From d7a0b557c71e77787c2c69d012bc3fa04d8a3bbd Mon Sep 17 00:00:00 2001 From: majian <780924089@qq.com> Date: Tue, 23 Jul 2024 18:21:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=AC=E5=BA=93=E5=8D=95=E5=8E=9F=E6=9D=90?= =?UTF-8?q?=E6=96=99=E5=88=B0=E4=B8=AD=E5=82=A8=E4=BB=93=E8=BD=AC=E5=BA=93?= =?UTF-8?q?=E3=80=81=E4=B8=AD=E5=82=A8=E4=BB=93=E9=80=80=E5=9B=9E=E5=8E=9F?= =?UTF-8?q?=E6=9D=90=E6=96=99=E8=BD=AC=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tnb.ProductionMgr/RedisBackGround.cs | 7 +- ...MaterialTransferDistributeSCWToYCLInput.cs | 33 +++ .../IWmsCarryBindService.cs | 2 + .../Tnb.WarehouseMgr/WareHouseService.cs | 191 ++++++++++---- .../Tnb.WarehouseMgr/WmsCarryBindService.cs | 9 +- .../WmsMaterialTransferService.cs | 240 ++++++++++++++++-- .../Tnb.WarehouseMgr/WmsPrdInstockHService.cs | 1 - 7 files changed, 399 insertions(+), 84 deletions(-) create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeSCWToYCLInput.cs diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 53863ad3..15f2984a 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -429,11 +429,16 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { WmsCarryH? carry = db_Scantimer.Queryable().Single(it => it.carry_code == coderesult); LoggerBGWCarrySupplement.LogInformation($"【ScanInStock】 八工位 {key} 查找{coderesult}绑定的托盘: {JsonConvert.SerializeObject(carry)}"); + //if (carry.location_id != "30773146852470") + //{ + // LoggerBGWCarrySupplement.LogInformation($"【ScanInStock】 八工位 {key} 查找{coderesult}绑定的托盘{carry.carry_code}起始库位既不是空也不是拆盘机,此时不能生成入库任务(防止重复生成任务)"); + // continue; + //} if (carry != null) { if (db_Scantimer.Queryable().Where(p => p.carry_id == carry.id && p.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID && p.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID).Any()) { - LoggerBGWCarrySupplement.LogInformation($"【ScanInStock】 八工位 {key} 托盘 {carry.carry_code} 找到了执行任务状态(status)既不是26126860808229(已完成)或26126863175461(已取消)的历史任务,此时不能执行入库"); + LoggerBGWCarrySupplement.LogInformation($"【ScanInStock】 八工位 {key} 托盘 {carry.carry_code} 找到了执行任务状态(status)既不是26126860808229(已完成)也不是26126863175461(已取消)的历史任务,此时不能执行入库"); continue; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeSCWToYCLInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeSCWToYCLInput.cs new file mode 100644 index 00000000..bc4679da --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeSCWToYCLInput.cs @@ -0,0 +1,33 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class MaterialTransferDistributeSCWToYCLInput + { + /// + /// 组织ID + /// + public string org_id { get; set; } + /// + /// 创建用户 + /// + public string create_id { get; set; } + + /// + /// 来源单据id(转库单主表) + /// + public string? source_id { get; set; } + + /// + /// 载具条码 + /// + public string? carry_code { get; set; } + + /// + /// 数量 + /// + public decimal qty { get; set; } + + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs index ce94d5fa..84831407 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs @@ -13,5 +13,7 @@ namespace Tnb.WarehouseMgr.Interfaces Task CarryBind(VisualDevModelDataCrInput input); Task CarryBind(CarryBindInput input, ISqlSugarClient dbConn = null); + + Task CarryMaterialBind(CarryMaterialBindInput input, ISqlSugarClient dbConn = null); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 01ea9053..b6235c55 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -545,16 +545,16 @@ namespace Tnb.WarehouseMgr public async Task>> OutStockStrategyZCC2Floor2([FromQuery] OutStockStrategyZCC2Floor2Query input) { Expressionable whereExprable = Expressionable.Create() - .And((a, b, c) => a.is_lock == 0 && c.is_lock == 0) - .And((a, b, c) => !string.IsNullOrEmpty(a.location_id)) - .And((a, b, c) => c.is_type == ((int)EnumLocationType.存储库位).ToString()) - .And((a, b, c) => a.out_status == "0") - .And((a, b, c) => c.wh_id == input.warehouse_id) - .AndIF(!string.IsNullOrEmpty(input.material_id), (a, b, c) => b.material_id == input.material_id) - .AndIF(!string.IsNullOrEmpty(input.code_batch), (a, b, c) => b.code_batch == input.code_batch) - .AndIF(!string.IsNullOrEmpty(input.material_specification), (a, b, c) => b.material_specification == input.material_specification) - .AndIF(!string.IsNullOrEmpty(input.container_no), (a, b, c) => b.container_no == input.container_no) - .AndIF(!string.IsNullOrEmpty(input.carrystd_id), (a, b, c) => a.carrystd_id == input.carrystd_id); + .And((a, b, c) => a.is_lock == 0 && c.is_lock == 0) + .And((a, b, c) => !string.IsNullOrEmpty(a.location_id)) + .And((a, b, c) => c.is_type == ((int)EnumLocationType.存储库位).ToString()) + .And((a, b, c) => a.out_status == "0") + .And((a, b, c) => c.wh_id == input.warehouse_id) + .AndIF(!string.IsNullOrEmpty(input.material_id), (a, b, c) => b.material_id == input.material_id) + .AndIF(!string.IsNullOrEmpty(input.code_batch), (a, b, c) => b.code_batch == input.code_batch) + .AndIF(!string.IsNullOrEmpty(input.material_specification), (a, b, c) => b.material_specification == input.material_specification) + .AndIF(!string.IsNullOrEmpty(input.container_no), (a, b, c) => b.container_no == input.container_no) + .AndIF(!string.IsNullOrEmpty(input.carrystd_id), (a, b, c) => a.carrystd_id == input.carrystd_id); Expression> carryStatusFilterExp = !input.material_id.IsNullOrWhiteSpace() ? (a, b, c) => a.carry_status == ((int)EnumCarryStatus.占用).ToString() : (a, b, c) => a.carry_status == ((int)EnumCarryStatus.空闲).ToString(); @@ -570,7 +570,8 @@ namespace Tnb.WarehouseMgr #region 只解决少数情况(比如只有60 59 60 60四个料箱,下发180,要取60 60 60) 其它情况不考虑 - var itemsASC = await cyDb.Queryable().LeftJoin((a, b) => a.id == b.carry_id) + List>? carrysDESC = new List>(); + var itemsDESC = await cyDb.Queryable().LeftJoin((a, b) => a.id == b.carry_id) .LeftJoin((a, b, c) => a.location_id == c.id) .Where(whereExpr) //.OrderByIF((a,b,c)=>SqlFunc.IsNullOrEmpty()) @@ -579,71 +580,151 @@ namespace Tnb.WarehouseMgr .Select((a, b) => new { wmsCarryH = a, wmsCarryCode = b }) .ToListAsync(); - //items = itemsASC.Count < itemsDESC.Count ? itemsASC : itemsDESC; + + itemsDESC = itemsDESC.Distinct().ToList(); + + // 数量正序 + List>? carrysASC = new List>(); + var itemsASC = await cyDb.Queryable().LeftJoin((a, b) => a.id == b.carry_id) + .LeftJoin((a, b, c) => a.location_id == c.id) + .Where(whereExpr) + //.OrderByIF((a,b,c)=>SqlFunc.IsNullOrEmpty()) + //.OrderBy(policy.policy) + .OrderBy("codeqty asc,a.location_code,layers,loc_line,loc_column") + + .Select((a, b) => new { wmsCarryH = a, wmsCarryCode = b }) + .ToListAsync(); itemsASC = itemsASC.Distinct().ToList(); - List>? carrys = new List>(); - // 6个下发一条任务链 int move_num = 6; - int endlocation_index = 0; - BasLocation endlocation_ssx = null; - - for (int i = 0; i < itemsASC.Count; i++) + // 剩余分配数 { - WmsCarryH wmsCarryH = itemsASC[i].wmsCarryH; - WmsCarryCode wmsCarryCode = itemsASC[i].wmsCarryCode; + decimal? needOut = input.needOut; + int endlocation_index = 0; + BasLocation endlocation_ssx = null; - if (input.needOut <= 0) + for (int i = 0; i < itemsDESC.Count; i++) { - break; - } + WmsCarryH wmsCarryH = itemsDESC[i].wmsCarryH; + WmsCarryCode wmsCarryCode = itemsDESC[i].wmsCarryCode; - // 每6个重新获取一次终点 - if (i % move_num == 0) - { - endlocation_ssx = await _db.Queryable().Where(r => input.endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); - } - - // 查找是否有一个料箱可以正好满足剩余需求数量(目前只做这个额外判断,其它情形不考虑) - bool isFind = false; - for (int j = i + 1; j < itemsASC.Count; j++) - { - WmsCarryCode _wmsCarryCode = itemsASC[j].wmsCarryCode; - if (_wmsCarryCode.codeqty == input.needOut) + if (needOut <= 0) { - input.needOut -= _wmsCarryCode.codeqty; - WmsCarryH _wmsCarryH = itemsASC[j].wmsCarryH; - - await _db.Updateable().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync(); - - carrys.Add(new Tuple(_wmsCarryH, _wmsCarryCode.codeqty, endlocation_ssx)); - - isFind = true; break; } + // 每6个重新获取一次终点 + if (i % move_num == 0) + { + endlocation_ssx = await _db.Queryable().Where(r => input.endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); + } + + // 查找是否有一个料箱可以正好满足剩余需求数量(目前只做这个额外判断,其它情形不考虑) + bool isFind = false; + for (int j = i + 1; j < itemsDESC.Count; j++) + { + WmsCarryCode _wmsCarryCode = itemsDESC[j].wmsCarryCode; + if (_wmsCarryCode.codeqty == needOut) + { + needOut -= _wmsCarryCode.codeqty; + WmsCarryH _wmsCarryH = itemsDESC[j].wmsCarryH; + + await _db.Updateable().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync(); + + carrysDESC.Add(new Tuple(_wmsCarryH, _wmsCarryCode.codeqty, endlocation_ssx)); + + isFind = true; + break; + } + + } + if (isFind) + break; + + // 目前只支持一个料箱只有一个物料 + needOut -= wmsCarryCode.codeqty; + + await _db.Updateable().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync(); + + carrysDESC.Add(new Tuple(wmsCarryH, wmsCarryCode.codeqty, endlocation_ssx)); } - if (isFind) - break; - // 目前只支持一个料箱只有一个物料 - input.needOut -= wmsCarryCode.codeqty; - - await _db.Updateable().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync(); - - carrys.Add(new Tuple(wmsCarryH, wmsCarryCode.codeqty, endlocation_ssx)); + if (needOut > 0) + { + throw new AppFriendlyException($"物料{input.material_code}没有足够的库存!,缺失数量为{needOut}", 500); + } } - #endregion - if (input.needOut > 0) { - throw new AppFriendlyException($"物料{input.material_code}没有足够的库存!,缺失数量为{input.needOut}", 500); + decimal? needOut = input.needOut; + int endlocation_index = 0; + BasLocation endlocation_ssx = null; + + for (int i = 0; i < itemsASC.Count; i++) + { + WmsCarryH wmsCarryH = itemsASC[i].wmsCarryH; + WmsCarryCode wmsCarryCode = itemsASC[i].wmsCarryCode; + + if (needOut <= 0) + { + break; + } + + // 每6个重新获取一次终点 + if (i % move_num == 0) + { + endlocation_ssx = await _db.Queryable().Where(r => input.endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); + } + + // 查找是否有一个料箱可以正好满足剩余需求数量(目前只做这个额外判断,其它情形不考虑) + bool isFind = false; + for (int j = i + 1; j < itemsASC.Count; j++) + { + WmsCarryCode _wmsCarryCode = itemsASC[j].wmsCarryCode; + if (_wmsCarryCode.codeqty == needOut) + { + needOut -= _wmsCarryCode.codeqty; + WmsCarryH _wmsCarryH = itemsASC[j].wmsCarryH; + + await _db.Updateable().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync(); + + carrysASC.Add(new Tuple(_wmsCarryH, _wmsCarryCode.codeqty, endlocation_ssx)); + + isFind = true; + break; + } + + } + if (isFind) + break; + + // 目前只支持一个料箱只有一个物料 + needOut -= wmsCarryCode.codeqty; + + await _db.Updateable().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync(); + + carrysASC.Add(new Tuple(wmsCarryH, wmsCarryCode.codeqty, endlocation_ssx)); + } + + if (needOut > 0) + { + throw new AppFriendlyException($"物料{input.material_code}没有足够的库存!,缺失数量为{needOut}", 500); + } } + #endregion + List>? carrys = new List>(); - return carrys; + if (carrysDESC.Count == carrysASC.Count) + { + return carrysDESC.Sum(r => r.Item2) <= carrysASC.Sum(r => r.Item2) ? carrysDESC : carrysASC; + } + else + { + return carrysDESC.Count <= carrysASC.Count ? carrysDESC : carrysASC; + } } /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index 1d4a88c8..e423721b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -152,11 +152,14 @@ namespace Tnb.WarehouseMgr return result; } [HttpPost] - public async Task CarryMaterialBind(CarryMaterialBindInput input) + public async Task CarryMaterialBind(CarryMaterialBindInput input, ISqlSugarClient dbConn = null) { + var db = _db; + if (dbConn != null) + db = dbConn; try { - WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.carry_code == input.carrycode); + WmsCarryH? carry = await db.Queryable().SingleAsync(it => it.carry_code == input.carrycode); List WmsCarryCodes = new List(); foreach (var detail in input.details) { @@ -170,7 +173,7 @@ namespace Tnb.WarehouseMgr } int rows = 0; if (WmsCarryCodes.Count > 0) - rows = await _db.Insertable(WmsCarryCodes).ExecuteCommandAsync(); + rows = await db.Insertable(WmsCarryCodes).ExecuteCommandAsync(); if (rows == 0) { throw new Exception($"物料列表为空,不能提交绑定,可能的原因;1.需要检查扫码设置(新PDA) 2.未扫到有效的二维码 详细信息:接收到{input.details.Count}个条码 但是成功绑定的条码数量为0个!"); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 92b2700f..f6369ef8 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -372,7 +372,6 @@ namespace Tnb.WarehouseMgr foreach (var wmsCarryH in items) { - WmsCarryCode wmsCarryCode = await _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).FirstAsync(); BasLocation startLocation = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); BasLocation endLocation = null; @@ -523,6 +522,23 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($@"生成预任务失败", 500); } + CarryMaterialBindInput carryMaterialBindInput = new CarryMaterialBindInput(); + carryMaterialBindInput.carrycode = wmsCarryHs[index].carry_code; + carryMaterialBindInput.create_id = input.create_id; + + List carryMaterialDetails = new List(); + CarryMaterialDetail carryMaterialDetail = new CarryMaterialDetail(); + carryMaterialDetail.material_id = wmsMaterialTransferD.material_id; + carryMaterialDetail.material_code = wmsMaterialTransferD.material_code; + carryMaterialDetail.codeqty = wmsCarryH.qty.ToString(); + carryMaterialDetail.code_batch = wmsMaterialTransferD.code_batch; + carryMaterialDetail.barcode = wmsCarryHs[index].carry_code; + carryMaterialDetail.unit_id = wmsMaterialTransferD.unit_id; + carryMaterialDetails.Add(carryMaterialDetail); + carryMaterialBindInput.details = carryMaterialDetails; + await _wmsCarryBindService.CarryMaterialBind(carryMaterialBindInput, _db); + await _db.Updateable().SetColumns(r => r.carry_status == "1").Where(r => r.id == wmsCarryHs[index].id).ExecuteCommandAsync(); + index++; } @@ -534,8 +550,8 @@ namespace Tnb.WarehouseMgr catch (Exception ex) { await _db.Ado.RollbackTranAsync(); - Logger.LogError("【Distribute】" + ex.Message); - Logger.LogError("【Distribute】" + ex.StackTrace); + Logger.LogError("【DistributeYCLToZCC】" + ex.Message); + Logger.LogError("【DistributeYCLToZCC】" + ex.StackTrace); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } finally @@ -580,7 +596,7 @@ namespace Tnb.WarehouseMgr WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id); - if (wmsMaterialTransferD.yxfqty == wmsMaterialTransferD.qty) + if (wmsMaterialTransferD.yxfqty >= wmsMaterialTransferD.qty) { throw new AppFriendlyException("已下发数量已达到转库数量", 500); } @@ -651,7 +667,6 @@ namespace Tnb.WarehouseMgr foreach (var wmsCarryH in items) { - WmsCarryCode wmsCarryCode = await _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).FirstAsync(); BasLocation startLocation = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); @@ -787,7 +802,7 @@ namespace Tnb.WarehouseMgr WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id); - if (wmsMaterialTransferD.yxfqty == wmsMaterialTransferD.qty) + if (wmsMaterialTransferD.yxfqty >= wmsMaterialTransferD.qty) { throw new AppFriendlyException("已下发数量已达到转库数量", 500); } @@ -841,13 +856,12 @@ namespace Tnb.WarehouseMgr int index = 0; foreach (var wmsCarryH in items) { - WmsCarryCode wmsCarryCode = await _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).FirstAsync(); BasLocation startLocation = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); commonCreatePretaskInput.startlocation_id = startLocation.id; commonCreatePretaskInput.endlocation_id = endlocations[index].id; - commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; // 转库单id commonCreatePretaskInput.source_id = input.source_id; @@ -896,16 +910,23 @@ namespace Tnb.WarehouseMgr try { List wmsCarryCodes = await _db.Queryable().Where(r => r.carry_id == input.carryIds[0]).ToListAsync(); - if (wmsCarryCodes.Count == 0) - { - Logger.LogWarning($"【WmsMaterialTransferService ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码"); - return; - } + //if (wmsCarryCodes.Count == 0) + //{ + // Logger.LogWarning($"【WmsMaterialTransferService ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码"); + // return; + //} await _db.Ado.BeginTranAsync(); + WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable().Where(r => r.id == input.source_id).SingleAsync(); + WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id); + bool isOk = false; - // 入库回写入库数量字段 - if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID) + + #region 更新已转数量 + // 8线到中储仓入库或三工位退回原材料操作时回写数量 + if ((wmsMaterialTransfer.warehouse_outstock == WmsWareHouseConst.WAREHOUSE_YCL_ID && wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID) + || (wmsMaterialTransfer.warehouse_outstock == WmsWareHouseConst.WAREHOUSE_ZC_ID && wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_YCL_ID) + && input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID) { // 更新已转数量(入库) isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty_rk = it.yzqty_rk + wmsCarryCodes.Sum(r => r.codeqty) }) @@ -913,21 +934,55 @@ namespace Tnb.WarehouseMgr } else { + // 中储仓到8线后自动解绑物料 + if ((wmsMaterialTransfer.warehouse_outstock == WmsWareHouseConst.WAREHOUSE_ZC_ID && wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_YCL_ID) + && input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID) + { + CarryCodeUnbindInput carryCodeUnbindInput = new(); + carryCodeUnbindInput.carry_id = input.wmsDistaskH.carry_id; + var resCarryUnbind = await _wmsCarryUnbindService.CarryCodeUnbind(carryCodeUnbindInput, _db); + if (resCarryUnbind.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + throw new AppFriendlyException($"载具{input.wmsDistaskH.carry_code}解绑条码", 500); + } + } + // 更新已转数量 isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty) }) .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync(); } - - // 如果所有明细已完成 更新主表状态为完成 - WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable().Where(r => r.id == input.source_id).SingleAsync(); - List wmsMaterialTransferDs = _db.Queryable() - .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList(); + #endregion + + #region 如果所有明细已完成 更新主表状态为完成 bool isOk2 = true; - if (wmsMaterialTransferDs.Count == 0) + // 原材料到中储仓入库操作时回写状态 + if ((wmsMaterialTransfer.warehouse_outstock == WmsWareHouseConst.WAREHOUSE_YCL_ID && wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID) + || (wmsMaterialTransfer.warehouse_outstock == WmsWareHouseConst.WAREHOUSE_ZC_ID && wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_YCL_ID)) { - isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) - .Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync(); + if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID) + { + List wmsMaterialTransferDs = _db.Queryable() + .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yxfqty_rk < a.yzqty_rk).ToList(); + if (wmsMaterialTransferDs.Count == 0) + { + isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) + .Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync(); + } + } } + else + { + List wmsMaterialTransferDs = _db.Queryable() + .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList(); + if (wmsMaterialTransferDs.Count == 0) + { + isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) + .Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync(); + } + } + + + #endregion // require_code是任务单 //string mo_task_code = input.require_code; @@ -955,7 +1010,6 @@ namespace Tnb.WarehouseMgr { Logger.LogInformation("【WmsMaterialTransferService ModifyAsync】同步其它出库单到erp..."); - WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id); List dList = await _db.Queryable().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x => x.id).ToListAsync(); DictionaryDataEntity unitData = await _db.Queryable() .LeftJoin((x, y) => x.Id == y.DictionaryTypeId) @@ -1325,7 +1379,145 @@ namespace Tnb.WarehouseMgr return await ToApiResult(HttpStatusCode.OK, "成功"); } + /// + /// 三工位入库到原材料仓 + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task DistributeSCWToYCL(MaterialTransferDistributeSCWToYCLInput input) + { + try + { + if (string.IsNullOrEmpty(input.source_id)) + { + throw new AppFriendlyException("来源单据id不可为空", 500); + } + if (string.IsNullOrEmpty(input.carry_code)) + { + throw new AppFriendlyException("载具不可为空", 500); + } + + if (input.qty <= 0) + { + throw new AppFriendlyException("数量必须大于0", 500); + } + + WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); + if (wmsMaterialTransferD == null) + { + Logger.LogWarning($"不存在id为{input.source_id}的转库单明细!"); + throw new AppFriendlyException($"不存在id为{input.source_id}的转库单明细!", 500); + } + + if (wmsMaterialTransferD.yxfqty_rk >= wmsMaterialTransferD.yzqty) + { + throw new AppFriendlyException("已下发数量已达到中储仓的转出数量", 500); + } + + WmsCarryH wmsCarryH = await _db.Queryable().FirstAsync(it => it.carry_code == input.carry_code); + if (wmsCarryH == null) + { + Logger.LogWarning($"不存在编码为{input.carry_code}的载具!"); + throw new AppFriendlyException($"不存在编码为{input.carry_code}的载具!", 500); + } + if (wmsCarryH.carry_status != "0") + { + Logger.LogWarning($"载具{input.carry_code}状态为占用!"); + throw new AppFriendlyException($"载具{input.carry_code}状态为占用!", 500); + } + if (wmsCarryH.is_lock == 1) + { + 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); + } + if (!_wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(wmsCarryH.location_id)) + { + Logger.LogWarning($"载具{input.carry_code}当前所在库位不是三工位!"); + throw new AppFriendlyException($"载具{input.carry_code}当前所在库位不是三工位!", 500); + } + + await s_taskExecuteSemaphore.WaitAsync(); + await _db.Ado.BeginTranAsync(); + + + InStockStrategyQuery inStockStrategyInput = new() + { + warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, + Size = 1 + }; + List endlocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); + + if (endlocations.Count < 1) + { + throw new AppFriendlyException($@"没有可以入库的库位", 500); + } + + BasLocation startLocation = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = startLocation.id; + commonCreatePretaskInput.endlocation_id = endlocations[0].id; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; + // 转库单id + commonCreatePretaskInput.source_id = input.source_id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; + commonCreatePretaskInput.isExcuteMission = false; + + Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); + + if (res.code != HttpStatusCode.OK) + { + Logger.LogInformation($@"生成预任务失败"); + throw new AppFriendlyException($@"生成预任务失败", 500); + } + + CarryMaterialBindInput carryMaterialBindInput = new CarryMaterialBindInput(); + carryMaterialBindInput.carrycode = wmsCarryH.carry_code; + carryMaterialBindInput.create_id = input.create_id; + + List carryMaterialDetails = new List(); + CarryMaterialDetail carryMaterialDetail = new CarryMaterialDetail(); + carryMaterialDetail.material_id = wmsMaterialTransferD.material_id; + carryMaterialDetail.material_code = wmsMaterialTransferD.material_code; + carryMaterialDetail.codeqty = input.qty.ToString(); + carryMaterialDetail.code_batch = wmsMaterialTransferD.code_batch; + carryMaterialDetail.barcode = wmsCarryH.carry_code; + carryMaterialDetail.unit_id = wmsMaterialTransferD.unit_id; + carryMaterialDetails.Add(carryMaterialDetail); + carryMaterialBindInput.details = carryMaterialDetails; + await _wmsCarryBindService.CarryMaterialBind(carryMaterialBindInput, _db); + await _db.Updateable().SetColumns(r => r.carry_status == "1").Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); + + // 更新子表已下发数量 + await _db.Updateable().SetColumns(r => r.yxfqty_rk == r.yxfqty_rk + input.qty).Where(r => r.id == input.source_id).ExecuteCommandAsync(); + + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + await _db.Ado.RollbackTranAsync(); + Logger.LogError("【DistributeSCWToYCL】" + ex.Message); + Logger.LogError("【DistributeSCWToYCL】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + _ = s_taskExecuteSemaphore.Release(); + InvokeGenPretaskExcute(); + } + + return await ToApiResult(HttpStatusCode.OK, "成功"); + } /// /// 从暂存仓呼叫料架到产线 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs index 717aec7a..4868a0e2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs @@ -253,7 +253,6 @@ namespace Tnb.WarehouseMgr commonCreatePretaskInput2.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; commonCreatePretaskInput2.biz_type = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID; commonCreatePretaskInput2.require_id = wmsPrdInstockD.id; - commonCreatePretaskInput2.isChangeCarryLoc2StartLoc = false; Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2, db); if (res2.code != HttpStatusCode.OK)