diff --git a/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs b/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs index 7f382d40..27de3443 100644 --- a/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs +++ b/BasicData/Tnb.BasicData.Entities/Dto/SubBomListOutput.cs @@ -64,5 +64,10 @@ namespace Tnb.BasicData.Entities.Dto /// 工序排序序号 /// public long? ordinal { get; set; } + + /// + /// 生产bom工序id + /// + public string? mbom_process_id { get; set; } } } diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdFeedingD.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdFeedingD.cs index 29bc4b6c..58f50b8d 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdFeedingD.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdFeedingD.cs @@ -53,5 +53,25 @@ public partial class PrdFeedingD : BaseEntity /// 物料签收单子表id /// public string? material_receipt_detail_id { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 状态 0 未消耗 1 部分消耗 2 消耗完 + /// + public string? status { get; set; } + + /// + /// 使用数量 + /// + public decimal use_num { get; set; } = 0; } \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs index 7d4dfe1e..16772015 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdMoTask.cs @@ -177,4 +177,9 @@ public partial class PrdMoTask : BaseEntity /// 工序id /// public string process_id { get; set; } + + /// + /// 生产bom工序id + /// + public string? mbom_process_id { get; set; } } diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs index 06c5e640..047a6725 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdFeedingService.cs @@ -91,6 +91,8 @@ namespace Tnb.ProductionMgr batch = item["batch"], unit_id = item["unit_id"], carry_id = input.carry_id, + status = "0", + use_num = 0, }); if (detail != null) diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs index 4561e5c0..503dbbfd 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoTaskService.cs @@ -39,6 +39,7 @@ using System.Dynamic; using Tnb.EquipMgr.Entities.Dto; using JNPF.Common.Filter; using JNPF.Systems.Entitys.System; +using Microsoft.ClearScript.Util.Web; using Newtonsoft.Json; using Tnb.BasicData.Entities.Dto; using NPOI.SS.Formula.Functions; @@ -369,7 +370,8 @@ namespace Tnb.ProductionMgr workline_code = b.EnCode, workline_name = b.FullName, mo_task_status = a.mo_task_status, - scheduled_qty = SqlFunc.Subqueryable().Where(it => it.mo_id == a.mo_id).Sum(it => it.scheduled_qty), + // 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), estimated_start_date = a.estimated_start_date, estimated_end_date = a.estimated_end_date, @@ -824,6 +826,7 @@ namespace Tnb.ProductionMgr material_id = SqlFunc.Subqueryable().Where(it => it.id == e.material_id).Select(it => it.id), num = e.num, ordinal = d.ordinal, + mbom_process_id = b.id, }) .Mapper(it => it.output_qty = it.num.ParseToInt()) .ToListAsync(); @@ -839,6 +842,7 @@ namespace Tnb.ProductionMgr subMoTask.parent_id = moTask.id; subMoTask.bom_id = input.bom_id; subMoTask.process_id = item.process_id; + subMoTask.mbom_process_id = item.mbom_process_id; subMoTask.mo_task_status = DictConst.ToBeScheduledEncode; subMoTask.workroute_id = item.route_id; subMoTask.workline_id = input.workline_id; @@ -1229,7 +1233,80 @@ namespace Tnb.ProductionMgr await db.Updateable(master).ExecuteCommandAsync(); } + + //扣除生产投料 按最先投入的依次扣除 + List prdFeedingDs = await db.Queryable() + .LeftJoin((a,b)=>a.id==b.feeding_id) + .Where((a,b) => a.workline_id == prdMoTask.workline_id && (b.status=="0" || b.status=="1")) + .OrderBy((a,b) => b.create_time) + .Select((a,b)=>b) + .ToListAsync(); + + if (prdFeedingDs != null && prdFeedingDs.Count>0) + { + + BasMbom basMbom = await db.Queryable().SingleAsync(x => x.id == prdMoTask.bom_id); + List basMbomInputs = await db.Queryable().Where(x => + x.mbom_id == prdMoTask.bom_id && x.mbom_process_id == prdMoTask.mbom_process_id).ToListAsync(); + + foreach (var item in basMbomInputs) + { + var details = prdFeedingDs.Where(x => x.material_id == item.material_id).OrderBy(x=>x.create_time).ToList(); + if (details?.Count>0) + { + decimal deductNum = input.reported_qty * item.num / basMbom.num; + decimal? notUseNum = details.Sum(x => x.num - x.use_num); + if (notUseNum > deductNum) + { + + foreach (var detail in details) + { + + if (deductNum - (detail.num - detail.use_num) < 0) + { + await db.Updateable().SetColumns(x => x.use_num == x.use_num+deductNum) + .SetColumns(x=>x.status=="1") + .Where(x => x.id == detail.id).ExecuteCommandAsync(); + + } + else + { + await db.Updateable().SetColumns(x => x.use_num == x.num) + .SetColumns(x=>x.status=="2") + .Where(x => x.id == detail.id).ExecuteCommandAsync(); + + } + + deductNum = deductNum - (detail.num - detail.use_num); + } + + if (deductNum > 0) + { + throw new Exception("投入物料不足"); + } + } + else if(notUseNum == deductNum) + { + foreach (var detail in details) + { + db.Updateable().SetColumns(x => x.use_num == x.num) + .SetColumns(x=>x.status=="2") + .Where(x => x.id == detail.id); + + } + } + else + { + throw new Exception("投入物料不足"); + } + + } + } + } + }); + + if (!result.IsSuccess) throw Oops.Bah(result.ErrorMessage); return result.IsSuccess; } diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdPackReportService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdPackReportService.cs index 6f426481..8b47fbca 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdPackReportService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdPackReportService.cs @@ -69,7 +69,8 @@ namespace Tnb.ProductionMgr plan_start_date = a.estimated_start_date, plan_end_date = a.estimated_end_date, plan_qty = c.plan_qty, - complete_qty = SqlFunc.Subqueryable().Where(it => it.mo_task_code == a.mo_task_code).Sum(it => it.reported_work_qty), + // complete_qty = SqlFunc.Subqueryable().Where(it => it.mo_task_code == a.mo_task_code).Sum(it => it.reported_work_qty), + complete_qty = a.reported_work_qty+a.scrap_qty, mo_task_status = a.mo_task_status, })