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