diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PackSechelToBeIssueListOutput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PackSechelToBeIssueListOutput.cs
index 66d4d2ec..12e0029e 100644
--- a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PackSechelToBeIssueListOutput.cs
+++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PackSechelToBeIssueListOutput.cs
@@ -57,6 +57,10 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
///
public int? plan_qty { get; set; }
///
+ /// 已完成数量
+ ///
+ public int? complete_qty { get; set; }
+ ///
/// 工序任务量
///
public int? process_task_qty { get; set; }
diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMaterialReceiptD.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMaterialReceiptD.cs
index 71ade71f..4fd65c0f 100644
--- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMaterialReceiptD.cs
+++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMaterialReceiptD.cs
@@ -43,6 +43,17 @@ public partial class PrdMaterialReceiptD : BaseEntity
/// 载具id
///
public string carry_id { get; set; } = string.Empty;
+
+ ///
+ /// 子载具id
+ ///
+ public string? member_carry_id { get; set; }
+
+ ///
+ /// 子载具编号
+ ///
+ public string? member_carry_code { get; set; }
+
///
/// 是否全部投料
diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Enums/PrdTaskBehavior.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Enums/PrdTaskBehavior.cs
index 70d861ba..48c5a6c8 100644
--- a/ProductionMgr/Tnb.ProductionMgr.Entities/Enums/PrdTaskBehavior.cs
+++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Enums/PrdTaskBehavior.cs
@@ -18,6 +18,10 @@
/// 任务完成
///
Compled = 8,
+ ///
+ /// 暂停
+ ///
+ Pause = 16,
}
}
diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs
index 6ecc1bdf..c053f113 100644
--- a/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs
+++ b/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs
@@ -302,8 +302,8 @@ namespace Tnb.ProductionMgr
// }
}
- if(!result2.IsSuccess) throw Oops.Oh(result2.ErrorMessage);
- return result2.IsSuccess ? "签收成功" : result2.ErrorMessage;
+ if(!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
+ return result.IsSuccess ? "签收成功" : result.ErrorMessage;
}
[HttpPost]
diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMaterialReceiptService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMaterialReceiptService.cs
index bdb2348f..b42dcfaf 100644
--- a/ProductionMgr/Tnb.ProductionMgr/PrdMaterialReceiptService.cs
+++ b/ProductionMgr/Tnb.ProductionMgr/PrdMaterialReceiptService.cs
@@ -57,26 +57,78 @@ namespace Tnb.ProductionMgr
public async Task GetInfoByQrCode(string qrCode)
{
var db = _repository.AsSugarClient();
- var result = await db.Queryable()
- .Where((a) => a.carry_code == qrCode)
- .Select(a => new
- {
- carry_id = a.id,
- carry_name = a.carry_name,
- children = SqlFunc.Subqueryable()
- .LeftJoin((b,c)=>b.material_id==c.id)
- .Where((b,c)=>a.id==b.carry_id).ToList((b,c)=>new CarryCodeDetailOutput()
- {
- unit_id = c.unit_id,
- barcode = b.barcode,
- code_batch = b.code_batch,
- codeqty = b.codeqty,
- material_id = b.material_id,
- material_code = c.code,
- material_name = c.name
- })
- }).FirstAsync();
- return result;
+ // var result = await db.Queryable()
+ // .Where((a) => a.carry_code == qrCode)
+ // .Select(a => new
+ // {
+ // carry_id = a.id,
+ // carry_name = a.carry_name,
+ // children = SqlFunc.Subqueryable()
+ // .LeftJoin((b,c)=>b.material_id==c.id)
+ // .Where((b,c)=>a.id==b.carry_id).ToList((b,c)=>new CarryCodeDetailOutput()
+ // {
+ // unit_id = c.unit_id,
+ // barcode = b.barcode,
+ // code_batch = b.code_batch,
+ // codeqty = b.codeqty,
+ // material_id = b.material_id,
+ // material_code = c.code,
+ // material_name = c.name
+ // })
+ // }).FirstAsync();
+
+ if (await db.Queryable()
+ .AnyAsync(x => x.member_carry_code == qrCode && x.is_all_feeding == 0))
+ {
+ var result = await db.Queryable()
+ .LeftJoin((a, b) => a.carry_id == b.id)
+ .Where((a) => a.member_carry_code == qrCode && a.is_all_feeding == 0)
+ .Select((a, b) => new FeedingDetailOutput
+ {
+ carry_id = b.id,
+ carry_name = b.carry_name,
+ children = SqlFunc.Subqueryable()
+ .LeftJoin((c, d) => c.material_id == d.id)
+ .Where((c, d) => a.member_carry_code == c.member_carry_code && c.is_all_feeding == 0)
+ .ToList((c, d) => new CarryCodeDetailOutput()
+ {
+ unit_id = d.unit_id,
+ // barcode = c.barcode,
+ // code_batch = c.code_batch,
+ code_batch = c.batch,
+ codeqty = c.num,
+ material_id = c.material_id,
+ material_code = d.code,
+ material_name = d.name
+ })
+ }).FirstAsync();
+ return result;
+ }
+ else
+ {
+ var result = await db.Queryable()
+ .LeftJoin((a, b) => a.carry_id == b.id)
+ .Where((a) => a.carry_code == qrCode)
+ .Select((a, b) => new FeedingDetailOutput
+ {
+ carry_id = a.carry_id,
+ carry_name = b.carry_name,
+ children = SqlFunc.Subqueryable()
+ .LeftJoin((c, d) => c.material_id == d.id)
+ .Where((c, d) => a.id == c.material_receipt_id && c.is_all_feeding==0).ToList((c, d) => new CarryCodeDetailOutput()
+ {
+ unit_id = d.unit_id,
+ // barcode = c.barcode,
+ // code_batch = c.code_batch,
+ code_batch = c.batch,
+ codeqty = c.num,
+ material_id = c.material_id,
+ material_code = d.code,
+ material_name = d.name
+ })
+ }).FirstAsync();
+ return result;
+ }
}
[HttpPost]
@@ -90,7 +142,8 @@ namespace Tnb.ProductionMgr
{
var moTask = await db.Queryable().FirstAsync(x => x.id == input.mo_task_id);
var inputMaterials = await db.Queryable()
- .Where(x => x.mbom_id == moTask.bom_id && x.mbom_process_id == input.mbom_process_id)
+ .Where(x => x.mbom_id == moTask.bom_id)
+ .WhereIF(!string.IsNullOrEmpty(input.mbom_process_id),x=>x.mbom_process_id==input.mbom_process_id)
.Select(x=>x.material_id)
.ToListAsync();
@@ -113,7 +166,6 @@ namespace Tnb.ProductionMgr
org_id = _userManager.GetUserInfo().Result.organizeId
};
- List list = new List();
if (input.details != null && input.details.Count > 0)
{
foreach (var item in input.details)
@@ -130,6 +182,8 @@ namespace Tnb.ProductionMgr
unit_id = item["unit_id"],
carry_id = input.carry_id,
is_all_feeding = 0,
+ member_carry_id = item["member_carry_id"],
+ member_carry_code = item["member_carry_code"],
feeding_num = 0,
});
}
@@ -185,9 +239,9 @@ namespace Tnb.ProductionMgr
}
}
-
- if(!result2.IsSuccess) throw Oops.Oh(result2.ErrorMessage);
- return result2.IsSuccess ? "签收成功" : result2.ErrorMessage;
+ if(!result.IsSuccess) throw Oops.Bah(result.ErrorMessage);
+ if(!result2.IsSuccess) throw Oops.Bah(result2.ErrorMessage);
+ return "签收成功";
}
}
}
\ No newline at end of file
diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs
index 8b8af35d..d4e57270 100644
--- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs
+++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs
@@ -315,10 +315,10 @@ namespace Tnb.ProductionMgr
eqp_name = e.name,
eqp_type_code = SqlFunc.Subqueryable().Where(it => it.id == e.equip_type_id).Select(it => it.code),
mo_task_qty = SqlFunc.Subqueryable().Where(a => a.mo_id == moId).Count(),
- estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH"),
- estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH"),
+ estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
+ estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
plan_qty = a.scheduled_qty,
- complete_qty = a.complete_qty,
+ complete_qty = SqlFunc.IsNull(a.reported_work_qty,0)+SqlFunc.IsNull(a.scrap_qty,0),
process_code = SqlFunc.Subqueryable().Where(it => it.id == a.process_id).Select(it => it.process_code),
process_name = SqlFunc.Subqueryable().Where(it => it.id == a.process_id).Select(it => it.process_name),
})
@@ -346,10 +346,10 @@ namespace Tnb.ProductionMgr
process_code = e.process_code,
process_name = e.process_name,
mo_task_qty = SqlFunc.Subqueryable().Where(a => a.mo_id == moId).Count(),
- estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH"),
- estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH"),
+ estimated_start_date = a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
+ estimated_end_date = a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm:ss"),
plan_qty = a.scheduled_qty,
- complete_qty = a.complete_qty,
+ complete_qty = SqlFunc.IsNull(a.reported_work_qty,0)+SqlFunc.IsNull(a.scrap_qty,0),
})
.Mapper(it =>
{
@@ -389,6 +389,7 @@ namespace Tnb.ProductionMgr
// scheduled_qty = SqlFunc.Subqueryable().Where(it => it.mo_id == a.mo_id).Sum(it => it.scheduled_qty),
scheduled_qty = a.scheduled_qty,
plan_qty = SqlFunc.Subqueryable().Where(it => it.id == a.mo_id).Select(it => it.plan_qty),
+ complete_qty = a.last_process_complete_qty,
estimated_start_date = a.estimated_start_date==null ? null : a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm"),
estimated_end_date = a.estimated_end_date==null ? null : a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm"),
bom_id = d.id,
@@ -425,6 +426,7 @@ namespace Tnb.ProductionMgr
scheduled_qty = a.scheduled_qty,
plan_qty = d.plan_qty,
process_task_qty = a.process_task_qty,
+ complete_qty = SqlFunc.IsNull(a.reported_work_qty,0)+SqlFunc.IsNull(a.scrap_qty,0),
estimated_start_date = a.estimated_start_date==null ? null : a.estimated_start_date.Value.ToString("yyyy-MM-dd HH:mm"),
estimated_end_date = a.estimated_end_date==null ? null : a.estimated_end_date.Value.ToString("yyyy-MM-dd HH:mm"),
process_name = e.process_name,
@@ -658,32 +660,34 @@ namespace Tnb.ProductionMgr
{
if (input.schedule_type.Value == 1) //注塑、基础排产
{
+ var mo = await db.Queryable().FirstAsync(it => it.id == input.mo_id);
var moTask = input.Adapt();
moTask.id = SnowflakeIdHelper.NextId();
moTask.create_id = _userManager.UserId;
moTask.create_time = DateTime.Now;
moTask.mo_task_status = DictConst.ToBeScheduledEncode;
moTask.scheduled_qty = input.scheduled_qty;
-
- var mo = await db.Queryable().FirstAsync(it => it.id == input.mo_id);
- var moCode = mo?.mo_code;
- var taskCode = await db.Queryable().Where(it => !string.IsNullOrEmpty(it.mo_task_code) && it.mo_task_code.Contains(moCode)).OrderByDescending(it => it.mo_task_code).Select(it => it.mo_task_code).FirstAsync();
moTask.unit_id = mo.unit_id;
- if (taskCode.IsNullOrEmpty())
- {
- moTask.mo_task_code = $"{moCode}-01";
- }
- else
- {
- var pos = taskCode.IndexOf("-", StringComparison.Ordinal);
- if (pos > -1)
- {
- var num = taskCode.AsSpan().Slice(pos + 1).ToString().ParseToInt();
- var code = taskCode.AsSpan().Slice(0, pos).ToString();
- var n = (num + 1).ToString().PadLeft(2, '0');
- moTask.mo_task_code = $"{code}-{n}";
- }
- }
+
+ var moCode = mo?.mo_code;
+ var taskCode = await _billRuleService.GetBillNumber(Tnb.BasicData.CodeTemplateConst.PRDMOTASK_CODE);
+ moTask.mo_task_code = taskCode;
+ // var taskCode = await db.Queryable().Where(it => !string.IsNullOrEmpty(it.mo_task_code) && it.mo_task_code.Contains(moCode)).OrderByDescending(it => it.mo_task_code).Select(it => it.mo_task_code).FirstAsync();
+ // if (taskCode.IsNullOrEmpty())
+ // {
+ // moTask.mo_task_code = $"{moCode}-01";
+ // }
+ // else
+ // {
+ // var pos = taskCode.IndexOf("-", StringComparison.Ordinal);
+ // if (pos > -1)
+ // {
+ // var num = taskCode.AsSpan().Slice(pos + 1).ToString().ParseToInt();
+ // var code = taskCode.AsSpan().Slice(0, pos).ToString();
+ // var n = (num + 1).ToString().PadLeft(2, '0');
+ // moTask.mo_task_code = $"{code}-{n}";
+ // }
+ // }
try
{
await db.Ado.BeginTranAsync();
@@ -702,16 +706,31 @@ namespace Tnb.ProductionMgr
if (mo != null)
{//判断如果当前 工单的已排产数大于工单计划数量则更新工单状态为 已排产
- if (schedQty.HasValue && schedQty.Value >= mo.plan_qty)
+ // if (schedQty.HasValue && schedQty.Value >= mo.plan_qty)
+ // {
+ // mo.mo_status = DictConst.AlreadyId;
+ // }
+ // else
+ // {
+ // if (schedQty.HasValue)
+ // mo.scheduled_qty = schedQty.Value;
+ // }
+ // row = await db.Updateable(mo).ExecuteCommandAsync();
+
+ if (mo.scheduled_qty == null)
{
- mo.mo_status = DictConst.AlreadyId;
+ await _db.Updateable()
+ .SetColumns(x => x.mo_status == DictConst.AlreadyId)
+ .SetColumns(x => x.scheduled_qty == input.scheduled_qty)
+ .Where(x=>x.id==mo.id)
+ .ExecuteCommandAsync();
}
else
{
- if (schedQty.HasValue)
- mo.scheduled_qty = schedQty.Value;
+ await _db.Updateable().SetColumns(x => x.scheduled_qty == x.scheduled_qty + input.scheduled_qty)
+ .Where(x=>x.id==mo.id)
+ .ExecuteCommandAsync();
}
- row = await db.Updateable(mo).ExecuteCommandAsync();
}
var material = await db.Queryable().FirstAsync(it => it.id == moTask.material_id);
@@ -789,7 +808,7 @@ namespace Tnb.ProductionMgr
moTask.estimated_end_date = input.estimated_end_date;
moTask.scheduled_qty = input.scheduled_qty;
var mo = await _db.Queryable().FirstAsync(it => it.id == input.mo_id);
- moTask.unit_id = mo.unit_id;
+ // moTask.unit_id = mo.unit_id;
var moCode = mo?.mo_code;
// var taskCode = await _db.Queryable().Where(it => string.IsNullOrEmpty(it.parent_id) && !string.IsNullOrEmpty(it.mo_task_code) && it.mo_task_code.Contains(moCode))
// .OrderByDescending(it => it.mo_task_code)
@@ -1008,6 +1027,7 @@ namespace Tnb.ProductionMgr
PrdTaskBehavior.Start => DictConst.InProgressEnCode,
PrdTaskBehavior.Closed => DictConst.ClosedEnCode,
PrdTaskBehavior.Compled => DictConst.ComplatedEnCode,
+ PrdTaskBehavior.Pause => DictConst.MoStatusPauseCode,
_ => throw new NotImplementedException(),
};
PrdTaskBehavior behavior = input.Behavior.ToEnum();
@@ -1828,7 +1848,7 @@ namespace Tnb.ProductionMgr
if (processStandardsH == null) throw Oops.Bah("工艺标准成型周期错误");
if (processStandardsH?.moulding_cycle <= 0) throw Oops.Bah("工艺标准成型周期错误");
- decimal? addTime = (input.scheduled_qty * toolMolds.mold_cavity - 1) / processStandardsH?.moulding_cycle + 1;
+ decimal? addTime = (input.scheduled_qty * processStandardsH?.moulding_cycle - 1) / toolMolds.mold_cavity + 1;
return input.estimated_start_date.AddSeconds((double)addTime.Value).ToString("yyyy-MM-dd HH:mm:ss");
}
else
diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdPackReportService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdPackReportService.cs
index b848a515..4be63421 100644
--- a/ProductionMgr/Tnb.ProductionMgr/PrdPackReportService.cs
+++ b/ProductionMgr/Tnb.ProductionMgr/PrdPackReportService.cs
@@ -89,7 +89,7 @@ namespace Tnb.ProductionMgr
process_id = a.process_id,
plan_start_date = a.estimated_start_date,
plan_end_date = a.estimated_end_date,
- plan_qty = c.scheduled_qty,
+ plan_qty = a.scheduled_qty,
// complete_qty = SqlFunc.Subqueryable().Where(it => it.mo_task_code == a.mo_task_code).Sum(it => it.reported_work_qty),
complete_qty = a.last_process_complete_qty,
mo_task_status = a.mo_task_status,
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/Dto/Outputs/FeedingDetailOutput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/FeedingDetailOutput.cs
new file mode 100644
index 00000000..e57f58f2
--- /dev/null
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/FeedingDetailOutput.cs
@@ -0,0 +1,12 @@
+namespace Tnb.WarehouseMgr.Entities.Dto
+{
+ ///
+ /// 扫码投料
+ ///
+ public class FeedingDetailOutput
+ {
+ public string carry_id { get; set; }
+ public string carry_name { get; set; }
+ public List children { get; set; }
+ }
+}
\ 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.Interfaces/IWmsCarryService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryService.cs
index d8e1515f..ae2deba4 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryService.cs
@@ -13,6 +13,6 @@ namespace Tnb.WarehouseMgr.Interfaces
///
///
///
- Task UpdateNullCarry(WmsCarryH carryObj, Func> updateTask=null, [CallerMemberName] string original = "");
+ Task> UpdateNullCarry(WmsCarryH carryObj, Func> updateTask = null, [CallerMemberName] string original = "");
}
}
\ No newline at end of file
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
index adf7ae9d..a3819054 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
@@ -158,8 +158,6 @@ namespace Tnb.WarehouseMgr
var items = new List();
try
{
-
- //var stauts = (int)EnumCarryStatus.空闲;
items = await _db.Queryable().Where(it => it.wh_id == input.warehouse_id && it.is_lock == 0 && it.is_type == "0" && it.is_use == ((int)EnumCarryStatus.空闲).ToString()).OrderBy(it => new { it.layers, it.loc_line, it.loc_column }, OrderByType.Asc).ToListAsync();
}
@@ -185,47 +183,6 @@ namespace Tnb.WarehouseMgr
[HttpPost]
public async Task GenTaskExecute()
{
- //任务链属性处理内部函数
- async Task _taskChainAttrHandle(List items, List areaPreTasks, int moveNum)
- {
- var groupCode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE);
- await Task.Run(() =>
- {
- if (moveNum == 1 || (moveNum > areaPreTasks.Count && areaPreTasks.Count == 1))
- {
- items.ForEach(x =>
- {
- x.is_chain = 0;
- });
- items[0].groups = groupCode;
- items[0].bill_code = $"{groupCode}-1";
- }
- else if ((moveNum >= areaPreTasks.Count && areaPreTasks.Count > 1) || moveNum < areaPreTasks.Count)
- {
- items.ForEach(x => x.is_chain = 1);
- var itemsCount = items.Count;
- var mod = items.Count % moveNum > 0 ? itemsCount / moveNum + 1 : itemsCount / moveNum;
- var start = 0;
- var end = Math.Min(itemsCount, moveNum);
- var arrary = items.ToArray();
- for (int i = 1; i <= mod; i++)
- {
- while (start < itemsCount)
- {
- var subArray = arrary[start..end];
- for (int j = 0, arrLen = subArray.Length; j < arrLen; j++)
- {
- subArray[j].groups = groupCode;
- subArray[j].bill_code = $"{groupCode}-{i}";
- }
- start = end;
- end = Math.Min((end + moveNum), arrary.Length);
- }
- }
- }
- });
- }
-
//获取所有未下发的预任务申请
var preTasks = await _db.Queryable().InnerJoin((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
.InnerJoin((a, b, c) => a.area_id == c.id)
@@ -256,7 +213,44 @@ namespace Tnb.WarehouseMgr
if (moveNum >= 1)
{
var areaPreTasks = itGroup.ToList();
- await _taskChainAttrHandle(items, areaPreTasks, moveNum);
+ var groupCode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE);
+ if (moveNum == 1 || (moveNum > areaPreTasks.Count && areaPreTasks.Count == 1))
+ {
+ items.ForEach(x =>
+ {
+ x.is_chain = 0;
+ });
+ items[0].groups = groupCode;
+ items[0].bill_code = $"{groupCode}-1";
+ }
+ else if ((moveNum >= areaPreTasks.Count && areaPreTasks.Count > 1) || moveNum < areaPreTasks.Count)
+ {
+ items.ForEach(x => x.is_chain = 1);
+ var itemsCount = items.Count;
+ var mod = items.Count % moveNum > 0 ? itemsCount / moveNum + 1 : itemsCount / moveNum;
+ var start = 0;
+ var end = Math.Min(itemsCount, moveNum);
+ var arrary = items.ToArray();
+ var dic = new Dictionary();
+ for (int i = 1; i <= mod; i++)
+ {
+ while (start < itemsCount)
+ {
+ var subArray = arrary[start..end];
+ dic[i] = subArray;
+ start = end;
+ end = Math.Min((end + moveNum), arrary.Length);
+ }
+ }
+ foreach (var (i, v) in dic)
+ {
+ foreach (var it in v)
+ {
+ it.groups = groupCode;
+ it.bill_code = $"{groupCode}-{i}";
+ }
+ }
+ }
}
if (preTaskCodes?.Count > 0)
{
@@ -661,6 +655,7 @@ namespace Tnb.WarehouseMgr
List results = new() { startObj };
if (points?.Count > 0)
{
+ points.Where(it => result.Contains(it.id));
foreach (var i in result)
{
WmsPointH? point = points?.Find(x => x.id == i);
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs
index 5aa85612..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);
+ row = await await UpdateNullCarry(oldCarry);
isOk = (row > 0);
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);
}
@@ -156,9 +156,10 @@ namespace Tnb.WarehouseMgr
}
[NonAction]
- public async Task UpdateNullCarry(WmsCarryH carryObj, Func> updateTask = null, [CallerMemberName] string original = "")
+ public async Task> UpdateNullCarry(WmsCarryH carryObj, Func> updateTask = null, [CallerMemberName] string original = "")
{
var row = 1;
+ Task resTask = Task.FromResult(row);
try
{
carryObj.status = 0;
@@ -173,16 +174,8 @@ namespace Tnb.WarehouseMgr
carryObj.collocation_scheme_code = null;
carryObj.source_id = null;
carryObj.source_code = null;
- if (updateTask != null)
- {
- updateTask(carryObj);
- }
- else
- {
- row = await _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync();
- }
- //Task.Run(() => _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync());
- //删除对应明细表
+ resTask = updateTask?.Invoke(carryObj) ?? _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync();
+ //*****删除对应明细表
//删除载具明细
await _db.CopyNew().Deleteable().Where(it => it.carry_id == carryObj.id).ExecuteCommandHasChangeAsync();
//删除载具分拣物料明细
@@ -193,10 +186,11 @@ namespace Tnb.WarehouseMgr
catch (Exception ex)
{
row = 0;
+ resTask = Task.FromResult(row);
Log.Error("更新空载具出错", ex);
throw;
}
- return row;
+ return resTask;
}
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();
+ }
+ }
+}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutBaleService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutBaleService.cs
index 665a32ee..89de62ce 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutBaleService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutBaleService.cs
@@ -169,7 +169,7 @@ namespace Tnb.WarehouseMgr
var isOk = await _db.Updateable().SetColumns(it => new WmsOutbale { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }).Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
var carryId = input.carryIds[^input.carryIds.Count];
var carry = await _db.Queryable().SingleAsync(it => it.id == carryId);
- var row = await _wmsCarryService.UpdateNullCarry(carry);
+ var row = await _wmsCarryService.UpdateNullCarry(carry).Unwrap();
isOk = row > 0;
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs
index b278eeb6..d0456106 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs
@@ -622,7 +622,7 @@ namespace Tnb.WarehouseMgr
//如果没有完成,修改为工作中
await _db.Updateable().SetColumns(it => new WmsOutstockH { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == input.requireId).ExecuteCommandAsync();
}
- await _wareCarryService.UpdateNullCarry(carry);
+ await _wareCarryService.UpdateNullCarry(carry).Unwrap();
}
else if (outStatus == EnumOutStatus.分拣出)
{
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAFeedingService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAFeedingService.cs
index 23b83bb3..206fe46b 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAFeedingService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAFeedingService.cs
@@ -91,16 +91,17 @@ namespace Tnb.WarehouseMgr
feedBox.modify_id = _userManager.UserId;
feedBox.modify_time = DateTime.Now;
var row = await _db.Updateable(feedBox)
- .UpdateColumns(it => new {
+ .UpdateColumns(it => new
+ {
it.material_id,
it.material_code,
it.qty,
it.batch,
- it.modify_id,
+ it.modify_id,
it.modify_time
}).ExecuteCommandAsync();
//更新载具
- row = await _carryService.UpdateNullCarry(carry);
+ row = await _carryService.UpdateNullCarry(carry).Unwrap();
isOk = (row > 0);
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs
index cd498d19..cc149b94 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs
@@ -306,17 +306,17 @@ namespace Tnb.WarehouseMgr
if (carrys?.Count > 0)
{
await _db.Ado.BeginTranAsync();
- var tasks = new List>();
+ var tasks = new List>>();
foreach (var carryIt in carrys)
{
tasks.Add(_carryService.UpdateNullCarry(carryIt, carryIt => Task.Run(() => _db.CopyNew().Updateable(carryIt).ExecuteCommandAsync())));
}
- var all = await Task.WhenAll(tasks);
- await _db.Ado.CommitTranAsync();
+ var all = await Task.WhenAll(tasks.Select(t => t.Unwrap()));
if (all.All(x => x > 0))
{
isOk = all?.Length > 0;
}
+ await _db.Ado.CommitTranAsync();
}
}
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);