齐套出库

This commit is contained in:
2024-06-02 21:27:20 +08:00
parent db40c03da6
commit 2c545e9b7f
15 changed files with 573 additions and 215 deletions

View File

@@ -33,6 +33,7 @@ using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Microsoft.Extensions.Logging;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Entitys.Permission;
using Aop.Api.Domain;
namespace Tnb.WarehouseMgr
{
@@ -43,7 +44,7 @@ namespace Tnb.WarehouseMgr
[ServiceModule(BizTypeId)]
public class WmsMaterialTransferService : BaseWareHouseService
{
private const string BizTypeId = "";
private const string BizTypeId = "34354738929685";
private readonly ISqlSugarClient _db;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
@@ -51,6 +52,8 @@ namespace Tnb.WarehouseMgr
private readonly IBillRullService _billRullService;
private readonly IUserManager _userManager;
public static SemaphoreSlim s_taskDistributeToZCC = new(1);
public WmsMaterialTransferService(
ISqlSugarRepository<WmsCarryH> repository,
IRunService runService,
@@ -80,6 +83,8 @@ namespace Tnb.WarehouseMgr
.InnerJoin<UserEntity>((a, b, c) => c.Id == a.create_id)
.InnerJoin<BasWarehouse>((a, b, c, d) => d.id == a.warehouse_outstock)
.InnerJoin<BasWarehouse>((a, b, c, d, e) => e.id == a.warehouse_instock)
// 只显示未完成的单据
.Where( a => a.status != "25065149810453")
.Select((a, b, c, d, e) => new WmsMaterialTransfer
{
id = a.id,
@@ -94,7 +99,7 @@ namespace Tnb.WarehouseMgr
status = b.FullName,
bill_date = a.bill_date,
warehouse_outstock = d.whname,
warehouse_instock = d.whname,
warehouse_instock = e.whname,
type = a.type,
biller_out = a.biller_out,
depart_out = a.depart_out,
@@ -113,9 +118,9 @@ namespace Tnb.WarehouseMgr
foreach (dynamic row in mainTable)
{
row.deliver_date = row.deliver_date.Value.ToString("yyyy-MM-dd");
row.arrival_date = row.arrival_date.Value.ToString("yyyy-MM-dd");
row.create_time = row.create_time.Value.ToString("yyyy-MM-dd");
row.deliver_date = row.deliver_date.Value?.ToString("yyyy-MM-dd");
row.arrival_date = row.arrival_date.Value?.ToString("yyyy-MM-dd");
row.create_time = row.create_time.Value?.ToString("yyyy-MM-dd");
}
List<WmsMaterialTransferD> wmsTransferInstockDs = _db.Queryable<WmsMaterialTransferD, BasMaterial>((a, b) =>
@@ -235,6 +240,12 @@ namespace Tnb.WarehouseMgr
WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable<WmsMaterialTransferD>().FirstAsync(it => it.id == input.source_id);
WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable<WmsMaterialTransfer>().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id);
if (wmsMaterialTransferD.yxfqty == wmsMaterialTransferD.qty)
{
throw new AppFriendlyException("已下发数量已达到转库数量", 500);
}
await s_taskExecuteSemaphore.WaitAsync();
await _db.Ado.BeginTranAsync();
@@ -280,6 +291,8 @@ namespace Tnb.WarehouseMgr
commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID;
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
commonCreatePretaskInput.require_id = input.source_id;
commonCreatePretaskInput.carry_id = wmsCarryH.id;
commonCreatePretaskInput.carry_code = wmsCarryH.carry_code;
Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
@@ -303,7 +316,7 @@ namespace Tnb.WarehouseMgr
finally
{
_ = s_taskExecuteSemaphore.Release();
await InvokeGenPretaskExcute();
InvokeGenPretaskExcute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
@@ -321,12 +334,221 @@ namespace Tnb.WarehouseMgr
Logger.LogWarning($"【ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码");
return;
}
// 更新已转数量
bool isOk = await _db.Updateable<WmsMaterialTransferD>().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCode.codeqty })
.Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
if (!isOk)
// 如果所有明细已完成 更新主表状态为完成
WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable<WmsMaterialTransferD>().Where(r => r.id == input.requireId).SingleAsync();
List<WmsMaterialTransferD> wmsMaterialTransferDs = _db.Queryable<WmsMaterialTransferD>()
.Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList();
bool isOk2 = true;
if (wmsMaterialTransferDs.Count == 0)
{
isOk2 = await _db.Updateable<WmsMaterialTransfer>().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
.Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync();
}
if (!isOk || !isOk2)
{
throw Oops.Oh(ErrorCode.COM1001);
}
}
/// <summary>
/// 中储仓下发到二楼暂存仓
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> DistributeToZCC(MaterialTransferDistributeToZCCInput input)
{
s_taskDistributeToZCC.Wait();
try
{
WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable<WmsMaterialTransfer>().Where(r => r.id == input.source_id).First();
if (wmsMaterialTransfer == null)
{
Logger.LogWarning($"不存在id为{input.source_id}的转库单!");
throw new AppFriendlyException($"不存在id为{input.source_id}的转库单!", 500);
}
if (wmsMaterialTransfer.status != WmsWareHouseConst.BILLSTATUS_ADD_ID)
{
Logger.LogWarning($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓下发到二楼暂存仓任务!");
throw new AppFriendlyException($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓下发到二楼暂存仓任务!", 500);
}
List<WmsMaterialTransferD> wmsMaterialTransferds = _db.Queryable<WmsMaterialTransferD>().Where(r => r.bill_id == input.source_id).ToList();
// 转库单载具子表
List<WmsMaterialTransferCarry> wmsMaterialTransferCarrys = new List<WmsMaterialTransferCarry>();
foreach (WmsMaterialTransferD wmsMaterialTransferD in wmsMaterialTransferds)
{
//出库取起点,获取所有符合输入的载具规格的载具
OutStockStrategyQuery OutStockStrategyInput = new()
{
warehouse_id = "2",
material_id = wmsMaterialTransferD.material_id,
code_batch = wmsMaterialTransferD.code_batch
};
List<WmsCarryH>? carrys = await _wareHouseService.OutStockStrategy(OutStockStrategyInput);
// 需要转库数量
decimal? needOut = wmsMaterialTransferD.qty;
foreach (WmsCarryH wmsCarryH in carrys)
{
if (needOut <= 0)
{
break;
}
WmsCarryCode wmsCarryCode = _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == wmsCarryH.id).First();
needOut -= wmsCarryCode.codeqty;
BasLocation endlocation_ssx = await _db.Queryable<BasLocation>().Where(r => new string[2] { "32609229889045", "32609238573589" }.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
await _db.Updateable<BasLocation>().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync();
// 转库单载具子表
WmsMaterialTransferCarry wmsMaterialTransferCarry = new WmsMaterialTransferCarry();
wmsMaterialTransferCarry.bill_id = input.source_id;
wmsMaterialTransferCarry.carry_id = wmsCarryH.id;
wmsMaterialTransferCarry.carry_code = wmsCarryH.carry_code;
wmsMaterialTransferCarry.create_id = input.create_id;
wmsMaterialTransferCarry.create_time = DateTime.Now;
wmsMaterialTransferCarry.endlocation_id = endlocation_ssx.id;
wmsMaterialTransferCarry.endlocation_code = endlocation_ssx.location_code;
wmsMaterialTransferCarry.startlocation_id = wmsCarryH.location_id;
wmsMaterialTransferCarry.startlocation_code = wmsCarryH.location_code;
wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id;
wmsMaterialTransferCarry.qty = wmsCarryCode.codeqty;
wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry);
}
if (needOut > 0)
{
throw new AppFriendlyException($"物料{wmsMaterialTransferD.material_code}没有足够的库存!,缺失数量为{needOut}", 500);
}
}
await _db.Ado.BeginTranAsync();
await _db.Updateable<WmsMaterialTransfer>().SetColumns(r => new WmsMaterialTransfer
{
status = WmsWareHouseConst.BILLSTATUS_ON_ID,
carry_count = wmsMaterialTransferCarrys.Count,
remainbindracknum = wmsMaterialTransferCarrys.Count
}).Where(r => r.id == input.source_id).ExecuteCommandAsync();
Logger.LogInformation($"【DistributeToZCC】更新转库单{wmsMaterialTransfer.bill_code}主表的数据");
await _db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync();
Logger.LogInformation($"【DistributeToZCC插入转库单{wmsMaterialTransfer.bill_code}载具表的数据");
foreach (WmsMaterialTransferCarry wmsMaterialTransferCarry in wmsMaterialTransferCarrys)
{
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = wmsMaterialTransferCarry.startlocation_id;
commonCreatePretaskInput.endlocation_id = wmsMaterialTransferCarry.endlocation_id;
commonCreatePretaskInput.carry_id = wmsMaterialTransferCarry.carry_id;
commonCreatePretaskInput.carry_code = wmsMaterialTransferCarry.carry_code;
commonCreatePretaskInput.task_type = WmsWareHouseConst.BIZTYPE_WMSTRANSFER_ID;
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
commonCreatePretaskInput.require_id = wmsMaterialTransferCarry.mat_bill_id;
commonCreatePretaskInput.isExcuteMission = false;
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
{
Logger.LogInformation($"【DistributeToZCC生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}");
throw new AppFriendlyException($"生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}", 500);
}
await _db.Updateable<WmsMaterialTransferD>().SetColumns(r => r.yxfqty == r.yxfqty + wmsMaterialTransferCarry.qty).Where(r => r.id == wmsMaterialTransferCarry.mat_bill_id).ExecuteCommandAsync();
}
Logger.LogInformation($"转库单{wmsMaterialTransfer.bill_code}预任务{wmsMaterialTransferCarrys.Count}条全部生成成功");
await _db.Ado.CommitTranAsync();
}
catch(Exception ex)
{
await _db.Ado.RollbackTranAsync();
Logger.LogError("【DistributeToZCC】" + ex.Message);
Logger.LogError("【DistributeToZCC】" + ex.StackTrace);
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
s_taskDistributeToZCC.Release();
InvokeGenPretaskExcute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
/// <summary>
/// 从暂存仓呼叫料架到产线
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> CallRackToProductionLine(MaterialTransferCallRackToProductionLineInput input)
{
WmsCarryH wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).First();
if (wmsCarryH == null)
{
Logger.LogWarning($"不存在编码为{input.carry_code}的料架号!");
throw new AppFriendlyException($"不存在编码为{input.carry_code}的料架号!", 500);
}
if (string.IsNullOrEmpty(wmsCarryH.work_station))
{
Logger.LogWarning($"此料架目标工位为空!{input.carry_code}");
throw new AppFriendlyException($"此料架目标工位为空!{input.carry_code}", 500);
}
if (string.IsNullOrEmpty(wmsCarryH.location_id))
{
Logger.LogWarning($"此料架的库位为空!{input.carry_code}");
throw new AppFriendlyException($"此料架的库位为空!{input.carry_code}", 500);
}
BasLocation endlocation = _db.Queryable<BasLocation>().Where(r => r.location_code == wmsCarryH.work_station).First();
WmsDistaskH wmsDistaskH = _db.Queryable<WmsDistaskH>().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).First();
if (wmsDistaskH != null)
{
Logger.LogWarning($"此料架{input.carry_code}存在未完成的任务{wmsDistaskH.bill_code}");
throw new AppFriendlyException($"此料架{input.carry_code}存在未完成的任务{wmsDistaskH.bill_code}", 500);
}
try
{
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = wmsCarryH.location_id;
commonCreatePretaskInput.endlocation_id = endlocation.id;
commonCreatePretaskInput.carry_id = wmsCarryH.id;
commonCreatePretaskInput.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput.task_type = "";
commonCreatePretaskInput.biz_type = "";
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
{
Logger.LogInformation($"【CallRackToProductionLine】生成预任务失败 载具 {wmsCarryH.carry_code}");
throw new AppFriendlyException($"生成预任务失败 载具 {wmsCarryH.carry_code}", 500);
}
}
catch (Exception ex)
{
Logger.LogError("【CallRackToProductionLine】" + ex.Message);
Logger.LogError("【CallRackToProductionLine】" + ex.StackTrace);
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
}
}