diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 702af71d..073b0d57 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -2084,10 +2084,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { if (s_agvElevatortaskDic.CurrentCount == 0) return; + + var floor3outstock = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3outstock").FirstAsync(); + if (floor3outstock != null && floor3outstock.value == "0") + return; await s_agvElevatortaskDic.WaitAsync(); try { + await db_agvElevatorTaskExceptionHandles.Ado.BeginTranAsync(); // 获取暂存区需要生成任务的库位 List agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable() .Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_use == "1" && r.is_lock == 0).ToListAsync(); @@ -2099,38 +2104,86 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA List> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList(); foreach (IGrouping group in elevatorTaskGroup) { - // 选一楼出货库位 - List outLocations = await db_agvElevatorTaskExceptionHandles.Queryable() - .Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0") - .OrderBy("task_nums, location_code").ToListAsync(); - - if (outLocations.Count == 0) - { - LoggerAgvElevatorTask.LogWarning($"一楼没有可用的出货库位"); - continue; - } - BasLocation outLocation = outLocations.FirstOrDefault(); - WmsPointH outPoint = await db_agvElevatorTaskExceptionHandles.Queryable().FirstAsync(it => it.location_id == outLocation.id); - List locs = group.ToList(); LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务"); for (int i = 0; i < locs.Count; i++) { + // 选一楼出货库位 + List outLocations = await db_agvElevatorTaskExceptionHandles.Queryable() + .Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0") + .OrderBy("location_code").ToListAsync(); + + if (outLocations.Count == 0) + { + LoggerAgvElevatorTask.LogWarning($"一楼没有可用的出货库位"); + continue; + } + BasLocation outLocation = outLocations.FirstOrDefault(); + WmsPointH outPoint = await db_agvElevatorTaskExceptionHandles.Queryable().FirstAsync(it => it.location_id == outLocation.id); + // 交替选择缓存区库位 var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3CurOutCacheLocation").FirstAsync(); if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右")) - { throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前出库分区 项配置错误!需要配置值为【3楼发货左】或【3楼发货右】", 500); - } BasLocation startloc = null; + // 如果没切换就是当前发货区 + string 切换发货区 = YCLInnerTransfer.value; if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID) { List locations = await db_agvElevatorTaskExceptionHandles.Queryable() .InnerJoin((a, b) => a.id == b.location_id) - .Where((a, b) => b.name == YCLInnerTransfer.value).OrderBy("a.location_code,a.is_lock,a.is_use,task_nums").ToListAsync(); + .Where((a, b) => b.name == YCLInnerTransfer.value && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync(); + startloc = locations.FirstOrDefault(); + #region 如果当前侧没有可用库位 切换另一侧继续发货,但是因为不能同时发两托同侧的货到同个电梯,所以必须保证当前优先级电梯是接第一托货 + // 交替出的时候可能会选不到库位,做特殊处理 + if (startloc == null) + { + LoggerAgvElevatorTask.LogInformation($"交替到{YCLInnerTransfer.value} 进行发货的时候,没有货物可以发"); + var _floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync(); + + 切换发货区 = YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左"; + LoggerAgvElevatorTask.LogInformation($"再次交替到{切换发货区} 进行发货"); + + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == 切换发货区) + .Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync(); + locations = await db_agvElevatorTaskExceptionHandles.Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .Where((a, b) => b.name == 切换发货区 && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync(); + + startloc = locations.FirstOrDefault(); + // 如果还是选不到 + if (startloc == null) + { + throw new Exception($"再次交替到{切换发货区} 进行发货,仍然没有货可发,属于暂存区数据异常"); + } + + var _floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync(); + // 如果当前优先级电梯是空托盘 切换发货区之后不需要切换电梯 + if (_floor3FirstSelectElevatorTasknums.value == "2") + { + LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}是空托盘 切换发货区之后不需要切换电梯"); + } + // 如果当前优先级电梯不是空托盘 切换发货区之后还需要切换电梯 + else + { + LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}不是空托盘 切换发货区之后还需要切换电梯"); + + string 切换电梯 = _floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3"; + LoggerAgvElevatorTask.LogInformation($"交替到{切换电梯} 进行发货"); + // 选择另一个电梯座位首选电梯 + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == 切换电梯) + .Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync(); + // 剩余可放托数 + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == "2") + .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); + } + + } + #endregion + } List wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.location_id == startloc.id).ToListAsync(); if (wmsCarryHs.Count > 1) @@ -2138,7 +2191,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}"); continue; } - if (wmsCarryHs.Count == 1) + if (wmsCarryHs.Count == 0) { LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘"); continue; @@ -2149,18 +2202,23 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 选电梯 if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID) { - List wmsElevatorHs = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.elevator_group == "2" && r.enabled == 1).ToListAsync(); + var floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync(); + var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync(); - foreach (WmsElevatorH _wmsElevatorH in wmsElevatorHs) + wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync(); + + floor3FirstSelectElevatorTasknums.value = (int.Parse(floor3FirstSelectElevatorTasknums.value) - 1).ToString(); + if (floor3FirstSelectElevatorTasknums.value == "0") { - // 加上暂存区到电梯的任务数 - List wmsPretaskHs = await db_agvElevatorTaskExceptionHandles.Queryable() - .Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID || r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.startlocation_id == startloc.id).ToListAsync(); - - _wmsElevatorH.carry_count += wmsPretaskHs.Count; + // 选择另一个电梯座位首选电梯 + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3")) + .Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync(); + // 重置为可放两托 + floor3FirstSelectElevatorTasknums.value = "2"; } - - wmsElevatorH = wmsElevatorHs.OrderBy(r => r.carry_count).FirstOrDefault(); + // 剩余可放托数 + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value) + .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); } string elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", ""); @@ -2192,7 +2250,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA WmsPretaskH preTask = new() { - org_id = _userManager!.User.OrganizeId, + org_id = WmsWareHouseConst.AdministratorOrgId, startlocation_id = sPoint?.location_id!, startlocation_code = sPoint?.location_code!, endlocation_id = ePoint?.location_id!, @@ -2235,7 +2293,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA }).Where(it => it.id == wmsCarryH.id).ExecuteCommandAsync(); } - await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == (YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左")) + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == (切换发货区 == "3楼发货左" ? "3楼发货右" : "3楼发货左")) .Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync(); //所有库位加锁 @@ -2249,6 +2307,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } } + + await db_agvElevatorTaskExceptionHandles.Ado.CommitTranAsync(); } } catch (ObjectDisposedException ex) @@ -2587,6 +2647,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA DateTime dateTime = DateTime.Now; WmsSterilizationInstockH wmsSterilizationInstockH = new WmsSterilizationInstockH(); + string code = await _billRullService.GetBillNumber("WmsSterilizationInstockH"); + wmsSterilizationInstockH.bill_code = code; wmsSterilizationInstockH.carry_id = wmsCarryH.id; wmsSterilizationInstockH.carry_code = wmsCarryH.carry_code; wmsSterilizationInstockH.location_id = endlocation.id; @@ -2868,7 +2930,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA public Task StartAsync(CancellationToken cancellationToken) { CheckGettimer = new Timer(CheckGet, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); - Scantimer = new Timer(ScanInStock, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); + Scantimer = new Timer(ScanInStock, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); SSXcodetimer = new Timer(SSXcode, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); // 八工位缓存区补充空托盘 BGWCarrySupplementtimer = new Timer(BGWCarrySupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); @@ -2893,15 +2955,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 停用 //PackOutstockServicetimer = new Timer(PackOutstockService, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); - Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); YCLInternalTransfertimer = new Timer(YCLInternalTransfer, null, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(185)); elevatorTimer = new Timer(ElevatorTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20)); - //agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20)); + agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20)); return Task.CompletedTask; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseQcrecord.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseQcrecord.cs new file mode 100644 index 00000000..8de1df42 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseQcrecord.cs @@ -0,0 +1,106 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 收货质检记录 +/// +[SugarTable("wms_purchase_qcrecord")] +public partial class WmsPurchaseQcrecord : BaseEntity +{ + public WmsPurchaseQcrecord() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// 来源单据 + /// + public string? type { get; set; } + + /// + /// 来源单号 + /// + public string? ori_bill_code { get; set; } + + /// + /// 来源明细id + /// + public string? ori_detail_id { get; set; } + + /// + /// 仓库 + /// + public string? warehouse_id { get; set; } + + /// + /// 物料id + /// + public string? material_id { get; set; } + + /// + /// 物料编码 + /// + public string? material_code { get; set; } + + /// + /// 物料名称 + /// + public string? material_name { get; set; } + + /// + /// 物料型号 + /// + public string? material_spec { get; set; } + + /// + /// 采购数量 + /// + public decimal? purchase_qty { get; set; } + + /// + /// 已到货数量 + /// + public decimal? purchase_prqty { get; set; } + + /// + /// 本次到货数量 + /// + public decimal? purchase_arriveqty { get; set; } + + /// + /// 质检结论 + /// + public string? result { get; set; } + + /// + /// 单位 + /// + public string? unit_id { get; set; } + + /// + /// 批次 + /// + public string? batchno { get; set; } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 7bfe5fb2..bd730732 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -541,7 +541,11 @@ namespace Tnb.WarehouseMgr Logger.Information($"未成功解锁起点库位{wmsDistaskH.startlocation_code}"); } - int unlockEndRow = await _db.Updateable().SetColumns(r => r.is_lock == 0).Where(r => r.location_code == wmsDistaskH.endlocation_code).ExecuteCommandAsync(); + int unlockEndRow = await _db.Updateable().SetColumns(r => new BasLocation + { + is_lock = 0, + task_nums = r.task_nums - 1, + }).Where(r => r.location_code == wmsDistaskH.endlocation_code).ExecuteCommandAsync(); if (unlockEndRow > 0) Logger.Information($"成功解锁终点库位{wmsDistaskH.endlocation_code}"); else @@ -668,7 +672,11 @@ namespace Tnb.WarehouseMgr Logger.Information($"未成功解锁起点库位{wmsDistaskH.startlocation_code}"); } - int unlockEndRow = await _db.Updateable().SetColumns(r => r.is_lock == 0).Where(r => r.location_code == wmsDistaskH.endlocation_code).ExecuteCommandAsync(); + int unlockEndRow = await _db.Updateable().SetColumns(r => new BasLocation + { + is_lock = 0, + task_nums = r.task_nums - 1, + }).Where(r => r.location_code == wmsDistaskH.endlocation_code).ExecuteCommandAsync(); if (unlockEndRow > 0) Logger.Information($"成功解锁终点库位{wmsDistaskH.endlocation_code}"); else diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index dd68cccf..228c9eb9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -1460,21 +1460,57 @@ namespace Tnb.WarehouseMgr !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)) .ToList(); + + var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); + var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList(); + + //Logger.Information("【GenTaskExecute】 电梯预任务elePreTasks:" + JsonConvert.SerializeObject(elePreTasks)); + //Logger.Information("【GenTaskExecute】 AGV/CTU/KIVA预任务normalPreTasks:" + JsonConvert.SerializeObject(normalPreTasks)); + //Logger.Information("【GenTaskExecute】 AGV电梯预任务agvElevatorTasks:" + JsonConvert.SerializeObject(agvElevatorTasks)); + + /* IEnumerable firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); + agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty().ToList()!; + */ + + //如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 + var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code)); + if (equalEndLocPreTasks.Any()) + { + Logger.Information("【GenTaskExecute】 执行:如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 "); + agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList(); + } + #region 三楼三四号梯如果与判断一托下有冲突 #region 电梯第三次改动 // 到暂存区的未完成任务 - List wmsdistasks_agvElevator = await _db.Queryable() + List wmsdistasks_agvElevator = await db.Queryable() .InnerJoin((a, b) => a.endlocation_id == b.id) - .Where((a, b) => a.status != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID && a.status != WmsWareHouseConst.BILLSTATUS_CANCEL_ID + .Where((a, b) => a.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && b.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID) .ToListAsync(); - // 过滤同目标库位的正在执行的预任务 - agvElevatorTasks = agvElevatorTasks.Where(r => !wmsdistasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList(); - // 过滤重复目标库位的预任务 - agvElevatorTasks = agvElevatorTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).ToList(); - #endregion + // 到暂存区的未完成预任务 + List wmspretasks_agvElevator = await db.Queryable() + .InnerJoin((a, b) => a.endlocation_id == b.id) + .InnerJoin((a, b, c) => a.area_id == c.id) + .Where((a, b) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID + && b.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && b.is_use == "0") + .Select((a, b, c) => new WmsPretaskH + { + move_num = c.move_num, + third_eqp_type = c.third_eqp_type, + }, true) + .ToListAsync(); + // 过滤normalPreTasks中的到三楼暂存区任务 + normalPreTasks = normalPreTasks.Where(r => !wmspretasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList(); + // 过滤到三楼暂存区同目标库位的正在执行的任务 + var cacheLocTasks = wmspretasks_agvElevator.Where(r => !wmsdistasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList(); + // 过滤重复目标库位的预任务 + cacheLocTasks = cacheLocTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).ToList(); + + normalPreTasks = normalPreTasks.Concat(cacheLocTasks).ToList(); + #endregion if (s_elevatortaskWCSRequestDic.Count > 0) { @@ -1512,27 +1548,12 @@ namespace Tnb.WarehouseMgr #endregion - - var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); - var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList(); - - //Logger.Information("【GenTaskExecute】 电梯预任务elePreTasks:" + JsonConvert.SerializeObject(elePreTasks)); - //Logger.Information("【GenTaskExecute】 AGV/CTU/KIVA预任务normalPreTasks:" + JsonConvert.SerializeObject(normalPreTasks)); - //Logger.Information("【GenTaskExecute】 AGV电梯预任务agvElevatorTasks:" + JsonConvert.SerializeObject(agvElevatorTasks)); - - /* IEnumerable firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); - agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty().ToList()!; - */ - - //如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 - var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code)); - if (equalEndLocPreTasks.Any()) - { - Logger.Information("【GenTaskExecute】 执行:如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 "); - agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList(); - } preTasks = normalPreTasks.Concat(agvElevatorTasks).Concat(elePreTasks).ToList(); + if (preTasks.Count() == 0) + return; + + //一楼中储仓CTU List ids = preTasks.Select(x => x.id).Distinct().ToList(); @@ -2354,8 +2375,29 @@ namespace Tnb.WarehouseMgr { Logger.Information($"通知WCS电梯{devName}下行接口调用成功"); } + + List carryHs = await db.Queryable().Where(r => disTasks.Select(r => r.carry_id).Contains(r.id)).ToListAsync(); + carryHs.ForEach(r => { + r.location_id = disTask.endlocation_id; + r.location_code = disTask.endlocation_code; + }); + await db.Updateable(carryHs).ExecuteCommandAsync(); + #region 电梯第三次改动 + + // 一托下的时候切换首选电梯 + if (disTaskIds.Count == 1) + { + // 选择另一个电梯座位首选电梯 + await db.Updateable().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3")) + .Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync(); + // 剩余可放托数 + await db.Updateable().SetColumns(r => r.value == "2") + .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); + } + + #endregion } - + } } catch { throw; } @@ -2802,7 +2844,7 @@ namespace Tnb.WarehouseMgr { id = multiList[i].endlocation_id, is_lock = 0, - carry_count = locCarrycountMap[endLocId] == null ? 1: int.Parse(locCarrycountMap[endLocId].ToString()) + 1, + carry_count = locCarrycountMap[endLocId] == null || string.IsNullOrEmpty(locCarrycountMap[endLocId].ToString()) ? 1: int.Parse(locCarrycountMap[endLocId].ToString()) + 1, is_use = string.IsNullOrEmpty(multiList[i].carry_status) ? ((int)EnumCarryStatus.占用).ToString() : multiList[i].carry_status }; if (!string.IsNullOrEmpty(multiList[i].carry_status)) @@ -2810,8 +2852,6 @@ namespace Tnb.WarehouseMgr loc.is_use = ((int)EnumCarryStatus.占用).ToString(); } - - // 如果是出入库位 完成后解除占用 string? is_type = locTypeMap.ContainsKey(endLocId) ? locTypeMap[endLocId].ToString() : ""; if (is_type == ((int)EnumLocationType.出入库位).ToString()) @@ -3197,7 +3237,7 @@ namespace Tnb.WarehouseMgr BasLocation endlocation = await _db.Queryable().InnerJoin((a, b) => a.id == b.location_id).Where((a, b) => b.id == pEndId).FirstAsync(); // 后续可整理成配置表 - #region 第二次改动弃用 + #region 电梯第三次次改动弃用 //if (startlocation.wh_id == WmsWareHouseConst.WAREHOUSE_CP_ID && endlocation.wh_id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID) //{ // WmsElevatorH wmsElevatorH = await _db.Queryable().Where(it => it.elevator_group == "2" && it.enabled == 1).OrderBy(r => r.task_nums).FirstAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs index f7ac1b94..db0fd55b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs @@ -169,18 +169,21 @@ namespace Tnb.WarehouseMgr CarryCodeUnbindCodeInput carryCodeUnbindCodeInput = new CarryCodeUnbindCodeInput(); carryCodeUnbindCodeInput.carry_code_id = wmsCarryCode.id; await _wmsCarryUnbindService.CarryCodeUnbindCode(carryCodeUnbindCodeInput, _db); - await _db.Updateable().SetColumns(r => r.carry_status == "0").Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); + } await _db.Updateable().SetColumns(r => r.codeqty == wmsCarryCode.codeqty) .Where(r => r.barcode == wmsCarryCode.barcode).ExecuteCommandAsync(); } + // 如果没有条码 设置载具状态为空闲 + List _wmsCarryCodes = _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).ToList(); + await _db.Updateable().SetColumns(r => r.carry_status == (_wmsCarryCodes.Count == 0 ? "0" : r.carry_status)).Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); switch (carryLoc.wh_id) { case WmsWareHouseConst.WAREHOUSE_YCL_ID: { - + await _db.Updateable(wmsCarryCodes).ExecuteCommandAsync(); await _wareHouseService.s_taskExecuteSemaphore_YCLInstock.WaitAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs index ca523a68..711ae5db 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutsourceService.cs @@ -81,10 +81,10 @@ namespace Tnb.WarehouseMgr try { await _db.Ado.BeginTranAsync(); - if (_db.Queryable().Where(it => input.BillId == it.require_id).Any()) - { - throw new AppFriendlyException("条码已生成", 500); - }; + //if (_db.Queryable().Where(it => input.BillId == it.require_id).Any()) + //{ + // throw new AppFriendlyException("条码已生成", 500); + //}; WmsOutsourceD WmsOutsourceD = await _db.Queryable().Where(it => input.BillId == it.id).FirstAsync(); WmsOutsourceH WmsOutsourceH = await _db.Queryable().Where(it => WmsOutsourceD.fk_wms_outsource_order_id == it.id).FirstAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs index 09c50af6..38550f17 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs @@ -20,6 +20,8 @@ using Tnb.BasicData.Entities; using Tnb.BasicData; using Tnb.ProductionMgr.Entities.Entity; using ModuleConst = Tnb.ProductionMgr.ModuleConst; +using JNPF.Common.Dtos.VisualDev; +using JNPF.VisualDev.Entitys; namespace Tnb.WarehouseMgr { @@ -60,12 +62,40 @@ namespace Tnb.WarehouseMgr { string id = dic["id"]; string qcRes = dic["qc_res"]; - WmsPurchaseD wmsPurchaseD = await _db.Queryable().SingleAsync(x => x.id == id); - string purchaseHId = wmsPurchaseD?.bill_id ?? ""; WmsPurchaseH wmsPurchaseH = await _db.Queryable().SingleAsync(x => x.id == purchaseHId); + #region 插入质检记录 + + string? create_id = _userManager.User.Id; + + if (qcRes != (wmsPurchaseD.qc_res ?? "")) + { + BasMaterial basMaterial = await _db.Queryable().Where(r => r.id == wmsPurchaseD.material_id).FirstAsync(); + WmsPurchaseQcrecord wmsPurchaseQcrecord = new WmsPurchaseQcrecord(); + wmsPurchaseQcrecord.create_id = create_id; + wmsPurchaseQcrecord.create_time = DateTime.Now; + wmsPurchaseQcrecord.type = "采购收货"; + wmsPurchaseQcrecord.ori_bill_code = wmsPurchaseH.bill_code; + wmsPurchaseQcrecord.ori_detail_id = wmsPurchaseD.id; + wmsPurchaseQcrecord.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID; + wmsPurchaseQcrecord.material_id = basMaterial.id; + wmsPurchaseQcrecord.material_code = basMaterial.code; + wmsPurchaseQcrecord.material_name = basMaterial.name; + wmsPurchaseQcrecord.material_spec = basMaterial.material_specification; + wmsPurchaseQcrecord.unit_id = wmsPurchaseD.unit_id; + wmsPurchaseQcrecord.batchno = wmsPurchaseD.code_batch; + wmsPurchaseQcrecord.purchase_qty = wmsPurchaseD.purchase_qty; + wmsPurchaseQcrecord.purchase_prqty = wmsPurchaseD.purchase_prqty; + wmsPurchaseQcrecord.purchase_arriveqty = wmsPurchaseD.purchase_arriveqty; + wmsPurchaseQcrecord.result = qcRes; + + await _db.Insertable(wmsPurchaseQcrecord).ExecuteCommandAsync(); + } + + #endregion + List wmsOutinStockDetails = await _db.Queryable() .Where(x => x.source_detail_id == wmsPurchaseD.id && x.source_type == WmsWareHouseConst.BIZTYPE_WMSINSTOCK_ID) .ToListAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs index ae159828..76aa8d73 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs @@ -35,6 +35,8 @@ using Tnb.ProductionMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Entity; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Authorization; +using JNPF.VisualDev.Interfaces; +using JNPF.VisualDev.Entitys; namespace Tnb.WarehouseMgr { @@ -48,16 +50,25 @@ namespace Tnb.WarehouseMgr private readonly ISqlSugarClient _db; private readonly IUserManager _userManager; private readonly IWareHouseService _wareHouseService; + private readonly IRunService _runService; + private readonly IVisualDevService _visualDevService; public WmsPurchaseService(ISqlSugarRepository repo, IUserManager userManager, IQcCheckPlanService qcCheckPlanService, IBillRullService billRullService, - IWareHouseService wareHouseService) + IWareHouseService wareHouseService, IRunService runService, + IVisualDevService visualDevService) : base(repo, userManager, qcCheckPlanService) { _db = repo.AsSugarClient(); _userManager = userManager; _billRullService = billRullService; _wareHouseService = wareHouseService; + _runService = runService; + _visualDevService = visualDevService; + } + + + private async Task xxx(VisualDevModelDataCrInput input) { PurchaseAndReceiveUpInput input2 = new(); @@ -320,10 +331,10 @@ namespace Tnb.WarehouseMgr try { await _db.Ado.BeginTranAsync(); - if (_db.Queryable().Where(it => input.BillId == it.require_id).Any()) - { - throw new AppFriendlyException("条码已生成", 500); - }; + //if (_db.Queryable().Where(it => input.BillId == it.require_id).Any()) + //{ + // throw new AppFriendlyException("条码已生成", 500); + //}; WmsPurchaseD WmsPurchaseD = await _db.Queryable().Where(it => input.BillId == it.id).FirstAsync(); WmsPurchaseH WmsPurchaseH = await _db.Queryable().Where(it => WmsPurchaseD.bill_id == it.id).FirstAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferinstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferinstockService.cs index 63b4aeff..d748bc87 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferinstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferinstockService.cs @@ -207,10 +207,10 @@ namespace Tnb.WarehouseMgr try { await _db.Ado.BeginTranAsync(); - if (_db.Queryable().Where(it => input.BillId == it.require_id).Any()) - { - throw new AppFriendlyException("条码已生成", 500); - }; + //if (_db.Queryable().Where(it => input.BillId == it.require_id).Any()) + //{ + // throw new AppFriendlyException("条码已生成", 500); + //}; WmsRawmatTransferinstockD WmsRawmatTransferinstockD = await _db.Queryable().Where(it => input.BillId == it.id).FirstAsync(); WmsRawmatTransferinstockH WmsRawmatTransferinstockH = await _db.Queryable().Where(it => WmsRawmatTransferinstockD.bill_id == it.id).FirstAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs index 864d3c6d..6f8a0652 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs @@ -224,21 +224,25 @@ namespace Tnb.WarehouseMgr { #region 电梯第三次改动 延迟预任务生成 // 3-1 第三次改动 - var YCLInnerTransfer = await _db.Queryable().Where(p => p.key == "floor3CurInCacheLocation").FirstAsync(); - Logger.Information($"当前发货区: {YCLInnerTransfer.value}"); - if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右")) - { - throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前入库分区 项配置错误!需要配置值为【3楼发货左】或【3楼发货右】", 500); - } - List locations = await _db.Queryable() + endLocation = null; + // 正常情况下交替入,如果左右两侧缓存数量不一致 优先补充托盘数量少那一侧 + List locations_left = await _db.Queryable() .InnerJoin((a, b) => a.id == b.location_id) - .Where((a, b) => b.name == YCLInnerTransfer.value).OrderBy("a.is_lock,a.is_use,carry_count,a.location_code").ToListAsync(); - - endLocation = locations.FirstOrDefault(); - - await _db.Updateable().SetColumns(r => r.value == (YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左")) - .Where(r => r.key == "floor3CurInCacheLocation").ExecuteCommandAsync(); + .Where((a, b) => b.name == "3楼发货左").OrderBy("a.is_lock,a.is_use,a.carry_count+a.task_nums,a.location_code").ToListAsync(); + List locations_right = await _db.Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .Where((a, b) => b.name == "3楼发货右").OrderBy("a.is_lock,a.is_use,a.carry_count+a.task_nums,a.location_code").ToListAsync(); + decimal leftQty = locations_left.Sum(r => r.carry_count + r.task_nums); + decimal rightQty = locations_right.Sum(r => r.carry_count + r.task_nums); + if (leftQty <= rightQty) + endLocation = locations_left.FirstOrDefault(); + else + endLocation = locations_right.FirstOrDefault(); + if (endLocation == null) + { + throw new AppFriendlyException($"载具{carry.carry_code}无法选到缓存区库位,请检查电梯缓存分区配置表", 500); + } #endregion } //人工发货 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs index 106b9887..ddecbd8f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs @@ -67,7 +67,6 @@ namespace Tnb.WarehouseMgr throw new ArgumentNullException(nameof(input)); } - BasLocation endLocation = await _db.Queryable().Where(r => r.id == input.wmsDistaskH.endlocation_id).FirstAsync(); string outWhid = ""; string inWhid = ""; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs index 6682160e..85f982d3 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs @@ -114,12 +114,12 @@ namespace Tnb.WarehouseMgr // 自动发货 if (!input.isManual) { - endLocations = await _db.Queryable().Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").ToListAsync(); + //endLocations = await _db.Queryable().Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").ToListAsync(); - if (endLocations.Count < items_pretask.Count) - { - throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500); - } + //if (endLocations.Count < items_pretask.Count) + //{ + // throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500); + //} } //人工发货 else @@ -145,18 +145,28 @@ namespace Tnb.WarehouseMgr // 自动发货 if (!input.isManual) { - endLocation = await _db.Queryable().Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync(); + #region 电梯第三次改动 延迟预任务生成 + // 3-1 第三次改动 + endLocation = null; + // 正常情况下交替入,如果左右两侧缓存数量不一致 优先补充托盘数量少那一侧 + List locations_left = await _db.Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .Where((a, b) => b.name == "3楼发货左").OrderBy("a.is_lock,a.is_use,a.carry_count+a.task_nums,a.location_code").ToListAsync(); + List locations_right = await _db.Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .Where((a, b) => b.name == "3楼发货右").OrderBy("a.is_lock,a.is_use,a.carry_count+a.task_nums,a.location_code").ToListAsync(); + decimal leftQty = locations_left.Sum(r => r.carry_count + r.task_nums); + decimal rightQty = locations_right.Sum(r => r.carry_count + r.task_nums); + if (leftQty <= rightQty) + endLocation = locations_left.FirstOrDefault(); + else + endLocation = locations_right.FirstOrDefault(); if (endLocation == null) { - throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500); - } - List endLocations_temp = await _db.Queryable().Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_lock == 0 && r.is_use == "0").ToListAsync(); - - if (endLocations_temp.Count < items_pretask.Count) - { - throw new AppFriendlyException($"三楼发货时,没有可用的暂存库位可以使用,需要下发任务{items_pretask.Count}条,可用的暂存库位只有{endLocations_temp.Count}条", 500); + throw new AppFriendlyException($"载具{carry.carry_code}无法选到缓存区库位,请检查电梯缓存分区配置表", 500); } + #endregion } //人工发货 else diff --git a/common/Tnb.Common/Utils/HttpClientHelper.cs b/common/Tnb.Common/Utils/HttpClientHelper.cs index 56b83f15..0ec84d57 100644 --- a/common/Tnb.Common/Utils/HttpClientHelper.cs +++ b/common/Tnb.Common/Utils/HttpClientHelper.cs @@ -116,21 +116,23 @@ namespace Tnb.Common.Utils { Log.Information($"开始请求 {url} 请求参数: {JsonConvert.SerializeObject(pars)}"); } - HttpClient Client = new HttpClient(); - var reqUri = url; - if (pars?.Count > 0) + using (HttpClient Client = new HttpClient()) { - reqUri = QueryHelpers.AddQueryString(url, pars); - //await Console.Out.WriteLineAsync(reqUri); + var reqUri = url; + if (pars?.Count > 0) + { + reqUri = QueryHelpers.AddQueryString(url, pars); + //await Console.Out.WriteLineAsync(reqUri); + } + Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + var respBody = await Client.GetAsync(reqUri); + var result = await respBody.Content.ReadAsStringAsync(); + if (isLog) + { + Log.Information($"请求 {url} 参数: {JsonConvert.SerializeObject(pars)} 结果: {result}"); + } + return result; } - Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - var respBody = await Client.GetAsync(reqUri); - var result = await respBody.Content.ReadAsStringAsync(); - if (isLog) - { - Log.Information($"请求 {url} 结果: {result}"); - } - return result; } public static async Task GetAsync(string url, Dictionary headers = null, Dictionary pars = null)