diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index b15d8719..1ab74ea8 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -1337,10 +1337,10 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BasLocation endLocation = rackEndLocations.First(); // 锁住终点库位 - //await db.Updateable(r => new BasLocation - //{ - // is_lock = 1 - //}).Where(r => r.id == endLocation.id).ExecuteCommandAsync(); + await db_Floor2timer移走上升降区未生成预任务且满托的料架.Updateable(r => new BasLocation + { + is_lock = 1 + }).Where(r => r.id == endLocation.id).ExecuteCommandAsync(); LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}"); @@ -1593,26 +1593,26 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA private async Task Floor2UpDownMachinecode_SetTag(string tag, string value) { - string DevName = "东面提升机输送线"; - Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) - { - ["DevName"] = DevName, - ["token"] = _eleCtlCfg.token, - ["TagName"] = tag, - ["Value"] = value, - }; - string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); + //string DevName = "东面提升机输送线"; + //Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) + //{ + // ["DevName"] = DevName, + // ["token"] = _eleCtlCfg.token, + // ["TagName"] = tag, + // ["Value"] = value, + //}; + //string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); - return result.Contains("Ok"); + //return result.Contains("Ok"); //测试 - //string DevName = "东面提升机输送线"; + string DevName = "东面提升机输送线"; - //JObject valueJson = new JObject(); - //valueJson["Value"] = value; + JObject valueJson = new JObject(); + valueJson["Value"] = value; - //_redisData.SetHash(DevName, tag, valueJson.ToString()); - //return true; + _redisData.SetHash(DevName, tag, valueJson.ToString()); + return true; } #endregion @@ -1636,13 +1636,13 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA //YCLWXDPJInstocktimer = new Timer(YCLWXDPJInstock, null, TimeSpan.Zero, TimeSpan.FromSeconds(100000)); // 二楼上升降机 - Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(20)); + Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); // 二楼料架配送 - Floor2timer送空托到上升降区 = new Timer(送空托到上升降区, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - Floor2timer送满托到下升降区 = new Timer(送满托到下升降区, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - Floor2timer移走上升降区未生成预任务且满托的料架 = new Timer(移走上升降区未生成预任务且满托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - Floor2timer移走下升降区未生成预任务且空托的料架 = new Timer(移走下升降区未生成预任务且空托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + Floor2timer送空托到上升降区 = new Timer(送空托到上升降区, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor2timer送满托到下升降区 = new Timer(送满托到下升降区, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor2timer移走上升降区未生成预任务且满托的料架 = new Timer(移走上升降区未生成预任务且满托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor2timer移走下升降区未生成预任务且空托的料架 = new Timer(移走下升降区未生成预任务且空托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); return Task.CompletedTask; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index 6e8d17f4..15065e3a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -22,7 +22,15 @@ /// 四楼解析库 /// public const string WAREHOUSE_JXK_ID = "26103367464997"; - + /// + /// 缓存仓ID + /// + public const string WAREHOUSE_HCC_ID = "26103348825381"; + /// + /// 组装线边库 + /// + public const string WAREHOUSE_ZZXBK_ID = "26257716248101"; + /// /// 出入库单据状态TypeID diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs index 761bb8de..d0e435ad 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs @@ -25,10 +25,18 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs /// /// 来源业务单据id /// - public string require_id { get; set; } + public string source_id { get; set; } /// /// 来源业务单据code /// + public string source_code { get; set; } + /// + /// 需求单据id + /// + public string require_id { get; set; } + /// + /// 需求单据code + /// public string require_code { get; set; } public string moduleConsts { get; set; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeInput.cs index 0e20d00c..42b68b32 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeInput.cs @@ -33,5 +33,12 @@ /// 批次 /// public string? code_batch { get; set; } + + /// + /// 终点库位(缓存仓) + /// + public string? endlocation_id { get; set; } + + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/WareHouseUpInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/WareHouseUpInput.cs index 0eba2328..43cc97aa 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/WareHouseUpInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/WareHouseUpInput.cs @@ -15,6 +15,18 @@ /// public string requireId { get; set; } /// + /// 需求单据code + /// + public string require_code { get; set; } + /// + /// 来源单据id + /// + public string source_id { get; set; } + /// + /// 来源单据code + /// + public string source_code { get; set; } + /// /// 单据业务类型Id /// public string bizTypeId { get; set; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs index 5e049544..f2ad3bcb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs @@ -34,6 +34,13 @@ namespace Tnb.WarehouseMgr.Interfaces /// Task> OutStockStrategyYCL([FromQuery] OutStockStrategyQuery input); /// + /// 缓存仓出库策略 + /// + /// + /// + /// + Task> OutStockStrategyHCC([FromQuery] OutStockStrategyQuery input); + /// /// 中储仓到二楼出库策略 /// /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 0fe1b6b4..1bcf09b4 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -411,6 +411,52 @@ namespace Tnb.WarehouseMgr return input.Size > 0 ? items.Take(input.Size).ToList() : items; } + + /// + /// 缓存仓出库策略 + /// + /// + /// + /// + public async Task> OutStockStrategyHCC([FromQuery] OutStockStrategyQuery 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); + Expression> carryStatusFilterExp = !input.material_id.IsNullOrWhiteSpace() + ? (a, b, c) => a.carry_status == ((int)EnumCarryStatus.占用).ToString() + : (a, b, c) => a.carry_status == ((int)EnumCarryStatus.空闲).ToString(); + _ = whereExprable.And(carryStatusFilterExp); + Expression> whereExpr = whereExprable.ToExpression(); + + SqlSugarClient cyDb = _db.CopyNew(); + WmsInstockPolicies policy = await cyDb.Queryable().Where(it => it.status == 1).FirstAsync(); + if (policy == null) + { + throw new AppFriendlyException("没有可用策略", 500); + } + + List items = 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) + + .Select() + .ToListAsync(); + + items = items.Distinct().ToList(); + return input.Size > 0 ? items.Take(input.Size).ToList() : items; + } + /// /// 1->2出库策略 /// @@ -948,26 +994,26 @@ namespace Tnb.WarehouseMgr private async Task Floor2UpDownMachinecode_SetTag(string tag, string value) { - string DevName = "东面提升机输送线"; - Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) - { - ["DevName"] = DevName, - ["token"] = _eleCtlCfg.token, - ["TagName"] = tag, - ["Value"] = value, - }; - string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); + //string DevName = "东面提升机输送线"; + //Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) + //{ + // ["DevName"] = DevName, + // ["token"] = _eleCtlCfg.token, + // ["TagName"] = tag, + // ["Value"] = value, + //}; + //string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); - return result.Contains("Ok"); + //return result.Contains("Ok"); // 测试 - //string DevName = "东面提升机输送线"; + string DevName = "东面提升机输送线"; - //JObject valueJson = new JObject(); - //valueJson["Value"] = value; + JObject valueJson = new JObject(); + valueJson["Value"] = value; - //_redisData.SetHash(DevName, tag, valueJson.ToString()); - //return true; + _redisData.SetHash(DevName, tag, valueJson.ToString()); + return true; } @@ -2089,11 +2135,16 @@ namespace Tnb.WarehouseMgr else if (dt.biz_type == "FloorCallMaterial") { await _db.Updateable().SetColumns(r => r.work_station == "").Where(r => r.id == dt.carry_id).ExecuteCommandAsync(); + + // require_code是任务单 + string mo_task_code = dt.require_code; + } #endregion List disTaskCodes = await _db.Queryable().Where(it => it.bill_id == dt.id).ToListAsync(); - WareHouseUpInput upInput = new() { bizTypeId = dt.biz_type, requireId = dt.require_id!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList() }; + WareHouseUpInput upInput = new() { bizTypeId = dt.biz_type, requireId = dt.require_id!, require_code = dt.require_code!, source_id = dt.source_id! + , source_code = dt.source_code!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList() }; /*if (!_userManager?.LoginType.IsNullOrEmpty() ?? false) { @@ -2856,6 +2907,8 @@ namespace Tnb.WarehouseMgr carry_code = carry_code, area_id = sPoint?.area_id!, area_code = it.Key, + source_id = input.source_id, + source_code = input.source_code, require_id = input.require_id, require_code = input.require_code, create_id = _userManager.UserId, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index 0083fe03..88ee29c9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -321,6 +321,8 @@ namespace Tnb.WarehouseMgr } catch (Exception ex) { + Logger.LogError($"【CarryUnbind】 {ex.Message}"); + Logger.LogError($"【CarryUnbind】 {ex.StackTrace}"); await _db.Ado.RollbackTranAsync(); return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 17adefae..66a1468b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -38,6 +38,7 @@ using Senparc.Weixin.Work.AdvancedAPIs.OaDataOpen; using NPOI.SS.Formula.Functions; using Org.BouncyCastle.Asn1.X509; using Tnb.ProductionMgr.Entities; +using Tnb.BasicData; namespace Tnb.WarehouseMgr { @@ -201,7 +202,56 @@ namespace Tnb.WarehouseMgr }; List items = await _wareHouseService.OutStockStrategyYCL(inStockStrategyInput); - decimal qty = _db.Queryable().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == input.material_id).Sum(r => r.codeqty); + decimal qty = _db.Queryable().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == input.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty); + + JObject keyValuePairs = new JObject(); + keyValuePairs["realPalletCount"] = items.Count; + keyValuePairs["realInvQty"] = qty; + + return await ToApiResult(HttpStatusCode.OK, "成功", keyValuePairs); + } + catch (Exception ex) + { + await _db.Ado.RollbackTranAsync(); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + } + + /// + /// 获取物料库存(缓存仓) + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task MaterialInventoryHCC(MaterialTransferGetMaterialInventoryInput input) + { + try + { + if (input.palletCount <= 0) + { + throw new AppFriendlyException("料架数必须大于0", 500); + } + if (string.IsNullOrEmpty(input.material_id)) + { + throw new AppFriendlyException("物料id不可为空", 500); + } + if (string.IsNullOrEmpty(input.code_batch)) + { + throw new AppFriendlyException("批号不可为空", 500); + } + + //入库取终点 //出库起点 + OutStockStrategyQuery inStockStrategyInput = new() + { + warehouse_id = WmsWareHouseConst.WAREHOUSE_HCC_ID, + material_id = input.material_id, + code_batch = input.code_batch, + Size = input.palletCount + }; + List items = await _wareHouseService.OutStockStrategyHCC(inStockStrategyInput); + + decimal qty = _db.Queryable().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == input.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty); JObject keyValuePairs = new JObject(); keyValuePairs["realPalletCount"] = items.Count; @@ -257,7 +307,7 @@ namespace Tnb.WarehouseMgr await _db.Ado.BeginTranAsync(); //入库取终点 //出库起点 - OutStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, material_id = wmsMaterialTransferD.material_id, code_batch = wmsMaterialTransferD.code_batch, Size = input.palletCount }; + OutStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, material_id = wmsMaterialTransferD.material_id, code_batch = input.code_batch, Size = input.palletCount }; List items = await _wareHouseService.OutStockStrategyYCL(inStockStrategyInput); if (items.Count == 0) @@ -265,7 +315,7 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($@"没有可以出库的载具", 500); } - decimal qty = _db.Queryable().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == wmsMaterialTransferD.material_id).Sum(r => r.codeqty); + decimal qty = _db.Queryable().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == wmsMaterialTransferD.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty); // 暂定PDA上查询到的物料批次和库存数量与提交时获取的不一致时,需要前台重新获取库存接口 if (input.palletCount != items.Count || input.qty != qty) @@ -297,7 +347,7 @@ 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.location_code == wmsCarryH.location_code).FirstAsync(); + BasLocation startLocation = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); BasLocation endLocation = null; // 集中供料区三工位 @@ -358,6 +408,157 @@ namespace Tnb.WarehouseMgr return await ToApiResult(HttpStatusCode.OK, "成功"); } + /// + /// 按料架下发(缓存仓) + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task DistributeHCC(MaterialTransferDistributeInput input) + { + try + { + if (string.IsNullOrEmpty(input.source_id)) + { + throw new AppFriendlyException("来源单据id不可为空", 500); + } + if (input.palletCount <= 0) + { + throw new AppFriendlyException("料架数必须大于0", 500); + } + if (input.qty <= 0) + { + throw new AppFriendlyException("数量必须大于0", 500); + } + if (string.IsNullOrEmpty(input.code_batch)) + { + throw new AppFriendlyException("批号不可为空", 500); + } + + + 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) + { + throw new AppFriendlyException("已下发数量已达到转库数量", 500); + } + + OrganizeEntity organizeEntity = _db.Queryable().Where(r => r.EnCode == wmsMaterialTransferD.station_code).First(); + if (organizeEntity == null) + { + Logger.LogWarning($"【CallRackToProductionLine】不存在工位code为{wmsMaterialTransferD.station_code}的工位!"); + throw new AppFriendlyException($"不存在工位code为{wmsMaterialTransferD.station_code}的工位!", 500); + } + // 获取产线 + OrganizeEntity organizeEntityCX = _db.Queryable().Where(r => r.Id == organizeEntity.ParentId).First(); + if (organizeEntityCX == null) + { + Logger.LogWarning($"【CallRackToProductionLine】基础资料错误!工位{organizeEntity.EnCode}的上级产线不存在,请检查!"); + throw new AppFriendlyException($"【CallRackToProductionLine】基础资料错误!工位{organizeEntity.EnCode}的上级产线不存在,请检查!", 500); + } + + if (organizeEntityCX.Category != "workline") + { + Logger.LogWarning($"【CallRackToProductionLine】基础资料错误!工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}不属于产线类型,请检查!"); + throw new AppFriendlyException($"【CallRackToProductionLine】基础资料错误!工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}不属于产线类型,请检查!", 500); + } + + // 获取任务单 + + List organizeEntityCXs = _db.Queryable().Where(r => r.workline_id == organizeEntityCX.Id && r.mo_task_status == DictConst.InProgressEnCode).ToList(); + if (organizeEntityCXs.Count > 1) + { + Logger.LogWarning($"【CallRackToProductionLine】工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单不唯一,请检查!"); + throw new AppFriendlyException($"【CallRackToProductionLine】工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单不唯一,请检查!", 500); + } + if (organizeEntityCXs.Count == 0) + { + Logger.LogWarning($"【CallRackToProductionLine】未找到工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单,请检查!"); + throw new AppFriendlyException($"【CallRackToProductionLine】未找到工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单,请检查!", 500); + } + PrdMoTask prdMoTask = organizeEntityCXs.First(); + + + + await s_taskExecuteSemaphore.WaitAsync(); + await _db.Ado.BeginTranAsync(); + + //入库取终点 //出库起点 + OutStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_HCC_ID, material_id = wmsMaterialTransferD.material_id, code_batch = input.code_batch, Size = input.palletCount }; + List items = await _wareHouseService.OutStockStrategyHCC(inStockStrategyInput); + + if (items.Count == 0) + { + throw new AppFriendlyException($@"没有可以出库的载具", 500); + } + + decimal qty = _db.Queryable().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == wmsMaterialTransferD.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty); + + // 暂定PDA上查询到的物料批次和库存数量与提交时获取的不一致时,需要前台重新获取库存接口 + if (input.palletCount != items.Count || input.qty != qty) + { + throw new AppFriendlyException($@"当前实际料架数量为{input.palletCount} 实际库存数量为{qty},与前台数据不一致,请重新获取库存", HttpStatusCode.InternalServerError); + } + + + if (wmsMaterialTransfer.warehouse_instock != WmsWareHouseConst.WAREHOUSE_ZZXBK_ID) + { + throw new AppFriendlyException($@"转库单{wmsMaterialTransfer.bill_code}入库仓库不是线边库,请检查!", HttpStatusCode.InternalServerError); + } + + + 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 = input.endlocation_id; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; + // 转库单id + commonCreatePretaskInput.source_id = input.source_id; + // 任务单code + commonCreatePretaskInput.require_id = prdMoTask.id; + commonCreatePretaskInput.require_code = prdMoTask.mo_task_code; + 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); + } + } + + // 更新子表已下发数量 + await _db.Updateable().SetColumns(r => r.yxfqty == r.yxfqty + input.qty).Where(r => r.id == input.source_id).ExecuteCommandAsync(); + + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + await _db.Ado.RollbackTranAsync(); + Logger.LogError("【Distribute】" + ex.Message); + Logger.LogError("【Distribute】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + _ = s_taskExecuteSemaphore.Release(); + InvokeGenPretaskExcute(); + } + + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + public override async Task ModifyAsync(WareHouseUpInput input) { if (input == null) @@ -372,10 +573,10 @@ namespace Tnb.WarehouseMgr } // 更新已转数量 bool isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty)}) - .Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync(); + .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync(); // 如果所有明细已完成 更新主表状态为完成 - WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable().Where(r => r.id == input.requireId).SingleAsync(); + 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(); bool isOk2 = true; @@ -384,7 +585,9 @@ namespace Tnb.WarehouseMgr isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) .Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync(); } - + + // require_code是任务单 + string mo_task_code = input.require_code; if (!isOk || !isOk2) { @@ -579,7 +782,7 @@ namespace Tnb.WarehouseMgr // 获取任务单 - List organizeEntityCXs = _db.Queryable().Where(r => r.workline_code == organizeEntityCX.EnCode).ToList(); + List organizeEntityCXs = _db.Queryable().Where(r => r.workline_id == organizeEntityCX.Id && r.mo_task_status == DictConst.InProgressEnCode).ToList(); if (organizeEntityCXs.Count > 1) { Logger.LogWarning($"【CallRackToProductionLine】工位{organizeEntity.EnCode}的上级{organizeEntityCX.EnCode}对应的进行中的任务单不唯一,请检查!"); @@ -625,6 +828,8 @@ namespace Tnb.WarehouseMgr commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; commonCreatePretaskInput.task_type = ""; commonCreatePretaskInput.biz_type = "FloorCallMaterial"; + commonCreatePretaskInput.source_id = ""; + commonCreatePretaskInput.require_code = ""; commonCreatePretaskInput.require_id = prdMoTask.id; commonCreatePretaskInput.require_code = prdMoTask.mo_task_code; @@ -716,25 +921,47 @@ namespace Tnb.WarehouseMgr } /// - /// 从产线呼叫装料架到暂存仓 + /// 从产线呼叫装料架到暂存仓/缓存仓 /// /// /// [HttpPost, NonUnify, AllowAnonymous] public async Task RackInstock(MaterialTransferRackInstockInput input) + { + WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.carry_code == input.carry_code).FirstAsync(); + + // 料架到暂存仓 + if (wmsCarryH.carrystd_id == "26037267399717") + { + return await RackInstock_到暂存仓(input, wmsCarryH); + } + // 载运小车和载运料架到缓存仓 + else if (wmsCarryH.carrystd_id == "26103233723941" || wmsCarryH.carrystd_id == "34995839046677") + { + return await RackInstock_到缓存仓(input, wmsCarryH); + } + else + { + Logger.LogError($"【RackInstock】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"【RackInstock】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!"); + } + } + + + async Task RackInstock_到暂存仓(MaterialTransferRackInstockInput input, WmsCarryH wmsCarryH) { try { BasLocation startlocation = _db.Queryable().Where(r => r.id == input.startlocation_id).First(); if (startlocation == null) { - Logger.LogWarning($"【RackEmptyInstock】不存在id为{input.startlocation_id}的库位!"); - throw new AppFriendlyException($"【RackEmptyInstock】不存在id为{input.startlocation_id}的库位!", 500); + Logger.LogWarning($"【RackInstock】不存在id为{input.startlocation_id}的库位!"); + throw new AppFriendlyException($"【RackInstock】不存在id为{input.startlocation_id}的库位!", 500); } if (string.IsNullOrEmpty(input.carry_code)) { - Logger.LogWarning($"【RackEmptyInstock】料架不能为空!{input.carry_code}"); - throw new AppFriendlyException($"【RackEmptyInstock】料架不能为空!{input.carry_code}!", 500); + Logger.LogWarning($"【RackInstock】料架不能为空!{input.carry_code}"); + throw new AppFriendlyException($"【RackInstock】料架不能为空!{input.carry_code}!", 500); } if (input.judgeEmptyCarry) { @@ -743,8 +970,8 @@ namespace Tnb.WarehouseMgr .Where((a, b) => input.details.Select(r => r.carry_code).Contains(a.carry_code)).Select((a, b) => b).ToList(); if (wmsCarryCodes.Count > 0) { - Logger.LogWarning($"【RackEmptyInstock】存在非空料箱,不能入库!{input.carry_code}"); - throw new AppFriendlyException($"【RackEmptyInstock】存在非空料箱,不能入库!{input.carry_code}!", 500); + Logger.LogWarning($"【RackInstock】存在非空料箱,不能入库!{input.carry_code}"); + throw new AppFriendlyException($"【RackInstock】存在非空料箱,不能入库!{input.carry_code}!", 500); } } @@ -755,16 +982,15 @@ namespace Tnb.WarehouseMgr if (rackEndLocations.Count() == 0) { - Logger.LogWarning($"【RackEmptyInstock】没有可用的终点库位"); - throw new AppFriendlyException($"【RackEmptyInstock】没有可用的终点库位!", 500); + Logger.LogWarning($"【RackInstock】没有可用的终点库位"); + throw new AppFriendlyException($"【RackInstock】没有可用的终点库位!", 500); } BasLocation endlocation = rackEndLocations.First(); - WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.carry_code == input.carry_code).FirstAsync(); // 重新绑定料箱到料架 // 清空料架 - Logger.LogWarning($"【RackEmptyInstock】清空料架"); + Logger.LogWarning($"【RackInstock】清空料架"); List membercarrys = _db.Queryable().Where(r => input.details.Select(r => r.carry_code).Contains(r.carry_code)).ToList(); @@ -796,7 +1022,7 @@ namespace Tnb.WarehouseMgr } Logger.LogWarning($"【RackEmptyInstock】开始生成预任务"); - CommonCreatePretaskInput commonCreatePretaskInput = new (); + CommonCreatePretaskInput commonCreatePretaskInput = new(); commonCreatePretaskInput.startlocation_id = startlocation.id; commonCreatePretaskInput.endlocation_id = endlocation.id; commonCreatePretaskInput.carry_id = wmsCarryH.id; @@ -807,7 +1033,7 @@ namespace Tnb.WarehouseMgr var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) { - Logger.LogInformation($"【RackEmptyInstock】生成预任务失败 载具 {input.carry_code}"); + Logger.LogInformation($"【RackInstock】生成预任务失败 载具 {input.carry_code}"); throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500); } Logger.LogWarning($"【RackEmptyInstock】生成预任务成功"); @@ -815,14 +1041,72 @@ namespace Tnb.WarehouseMgr } catch (Exception ex) { - Logger.LogError("【RackEmptyInstock】" + ex.Message); - Logger.LogError("【RackEmptyInstock】" + ex.StackTrace); + Logger.LogError("【RackInstock】" + ex.Message); + Logger.LogError("【RackInstock】" + ex.StackTrace); await _db.Ado.RollbackTranAsync(); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } - return await ToApiResult(HttpStatusCode.OK, "成功"); - } + + async Task RackInstock_到缓存仓(MaterialTransferRackInstockInput input, WmsCarryH wmsCarryH) + { + try + { + BasLocation startlocation = _db.Queryable().Where(r => r.id == input.startlocation_id).First(); + if (startlocation == null) + { + Logger.LogWarning($"【RackInstock】不存在id为{input.startlocation_id}的库位!"); + throw new AppFriendlyException($"【RackInstock】不存在id为{input.startlocation_id}的库位!", 500); + } + if (string.IsNullOrEmpty(input.carry_code)) + { + Logger.LogWarning($"【RackInstock】料架不能为空!{input.carry_code}"); + throw new AppFriendlyException($"【RackInstock】料架不能为空!{input.carry_code}!", 500); + } + + // 找到未占用且未锁定的库位 + ISugarQueryable rackEndLocations = + _db.Queryable() + .Where(r => r.wh_id == "26103348825381" && r.is_use == "0" && r.is_lock == 0).OrderBy(a => a.id).Take(1); + + if (rackEndLocations.Count() == 0) + { + Logger.LogWarning($"【RackInstock】没有可用的终点库位"); + throw new AppFriendlyException($"【RackInstock】没有可用的终点库位!", 500); + } + + BasLocation endlocation = rackEndLocations.First(); + + await _db.Ado.BeginTranAsync(); + + Logger.LogWarning($"【RackEmptyInstock】开始生成预任务"); + CommonCreatePretaskInput commonCreatePretaskInput = new(); + commonCreatePretaskInput.startlocation_id = startlocation.id; + commonCreatePretaskInput.endlocation_id = endlocation.id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = input.carry_code; + commonCreatePretaskInput.task_type = ""; + commonCreatePretaskInput.biz_type = "FloorCallMaterial"; + + var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); + if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.LogInformation($"【RackInstock】生成预任务失败 载具 {input.carry_code}"); + throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500); + } + Logger.LogWarning($"【RackEmptyInstock】生成预任务成功"); + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + Logger.LogError("【RackInstock】" + ex.Message); + Logger.LogError("【RackInstock】" + ex.StackTrace); + await _db.Ado.RollbackTranAsync(); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + } }