From 24606bab04d8396470752a47f2bbaac6325d01c1 Mon Sep 17 00:00:00 2001 From: zhoukeda <1315948824@qq.com> Date: Fri, 25 Aug 2023 16:36:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=8D=E5=90=91=E8=BF=BD=E6=BA=AF=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dto/PrdManage/PrdMoFromQueryInput.cs | 30 +++ .../Tnb.ProductionMgr/PrdMoService.cs | 250 +++++++++++++----- 2 files changed, 212 insertions(+), 68 deletions(-) diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoFromQueryInput.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoFromQueryInput.cs index f7884670..d284f723 100644 --- a/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoFromQueryInput.cs +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Dto/PrdManage/PrdMoFromQueryInput.cs @@ -18,4 +18,34 @@ namespace Tnb.ProductionMgr.Entities.Dto.PrdManage public string? barcode { get; set; } } + + public class PrdMoFromTwoQueryInput + { + public string mo_id { get; set; } + public string mo_task_code { get; set; } + public string barcode { get; set; } + } + + public class PrdMoFromThreeQueryInput + { + public string mo_task_id { get; set; } + public string mo_task_code { get; set; } + public string barcode { get; set; } + } + + public class PrdMoFromTabQueryInput + { + public string mo_task_id { get; set; } + public string barcode { get; set; } + } + + public class PrdMoReverseFromQueryInput + { + public string barcode { get; set; } + } + + public class PrdMoReverseFromOutInfoQueryInput + { + public string feeding_detail_id { get; set; } + } } \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs index 3b048952..baffc63b 100644 --- a/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs +++ b/ProductionMgr/Tnb.ProductionMgr/PrdMoService.cs @@ -423,11 +423,11 @@ namespace Tnb.ProductionMgr /// /// [HttpPost] - public async Task PrdMoFromTwoList(Dictionary dic) + public async Task PrdMoFromTwoList(PrdMoFromTwoQueryInput prdMoFromTwoQueryInput) { - string mo_id = dic.ContainsKey("mo_id") ? dic["mo_id"] : ""; - string mo_task_code = dic.ContainsKey("mo_task_code") ? dic["mo_task_code"] : ""; - string barcode = dic.ContainsKey("barcode") ? dic["barcode"] : ""; + string mo_id = prdMoFromTwoQueryInput.mo_id ?? ""; + string mo_task_code = prdMoFromTwoQueryInput.mo_task_code ?? ""; + string barcode = prdMoFromTwoQueryInput.barcode ?? ""; List ids = new List(); if (!string.IsNullOrEmpty(barcode)) { @@ -495,11 +495,11 @@ namespace Tnb.ProductionMgr /// /// [HttpPost] - public async Task PrdMoFromThreeList(Dictionary dic) + public async Task PrdMoFromThreeList(PrdMoFromThreeQueryInput prdMoFromThreeQueryInput) { - string mo_task_id = dic.ContainsKey("mo_task_id") ? dic["mo_task_id"] : ""; - string mo_task_code = dic.ContainsKey("mo_task_code") ? dic["mo_task_code"] : ""; - string barcode = dic.ContainsKey("barcode") ? dic["barcode"] : ""; + string mo_task_id = prdMoFromThreeQueryInput.mo_task_id ?? ""; + string mo_task_code = prdMoFromThreeQueryInput.mo_task_code ?? ""; + string barcode = prdMoFromThreeQueryInput.barcode ?? ""; List ids = new List(); if (!string.IsNullOrEmpty(barcode)) { @@ -545,10 +545,10 @@ namespace Tnb.ProductionMgr /// /// [HttpPost] - public async Task PrdMoFromManList(Dictionary dic) + public async Task PrdMoFromManList(PrdMoFromTabQueryInput prdMoFromTabQueryInput) { - string mo_task_id = dic.ContainsKey("mo_task_id") ? dic["mo_task_id"] : ""; - string barcode = dic.ContainsKey("barcode") ? dic["barcode"] : ""; + string mo_task_id = prdMoFromTabQueryInput.mo_task_id ?? ""; + string barcode = prdMoFromTabQueryInput.barcode ?? ""; List ids = new List(); if (!string.IsNullOrEmpty(barcode)) { @@ -580,10 +580,10 @@ namespace Tnb.ProductionMgr /// /// [HttpPost] - public async Task PrdMoFromEquipList(Dictionary dic) + public async Task PrdMoFromEquipList(PrdMoFromTabQueryInput prdMoFromTabQueryInput) { - string mo_task_id = dic.ContainsKey("mo_task_id") ? dic["mo_task_id"] : ""; - string barcode = dic.ContainsKey("barcode") ? dic["barcode"] : ""; + string mo_task_id = prdMoFromTabQueryInput.mo_task_id ?? ""; + string barcode = prdMoFromTabQueryInput.barcode ?? ""; List ids = new List(); if (!string.IsNullOrEmpty(barcode)) { @@ -608,10 +608,10 @@ namespace Tnb.ProductionMgr /// /// [HttpPost] - public async Task PrdMoFromMaterialList(Dictionary dic) + public async Task PrdMoFromMaterialList(PrdMoFromTabQueryInput prdMoFromTabQueryInput) { - string mo_task_id = dic.ContainsKey("mo_task_id") ? dic["mo_task_id"] : ""; - string barcode = dic.ContainsKey("barcode") ? dic["barcode"] : ""; + string mo_task_id = prdMoFromTabQueryInput.mo_task_id ?? ""; + string barcode = prdMoFromTabQueryInput.barcode ?? ""; List ids = new List(); if (!string.IsNullOrEmpty(barcode)) { @@ -719,7 +719,9 @@ namespace Tnb.ProductionMgr List lastPrdReportIds = new List(); foreach (var item in basMbomInputs) { - decimal? num1 = beforeReportNum / basMbom.num * item.num; + BasMbomOutput basMbomOutput = await _db.Queryable().Where(x=>x.mbom_process_id==basMbomProcess.id && x.material_id==prdMoTask.material_id).FirstAsync(); + if (basMbomOutput == null) break; + decimal? num1 = beforeReportNum / Convert.ToDecimal(basMbomOutput.num) * item.num; List prdFeedingDs = await _db.Queryable() .LeftJoin((a, b) => a.feeding_id == b.id) .Where((a, b) => a.material_id == item.material_id && b.mo_task_id == mo_task_id) @@ -751,7 +753,7 @@ namespace Tnb.ProductionMgr } else { - decimal? num2 = lastPrdReport.reported_qty / basMbom.num * item.num; + decimal? num2 = lastPrdReport.reported_qty / Convert.ToDecimal(basMbomOutput.num) * item.num; if (sum2 <= num2) { lastPrdReportIds.Add(lastPrdReport.id); @@ -779,7 +781,7 @@ namespace Tnb.ProductionMgr } else { - decimal? num2 = prdReport.reported_qty / basMbom.num * item.num; + decimal? num2 = prdReport.reported_qty / Convert.ToDecimal(basMbomOutput.num) * item.num; if (sum2 <= num2) { prdFeedingIds.Add(item.id); @@ -846,9 +848,9 @@ namespace Tnb.ProductionMgr /// /// [HttpPost] - public async Task PrdMoReverseFromMaterialInfo(Dictionary dic) + public async Task PrdMoReverseFromMaterialInfo(PrdMoReverseFromQueryInput prdMoReverseFromQueryInput) { - string barcode = dic.ContainsKey("barcode") ? dic["barcode"] : ""; + string barcode = prdMoReverseFromQueryInput.barcode ?? ""; string domain = (App.HttpContext.Request.IsHttps ? "https://" : "http://") + App.HttpContext.Request.Host; Dictionary header = new Dictionary() { @@ -891,9 +893,9 @@ namespace Tnb.ProductionMgr /// /// [HttpPost] - public async Task PrdMoReverseFromFeedingInfo(Dictionary dic) + public async Task PrdMoReverseFromFeedingInfo(PrdMoReverseFromQueryInput prdMoReverseFromQueryInput) { - string barcode = dic.ContainsKey("barcode") ? dic["barcode"] : ""; + string barcode = prdMoReverseFromQueryInput.barcode ?? ""; List ids = await _db.Queryable() .LeftJoin((a, b) => a.id == b.material_receipt_detail_id) .LeftJoin((a, b, c) => b.feeding_id == c.id) @@ -937,9 +939,9 @@ namespace Tnb.ProductionMgr /// /// [HttpPost] - public async Task PrdMoReverseFromOutInfo(Dictionary dic) + public async Task PrdMoReverseFromOutInfo(PrdMoReverseFromOutInfoQueryInput prdMoReverseFromOutInfoQueryInput) { - string feeding_detail_id = dic.ContainsKey("feeding_detail_id") ? dic["feeding_detail_id"] : ""; + string feeding_detail_id = prdMoReverseFromOutInfoQueryInput.feeding_detail_id ?? ""; PrdFeedingD prdFeedingD = await _db.Queryable().FirstAsync(x => x.id == feeding_detail_id); if(prdFeedingD.use_num<=0) return Array.Empty(); PrdFeedingH prdFeedingH = await _db.Queryable().FirstAsync(x => x.id == prdFeedingD.feeding_id); @@ -1011,51 +1013,163 @@ namespace Tnb.ProductionMgr return Array.Empty(); } - - List barCodes = await _db.Queryable().Where(x=>reportIds.Contains(x.id)).Select(x=>x.barcode).ToListAsync(); - - string domain = (App.HttpContext.Request.IsHttps ? "https://" : "http://") + App.HttpContext.Request.Host; - Dictionary header = new Dictionary() - { - ["Authorization"] = App.HttpContext.Request.Headers["Authorization"] - }; - Dictionary postData = new Dictionary() - { - ["org_id"] = _userManager.GetUserInfo().Result.organizeId, - ["barcode"] = barCodes, - ["currentPage"] = 1, - ["pageSize"] = int.MaxValue, - }; - var sendResult = HttpUtils.RequestPost(domain + WebApiConst.MES_FETCH_IN_OUT_STOCK_INFO_BY_BAR_CODE,JsonConvert.SerializeObject(postData),header); - Log.Information(sendResult); - - AuthResponse authResponse = JsonConvert.DeserializeObject(sendResult); - if (authResponse.code != 200) - { - throw Oops.Bah(authResponse.msg); - } - else - { - BasMaterial basMaterial = await _db.Queryable().FirstAsync(x => x.id == prdMoTask.material_id); - PageResult output = JsonConvert.DeserializeObject>(authResponse.data.ToString(),new Tnb.Common.Utils.DateTimeJsonConverter()); - if (output.list != null && output.list.Count > 0) - { - foreach (var item in output.list) - { - item.material_name = basMaterial.name; - } - } - - return output.list; - } } else { - // var queryable = _db.Queryable() - // .LeftJoin((a,b)=>a.mbom_process_id==b.id) - // .LeftJoin((a,b,c)=>a.id==c.mo_task_id) - // .Where((a,b,c)=>a.) - return null; + List prdReports = await _db.Queryable() + .LeftJoin((a, b) => a.mbom_process_id == b.id) + .LeftJoin((a, b, c) => a.id == c.mo_task_id) + .Where((a, b, c) => a.mo_id == prdMoTask.mo_id && b.next_process_no == null) + .OrderBy((a,b,c)=>c.create_time) + .Select((a, b, c) => c).ToListAsync(); + + if (prdReports != null && prdReports.Count > 0) + { + List mbomProcesssIds = new List(){prdMoTask.mbom_process_id}; + BasMbomProcess startMbomProcess = await _db.Queryable().Where(x=>x.id==prdMoTask.mbom_process_id).FirstAsync(); + List allMbomProcesses = await _db.Queryable().Where(x=>x.mbom_id==prdMoTask.bom_id).ToListAsync(); + string startNo = startMbomProcess.next_process_no; + if (!string.IsNullOrEmpty(startNo)) + { + while (true) + { + BasMbomProcess nextMbomProcess = allMbomProcesses.FirstOrDefault(x=>x.no==startNo); + + if (nextMbomProcess==null || nextMbomProcess.no==null) + { + break; + } + else + { + startNo = nextMbomProcess.next_process_no; + mbomProcesssIds.Add(nextMbomProcess.id); + } + } + } + else + { + if (!prdMoTask.mbom_process_id.Contains(prdMoTask.mbom_process_id)) + { + mbomProcesssIds.Add(startMbomProcess.id); + } + } + + List outputList = await _db.Queryable() + .LeftJoin((a, b) => a.id == b.mbom_process_id) + .Where((a, b) => mbomProcesssIds.Contains(a.id)) + .Select((a,b)=>b).ToListAsync(); + + List inputList = await _db.Queryable() + .LeftJoin((a, b) => a.id == b.mbom_process_id) + .Where((a, b) => mbomProcesssIds.Contains(a.id)) + .Select((a,b)=>b).ToListAsync(); + + decimal? needNum = 1;//一个最终物料需要本任务单投入物料的数量 + string tempMaterialId = outputList.FirstOrDefault(x=>x.mbom_process_id==mbomProcesssIds[mbomProcesssIds.Count-1])?.material_id; + for (int i = mbomProcesssIds.Count - 1; i > 0;i--) + { + + List inputs = inputList.Where(x => x.mbom_process_id == mbomProcesssIds[i]).ToList(); + BasMbomOutput output = outputList.FirstOrDefault(x => x.mbom_process_id == mbomProcesssIds[i] && x.material_id==tempMaterialId); + List inputMaterialIds = inputs.Select(x => x.material_id).ToList(); + List lastOutputs = outputList.Where(x=>x.mbom_process_id==mbomProcesssIds[i-1]).ToList(); + decimal? inputNum = inputs.FirstOrDefault(x => inputMaterialIds.Contains(x.material_id))?.num; + if (inputNum == null) + { + throw new Exception("生产bom投入产出物料配置错误"); + } + else + { + tempMaterialId = inputs.FirstOrDefault(x => inputMaterialIds.Contains(x.material_id))?.material_id; + needNum = needNum / Convert.ToDecimal(output.num) * inputNum; + } + } + + bool flag = true; + decimal residueNeed = 0; + foreach (var prdReport in prdReports) + { + decimal needNumTotal = prdReport.reported_qty * needNum ?? 0; + if (beforeIn - needNumTotal >= 0) + { + beforeIn -= needNumTotal; + } + else + { + if (flag) + { + if (prdFeedingD.num > needNumTotal - beforeIn) + { + residueNeed = prdFeedingD.num - (needNumTotal - beforeIn); + reportIds.Add(prdReport.id); + } + else + { + reportIds.Add(prdReport.id); + break; + } + + flag = false; + continue; + + } + + if (residueNeed - needNumTotal > 0) + { + residueNeed -= needNumTotal; + reportIds.Add(prdReport.id); + }else + { + reportIds.Add(prdReport.id); + break; + } + } + } + + + + } + else + { + return Array.Empty(); + } + } + + List barCodes = await _db.Queryable().Where(x=>reportIds.Contains(x.id)).Select(x=>x.barcode).ToListAsync(); + + string domain = (App.HttpContext.Request.IsHttps ? "https://" : "http://") + App.HttpContext.Request.Host; + Dictionary header = new Dictionary() + { + ["Authorization"] = App.HttpContext.Request.Headers["Authorization"] + }; + Dictionary postData = new Dictionary() + { + ["org_id"] = _userManager.GetUserInfo().Result.organizeId, + ["barcode"] = barCodes, + ["currentPage"] = 1, + ["pageSize"] = int.MaxValue, + }; + var sendResult = HttpUtils.RequestPost(domain + WebApiConst.MES_FETCH_IN_OUT_STOCK_INFO_BY_BAR_CODE,JsonConvert.SerializeObject(postData),header); + Log.Information(sendResult); + + AuthResponse authResponse = JsonConvert.DeserializeObject(sendResult); + if (authResponse.code != 200) + { + throw Oops.Bah(authResponse.msg); + } + else + { + BasMaterial basMaterial = await _db.Queryable().FirstAsync(x => x.id == prdMoTask.material_id); + PageResult output = JsonConvert.DeserializeObject>(authResponse.data.ToString(),new Tnb.Common.Utils.DateTimeJsonConverter()); + if (output.list != null && output.list.Count > 0) + { + foreach (var item in output.list) + { + item.material_name = basMaterial.name; + } + } + + return output.list; } }