diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index b2506920..cb360200 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -55,6 +55,12 @@ namespace Tnb.WarehouseMgr.Entities.Consts /// 任务执行ENCODE /// public const string WMS_TASK_EXECUTE_ENCODE = "WmsTaskRequest"; + /// + /// 盘点出库EnCode + /// + public const string WMS_CHECK_STOCK_ENCODE = "CheckStockCode"; + + /// /// 预任务单据状态-待下发Id /// @@ -197,6 +203,10 @@ namespace Tnb.WarehouseMgr.Entities.Consts /// 预任务生成业务类型-载具绑定 /// public const string BIZTYPE_WMSCARRYBIND_ID = "27118595509525"; + /// + /// 预任务生成业务类型-盘点出库 + /// + public const string BIZTYPE_WMSCHECKOUTSTOCK_ID = "27718132310037"; /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckStatus.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckStatus.cs new file mode 100644 index 00000000..e817fe91 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckStatus.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Enums +{ + /// + /// 盘点状态 + /// + public enum EnumCheckStatus + { + 未盘点 = 0, + 盘点中, + 盘点结账, + 已关闭, + 已撤销 + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs index f2c0e3bf..bdd30dbd 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs @@ -7,7 +7,9 @@ using System.Threading.Tasks; using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Extension; +using JNPF.Common.Security; using JNPF.FriendlyException; +using JNPF.Systems.Interfaces.System; using JNPF.VisualDev; using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Interfaces; @@ -17,6 +19,7 @@ using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; @@ -33,17 +36,20 @@ namespace Tnb.WarehouseMgr private readonly IUserManager _userManager; private readonly IVisualDevService _visualDevService; private readonly IRunService _runService; + private readonly IBillRullService _billRullService; public WmsCheckTaskService( ISqlSugarRepository repository, IWareHouseService wareHouseService, IVisualDevService visualDevService, IRunService runService, + IBillRullService billRullService, IUserManager userManager) { _db = repository.AsSugarClient(); _warehouseService = wareHouseService; _visualDevService = visualDevService; _runService = runService; + _billRullService = billRullService; _userManager = userManager; OverideFuncs.CreateAsync = Create; } @@ -72,6 +78,7 @@ namespace Tnb.WarehouseMgr .ToExpression(); var queryTasks = new List>>(); + queryTasks.Add(Task.Run(() => FetchDisTasks((a, b) => a.startlocation_id == b.id, filter))); queryTasks.Add(Task.Run(() => FetchDisTasks((a, b) => a.endlocation_id == b.id, filter))); var disTasks = await Task.WhenAll(queryTasks); @@ -119,14 +126,85 @@ namespace Tnb.WarehouseMgr if (details.Count > 0 && carryCodes.Count > 0) { var locTypes = new[] { ((int)EnumLocationType.出库库位).ToString(), ((int)EnumLocationType.出入库位).ToString() }; - var endLocs = _db.Queryable().Where(it=>it.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString() && locTypes.Contains(it.is_type)).ToListAsync(); + var endLocs = await _db.Queryable().Where(it => it.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString() && locTypes.Contains(it.is_type)).ToListAsync(); + var randomIndex = new Random().Next(0, endLocs.Count - 1); + var carrys = await _db.Queryable().Where(it => carryCodes.Select(x => x.carry_id).Distinct().Contains(it.id)).ToListAsync(); var curDetails = details.DistinctBy(x => x.carry_id).ToList(); var curCarryCodes = carryCodes.FindAll(x => curDetails.Select(d => d.carry_id).Contains(x.carry_id)); if (curCarryCodes.Count > 0) { - foreach (var item in curCarryCodes) + List preTasks = new(); + List locIds = new(); + foreach (var item in carrys) { - + WmsPointH? sPoint = await _db.Queryable().FirstAsync(it => it.location_id == item.location_id); + WmsPointH? ePoint = await _db.Queryable().FirstAsync(it => it.location_id == endLocs[randomIndex].id); + if (sPoint != null && ePoint != null) + { + var points = await _warehouseService.PathAlgorithms(sPoint.id, ePoint.id); + + if (points.Count <= 2) throw new AppFriendlyException("该路径不存在", 500); + if (points?.Count > 0) + { + locIds.AddRange(points.Select(x => x.location_id).ToList()!); + var curPreTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => + { + var sPoint = it.FirstOrDefault(); + var ePoint = it.LastOrDefault(); + + WmsPretaskH preTask = new() + { + org_id = _userManager.User.OrganizeId, + startlocation_id = sPoint?.location_id!, + startlocation_code = sPoint?.location_code!, + endlocation_id = ePoint?.location_id!, + endlocation_code = ePoint?.location_code!, + start_floor = sPoint?.floor.ToString(), + end_floor = ePoint?.floor.ToString(), + bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(), + status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, + biz_type = WmsWareHouseConst.BIZTYPE_WMSCHECKOUTSTOCK_ID, + task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID, + carry_id = item.id, + carry_code = item.carry_code!, + area_id = sPoint?.area_id!, + area_code = it.Key, + require_id = input.data["ReturnIdentity"].ToString(), + require_code = input.data[nameof(WmsCheckstockH.checkstock_code)]?.ToString(), + create_id = _userManager.UserId, + create_time = DateTime.Now + }; + return preTask; + }).ToList(); + if (endLocs[randomIndex].is_sign == 0) + { + curPreTasks[^1].is_sign = 0; + } + preTasks.AddRange(curPreTasks); + } + } + } + List pretaskCodes = new(); + foreach (var pt in preTasks) + { + var partCodes = carryCodes.FindAll(x => x.carry_id == pt.carry_id).Distinct().ToList(); + var curPreTaskCodes = partCodes.Adapt>(); + curPreTaskCodes.ForEach(x => + { + x.id = SnowflakeIdHelper.NextId(); + x.bill_id = pt.id; + x.create_time = DateTime.Now; + }); + pretaskCodes.AddRange(curPreTaskCodes); + } + var isOk = await _warehouseService.GenPreTask(preTasks, pretaskCodes); + if (isOk) + { + await _db.Updateable().SetColumns(it => it.status == ((int)EnumCheckStatus.盘点中).ToString()).ExecuteCommandAsync(); + GenPreTaskUpInput genPreTaskAfterUpInput = new(); + genPreTaskAfterUpInput.CarryIds = preTasks.Select(x => x.carry_id).ToList(); + genPreTaskAfterUpInput.LocationIds = new HashSet(locIds).ToList(); + await _warehouseService.GenInStockTaskHandleAfter(genPreTaskAfterUpInput, it => new WmsCarryH { is_lock = 1 }, it => new BasLocation { is_lock = 1 }); } } }