This commit is contained in:
alex
2023-08-25 17:32:46 +08:00
2 changed files with 212 additions and 68 deletions

View File

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

View File

@@ -423,11 +423,11 @@ namespace Tnb.ProductionMgr
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> PrdMoFromTwoList(Dictionary<string,string> dic)
public async Task<dynamic> 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<string> ids = new List<string>();
if (!string.IsNullOrEmpty(barcode))
{
@@ -495,11 +495,11 @@ namespace Tnb.ProductionMgr
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> PrdMoFromThreeList(Dictionary<string,string> dic)
public async Task<dynamic> 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<string> ids = new List<string>();
if (!string.IsNullOrEmpty(barcode))
{
@@ -545,10 +545,10 @@ namespace Tnb.ProductionMgr
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> PrdMoFromManList(Dictionary<string,string> dic)
public async Task<dynamic> 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<string> ids = new List<string>();
if (!string.IsNullOrEmpty(barcode))
{
@@ -580,10 +580,10 @@ namespace Tnb.ProductionMgr
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> PrdMoFromEquipList(Dictionary<string,string> dic)
public async Task<dynamic> 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<string> ids = new List<string>();
if (!string.IsNullOrEmpty(barcode))
{
@@ -608,10 +608,10 @@ namespace Tnb.ProductionMgr
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> PrdMoFromMaterialList(Dictionary<string,string> dic)
public async Task<dynamic> 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<string> ids = new List<string>();
if (!string.IsNullOrEmpty(barcode))
{
@@ -719,7 +719,9 @@ namespace Tnb.ProductionMgr
List<string> lastPrdReportIds = new List<string>();
foreach (var item in basMbomInputs)
{
decimal? num1 = beforeReportNum / basMbom.num * item.num;
BasMbomOutput basMbomOutput = await _db.Queryable<BasMbomOutput>().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<PrdFeedingD> prdFeedingDs = await _db.Queryable<PrdFeedingD>()
.LeftJoin<PrdFeedingH>((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
/// <param name="dic"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> PrdMoReverseFromMaterialInfo(Dictionary<string, string> dic)
public async Task<dynamic> 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<string, object> header = new Dictionary<string, object>()
{
@@ -891,9 +893,9 @@ namespace Tnb.ProductionMgr
/// <param name="dic"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> PrdMoReverseFromFeedingInfo(Dictionary<string, string> dic)
public async Task<dynamic> PrdMoReverseFromFeedingInfo(PrdMoReverseFromQueryInput prdMoReverseFromQueryInput)
{
string barcode = dic.ContainsKey("barcode") ? dic["barcode"] : "";
string barcode = prdMoReverseFromQueryInput.barcode ?? "";
List<string> ids = await _db.Queryable<PrdMaterialReceiptD>()
.LeftJoin<PrdFeedingD>((a, b) => a.id == b.material_receipt_detail_id)
.LeftJoin<PrdFeedingH>((a, b, c) => b.feeding_id == c.id)
@@ -937,9 +939,9 @@ namespace Tnb.ProductionMgr
/// <param name="dic"></param>
/// <returns></returns>
[HttpPost]
public async Task<dynamic> PrdMoReverseFromOutInfo(Dictionary<string, string> dic)
public async Task<dynamic> 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<PrdFeedingD>().FirstAsync(x => x.id == feeding_detail_id);
if(prdFeedingD.use_num<=0) return Array.Empty<string>();
PrdFeedingH prdFeedingH = await _db.Queryable<PrdFeedingH>().FirstAsync(x => x.id == prdFeedingD.feeding_id);
@@ -1011,51 +1013,163 @@ namespace Tnb.ProductionMgr
return Array.Empty<string>();
}
List<string> barCodes = await _db.Queryable<PrdReport>().Where(x=>reportIds.Contains(x.id)).Select(x=>x.barcode).ToListAsync();
string domain = (App.HttpContext.Request.IsHttps ? "https://" : "http://") + App.HttpContext.Request.Host;
Dictionary<string, object> header = new Dictionary<string, object>()
{
["Authorization"] = App.HttpContext.Request.Headers["Authorization"]
};
Dictionary<string, object> postData = new Dictionary<string, object>()
{
["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<AuthResponse>(sendResult);
if (authResponse.code != 200)
{
throw Oops.Bah(authResponse.msg);
}
else
{
BasMaterial basMaterial = await _db.Queryable<BasMaterial>().FirstAsync(x => x.id == prdMoTask.material_id);
PageResult<PrdMoReverseFromOutput> output = JsonConvert.DeserializeObject<PageResult<PrdMoReverseFromOutput>>(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<PrdMoTask>()
// .LeftJoin<BasMbomProcess>((a,b)=>a.mbom_process_id==b.id)
// .LeftJoin<PrdReport>((a,b,c)=>a.id==c.mo_task_id)
// .Where((a,b,c)=>a.)
return null;
List<PrdReport> prdReports = await _db.Queryable<PrdMoTask>()
.LeftJoin<BasMbomProcess>((a, b) => a.mbom_process_id == b.id)
.LeftJoin<PrdReport>((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<string> mbomProcesssIds = new List<string>(){prdMoTask.mbom_process_id};
BasMbomProcess startMbomProcess = await _db.Queryable<BasMbomProcess>().Where(x=>x.id==prdMoTask.mbom_process_id).FirstAsync();
List<BasMbomProcess> allMbomProcesses = await _db.Queryable<BasMbomProcess>().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<BasMbomOutput> outputList = await _db.Queryable<BasMbomProcess>()
.LeftJoin<BasMbomOutput>((a, b) => a.id == b.mbom_process_id)
.Where((a, b) => mbomProcesssIds.Contains(a.id))
.Select((a,b)=>b).ToListAsync();
List<BasMbomInput> inputList = await _db.Queryable<BasMbomProcess>()
.LeftJoin<BasMbomInput>((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<BasMbomInput> 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<string> inputMaterialIds = inputs.Select(x => x.material_id).ToList();
List<BasMbomOutput> 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<string>();
}
}
List<string> barCodes = await _db.Queryable<PrdReport>().Where(x=>reportIds.Contains(x.id)).Select(x=>x.barcode).ToListAsync();
string domain = (App.HttpContext.Request.IsHttps ? "https://" : "http://") + App.HttpContext.Request.Host;
Dictionary<string, object> header = new Dictionary<string, object>()
{
["Authorization"] = App.HttpContext.Request.Headers["Authorization"]
};
Dictionary<string, object> postData = new Dictionary<string, object>()
{
["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<AuthResponse>(sendResult);
if (authResponse.code != 200)
{
throw Oops.Bah(authResponse.msg);
}
else
{
BasMaterial basMaterial = await _db.Queryable<BasMaterial>().FirstAsync(x => x.id == prdMoTask.material_id);
PageResult<PrdMoReverseFromOutput> output = JsonConvert.DeserializeObject<PageResult<PrdMoReverseFromOutput>>(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;
}
}