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);