diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 7048b44d..b8269f12 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -26,6 +26,7 @@ using Microsoft.Extensions.Logging; using NetTaste; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Npgsql; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Asn1.X509.Qualified; using Qiniu.Util; @@ -91,16 +92,16 @@ namespace Tnb.ProductionMgr private readonly IPrdInstockService _prdInstockService; private readonly ISqlSugarRepository _repository; private ISqlSugarClient db_Scantimer; - private readonly ISqlSugarClient db_CheckGettimer; - private readonly ISqlSugarClient db_SSXcodetimer; - private readonly ISqlSugarClient db_BGWCarrySupplementtimer; - private readonly ISqlSugarClient db_YCLGLDPJInstocktimer; - private readonly ISqlSugarClient db_YCLWXDPJInstocktimer; + private ISqlSugarClient db_CheckGettimer; + private ISqlSugarClient db_SSXcodetimer; + private ISqlSugarClient db_BGWCarrySupplementtimer; + private ISqlSugarClient db_YCLGLDPJInstocktimer; + private ISqlSugarClient db_YCLWXDPJInstocktimer; private ISqlSugarClient db_Floor2UpMachinecodetimer; - private readonly ISqlSugarClient db_Floor2timer送空托到上升降区; - private readonly ISqlSugarClient db_Floor2timer送满托到下升降区; - private readonly ISqlSugarClient db_Floor2timer移走上升降区未生成预任务且满托的料架; - private readonly ISqlSugarClient db_Floor2timer移走下升降区未生成预任务且空托的料架; + private ISqlSugarClient db_Floor2timer送空托到上升降区; + private ISqlSugarClient db_Floor2timer送满托到下升降区; + private ISqlSugarClient db_Floor2timer移走上升降区未生成预任务且满托的料架; + private ISqlSugarClient db_Floor2timer移走下升降区未生成预任务且空托的料架; private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; private readonly IUserManager _userManager; private readonly IBillRullService _billRullService; @@ -111,6 +112,14 @@ namespace Tnb.ProductionMgr private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); + static ConnectionStringsOptions connectionOpts = App.GetConfig("ConnectionStrings", true); + static ConnectionConfig cfg = new() + { + ConfigId = connectionOpts.ConfigId, + ConnectionString = connectionOpts.ConnectString, + DbType = SqlSugar.DbType.PostgreSQL, + IsAutoCloseConnection = true, + }; #endregion #region 构造函数 @@ -226,6 +235,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } } + catch(NpgsqlException ex) + { + Console.WriteLine("【CheckGet】" + ex.Message); + LoggerSSX.LogError(ex.ToString()); + //db_CheckGettimer = new SqlSugarClient(cfg); + } catch (Exception ex) { Console.WriteLine("【CheckGet】" + ex.Message); @@ -950,19 +965,18 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA carryBindInput.carrystd_id = rack.carrystd_id; carryBindInput.source_code = target.outbill; - Tnb.WarehouseMgr.Entities.Dto.Outputs.Result bindResult = await _wmsCarryBindService.CarryBind(carryBindInput); + int row = await db_Floor2UpMachinecodetimer.Updateable().SetColumns(r => r.carry_status == ((int)(EnumCarryStatus.齐套)).ToString()).Where(r => r.id == target.rackid).ExecuteCommandAsync(); + if (row == 0) + { + throw new Exception($"【上升降机】料架{target.rackcode}状态回写失败"); + } + + WarehouseMgr.Entities.Dto.Outputs.Result bindResult = await _wmsCarryBindService.CarryBind(carryBindInput, db_Floor2UpMachinecodetimer); if (bindResult.code != JNPF.Common.Enums.HttpStatusCode.OK) { throw new Exception(bindResult.msg); } - // 开始码垛 - bool result_开始码垛 = await Floor2UpDownMachinecode_SetTag(MechanicalArmConsts.上升降机当前码垛位, target.stackingposition.ToString()); - LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】码垛结果 {result_开始码垛}"); - if (!result_开始码垛) - { - throw new Exception($@"【上升降机】码垛结果 {result_开始码垛}"); - } // 回写料箱条码、码垛计数 await db_Floor2UpMachinecodetimer.Updateable().SetColumns(r => new WmsMechanicalArmH { @@ -980,15 +994,25 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】回写转库单的剩余可绑定料架数量"); + // 开始码垛 + bool result_开始码垛 = await Floor2UpDownMachinecode_SetTag(MechanicalArmConsts.上升降机当前码垛位, target.stackingposition.ToString()); + LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】码垛结果 {result_开始码垛}"); + if (!result_开始码垛) + { + throw new Exception($@"【上升降机】码垛结果 {result_开始码垛}"); + } + await db_Floor2UpMachinecodetimer.Ado.CommitTranAsync(); } } catch (Exception ex) { // 测试代码 无问题后期删 - if (ex.Message.Contains("Connection is busy")) + if (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 +1063,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 +1188,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"]); } @@ -1193,6 +1217,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return; } + await db_Floor2timer送满托到下升降区.Ado.BeginTranAsync(); // 料架区 foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) @@ -1214,7 +1239,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA var item = r.FirstOrDefault(); // 空载具入库: 前面通过OrderBy(d => d.id)对WmsCarryCode_id进行了排序 那么如果第一行有数据则说明存在非空料箱 // 没有物料且没有退料标记的不满足出库条件 - if (!string.IsNullOrEmpty(item.WmsCarryCode_id) && (item.wmsCarryH.need_return == 0 || item.wmsCarryH.need_return == null)) + if (!string.IsNullOrEmpty(item.WmsCarryCode_id) && item.wmsCarryH.carry_status != ((int)(EnumCarryStatus.退料)).ToString()) { return new BasLocation(); } @@ -1275,11 +1300,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 开始生成预任务 起点{startLocation.location_code} 终点{wmsMechanicalArmH.location_code} 料架 {targetCarry.carry_code}"); - await db_Floor2timer送满托到下升降区.Updateable().SetColumns(r => new WmsCarryH - { - need_return = 0 - }).Where(r => r.id == targetCarry.id).ExecuteCommandAsync(); - bool result = await createPretask(startLocation.id, wmsMechanicalArmH.location_id, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery, db_Floor2timer送满托到下升降区); if (!result) { @@ -1329,12 +1349,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 +1455,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 +1475,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 @@ -1480,13 +1500,20 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BasLocation endLocation = rackEndLocations.First(); + int row = await db_Floor2timer移走下升降区未生成预任务且空托的料架.Updateable().SetColumns(r => r.carry_status == "0").Where(r => r.id == wmsMechanicalArmH.rackid).ExecuteCommandAsync(); + + if (row == 0) + { + throw new Exception($"【移走下升降区空托的料架】料架{wmsMechanicalArmH.rackcode}状态回写失败"); + } + // 解除绑定料箱到料架 CarryBindInput carryBindInput = new() { }; carryBindInput.carry_id = wmsMechanicalArmH.rackid; carryBindInput.carry_code = wmsMechanicalArmH.rackcode; carryBindInput.source_code = wmsMechanicalArmH.outbill; - Tnb.WarehouseMgr.Entities.Dto.Outputs.Result unbindResult = await _wmsCarryUnbindService.CarryUnbind(carryBindInput); + Tnb.WarehouseMgr.Entities.Dto.Outputs.Result unbindResult = await _wmsCarryUnbindService.CarryUnbind(carryBindInput, db_Floor2timer移走下升降区未生成预任务且空托的料架); if (unbindResult.code != JNPF.Common.Enums.HttpStatusCode.OK) { throw new Exception(unbindResult.msg); @@ -1506,8 +1533,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) @@ -1666,6 +1693,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA #endregion + #endregion public Task StartAsync(CancellationToken cancellationToken) @@ -1692,6 +1720,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Floor2timer移走上升降区未生成预任务且满托的料架 = new Timer(移走上升降区未生成预任务且满托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); Floor2timer移走下升降区未生成预任务且空托的料架 = new Timer(移走下升降区未生成预任务且空托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + return Task.CompletedTask; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index 4ef76273..35e062e1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -18,6 +18,16 @@ /// 成品仓库ID /// public const string WAREHOUSE_CP_ID = "26103372441637"; + /// + /// 成品出入库仓库ID + /// + public const string WAREHOUSE_CPCRK_ID = "35302142874901"; + /// + /// 暂存仓仓库ID + /// + public const string WAREHOUSE_ZCC_ID = "33780009364245"; + + /// /// 四楼解析库 /// @@ -31,6 +41,22 @@ /// public const string WAREHOUSE_ZZXBK_ID = "26257716248101"; + /// + /// 长管出库 + /// + public const string MATERIALTRANSFER_CGCK_CODE = "longWarehouse"; + /// + /// 外协调拨入库 + /// + public const string MATERIALTRANSFER_WXDBRK_CODE = "wxdbWarehouse"; + /// + /// 集中供料入库 + /// + public const string MATERIALTRANSFER_JZGLRK_CODE = "materielWarehouse"; + /// + /// 齐套出入库 + /// + public const string MATERIALTRANSFER_QTCRK_CODE = "assortWarehouse"; /// /// 出入库单据状态TypeID @@ -326,6 +352,10 @@ /// public const string AdministratorOrgId = "25193668006933"; /// + /// ERPId(天益4厂) + /// + public const string ErpUserId = "34995305856535"; + /// /// 盘点任务计算状态-未结算 /// public const string CLOSINGSTATUS_WJS_ID = "27674058079509"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/MaterialTransferInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/MaterialTransferInput.cs index 06a7195c..433b7465 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/MaterialTransferInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/MaterialTransferInput.cs @@ -16,7 +16,7 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// /// 单据状态 /// - public string? biil_status { get; set; } + public string? bill_status { get; set; } /// /// 入库单创建日期 @@ -63,6 +63,11 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// public DateTime arrival_date { get; set; } + /// + /// 主表主键 + /// + public string erp_pk { get; set; } + public List details { get; set; } } public class MaterialTransferDetail @@ -77,11 +82,6 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// public string? material_code { get; set; } - /// - /// 规格型号 - /// - public string material_specification { get; set; } - /// /// 单位代码 /// @@ -103,8 +103,8 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs public decimal? qty { get; set; } /// - /// 物料描述 + /// 子表主键 /// - public string? material_ex { get; set; } + public string erp_line_pk { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSortInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSortInput.cs index 4d6d14c2..9e964929 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSortInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSortInput.cs @@ -6,8 +6,8 @@ public class FinishproductOutstockSignInput { /// - /// 起点 + /// 载具编号 /// - public string? location_id { get; set; } + public string? carry_code { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/WareHouseUpInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/WareHouseUpInput.cs index 43cc97aa..c3b2071d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/WareHouseUpInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/WareHouseUpInput.cs @@ -38,6 +38,14 @@ /// 载具 /// public List carryIds { get; set; } + /// + /// 任务执行单号 + /// + public string bill_code { get; set; } + /// + /// 任务执行区域 + /// + public string area_code { get; set; } 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.Entities/Entity/WmsCarryH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs index f4725c05..c83331eb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs @@ -139,10 +139,5 @@ public partial class WmsCarryH : BaseEntity /// 配送工位 /// public string? work_station { get; set; } - - /// - /// 需要退料 - /// - public int need_return { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransfer.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransfer.cs index a02aa0f3..96500bdf 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransfer.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransfer.cs @@ -124,4 +124,18 @@ public partial class WmsMaterialTransfer : BaseEntity /// public int? remainbindracknum { get; set; } + /// + /// erp转库单号 + /// + public string? erp_bill_code { get; set; } + + /// + /// 转库类型 + /// + public string? transfer_type { get; set; } + + /// + /// 主表主键 + /// + public string erp_pk { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs index 2a51b331..ccfcfe42 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs @@ -92,5 +92,8 @@ public partial class WmsMaterialTransferD : BaseEntity /// public string? material_ex { get; set; } - + /// + /// 子表主键 + /// + public string erp_line_pk { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCarryStatus.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCarryStatus.cs index 65a82d3b..7c76cd7f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCarryStatus.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCarryStatus.cs @@ -10,5 +10,6 @@ 齐套 = 3, 寄存 = 4, 齐套分拣 = 5, + 退料 = 6, } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs index f2ad3bcb..1cfcb722 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); /// /// 出库策略-销售出库下发 @@ -133,7 +133,7 @@ namespace Tnb.WarehouseMgr.Interfaces /// // 二楼机械臂 /// /// - Task Floor2MechanicalComplete(WmsDistaskH disTask, string action); + Task Floor2MechanicalConfirm(WmsDistaskH disTask, string action); /// /// 二楼kiva把料架送到下升降机后生成中储仓入库任务 diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs index 66161ecd..ce94d5fa 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs @@ -1,4 +1,5 @@ using JNPF.Common.Dtos.VisualDev; +using SqlSugar; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Dto.Outputs; @@ -11,6 +12,6 @@ namespace Tnb.WarehouseMgr.Interfaces { Task CarryBind(VisualDevModelDataCrInput input); - Task CarryBind(CarryBindInput input); + Task CarryBind(CarryBindInput input, ISqlSugarClient dbConn = null); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs index 45179184..767b00c7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs @@ -1,4 +1,5 @@ using JNPF.Common.Dtos.VisualDev; +using SqlSugar; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Dto.Outputs; @@ -9,7 +10,7 @@ namespace Tnb.WarehouseMgr.Interfaces /// public interface IWmsCarryUnbindService { - Task CarryUnbind(CarryBindInput input); - Task CarryCodeUnbind(CarryCodeUnbindInput input); + Task CarryUnbind(CarryBindInput input, ISqlSugarClient dbConn = null); + Task CarryCodeUnbind(CarryCodeUnbindInput input, ISqlSugarClient dbConn = null); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 3b94f7c9..5a4eab3a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -106,6 +106,20 @@ namespace Tnb.WarehouseMgr return await ToApiResult(HttpStatusCode.InternalServerError, "失败"); } } + // 机械臂边取货确认 + else if (dis.area_code == "E") + { + if (dis.startlocation_code.Contains("AS") || dis.startlocation_code.Contains("AX")) + { + // 二楼机械臂 + await _wareHouseService.Floor2MechanicalConfirm(dis, "LOAD"); + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + else + { + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + } } catch (Exception ex) { @@ -255,20 +269,49 @@ namespace Tnb.WarehouseMgr { Logger.Information("【UnloadConfirm】 接收到WCS放货确认信号.................."); Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode}"); - var dis = _db.Queryable().Where(P => P.bill_code == input.taskCode).First(); - if (dis.area_code == "ZSCJ001") + + try { - var flag = await _wareHouseService.Check(dis.endlocation_code, "UNLOAD"); - if (flag) + var dis = _db.Queryable().Where(P => P.bill_code == input.taskCode).First(); + if (dis.area_code == "ZSCJ001") { - await _wareHouseService.SsxControl(dis, "UNLOAD"); - return await ToApiResult(HttpStatusCode.OK, "成功"); + var flag = await _wareHouseService.Check(dis.endlocation_code, "UNLOAD"); + if (flag) + { + await _wareHouseService.SsxControl(dis, "UNLOAD"); + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + else + { + return await ToApiResult(HttpStatusCode.InternalServerError, "失败"); + } } - else + // 机械臂边放货确认 + else if (dis.area_code == "E") { - return await ToApiResult(HttpStatusCode.InternalServerError, "失败"); + if (dis.endlocation_code.Contains("AS") || dis.endlocation_code.Contains("AX")) + { + // 二楼机械臂 + await _wareHouseService.Floor2MechanicalConfirm(dis, "UNLOAD"); + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + else + { + return await ToApiResult(HttpStatusCode.OK, "成功"); + } } } + catch (Exception ex) + { + Logger.LogError(ex.Message); + Logger.LogError(ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, $"放货确认..................失败 原因是{ex.Message}"); + throw; + } + + + + try { /*var whereExp = Expressionable.Create() @@ -598,8 +641,6 @@ namespace Tnb.WarehouseMgr else { await _wareHouseService.SsxControl(disTask, "LOAD"); - // 二楼机械臂 - await _wareHouseService.Floor2MechanicalComplete(disTask, "LOAD"); } } else if (input.action == "UNLOAD") @@ -612,8 +653,6 @@ namespace Tnb.WarehouseMgr Logger.Information($"taskCompleUpInput json parameter:{JsonConvert.SerializeObject(taskCompleUpInput)}"); await _wareHouseService.TaskComplate(taskCompleUpInput); await _wareHouseService.SsxControl(disTask, "UNLOAD"); - // 二楼机械臂 - await _wareHouseService.Floor2MechanicalComplete(disTask, "UNLOAD"); Logger.Information($"【TaskCallback】 Agv放货完成,任务编号:{string.Join(",", disTasks.Select(x => x.bill_code))}"); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs index 43a7fe3d..d4062db9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs @@ -1,13 +1,21 @@ -using JNPF.DependencyInjection; +using System.Text; +using JNPF.Common.Enums; +using JNPF.DependencyInjection; using JNPF.DynamicApiController; +using JNPF.FriendlyException; using JNPF.Systems.Interfaces.System; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto.ErpInputs; +using Tnb.WarehouseMgr.Entities.Dto.Outputs; using Tnb.WarehouseMgr.Entities.Entity; +using Top.Api; namespace Tnb.WarehouseMgr { @@ -284,55 +292,193 @@ namespace Tnb.WarehouseMgr /// /// 转库单 /// - public async Task MaterialTransfer(MaterialTransferInput input) + [HttpPost, NonUnify, AllowAnonymous] + public async Task MaterialTransfer(MaterialTransferInput input) { + LoggerErp2Mes.LogInformation($"【MaterialTransfer】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); - WmsMaterialTransfer wmsMaterialTransfer = new WmsMaterialTransfer(); - string Code = await _billRuleService.GetBillNumber("MaterialTransfer"); - wmsMaterialTransfer.bill_code = Code; - wmsMaterialTransfer.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; - wmsMaterialTransfer.bill_date = input.bill_date; - wmsMaterialTransfer.warehouse_outstock = input.warehouse_outstock; - wmsMaterialTransfer.warehouse_instock = input.warehouse_instock; - wmsMaterialTransfer.biller_out = input.biller_out; - wmsMaterialTransfer.depart_out = input.depart_out; - wmsMaterialTransfer.biller_in = input.biller_in; - wmsMaterialTransfer.depart_in = input.depart_in; - wmsMaterialTransfer.deliver_date = input.deliver_date; - wmsMaterialTransfer.arrival_date = input.arrival_date; - wmsMaterialTransfer.create_id = ""; - wmsMaterialTransfer.create_time = DateTime.Now; - wmsMaterialTransfer.org_id = WmsWareHouseConst.AdministratorOrgId; - await db.Insertable(wmsMaterialTransfer).ExecuteCommandAsync(); - - - List wmsMaterialTransferDs = new List(); - foreach (var detail in input.details) + BasWarehouse warehouse_outstock = await db.Queryable().Where(r => r.whcode == input.warehouse_outstock).FirstAsync(); + BasWarehouse warehouse_instock = await db.Queryable().Where(r => r.whcode == input.warehouse_instock).FirstAsync(); + if (warehouse_outstock == null) { - WmsMaterialTransferD wmsMaterialTransferD = new WmsMaterialTransferD(); - wmsMaterialTransferD.lineno = detail.lineno; - wmsMaterialTransferD.material_code = detail.material_code; - wmsMaterialTransferD.material_specification = detail.material_specification; - wmsMaterialTransferD.unit_code = detail.unit_code; - wmsMaterialTransferD.code_batch = detail.code_batch; - wmsMaterialTransferD.station_code = detail.station_code; - wmsMaterialTransferD.qty = detail.qty; - wmsMaterialTransferD.bill_id = ""; - wmsMaterialTransferD.material_specification = detail.material_ex; - - var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); - if (material != null) - { - //wmsPurchased.material_id = material.id; - //// wmsPurchased.material_name = material.name; - //wmsPurchased.unit_id = material.unit_id; - } - wmsMaterialTransferDs.Add(wmsMaterialTransferD); + _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{input.warehouse_outstock}的档案记录!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{input.warehouse_outstock}的档案记录!"); + } + if (warehouse_instock == null) + { + _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到入库仓库{input.warehouse_instock}的档案记录!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到入库仓库{input.warehouse_instock}的档案记录!"); } - await db.Insertable(wmsMaterialTransferDs).ExecuteCommandAsync(); + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【MaterialTransfer】主表主键不能为空!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!"); + } + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + string transfer_type = ""; + // 中储仓到暂存仓 + if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZCC_ID) + { + int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count(); + if (count > 0) + { + _LoggerErp2Mes.LogWarning($@"表体存在未填写工位的明细!"); + throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500); + } + + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CGCK_CODE; + } + else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID) + { + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBRK_CODE; + } + else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_JZGL_ID) + { + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_JZGLRK_CODE; + } + // 暂时其他情况都算齐套出入库类型(未定) + else + { + int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count(); + if (count > 0) + { + _LoggerErp2Mes.LogWarning($@"表体存在未填写工位的明细!"); + throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500); + } + + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_QTCRK_CODE; + } + + try + { + await db.Ado.BeginTranAsync(); + WmsMaterialTransfer wmsMaterialTransfer = new WmsMaterialTransfer(); + string Code = await _billRuleService.GetBillNumber("MaterialTransfer"); + wmsMaterialTransfer.bill_code = Code; + wmsMaterialTransfer.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; + wmsMaterialTransfer.bill_date = input.bill_date; + wmsMaterialTransfer.warehouse_outstock = warehouse_outstock.id; + wmsMaterialTransfer.warehouse_instock = warehouse_instock.id; + wmsMaterialTransfer.biller_out = input.biller_out; + wmsMaterialTransfer.depart_out = input.depart_out; + wmsMaterialTransfer.biller_in = input.biller_in; + wmsMaterialTransfer.depart_in = input.depart_in; + wmsMaterialTransfer.deliver_date = input.deliver_date; + wmsMaterialTransfer.arrival_date = input.arrival_date; + wmsMaterialTransfer.create_id = WmsWareHouseConst.ErpUserId; + wmsMaterialTransfer.create_time = DateTime.Now; + wmsMaterialTransfer.org_id = WmsWareHouseConst.AdministratorOrgId; + wmsMaterialTransfer.erp_bill_code = input.bill_code; + wmsMaterialTransfer.transfer_type = transfer_type; + wmsMaterialTransfer.erp_pk = input.erp_pk; + + await db.Insertable(wmsMaterialTransfer).ExecuteCommandAsync(); + + List wmsMaterialTransferDs = new List(); + foreach (var detail in input.details) + { + WmsMaterialTransferD wmsMaterialTransferD = new WmsMaterialTransferD(); + wmsMaterialTransferD.lineno = detail.lineno; + wmsMaterialTransferD.material_code = detail.material_code; + wmsMaterialTransferD.unit_code = detail.unit_code; + wmsMaterialTransferD.code_batch = detail.code_batch; + wmsMaterialTransferD.station_code = detail.station_code; + wmsMaterialTransferD.qty = detail.qty; + wmsMaterialTransferD.bill_id = wmsMaterialTransfer.id; + + wmsMaterialTransferD.yxfqty = 0; + wmsMaterialTransferD.yzqty = 0; + wmsMaterialTransferD.erp_line_pk = detail.erp_line_pk; + + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsMaterialTransferD.material_id = material.id; + wmsMaterialTransferD.material_specification = material.material_specification; + wmsMaterialTransferD.unit_id = detail.unit_code; + } + wmsMaterialTransferDs.Add(wmsMaterialTransferD); + } + + await db.Insertable(wmsMaterialTransferDs).ExecuteCommandAsync(); + + await db.Ado.CommitTranAsync(); + + LoggerErp2Mes.LogInformation($"【MaterialTransfer】成功生成单据:{Code}"); + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + catch (Exception ex) + { + LoggerErp2Mes.LogError($"【MaterialTransfer】{ex.Message}"); + LoggerErp2Mes.LogError($"【MaterialTransfer】{ex.StackTrace}"); + await db.Ado.RollbackTranAsync(); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + + } + } + + protected Task ToApiResult(HttpStatusCode statusCode, string msg) + { + Result result = new() + { + code = statusCode, + msg = msg + }; + return Task.FromResult(result); + } + + private static readonly Dictionary s_logLevelMap = new() + { + [LogLevel.Debug] = "DBG", + [LogLevel.Information] = "INF", + [LogLevel.Warning] = "WRN", + [LogLevel.Error] = "ERR", + }; + + protected string _LoggerErp2MesFileName = ""; + protected ILogger _LoggerErp2Mes; + protected ILogger LoggerErp2Mes + { + get + { + string newFileName = $"{AppContext.BaseDirectory}/logs/Erp2Mes{DateTime.Now:yyyyMMdd}.log"; + if (_LoggerErp2MesFileName != newFileName) + { + ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts => + { + + //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff"; + cfgOpts.MessageFormat = (logMsg) => + { + var logLevel = s_logLevelMap[logMsg.LogLevel]; + var sb = new StringBuilder(); + _ = sb.Append($"[{logLevel}] "); + _ = sb.Append($"{logMsg.LogName} "); + _ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} "); + _ = sb.Append($"#{logMsg.EventId.Id} "); + _ = sb.Append(logMsg.Message + " "); + _ = sb.Append(logMsg.Exception?.ToString()); + return sb.ToString(); + }; + + })); + _LoggerErp2Mes = loggerFactory.CreateLogger(this.GetType()); + _LoggerErp2MesFileName = newFileName; + } + return _LoggerErp2Mes; + } } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index c195df5f..7d93a525 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; } /// @@ -811,7 +867,7 @@ namespace Tnb.WarehouseMgr /// 二楼机械臂 /// /// - public async Task Floor2MechanicalComplete(WmsDistaskH disTask, string action) + public async Task Floor2MechanicalConfirm(WmsDistaskH disTask, string action) { List rackAreaPointsUp = new List(); List rackAreaPointsDown = new List(); @@ -2138,7 +2194,7 @@ namespace Tnb.WarehouseMgr CarryCodeUnbindInput carryCodeUnbindInput = new CarryCodeUnbindInput(); carryCodeUnbindInput.carry_id = dt.carry_id; - await _wmsCarryUnbindService.CarryCodeUnbind(carryCodeUnbindInput); + await _wmsCarryUnbindService.CarryCodeUnbind(carryCodeUnbindInput, _db); } } // 成品调拨入库 @@ -2165,7 +2221,9 @@ namespace Tnb.WarehouseMgr List disTaskCodes = await _db.Queryable().Where(it => it.bill_id == dt.id).ToListAsync(); 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() }; + , source_code = dt.source_code!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList(), + bill_code = dt.bill_code!,area_code= dt.area_code! + }; /*if (!_userManager?.LoginType.IsNullOrEmpty() ?? false) { @@ -2982,6 +3040,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/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index cf5c3a07..8a2e275d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -199,10 +199,14 @@ namespace Tnb.WarehouseMgr /// /// [NonAction] - public async Task CarryBind(CarryBindInput input) + public async Task CarryBind(CarryBindInput input, ISqlSugarClient dbConn = null) { bool isOk = false; + var db = _db; + if (dbConn != null) + db = dbConn; + try { if (input == null) @@ -210,24 +214,24 @@ namespace Tnb.WarehouseMgr throw new ArgumentNullException(nameof(input)); } - await _db.Ado.BeginTranAsync(); - WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); - WmsCarryH? subCarry = await _db.Queryable().SingleAsync(it => it.id == input.membercarry_id); + await db.Ado.BeginTranAsync(); + WmsCarryH? carry = await db.Queryable().SingleAsync(it => it.id == input.carry_id); + WmsCarryH? subCarry = await db.Queryable().SingleAsync(it => it.id == input.membercarry_id); if (carry != null && subCarry != null) { // 插入子载具绑定记录 - VisualDevModelDataCrInput visualDevModelCrInput = new() { data = new Dictionary() }; - visualDevModelCrInput.data[nameof(WmsCarrybindH.carry_id)] = input.carry_id; - visualDevModelCrInput.data[nameof(WmsCarrybindH.carry_code)] = input.carry_code; - visualDevModelCrInput.data[nameof(WmsCarrybindH.membercarry_id)] = input.membercarry_id; - visualDevModelCrInput.data[nameof(WmsCarrybindH.membercarry_code)] = input.membercarry_code; - visualDevModelCrInput.data[nameof(WmsCarrybindH.type)] = 0; - visualDevModelCrInput.data[nameof(WmsCarrybindH.carrystd_id)] = carry.carrystd_id; - //visualDevModelCrInput.data[nameof(WmsCarrybindH.create_id)] = input.create_id; - visualDevModelCrInput.data[nameof(WmsCarrybindH.create_time)] = DateTime.Now; - visualDevModelCrInput.data[nameof(WmsCarrybindH.loc)] = 1; - VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCARRYBIND_ID, true); - await _runService.Create(templateEntity, visualDevModelCrInput); + //VisualDevModelDataCrInput visualDevModelCrInput = new() { data = new Dictionary() }; + //visualDevModelCrInput.data[nameof(WmsCarrybindH.carry_id)] = input.carry_id; + //visualDevModelCrInput.data[nameof(WmsCarrybindH.carry_code)] = input.carry_code; + //visualDevModelCrInput.data[nameof(WmsCarrybindH.membercarry_id)] = input.membercarry_id; + //visualDevModelCrInput.data[nameof(WmsCarrybindH.membercarry_code)] = input.membercarry_code; + //visualDevModelCrInput.data[nameof(WmsCarrybindH.type)] = 0; + //visualDevModelCrInput.data[nameof(WmsCarrybindH.carrystd_id)] = carry.carrystd_id; + ////visualDevModelCrInput.data[nameof(WmsCarrybindH.create_id)] = input.create_id; + //visualDevModelCrInput.data[nameof(WmsCarrybindH.create_time)] = DateTime.Now; + //visualDevModelCrInput.data[nameof(WmsCarrybindH.loc)] = 1; + //VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCARRYBIND_ID, true); + //await _runService.Create(templateEntity, visualDevModelCrInput); WmsCarryD wmsCarryD = new() { @@ -237,14 +241,14 @@ namespace Tnb.WarehouseMgr loc = 1, create_time = DateTime.Now }; - int row = await _db.Insertable(wmsCarryD).ExecuteCommandAsync(); + int row = await db.Insertable(wmsCarryD).ExecuteCommandAsync(); isOk = row > 0; if (!isOk) { throw Oops.Oh(ErrorCode.COM1001); } - await _db.Ado.CommitTranAsync(); + await db.Ado.CommitTranAsync(); Logger.LogError($"【CarryBind】 {input.membercarry_code}成功绑定到{input.carry_code}"); } else @@ -259,7 +263,7 @@ namespace Tnb.WarehouseMgr { Logger.LogError($"【CarryBind】 {ex.Message}"); Logger.LogError($"【CarryBind】 {ex.StackTrace}"); - await _db.Ado.RollbackTranAsync(); + await db.Ado.RollbackTranAsync(); return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs index ca0895b7..7719a691 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs @@ -129,9 +129,14 @@ namespace Tnb.WarehouseMgr /// /// [NonAction] - public async Task CarryUnbind(CarryBindInput input) + public async Task CarryUnbind(CarryBindInput input, ISqlSugarClient dbConn = null) { bool isOk = false; + + var db = _db; + if (dbConn != null) + db = dbConn; + try { if (input == null) @@ -139,17 +144,9 @@ namespace Tnb.WarehouseMgr throw new ArgumentNullException(nameof(input)); } - WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); + 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,7 +164,18 @@ namespace Tnb.WarehouseMgr //VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCARRYUNBIND_ID, true); //await _runService.Create(templateEntity, visualDevModelCrInput); - await _db.Ado.CommitTranAsync(); + + 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 { @@ -181,7 +189,7 @@ namespace Tnb.WarehouseMgr { Logger.LogError($"【CarryUnbind】 {ex.Message}"); Logger.LogError($"【CarryUnbind】 {ex.StackTrace}"); - await _db.Ado.RollbackTranAsync(); + await db.Ado.RollbackTranAsync(); return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); } @@ -196,9 +204,14 @@ namespace Tnb.WarehouseMgr /// /// [NonAction] - public async Task CarryCodeUnbind(CarryCodeUnbindInput input) + public async Task CarryCodeUnbind(CarryCodeUnbindInput input, ISqlSugarClient dbConn = null) { bool isOk = false; + + var db = _db; + if (dbConn != null) + db = dbConn; + try { if (input == null) @@ -206,16 +219,17 @@ namespace Tnb.WarehouseMgr throw new ArgumentNullException(nameof(input)); } - WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); + 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(); + int row = await db.Deleteable().Where(r => r.carry_id == input.carry_id).ExecuteCommandAsync(); isOk = row > 0; - if (!isOk) - { - throw Oops.Oh(ErrorCode.COM1001); - } + Logger.LogInformation($"【CarryCodeUnbind】载具{carry.carry_code}已解绑,解绑条数{row}"); + //if (!isOk) + //{ + // throw Oops.Oh(ErrorCode.COM1001); + //} } else { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs index 3a6838bf..7cb7678e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs @@ -196,10 +196,10 @@ namespace Tnb.WarehouseMgr //更新页面 //赋值签收状态 Logger.Information($"空载具出库生成的预任务数量:{preTasks.Count}"); - if (loc.is_sign == 0) - { - preTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值 - } + //if (loc.is_sign == 0) + //{ + // preTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值 + //} isOk = await _wareHouseService.GenPreTask(preTasks, null!); if (isOk) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 1430d565..d0bffb3d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -594,6 +594,7 @@ namespace Tnb.WarehouseMgr return; } await _db.Ado.BeginTranAsync(); + // 更新已转数量 bool isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty) }) .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync(); @@ -616,13 +617,16 @@ namespace Tnb.WarehouseMgr { throw Oops.Oh(ErrorCode.COM1001); } - await sign(input); + + if (input.area_code == "E") + await sign(input); + await _db.Ado.CommitTranAsync(); } catch(Exception ex) { - Logger.LogError("【WmsPrdReturnService ModifyAsync】" + ex.Message); - Logger.LogError("【WmsPrdReturnService ModifyAsync】" + ex.StackTrace); + Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.Message); + Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.StackTrace); await _db.Ado.RollbackTranAsync(); } } @@ -654,42 +658,39 @@ namespace Tnb.WarehouseMgr List wmsMaterialTransferds = _db.Queryable().Where(r => r.bill_id == input.source_id).ToList(); + int count = wmsMaterialTransferds.Where(r => string.IsNullOrEmpty(r.station_code)).Count(); + if (count > 0) + { + Logger.LogWarning($@"转库单{wmsMaterialTransfer.bill_code}表体存在未填写工位的明细!"); + throw new AppFriendlyException($@"转库单{wmsMaterialTransfer.bill_code}表体存在未填写工位的明细!", 500); + } + // 转库单载具子表 List wmsMaterialTransferCarrys = new List(); 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(); @@ -703,14 +704,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(); @@ -724,7 +720,7 @@ namespace Tnb.WarehouseMgr Logger.LogInformation($"【DistributeToZCC】更新转库单{wmsMaterialTransfer.bill_code}主表的数据"); await _db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync(); - Logger.LogInformation($"【DistributeToZCC插入转库单{wmsMaterialTransfer.bill_code}载具表的数据"); + Logger.LogInformation($"【DistributeToZCC】插入转库单{wmsMaterialTransfer.bill_code}载具表的数据"); foreach (WmsMaterialTransferCarry wmsMaterialTransferCarry in wmsMaterialTransferCarrys) { @@ -846,7 +842,7 @@ namespace Tnb.WarehouseMgr //BasLocation endlocation = _db.Queryable().Where(r => r.location_code == wmsCarryH.work_station).First(); - WmsPretaskH wmsPretaskH = _db.Queryable().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).First(); + WmsPretaskH wmsPretaskH = _db.Queryable().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID).First(); if (wmsPretaskH != null) { Logger.LogWarning($"【CallRackToProductionLine】此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!"); @@ -893,7 +889,8 @@ namespace Tnb.WarehouseMgr { try { - List wmsCarryHs = _db.Queryable().Where(r => r.work_station == input.work_station).ToList(); + List wmsCarryHs = _db.Queryable().Where(r => r.work_station == input.work_station && r.is_lock == 0 + && (r.carry_status == ((int)(EnumCarryStatus.占用)).ToString() || r.carry_status == ((int)(EnumCarryStatus.齐套)).ToString())).ToList(); if (string.IsNullOrEmpty(input.work_station)) { Logger.LogWarning($"【RackAndMatByWorkstation】工位不能为空!"); @@ -1053,7 +1050,7 @@ namespace Tnb.WarehouseMgr _carryBindInput.membercarry_id = membercarry.id; _carryBindInput.membercarry_code = membercarry.carry_code; _carryBindInput.carrystd_id = wmsCarryH.carrystd_id; - var resCarrybind = await _wmsCarryBindService.CarryBind(_carryBindInput); + var resCarrybind = await _wmsCarryBindService.CarryBind(_carryBindInput, _db); if (resCarrybind.code != JNPF.Common.Enums.HttpStatusCode.OK) { throw new AppFriendlyException($"绑定料箱到料架失败 载具 {input.carry_code}", 500); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs index ab216e5d..429f4798 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs @@ -1,4 +1,5 @@ -using JNPF.Common.Core.Manager; +using Aop.Api.Domain; +using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Enums; using JNPF.Common.Extension; @@ -10,6 +11,7 @@ using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Interfaces; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; @@ -377,9 +379,10 @@ namespace Tnb.WarehouseMgr [HttpPost, NonUnify, AllowAnonymous] public async Task FinishproductOutstockSign(FinishproductOutstockSignInput input) { - if (string.IsNullOrEmpty(input.location_id)) + Logger.LogInformation($"【FinishproductOutstockSign】载具签收 {input.carry_code}"); + if (string.IsNullOrEmpty(input.carry_code)) { - throw new AppFriendlyException("起点id不可为空", 500); + throw new AppFriendlyException("请扫描载具", 500); } //if (!_wareHouseService.GetFloor1OutstockLocation().Contains(input.location_id)) @@ -390,26 +393,51 @@ namespace Tnb.WarehouseMgr await _db.Ado.BeginTranAsync(); try { + WmsCarryH wmsCarryH = _db.Queryable().Where(r => r.carry_code == input.carry_code).First(); + + if (string.IsNullOrEmpty(wmsCarryH.location_id)) + { + Logger.Error($"【FinishproductOutstockSign】载具 {input.carry_code}没有当前库位 不能签收!"); + throw new AppFriendlyException("FinishproductOutstockSign】载具 {input.carry_code}没有当前库位 不能签收!", 500); + } + + await _db.Updateable().SetColumns(r => new WmsCarryH + { + is_lock = 0, + carry_status = "0" + }).Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); + await _db.Updateable().SetColumns(r => new BasLocation { is_lock = 0, is_use = "0" - }).Where(r => r.id == input.location_id).ExecuteCommandAsync(); + }).Where(r => r.id == wmsCarryH.location_id).ExecuteCommandAsync(); + BasLocation location = _db.Queryable().Where(r => r.id == wmsCarryH.location_id).First(); + if (string.IsNullOrEmpty(location.location_code)) + { + Logger.Error($"【FinishproductOutstockSign】库位id {wmsCarryH.location_id}没有对应的库位基础资料!"); + throw new AppFriendlyException("【FinishproductOutstockSign】库位id {wmsCarryH.location_id}没有对应的库位基础资料!", 500); + } await _db.Updateable().SetColumns(r => new WmsPointH { is_lock = 0 - }).Where(r => r.location_id == input.location_id).ExecuteCommandAsync(); + }).Where(r => r.location_id == location.id).ExecuteCommandAsync(); - WmsCarryH wmsCarryH = _db.Queryable().Where(r => r.location_id == input.location_id).First(); CarryCodeUnbindInput carryCodeUnbindInput = new CarryCodeUnbindInput(); carryCodeUnbindInput.carry_id = wmsCarryH.id; - await _wmsCarryUnbindService.CarryCodeUnbind(carryCodeUnbindInput); - + Tnb.WarehouseMgr.Entities.Dto.Outputs.Result result = await _wmsCarryUnbindService.CarryCodeUnbind(carryCodeUnbindInput, _db); + if (result.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.Error($"【FinishproductOutstockSign】载具 {input.carry_code}解绑失败!"); + throw new AppFriendlyException("【FinishproductOutstockSign】载具 {input.carry_code}解绑失败!", 500); + } await _db.Ado.CommitTranAsync(); } catch (Exception ex) { + Logger.Error($"【FinishproductOutstockSign】 {ex.Message}"); + Logger.Error($"【FinishproductOutstockSign】 {ex.StackTrace}"); await _db.Ado.RollbackTranAsync(); return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs index fae9cec3..707587ea 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAScanInStockService.cs @@ -574,7 +574,7 @@ namespace Tnb.WarehouseMgr ptc.code_batch = instockCode.code_batch; pretaskCodes.Add(ptc); } - bool isOk = await _wareHouseService.GenPreTask(preTasks, pretaskCodes); + bool isOk = await _wareHouseService.GenPreTask(preTasks, pretaskCodes, _dbScanInStockByRedis); if (isOk) { @@ -616,7 +616,7 @@ namespace Tnb.WarehouseMgr //回更状态 await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput, it => new WmsCarryH { carry_code = instock!.carry_code!, is_lock = 1, carry_status = ((int)EnumCarryStatus.占用).ToString(), location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode }, - it => new BasLocation { is_lock = 1 }); + it => new BasLocation { is_lock = 1 }, _dbScanInStockByRedis); _ = await _dbScanInStockByRedis.Updateable().SetColumns(it => new WmsInstockD { line_status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => instockCode.bill_d_id == it.id).ExecuteCommandAsync(); _ = await _dbScanInStockByRedis.Updateable().SetColumns(it => new WmsInstockH { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == instock!.id).ExecuteCommandAsync(); @@ -625,6 +625,7 @@ namespace Tnb.WarehouseMgr } await _dbScanInStockByRedis.Ado.CommitTranAsync(); } + // 测试代码 后期删 catch (AggregateException ex) { Console.WriteLine("【ScanInStockByRedis】 AggregateException" + ex.Message); @@ -637,7 +638,7 @@ namespace Tnb.WarehouseMgr { Logger.LogInformation($"【ScanInStockByRedis】 八工位扫到码发送入库请求发生异常:{ex.Message}"); - // 测试代码 + // 测试代码 后期删 if (ex.Message.Contains("Connection is busy")) _dbScanInStockByRedis = _dbScanInStockByRedis.CopyNew(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs index 515fb99a..befb0b8a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs @@ -25,9 +25,6 @@ using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr { - /// - /// 载具解绑 - /// [OverideVisualDev(ModuleConsts.MODULE_WMSPRDRETURN_ID)] [ServiceModule(BizTypeId)] public class WmsPrdReturnService : BaseWareHouseService, IWmsPrdReturnService @@ -169,19 +166,24 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料箱,请检查!{msg.Trim(',')}", 500); } - WmsPretaskH wmsPretaskH = _db.Queryable().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).First(); + WmsPretaskH wmsPretaskH = _db.Queryable().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID).First(); if (wmsPretaskH != null) { - Logger.LogWarning($"【CallRackToProductionLine】此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!"); + Logger.LogWarning($"【PrdReturn】此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!"); throw new AppFriendlyException($"此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!", 500); } await _db.Ado.BeginTranAsync(); // 标记为退料 - await _db.Updateable().SetColumns(r => r.need_return == 1).Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); + int row2= await _db.Updateable().SetColumns(r => r.carry_status == ((int)(EnumCarryStatus.退料)).ToString()).Where(r => r.carry_code == wmsCarryH.carry_code).ExecuteCommandAsync(); + if (row2 == 0) + { + throw new AppFriendlyException($"【PrdReturn】 料架 {wmsCarryH.carry_code} 退料状态回写失败", 500); + } + Logger.LogInformation($"【PrdReturn】料架 {wmsCarryH.carry_code} 退料状态回写成功!"); - Logger.LogWarning($"【RackEmptyInstock】绑定料箱到料架"); + Logger.LogInformation($"【PrdReturn】绑定料箱到料架"); List membercarrys = _db.Queryable().Where(r => input.details.Select(r => r.carry_code).Contains(r.carry_code)).ToList(); foreach (WmsCarryH membercarry in membercarrys) @@ -193,7 +195,7 @@ namespace Tnb.WarehouseMgr _carryBindInput.membercarry_id = membercarry.id; _carryBindInput.membercarry_code = membercarry.carry_code; _carryBindInput.carrystd_id = wmsCarryH.carrystd_id; - var resCarrybind = await _wmsCarryBindService.CarryBind(_carryBindInput); + var resCarrybind = await _wmsCarryBindService.CarryBind(_carryBindInput, _db); if (resCarrybind.code != JNPF.Common.Enums.HttpStatusCode.OK) { throw new AppFriendlyException($"绑定料箱到料架失败 载具 {input.carry_code}", 500); @@ -292,18 +294,23 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料架/载运小车,请检查!{msg.Trim(',')}", 500); } - WmsPretaskH wmsPretaskH = _db.Queryable().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).First(); + WmsPretaskH wmsPretaskH = _db.Queryable().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID).First(); if (wmsPretaskH != null) { - Logger.LogWarning($"【CallRackToProductionLine】此料架/载运小车{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!"); + Logger.LogWarning($"【PrdReturn】此料架/载运小车{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!"); throw new AppFriendlyException($"此料架/载运小车{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!", 500); } await _db.Ado.BeginTranAsync(); // 标记为退料 - await _db.Updateable().SetColumns(r => r.need_return == 1).Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); + int row2 =await _db.Updateable().SetColumns(r => r.carry_status == ((int)(EnumCarryStatus.退料)).ToString()).Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); + if (row2 == 0) + { + throw new AppFriendlyException($"【PrdReturn】 料架 {wmsCarryH.carry_code} 退料状态回写失败", 500); + } + Logger.LogInformation($"【PrdReturn】料架 {wmsCarryH.carry_code} 退料状态回写成功!"); - Logger.LogWarning($"【PrdReturn】开始生成预任务"); + Logger.LogInformation($"【PrdReturn】开始生成预任务"); CommonCreatePretaskInput commonCreatePretaskInput = new(); commonCreatePretaskInput.startlocation_id = startlocation.id; commonCreatePretaskInput.endlocation_id = endlocation.id; 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" } diff --git a/system/Tnb.Systems/System/BillRuleService.cs b/system/Tnb.Systems/System/BillRuleService.cs index bd3dd45a..d60eacca 100644 --- a/system/Tnb.Systems/System/BillRuleService.cs +++ b/system/Tnb.Systems/System/BillRuleService.cs @@ -67,7 +67,6 @@ public class BillRuleService : IBillRullService, IDynamicApiController, ITransie _fileManager = fileManager; } - public SemaphoreSlim s_getBillNumber = new(1); #region Get @@ -278,8 +277,6 @@ public class BillRuleService : IBillRullService, IDynamicApiController, ITransie { try { - s_getBillNumber.WaitAsync(); - string cacheKey = string.Format("{0}{1}_{2}", CommonConst.CACHEKEYBILLRULE, _userManager.TenantId, _userManager.UserId + enCode); string strNumber = string.Empty; if (isCache) @@ -308,10 +305,6 @@ public class BillRuleService : IBillRullService, IDynamicApiController, ITransie Logging.Log.Error("【GetBillNumber】" + ex.StackTrace); throw; } - finally - { - s_getBillNumber.Release(); - } } #endregion @@ -325,48 +318,52 @@ public class BillRuleService : IBillRullService, IDynamicApiController, ITransie /// private async Task GetNumber(string enCode) { - StringBuilder strNumber = new StringBuilder(); - var entity = await _repository.GetFirstAsync(m => m.EnCode == enCode && m.DeleteMark == null); - if (entity != null) + using (ISqlSugarClient db = _repository.CopyNew()) { - // 处理隔天流水号归0 - if (entity.OutputNumber != null) + StringBuilder strNumber = new StringBuilder(); + var entity = db.Queryable().Where(m => m.EnCode == enCode && m.DeleteMark == null).ToList()[0]; + //var entity = await _repository.GetFirstAsync(m => m.EnCode == enCode && m.DeleteMark == null); + if (entity != null) { - var serialDate = entity.OutputNumber.Remove(entity.OutputNumber.Length - (int)entity.Digit).Replace(entity.Prefix, string.Empty); - var thisDate = entity.DateFormat == "no" ? string.Empty : DateTime.Now.ToString(entity.DateFormat); - if (serialDate != thisDate) + // 处理隔天流水号归0 + if (entity.OutputNumber != null) { - entity.ThisNumber = 0; + var serialDate = entity.OutputNumber.Remove(entity.OutputNumber.Length - (int)entity.Digit).Replace(entity.Prefix, string.Empty); + var thisDate = entity.DateFormat == "no" ? string.Empty : DateTime.Now.ToString(entity.DateFormat); + if (serialDate != thisDate) + { + entity.ThisNumber = 0; + } + else + { + entity.ThisNumber++; + } } else { - entity.ThisNumber++; + entity.ThisNumber = 0; } + + // 拼接单据编码 + // 前缀 + strNumber.Append(entity.Prefix); + if (entity.DateFormat != "no") + strNumber.Append(DateTime.Now.ToString(entity.DateFormat)); // 日期格式 + + var number = int.Parse(entity.StartNumber) + entity.ThisNumber; + strNumber.Append(number.ToString().PadLeft((int)entity.Digit, '0')); // 流水号 + entity.OutputNumber = strNumber.ToString(); + var str = strNumber.ToString(); + // 更新流水号 + await db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandHasChangeAsync(); } else { - entity.ThisNumber = 0; + strNumber.Append("单据规则不存在"); } - // 拼接单据编码 - // 前缀 - strNumber.Append(entity.Prefix); - if (entity.DateFormat != "no") - strNumber.Append(DateTime.Now.ToString(entity.DateFormat)); // 日期格式 - - var number = int.Parse(entity.StartNumber) + entity.ThisNumber; - strNumber.Append(number.ToString().PadLeft((int)entity.Digit, '0')); // 流水号 - entity.OutputNumber = strNumber.ToString(); - var str = strNumber.ToString(); - // 更新流水号 - await _repository.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandHasChangeAsync(); + return strNumber.ToString(); } - else - { - strNumber.Append("单据规则不存在"); - } - - return strNumber.ToString(); } #endregion } \ No newline at end of file