diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs index f3c226da..82c65e85 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs @@ -152,5 +152,9 @@ public class ModuleConsts /// 模块标识-任务执行 /// public const string MODULE_WMSDISTASK_ID = "26128621455141"; + /// + /// 模块标识-盘点任务 + /// + public const string MODULE_WMSCHECKTASK_ID = "27582377555221"; } \ No newline at end of file diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockCode.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockCode.cs new file mode 100644 index 00000000..e96b25bd --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockCode.cs @@ -0,0 +1,102 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities; + +/// +/// 盘点任务明细表 +/// +[SugarTable("wms_checkstock_code")] +public partial class WmsCheckstockCode : BaseEntity +{ + public WmsCheckstockCode() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 盘点任务ID + /// + public string? checkstock_id { get; set; } + + /// + /// 盘点任务物料明细ID + /// + public string? checkstock_d_id { get; set; } + + /// + /// 载具ID + /// + public string? carry_id { get; set; } + + /// + /// 载具编号 + /// + public string? carry_code { get; set; } + + /// + /// 物料ID + /// + public string? material_id { get; set; } + + /// + /// 物料编号 + /// + public string? material_code { get; set; } + + /// + /// 条码编号 + /// + public string? barcode { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 条码数量 + /// + public int? codeqty { get; set; } + + /// + /// 单位ID + /// + public string? unit_id { get; set; } + + /// + /// 备注 + /// + public string? remark { get; set; } + + /// + /// 扩展 + /// + public string? extras { get; set; } + + /// + /// 时间戳 + /// + public string? timestamp { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockD.cs new file mode 100644 index 00000000..13e770a8 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockD.cs @@ -0,0 +1,102 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities; + +/// +/// 盘点任务子表 +/// +[SugarTable("wms_checkstock_d")] +public partial class WmsCheckstockD : BaseEntity +{ + public WmsCheckstockD() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 盘点任务ID + /// + public string? checkstock_id { get; set; } + + /// + /// 物料ID + /// + public string? material_id { get; set; } + + /// + /// 物料编号 + /// + public string? material_code { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 库位ID + /// + public string? location_id { get; set; } + + /// + /// 库位编号 + /// + public string? location_code { get; set; } + + /// + /// 载具ID + /// + public string? carry_id { get; set; } + + /// + /// 载具编号 + /// + public string? carry_code { get; set; } + + /// + /// 理论库存数量 + /// + public decimal? pr_qty { get; set; } + + /// + /// 已盘点数量 + /// + public decimal? qty { get; set; } + + /// + /// 扩展 + /// + public string? extras { get; set; } + + /// + /// 时间戳 + /// + public DateTime? timestamp { get; set; } + + /// + /// 创建用户 + /// + 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? closing_status { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockD.part.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockD.part.cs new file mode 100644 index 00000000..d313bff9 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockD.part.cs @@ -0,0 +1,18 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities; + +/// +/// 盘点任务子表 +/// +public partial class WmsCheckstockD +{ + /// + /// 条码数量 + /// + [SugarColumn(IsIgnore = true)] + public decimal codeqty { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockH.cs new file mode 100644 index 00000000..ba095aa0 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCheckstockH.cs @@ -0,0 +1,107 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities; + +/// +/// 盘点任务主表 +/// +[SugarTable("wms_checkstock_h")] +public partial class WmsCheckstockH : BaseEntity +{ + public WmsCheckstockH() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 所属组织 + /// + public string? org_id { get; set; } + + /// + /// 单号 + /// + public string? checkstock_code { get; set; } + + /// + /// 盘点计划ID + /// + public string? checkplan_id { get; set; } + + /// + /// 仓库ID + /// + public string? warehouse_id { get; set; } + + /// + /// 盘点状态 + /// + public string? status { get; set; } + + /// + /// 盘点类型 + /// + public string? checkstock_type { get; set; } + + /// + /// 盘点种类 + /// + public string? handle_kinds { get; set; } + + /// + /// 盘点开始时间 + /// + public DateTime? check_start_date { get; set; } + + /// + /// 盘点结束时间 + /// + public DateTime? check_end_date { get; set; } + + /// + /// 盘点人ID + /// + public string? checkstock_id { get; set; } + + /// + /// 扩展 + /// + public string? extras { get; set; } + + /// + /// 时间戳 + /// + public DateTime? timestamp { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// 流程任务Id + /// + public string? f_flowtaskid { get; set; } + + /// + /// 流程引擎Id + /// + public string? f_flowid { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckType.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckType.cs new file mode 100644 index 00000000..a497e2ee --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumCheckType.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Enums +{ + public enum EnumCheckType + { + /// + /// 全库盘点 + /// + 全库盘点 = 0, + /// + /// 物料盘点 + /// + 物料盘点, + /// + /// 批次盘点 + /// + 批次盘点, + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs index 9644e80e..7e8ca3ba 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs @@ -128,7 +128,7 @@ namespace Tnb.WarehouseMgr wmsCarryReplaceH.modify_id = null; wmsCarryReplaceH.modify_time = null; row = await _db.Insertable(wmsCarryReplaceH).ExecuteCommandAsync(); - row = await UpdateNullCarry(oldCarry).Unwrap(); + row = await await UpdateNullCarry(oldCarry); isOk = (row > 0); if (!isOk) throw Oops.Oh(ErrorCode.COM1001); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs new file mode 100644 index 00000000..f2c0e3bf --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; +using JNPF.Common.Core.Manager; +using JNPF.Common.Dtos.VisualDev; +using JNPF.Common.Extension; +using JNPF.FriendlyException; +using JNPF.VisualDev; +using JNPF.VisualDev.Entitys; +using JNPF.VisualDev.Interfaces; +using Mapster; +using OBS.Internal; +using SqlSugar; +using Tnb.BasicData.Entities; +using Tnb.WarehouseMgr.Entities; +using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Enums; +using Tnb.WarehouseMgr.Interfaces; + +namespace Tnb.WarehouseMgr +{ + /// + /// 盘点任务 + /// + [OverideVisualDev(ModuleConsts.MODULE_WMSCHECKTASK_ID)] + public class WmsCheckTaskService : BaseWareHouseService + { + private readonly ISqlSugarClient _db; + private readonly IWareHouseService _warehouseService; + private readonly IUserManager _userManager; + private readonly IVisualDevService _visualDevService; + private readonly IRunService _runService; + public WmsCheckTaskService( + ISqlSugarRepository repository, + IWareHouseService wareHouseService, + IVisualDevService visualDevService, + IRunService runService, + IUserManager userManager) + { + _db = repository.AsSugarClient(); + _warehouseService = wareHouseService; + _visualDevService = visualDevService; + _runService = runService; + _userManager = userManager; + OverideFuncs.CreateAsync = Create; + } + + private async Task Create(VisualDevModelDataCrInput input) + { + if (input == null) throw new ArgumentNullException(nameof(input)); + try + { + await _db.Ado.BeginTranAsync(); + + if (input.data?.Count > 0) + { + var checkType = input.data[nameof(WmsCheckstockH.checkstock_type)]?.ToString(); + if (!checkType.IsNullOrEmpty()) + { + var billStatus = new List + { + WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID, + WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID, + }; + var filter = Expressionable.Create() + .And((a, b) => b.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString()) + .And((a, b) => b.is_type == ((int)EnumLocationType.存储库位).ToString()) + .And((a, b) => !billStatus.Contains(a.status)) + .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); + if (disTasks?.Length > 0) + { + throw new AppFriendlyException("该仓库还有未完成的任务,不允许盘点!", 500); + } + VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCHECKTASK_ID, true); + await _runService.Create(templateEntity, input); + List carryCodes = new(); + List details = new(); + switch (checkType.ToEnum()) + { + case EnumCheckType.全库盘点: + carryCodes = await _db.Queryable().InnerJoin((a, b) => a.id == b.location_id) + .Where(a => a.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString() && a.is_type == ((int)EnumLocationType.存储库位).ToString()) + .Select() + .ToListAsync(); + carryCodes ??= Enumerable.Empty().ToList(); + var checkStockDs = carryCodes.Adapt>(); + var prQtyDic = checkStockDs.GroupBy(g => new { g.carry_id, g.material_id, g.code_batch }).ToDictionary(x => x.Key, x => x.Sum(d => d.codeqty)); + + foreach (var (k, v) in prQtyDic) + { + WmsCheckstockD? checkstockD = checkStockDs?.Find(x => string.Equals(k, $"{x.carry_id}{x.material_id}{x.code_batch}")); + if (checkstockD != null) + { + checkstockD.pr_qty = v; + details.Add(checkstockD); + } + } + details.ForEach(x => + { + x.create_id = _userManager.UserId; + x.create_time = DateTime.Now; + }); + await _db.Insertable(details).ExecuteCommandAsync(); + break; + case EnumCheckType.物料盘点: + break; + case EnumCheckType.批次盘点: + break; + } + //生成预任务信息 + 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 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) + { + + } + } + } + } + } + + await _db.Ado.CommitTranAsync(); + } + catch (Exception) + { + await _db.Ado.RollbackTranAsync(); + throw; + } + return Task.FromResult(1); + } + + private Task> FetchDisTasks(Expression> joinExp, Expression> whereExp) + { + return _db.Queryable().InnerJoin(joinExp).Where(whereExp).Select().ToListAsync(); + } + } +}