diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 7048b44d..82671083 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -986,9 +986,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA catch (Exception ex) { // 测试代码 无问题后期删 - if (ex.Message.Contains("Connection is busy")) + if (ex.Message.Contains("Connection is busy") || ex.Message.Contains("Exception while reading from stream")) { - db_Floor2UpMachinecodetimer = db_Floor2UpMachinecodetimer.CopyNew(); + LoggerFloor2UpDownMachine.LogError("【测试】重置连接"); + db_Floor2UpMachinecodetimer.Close(); + db_Floor2UpMachinecodetimer = _repository.CopyNew(); } LoggerFloor2UpDownMachine.LogError(ex.ToString()); @@ -1039,12 +1041,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA List configs_upMachine = new List(); if (await GetBoolTag("东面提升机输送线", $"上升降机请求送空托1")) { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】上升降机请求送空托1 true"); + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】上升降机请求送空托1 true"); configs_upMachine.Add(floor2mechanicalAtmDic["上升降机请求送空托1"]); } if (await GetBoolTag("东面提升机输送线", $"上升降机请求送空托2")) { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】上升降机请求送空托2 true"); + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】上升降机请求送空托2 true"); configs_upMachine.Add(floor2mechanicalAtmDic["上升降机请求送空托2"]); } @@ -1164,12 +1166,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA List configs_upMachine = new List(); if (await GetBoolTag("东面提升机输送线", $"下升降机请求送满托1")) { - LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】下升降机请求送满托1 true"); + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】下升降机请求送满托1 true"); configs_upMachine.Add(floor2mechanicalAtmDic["下升降机请求送满托1"]); } if (await GetBoolTag("东面提升机输送线", $"下升降机请求送满托2")) { - LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】下升降机请求送满托2 true"); + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】下升降机请求送满托2 true"); configs_upMachine.Add(floor2mechanicalAtmDic["下升降机请求送满托2"]); } @@ -1329,12 +1331,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA List configs_upMachine = new List(); if (await GetBoolTag("东面提升机输送线", $"上升降机请求取满托1")) { - LoggerFloor2RackDelivery.LogError($"【移走上升降区未生成预任务且满托的料架】上升降机请求取满托1 true"); + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区未生成预任务且满托的料架】上升降机请求取满托1 true"); configs_upMachine.Add(floor2mechanicalAtmDic["上升降机请求取满托1"]); } if (await GetBoolTag("东面提升机输送线", $"上升降机请求取满托2")) { - LoggerFloor2RackDelivery.LogError($"【移走上升降区未生成预任务且满托的料架】上升降机请求取满托2 true"); + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区未生成预任务且满托的料架】上升降机请求取满托2 true"); configs_upMachine.Add(floor2mechanicalAtmDic["上升降机请求取满托2"]); } @@ -1435,13 +1437,13 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA List configs_upMachine = new List(); if (await GetBoolTag("东面提升机输送线", $"下升降机请求取空托1")) { - LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】下升降机请求取空托1 true"); + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】下升降机请求取空托1 true"); configs_upMachine.Add(floor2mechanicalAtmDic["下升降机请求取空托1"]); } if (await GetBoolTag("东面提升机输送线", $"下升降机请求取空托2")) { - LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】下升降机请求取空托2 true"); + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】下升降机请求取空托2 true"); configs_upMachine.Add(floor2mechanicalAtmDic["下升降机请求取空托2"]); } @@ -1455,13 +1457,13 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA //await db.BeginTranAsync(); // 读取下升降机的左右料架区配置 - await db_Floor2timer移走下升降区未生成预任务且空托的料架.Ado.BeginTranAsync(); List WmsMechanicalArmHs = db_Floor2timer移走下升降区未生成预任务且空托的料架.Queryable().Where(r => !string.IsNullOrEmpty(r.rackcode) && r.iscreatepretask == 0 && configs_upMachine.Contains(r.name)).ToList(); foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) { LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成 {wmsMechanicalArmH.location_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); + await db_Floor2timer移走下升降区未生成预任务且空托的料架.Ado.BeginTranAsync(); await db_Floor2timer移走下升降区未生成预任务且空托的料架.Updateable().SetColumns(r => new WmsMechanicalArmH { iscreatepretask = 1 @@ -1506,8 +1508,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 未成功生成预任务 起点{wmsMechanicalArmH.location_code} 终点{endLocation.location_code} 料架 {wmsMechanicalArmH.rackcode}"); throw new Exception($"【移走下升降区空托的料架】 未成功生成预任务 起点{wmsMechanicalArmH.location_code} 终点{endLocation.location_code} 料架 {wmsMechanicalArmH.rackcode}"); } + await db_Floor2timer移走下升降区未生成预任务且空托的料架.Ado.CommitTranAsync(); } - await db_Floor2timer移走下升降区未生成预任务且空托的料架.Ado.CommitTranAsync(); } } catch (Exception ex) diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs new file mode 100644 index 00000000..540f2b1c --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs @@ -0,0 +1,54 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + public class OutStockStrategyZCC2Floor2Query + { + /// + /// 仓库Id + /// + public string warehouse_id { get; set; } + /// + /// 载具Id + /// + public string carry_id { get; set; } + /// + /// 载具规格Id + /// + public string carrystd_id { get; set; } + /// + /// 物料Id + /// + public string material_id { get; set; } + /// + /// 批次 + /// + public string code_batch { get; set; } + /// + /// 业务类型s + /// + public int BllType { get; set; } + + public int Size { get; set; } + + /// + /// 数量 + /// + public decimal qty { get; set; } + /// + /// 规格型号 + /// + public string? material_specification { get; set; } + /// + /// 箱号 + /// + public string? container_no { get; set; } + /// + /// + /// + public decimal? needOut { get; set; } + /// + /// + /// + public string? material_code { get; set; } + + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs index f2ad3bcb..3f17cc9c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs @@ -46,7 +46,7 @@ namespace Tnb.WarehouseMgr.Interfaces /// /// /// - Task> OutStockStrategyZCC2Floor2([FromQuery] OutStockStrategyQuery input); + Task>> OutStockStrategyZCC2Floor2([FromQuery] OutStockStrategyZCC2Floor2Query input); /// /// 出库策略-销售出库下发 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index c195df5f..93521e18 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -456,6 +456,7 @@ namespace Tnb.WarehouseMgr .Select() .ToListAsync(); + items = items.Distinct().ToList(); return input.Size > 0 ? items.Take(input.Size).ToList() : items; } @@ -466,7 +467,7 @@ namespace Tnb.WarehouseMgr /// /// /// - public async Task> OutStockStrategyZCC2Floor2([FromQuery] OutStockStrategyQuery input) + public async Task>> OutStockStrategyZCC2Floor2([FromQuery] OutStockStrategyZCC2Floor2Query input) { Expressionable whereExprable = Expressionable.Create() .And((a, b, c) => a.is_lock == 0 && c.is_lock == 0) @@ -492,17 +493,72 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException("没有可用策略", 500); } - List items = await cyDb.Queryable().LeftJoin((a, b) => a.id == b.carry_id) + #region 只解决少数情况(比如只有60 59 60 60四个料箱,下发180,要取60 60 60) 其它情况不考虑 + 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(policy.policy) + .OrderBy("codeqty desc,a.location_code,layers,loc_line,loc_column") - .Select() + .Select((a, b) => new { wmsCarryH = a, wmsCarryCode = b }) .ToListAsync(); + //items = itemsASC.Count < itemsDESC.Count ? itemsASC : itemsDESC; - items = items.Distinct().ToList(); - return input.Size > 0 ? items.Take(input.Size).ToList() : items; + itemsASC = itemsASC.Distinct().ToList(); + + List>? carrys = new List>(); + + for (int i = 0; i < itemsASC.Count; i++) + { + WmsCarryH wmsCarryH = itemsASC[i].wmsCarryH; + WmsCarryCode wmsCarryCode = itemsASC[i].wmsCarryCode; + + if (input.needOut <= 0) + { + break; + } + + + // 查找是否有一个料箱可以正好满足剩余需求数量(目前只做这个额外判断,其它情形不考虑) + bool isFind = false; + for (int j = i + 1; j < itemsASC.Count; j++) + { + WmsCarryCode _wmsCarryCode = itemsASC[j].wmsCarryCode; + if (_wmsCarryCode.codeqty == input.needOut) + { + WmsCarryH _wmsCarryH = itemsASC[j].wmsCarryH; + + BasLocation _endlocation_ssx = await _db.Queryable().Where(r => new string[2] { "32609229889045", "32609238573589" }.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); + 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; + } + + } + if (isFind) + break; + + // 目前只支持一个料箱只有一个物料 + input.needOut -= wmsCarryCode.codeqty; + + BasLocation endlocation_ssx = await _db.Queryable().Where(r => new string[2] { "32609229889045", "32609238573589" }.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); + 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)); + } + #endregion + + if (input.needOut > 0) + { + throw new AppFriendlyException($"物料{input.material_code}没有足够的库存!,缺失数量为{input.needOut}", 500); + } + + + return carrys; } /// @@ -2982,6 +3038,8 @@ namespace Tnb.WarehouseMgr { Logger.LogInformation($"【CommonCreatePretask】 {ex.Message}"); Logger.LogInformation($"【CommonCreatePretask】 {ex.StackTrace}"); + if (!db.Ado.Transaction.IsNull()) + await db.Ado.CommitTranAsync(); return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); } finally diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs index ca0895b7..1fa4ff41 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs @@ -142,14 +142,6 @@ namespace Tnb.WarehouseMgr WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); if (carry != null) { - int row = await _db.Deleteable().Where(r => r.carry_id == input.carry_id).ExecuteCommandAsync(); - isOk = row > 0; - - if (!isOk) - { - throw new Exception($"料架id{input.carry_id}载具解绑失败"); - } - // 插入子载具绑定记录 //VisualDevModelDataCrInput visualDevModelCrInput = new() { data = new Dictionary() }; @@ -167,6 +159,17 @@ namespace Tnb.WarehouseMgr //VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCARRYUNBIND_ID, true); //await _runService.Create(templateEntity, visualDevModelCrInput); + + int row = await _db.Deleteable().Where(r => r.carry_id == input.carry_id).ExecuteCommandAsync(); + //isOk = row > 0; + + //if (!isOk) + //{ + // throw new Exception($"料架id{input.carry_id}载具解绑失败"); + //} + Logger.LogInformation($"【CarryUnbind】料架{carry.carry_code}已解绑,解绑条数{row}"); + + await _db.Ado.CommitTranAsync(); } else diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index acbf33c1..f277db45 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -651,37 +651,27 @@ namespace Tnb.WarehouseMgr foreach (WmsMaterialTransferD wmsMaterialTransferD in wmsMaterialTransferds) { - //出库取起点,获取所有符合输入的载具规格的载具 - OutStockStrategyQuery OutStockStrategyInput = new() - { - warehouse_id = "2", - material_id = wmsMaterialTransferD.material_id, - code_batch = wmsMaterialTransferD.code_batch - }; - List? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput); - // 需要转库数量 decimal? needOut = wmsMaterialTransferD.qty; - foreach (WmsCarryH wmsCarryH in carrys) + //出库取起点,获取所有符合输入的载具规格的载具 + OutStockStrategyZCC2Floor2Query OutStockStrategyInput = new() { - if (needOut <= 0) - { - break; - } + warehouse_id = "2", + material_id = wmsMaterialTransferD.material_id, + code_batch = wmsMaterialTransferD.code_batch, + needOut = needOut, + material_code = wmsMaterialTransferD.material_code - List wmsCarryCodes = _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).ToList(); + }; + List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput); - WmsCarryCode wmsCarryCode = wmsCarryCodes.First(); - // 目前只支持一个料箱只有一个物料 - foreach (WmsCarryCode _wmsCarryCode in wmsCarryCodes) - { - needOut -= wmsCarryCode.codeqty; - } - - BasLocation endlocation_ssx = await _db.Queryable().Where(r => new string[2] { "32609229889045", "32609238573589" }.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); - await _db.Updateable().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync(); + foreach (var item in carrys) + { + WmsCarryH wmsCarryH = item.Item1; + decimal codeqty = item.Item2; + BasLocation endlocation_ssx = item.Item3; // 转库单载具子表 WmsMaterialTransferCarry wmsMaterialTransferCarry = new WmsMaterialTransferCarry(); @@ -695,14 +685,9 @@ namespace Tnb.WarehouseMgr wmsMaterialTransferCarry.startlocation_id = wmsCarryH.location_id; wmsMaterialTransferCarry.startlocation_code = wmsCarryH.location_code; wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id; - wmsMaterialTransferCarry.qty = wmsCarryCode.codeqty; + wmsMaterialTransferCarry.qty = codeqty; wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry); } - - if (needOut > 0) - { - throw new AppFriendlyException($"物料{wmsMaterialTransferD.material_code}没有足够的库存!,缺失数量为{needOut}", 500); - } } await _db.Ado.BeginTranAsync(); diff --git a/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json b/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json index cedc7a1b..b6af195c 100644 --- a/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json +++ b/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json @@ -20,7 +20,7 @@ //Oracle //"DefaultConnection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME={2})));User Id={3};Password={4}" //PostgreSQL - "DefaultConnection": "server={0};port={1};database={2};uid={3};pwd={4};pooling=true;" + "DefaultConnection": "server={0};port={1};database={2};uid={3};pwd={4};pooling=true;KeepAlive=60;ConnectionLifetime=300" //MySql //"DefaultConnection": "server={0};port={1};database={2};uid={3};pwd={4};sslmode=none;pooling=true;charset=utf8mb4;allowLoadLocalInfile=true;allowPublicKeyRetrieval=true" }