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();
+ }
+ }
+}