|
|
@@ -18,6 +18,7 @@ using MongoDB.Driver;
|
|
|
using MongoDB.Driver.Linq;
|
|
|
using Newtonsoft.Json;
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
+using SixLabors.ImageSharp;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
@@ -1450,47 +1451,53 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
return prWeekDtos;
|
|
|
}
|
|
|
-/*
|
|
|
- int getDateWeekRang(DateTime tmpDate)
|
|
|
- {
|
|
|
- var startDateStr = tmpDate.Date.AddDays(-(int)(tmpDate.DayOfWeek) + 1).ToString("yyyy-MM-dd");//当前周的开始日期
|
|
|
- var endDateStr = tmpDate.Date.AddDays(7 - (int)(tmpDate.DayOfWeek)).ToString("yyyy-MM-dd");//当前周的结束日期
|
|
|
- GregorianCalendar gc = new System.Globalization.GregorianCalendar();
|
|
|
- int weekOfYear = gc.GetWeekOfYear(tmpDate, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);
|
|
|
- return weekOfYear;
|
|
|
- }*/
|
|
|
+ /*
|
|
|
+ int getDateWeekRang(DateTime tmpDate)
|
|
|
+ {
|
|
|
+ var startDateStr = tmpDate.Date.AddDays(-(int)(tmpDate.DayOfWeek) + 1).ToString("yyyy-MM-dd");//当前周的开始日期
|
|
|
+ var endDateStr = tmpDate.Date.AddDays(7 - (int)(tmpDate.DayOfWeek)).ToString("yyyy-MM-dd");//当前周的结束日期
|
|
|
+ GregorianCalendar gc = new System.Globalization.GregorianCalendar();
|
|
|
+ int weekOfYear = gc.GetWeekOfYear(tmpDate, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);
|
|
|
+ return weekOfYear;
|
|
|
+ }*/
|
|
|
|
|
|
//PR自动审核
|
|
|
public async Task<string> PrAutoApprove(string companyid)
|
|
|
{
|
|
|
- //按要求改成发布四周任务。
|
|
|
- DateTime toTime = DateTime.Now.Date;
|
|
|
- DateTime starttime = toTime.AddDays(1);
|
|
|
- DateTime endtime = toTime.AddDays(28);
|
|
|
- List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.IsRequireGoods == 1 && s.pr_ssend_date >= starttime &&
|
|
|
+ //直接按间隔多少天一次来处理数据,定时任务按周四来考虑。
|
|
|
+ DateTime toTime = DateTime.Now;//new DateTime(2023, 12, 3);
|
|
|
+ DateTime starttime = toTime.Date.AddDays(1);
|
|
|
+ DateTime endtime = toTime.Date.AddDays(28);
|
|
|
+ List<srm_pr_main> alllist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.IsRequireGoods == 1 && s.pr_ssend_date >= starttime &&
|
|
|
s.pr_ssend_date <= endtime && s.state == 1 && string.IsNullOrEmpty(s.analogcalcversion) == true).Result;
|
|
|
|
|
|
- if (prlist.Any())
|
|
|
+ if (alllist.Any())
|
|
|
{
|
|
|
- List<srm_purchase> purchaselist = _mysql_srm_purchase.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.icitem_id).Contains(s.icitem_id) && prlist.Select(c => c.pr_purchaseid).Contains(s.supplier_id)).Result;
|
|
|
- List<srm_supplier> itemsupplierList = _mysql_srm_supplier.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.pr_purchaseid).Contains(s.Id)).Result;
|
|
|
- List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.icitem_id).Contains(s.Id)).Result;
|
|
|
+ List<srm_purchase> purchaselist = _mysql_srm_purchase.GetListAsync(s => s.company_id.ToString() == companyid && alllist.Select(c => c.icitem_id).Contains(s.icitem_id) && alllist.Select(c => c.pr_purchaseid).Contains(s.supplier_id)).Result;
|
|
|
+ List<srm_supplier> itemsupplierList = _mysql_srm_supplier.GetListAsync(s => s.company_id.ToString() == companyid && alllist.Select(c => c.pr_purchaseid).Contains(s.Id)).Result;
|
|
|
+ List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.company_id.ToString() == companyid && alllist.Select(c => c.icitem_id).Contains(s.Id)).Result;
|
|
|
PoActionListDto poaction = new PoActionListDto();
|
|
|
- param.company_id = prlist[0].company_id;
|
|
|
- param.factoryId = prlist[0].factory_id.GetValueOrDefault();
|
|
|
- AutoCreatePOFromPR(prlist, ic_Items, itemsupplierList, purchaselist, poaction);
|
|
|
+ param.company_id = alllist[0].company_id;
|
|
|
+ param.factoryId = alllist[0].factory_id.GetValueOrDefault();
|
|
|
+ for (int i = 0; i < 4; i++)
|
|
|
+ {
|
|
|
+ starttime = toTime.Date.AddDays(i * 7 + 1);
|
|
|
+ endtime = toTime.Date.AddDays((i + 1) * 7);
|
|
|
+ List<srm_pr_main> prlist = alllist.Where(s => s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime).ToList();
|
|
|
+ AutoCreatePOFromPR(prlist, ic_Items, itemsupplierList, purchaselist, poaction);
|
|
|
+ }
|
|
|
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
if (poaction.poMain.Any())
|
|
|
{
|
|
|
- _businessDbContext.BulkUpdate(prlist);
|
|
|
+ _businessDbContext.BulkUpdate(alllist);
|
|
|
_businessDbContext.BulkInsert(poaction.poMain);
|
|
|
}
|
|
|
if (poaction.polist.Any())
|
|
|
{
|
|
|
- _businessDbContext.BulkInsert(poaction.polist);
|
|
|
+ _businessDbContext.BulkInsert(poaction.polist);
|
|
|
}
|
|
|
if (poaction.poOccupiesList.Any())
|
|
|
{
|
|
|
@@ -2070,9 +2077,9 @@ namespace Business.ResourceExamineManagement
|
|
|
if (workordmsters.Any())
|
|
|
{
|
|
|
//根据工单表找到工单明细,然后根据DOP工单占用记录,对比工单明细发货数量,来做冲销。
|
|
|
- var workdetails = _workOrdDetail.Select(s => workordmsters.Select(c => c.WorkOrd).Contains(s.WorkOrd));
|
|
|
+ //var workdetails = _workOrdDetail.Select(s => workordmsters.Select(c => c.WorkOrd).Contains(s.WorkOrd));
|
|
|
List<ic_item_stockoccupy> item_occupy = new List<ic_item_stockoccupy>();
|
|
|
- if (!param.checkPlan)
|
|
|
+ /*if (!param.checkPlan)
|
|
|
{
|
|
|
//在库检,只计算下达工单的占用。
|
|
|
var pwork = workordmsters.Where(x => x.Status.ToLower() == "r").ToList();
|
|
|
@@ -2081,40 +2088,40 @@ namespace Business.ResourceExamineManagement
|
|
|
else {
|
|
|
//物料库存占用记录表
|
|
|
item_occupy = _mysql_ic_item_stockoccupy.GetListAsync(p => p.company_id == companyId && itemIds.Contains(p.icitem_id) && workordmsters.Select(c => c.WorkOrd).Contains(p.morder_mo)).Result;
|
|
|
- }
|
|
|
-
|
|
|
- if (item_occupy.Any())
|
|
|
+ }*/
|
|
|
+ //不论计划还是在库检,都是按全量跑工单,所以每次计算已占用库存,只算下达工单的占用。
|
|
|
+ var pwork = workordmsters.Where(x => x.Status.ToLower() == "r").ToList();
|
|
|
+ item_occupy = _mysql_ic_item_stockoccupy.GetListAsync(p => p.company_id == companyId && itemIds.Contains(p.icitem_id) && pwork.Select(c => c.WorkOrd).Contains(p.morder_mo)).Result;
|
|
|
+ var nbrList = _nbrMaster.Select(x => pwork.Select(c => c.WorkOrd).Contains(x.WorkOrd) && x.Status.ToUpper() != "C").ToList();
|
|
|
+ if (nbrList.Any())
|
|
|
{
|
|
|
- item_occupy.ForEach(s =>
|
|
|
+ var nbrDtlList = _nbrDetail.Select(x => nbrList.Select(c => c.RecID).Contains(x.NbrRecID) && x.Status.ToUpper() != "C").ToList();
|
|
|
+ if (nbrDtlList.Any())
|
|
|
{
|
|
|
- //TODO:对发布数量和占用数量进行对冲,因为目前没有处理不同层级下使用相同物料的占用的问题。dop占用有项次号,而wms的发布数量明细没有项次号
|
|
|
- var wdtl = workdetails.Where(x => x.WorkOrd == s.morder_mo && x.ItemNum == s.icitem_number).ToList();
|
|
|
- if (wdtl.Any())
|
|
|
+ if (item_occupy.Any())
|
|
|
{
|
|
|
- foreach (var dtl in wdtl)
|
|
|
+ item_occupy.ForEach(s =>
|
|
|
{
|
|
|
- if (s.quantity - dtl.QtyPosted > 0)
|
|
|
- {
|
|
|
- s.quantity -= dtl.QtyPosted;
|
|
|
- dtl.QtyPosted = 0;
|
|
|
- }
|
|
|
- else
|
|
|
+ //TODO:对发布数量和占用数量进行对冲,因为目前没有处理不同层级下使用相同物料的占用的问题。dop占用有项次号,而wms的发布数量明细没有项次号
|
|
|
+ var wdtl = nbrDtlList.Find(x => x.WorkOrd == s.morder_mo && x.ItemNum == s.icitem_number);
|
|
|
+ if (wdtl != null)
|
|
|
{
|
|
|
- dtl.QtyPosted -= s.quantity;
|
|
|
- s.quantity = 0;
|
|
|
+ s.quantity = wdtl.QtyOrd - wdtl.QtyRec;
|
|
|
+ s.quantity = s.quantity < 0 ? 0 : s.quantity;
|
|
|
}
|
|
|
+ });
|
|
|
+ item_occupy = item_occupy.Where(s => s.quantity > 0).ToList();
|
|
|
+ if (item_occupy.Count > 0)
|
|
|
+ {
|
|
|
+
|
|
|
+ var mo_item_occupy = ObjectMapper.Map<List<ic_item_stockoccupy>, List<mo_ic_item_stockoccupy>>(item_occupy);
|
|
|
+ mo_item_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
|
|
|
+ await MongoHelper<mo_ic_item_stockoccupy>.InsertManyAsync(mo_item_occupy);
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
- item_occupy = item_occupy.Where(s => s.quantity > 0).ToList();
|
|
|
- if (item_occupy.Count > 0)
|
|
|
- {
|
|
|
- var mo_item_occupy = ObjectMapper.Map<List<ic_item_stockoccupy>, List<mo_ic_item_stockoccupy>>(item_occupy);
|
|
|
- mo_item_occupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
|
|
|
- await MongoHelper<mo_ic_item_stockoccupy>.InsertManyAsync(mo_item_occupy);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
//工单主表
|
|
|
var mes_morder = _mysql_mes_morder.GetListAsync(x => string.IsNullOrEmpty(x.morder_state) == false && x.morder_state != "完成" && x.company_id == companyId && x.factory_id == factoryId && string.IsNullOrEmpty(x.analogcalcversion) == true && workordmsters.Select(c => c.WorkOrd).Contains(x.morder_no)).Result;
|
|
|
if (mes_morder.Count > 0)
|
|
|
@@ -2629,7 +2636,7 @@ namespace Business.ResourceExamineManagement
|
|
|
return "当前任务工厂编号为空,请检查。";
|
|
|
}
|
|
|
List<string> tsWork = new List<string> { "test", "tcn", "rw" };
|
|
|
- var ordlist = _workOrdMaster.Select(x => x.Domain == domain && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && x.Status.ToLower() == "p").ToList();
|
|
|
+ var ordlist = _workOrdMaster.Select(x => x.Domain == domain && x.WorkOrd== "M500413982" && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && x.Status.ToLower() == "p").ToList();
|
|
|
List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => ordlist.Select(c=>c.WorkOrd).Contains(x.morder_no) && x.factory_id.ToString() == domain).Result;
|
|
|
|
|
|
/*//先排除锁定期内的工单 //优先级排序
|
|
|
@@ -3466,7 +3473,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
}*/
|
|
|
_CalcBomViewAppService.GenerateMoList = GenerateMoList;
|
|
|
-
|
|
|
+ _CalcBomViewAppService.newStockOccList = new List<mo_ic_item_stockoccupy>();
|
|
|
foreach (var item in priorityMorderList)
|
|
|
{
|
|
|
var moentry = mo_Mes_Moentries.Find(s => s.moentry_moid == item.Id);
|
|
|
@@ -3513,7 +3520,7 @@ namespace Business.ResourceExamineManagement
|
|
|
dtl.sentry_id = sentry.Id;
|
|
|
getBomList.ForEach(s => s.sentry_id = item.Id);
|
|
|
}
|
|
|
- _CalcBomViewAppService.newStockOccList = new List<mo_ic_item_stockoccupy>();
|
|
|
+
|
|
|
_CalcBomViewAppService.morder_type = item.morder_type;
|
|
|
_CalcBomViewAppService.mes_morder = item;
|
|
|
//库存初始化
|
|
|
@@ -3534,9 +3541,7 @@ namespace Business.ResourceExamineManagement
|
|
|
rtn.examines = examines;
|
|
|
List<WorkOrdDetail> mainWorkOrdDetails = new List<WorkOrdDetail>();
|
|
|
if (moentryList == null)
|
|
|
- {
|
|
|
- //暂时屏蔽重新生成工单物料明细
|
|
|
-
|
|
|
+ {
|
|
|
//成品虚拟件对应关系
|
|
|
var productOpList = _productStructureOp.Select(x => priorityMorderList.Select(c => c.product_code).Contains(x.ProductItem) && x.Domain == param.factoryId.ToString());
|
|
|
foreach (var workord in priorityMorderList)
|
|
|
@@ -3740,6 +3745,16 @@ namespace Business.ResourceExamineManagement
|
|
|
return rtn;
|
|
|
}
|
|
|
|
|
|
+ public void XdWorkOrdCalc(string domain)
|
|
|
+ {
|
|
|
+ var nbrList = _nbrMaster.Select(x => !string.IsNullOrEmpty(x.Status) && x.Status.ToUpper() != "C").ToList();
|
|
|
+ if (nbrList.Any())
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 物料数据计算前准备
|
|
|
/// </summary>
|
|
|
@@ -4191,44 +4206,67 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
+ //List<string> locationList = new List<string> { "1000", "1001", "5008", "8000", "8001" };
|
|
|
+ var locationRange = _configurationItem.Select(x => x.FldName == "MRPLocationRange" && x.Domain == param.factoryId.ToString()).FirstOrDefault();
|
|
|
+
|
|
|
List<string> locationList = new List<string> { "1000", "1001", "5008", "8000", "8001" };
|
|
|
- //取出WMS物料记录
|
|
|
- var stockList = _invMaster.Select(a => a.Domain == param.factoryId.ToString() && locationList.Contains(a.Location) && a.IsActive && itemChildList.Distinct().Contains(a.ItemNum));
|
|
|
- //WMS物料记录汇总
|
|
|
- var groupList = stockList.
|
|
|
- GroupBy(m => new { m.ItemNum }).
|
|
|
- Select(a => new { ItemNum = a.Key.ItemNum, Qty = a.Sum(c => c.AvailStatusQty.GetValueOrDefault() + c.Assay.GetValueOrDefault()) }).ToList();
|
|
|
-
|
|
|
- var itemNums = groupList.Select(b => b.ItemNum).ToList();//需要处理的dop物料编码集合
|
|
|
+ if (locationRange != null && locationRange.Val != null)
|
|
|
+ {
|
|
|
+ locationList = locationRange.Val.SplitToArray(",").ToList();
|
|
|
+ }
|
|
|
+ if (!param.checkPlan)
|
|
|
+ {
|
|
|
+ if (locationList.Contains("1000"))
|
|
|
+ {
|
|
|
+ locationList.Remove("1000");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var locStock = _invMaster.Select(a => itemChildList.Contains(a.ItemNum) && a.IsActive && a.Domain == param.factoryId.ToString() && locationList.Contains(a.Location));
|
|
|
+ var sapInvList = _SAPInv.Select(a => a.WERKS == param.factoryId.ToString() && itemChildList.Contains(a.MATNR) && (a.SOBKZ.ToUpper() == "O" || locationList.Contains(a.LGORT)));
|
|
|
+
|
|
|
//根据WMS物料,取出DOP物料数据
|
|
|
- var items = _mysql_ic_item.GetListAsync(a => itemNums.Contains(a.number) && a.factory_id == param.factoryId && a.company_id == param.company_id).Result;
|
|
|
+ var items = _mysql_ic_item.GetListAsync(a => itemChildList.Contains(a.number) && a.factory_id == param.factoryId).Result;
|
|
|
|
|
|
var itemIds = items.Select(b => b.Id).ToList();//需要处理的dop物料id集合
|
|
|
- List<ic_item_stock> mysqlStock = _mysql_ic_item_stock.GetListAsync(a => itemIds.Contains(a.icitem_id) && a.factory_id == param.factoryId && a.company_id == param.company_id).Result;
|
|
|
+ List<ic_item_stock> mysqlStock = _mysql_ic_item_stock.GetListAsync(a => itemIds.Contains(a.icitem_id) && a.factory_id == param.factoryId).Result;
|
|
|
List<ic_item_stock> needAddList = new List<ic_item_stock>();
|
|
|
+ List<ic_item_stock> needupdList = new List<ic_item_stock>();
|
|
|
|
|
|
- foreach (var stockWMS in groupList)
|
|
|
+ foreach (var stockWMS in itemChildList)
|
|
|
{
|
|
|
- var num = items.Find(x => x.number == stockWMS.ItemNum);
|
|
|
+ var num = items.Find(x => x.number == stockWMS);
|
|
|
if (num != null)
|
|
|
{
|
|
|
var item = mysqlStock.Find(a => a.icitem_id == num.Id);
|
|
|
if (item != null)
|
|
|
{
|
|
|
- item.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
|
|
|
+ needupdList.Add(item);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ic_item_stock stock = new ic_item_stock();
|
|
|
- stock.GenerateNewId(help.NextId());
|
|
|
- stock.tenant_id = param.company_id;
|
|
|
- stock.factory_id = param.factoryId;
|
|
|
- stock.company_id = param.company_id;
|
|
|
- stock.icitem_id = num.Id;
|
|
|
- stock.icitem_number = num.number;
|
|
|
- stock.icitem_name = num.name;
|
|
|
- stock.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
|
|
|
- needAddList.Add(stock);
|
|
|
+ item = new ic_item_stock();
|
|
|
+ item.GenerateNewId(help.NextId());
|
|
|
+ item.tenant_id = param.company_id;
|
|
|
+ item.factory_id = param.factoryId;
|
|
|
+ item.company_id = param.company_id;
|
|
|
+ item.icitem_id = num.Id;
|
|
|
+ item.icitem_number = num.number;
|
|
|
+ item.icitem_name = num.name;
|
|
|
+ needAddList.Add(item);
|
|
|
+ }
|
|
|
+ item.sqty = 0;
|
|
|
+ foreach (var lct in locationList)
|
|
|
+ {
|
|
|
+ var lctQty = locStock.Where(s => s.ItemNum == item.icitem_number && s.Location == lct).Sum(p => p.AvailStatusQty.GetValueOrDefault() + p.Assay.GetValueOrDefault());
|
|
|
+ if (lctQty == 0)
|
|
|
+ {
|
|
|
+ lctQty = sapInvList.Where(x => x.MATNR == item.icitem_number && x.LGORT == lct).Sum(p => p.LABST + p.INSME);
|
|
|
+ }
|
|
|
+ item.sqty += lctQty;
|
|
|
+ }
|
|
|
+ if (param.checkPlan)
|
|
|
+ {
|
|
|
+ item.sqty += sapInvList.Where(x => x.MATNR == item.icitem_number && x.SOBKZ.ToUpper() == "O").Sum(p => p.LABST + p.INSME);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -4236,7 +4274,7 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
_businessDbContext.BulkInsert(needAddList);
|
|
|
}
|
|
|
- _businessDbContext.BulkUpdate(mysqlStock);
|
|
|
+ _businessDbContext.BulkUpdate(needupdList);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|