|
|
@@ -669,7 +669,7 @@ namespace Business.ResourceExamineManagement
|
|
|
|
|
|
//处理销售订单优先级
|
|
|
sorders = _priorityAppService.CalcOrderPriority(sorders, sentrys);
|
|
|
- AsyncItemStockFromWMS(sentrys);
|
|
|
+
|
|
|
//处理订单行优先级
|
|
|
sentrys = _priorityAppService.CalcOrderEntryPriority(sorders, sentrys);
|
|
|
|
|
|
@@ -699,6 +699,7 @@ namespace Business.ResourceExamineManagement
|
|
|
AutoCreateBomBill(param.company_id.ToString(), autoCreates);
|
|
|
pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
|
|
|
}
|
|
|
+ AsyncItemStockFromWMS(pretreatments);
|
|
|
|
|
|
//数据库快照-同步mysql库数据到mongoDB中
|
|
|
await DbSnapShot(input.company_id, input.factoryId, bangid, pretreatments);
|
|
|
@@ -994,7 +995,8 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
if (bomExamineList.Any())
|
|
|
{
|
|
|
- _businessBangDbContext.BulkInsert(bomExamineList.OrderBy(s => s.num_order).ToList());
|
|
|
+ await _mysql_bom_child_examine.InsertManyAsync(bomExamineList);
|
|
|
+ //_businessBangDbContext.BulkInsert(bomExamineList.OrderBy(s => s.num_order).ToList());
|
|
|
}
|
|
|
if (mooccupyList.Any())
|
|
|
{
|
|
|
@@ -1555,7 +1557,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
|
|
|
//获取订单行数据 progress == "2"已做检查但是未评审的订单行
|
|
|
- //sentrys = sentrys.Where(s => s.progress == "2").ToList();
|
|
|
+ sentrys = sentrys.Where(s => s.progress == "2").ToList();
|
|
|
if (!sentrys.Any())
|
|
|
{
|
|
|
new NLogHelper("ResourceExamineAppService").WriteLog("ReceiveResult", "订单行数据不存在", _currentTenant.Id.ToString());
|
|
|
@@ -2858,7 +2860,7 @@ namespace Business.ResourceExamineManagement
|
|
|
mo.morder_state = MorderEnum.Xd_state;
|
|
|
}
|
|
|
}
|
|
|
- await _mysql_mes_morder.UpdateManyAsync(morders);
|
|
|
+
|
|
|
if (workords.Length > 0)
|
|
|
{
|
|
|
workords = workords.Substring(1, workords.Length - 1);
|
|
|
@@ -2866,8 +2868,10 @@ namespace Business.ResourceExamineManagement
|
|
|
var pickRst = await CreatePickBill(workords, domain, userAccount);
|
|
|
if (pickRst != "ok")
|
|
|
{
|
|
|
+ new NLogHelper("ResourceExamineAppService").WriteLog("CreatePickBill", "生成领料单相关数据更新失败:" + pickRst, _currentTenant.Id.ToString());
|
|
|
return pickRst;
|
|
|
}
|
|
|
+ await _mysql_mes_morder.UpdateManyAsync(morders);
|
|
|
var insertList = GetCopyOP(workords, domain);
|
|
|
if (insertList.Any())
|
|
|
{
|
|
|
@@ -2912,6 +2916,7 @@ namespace Business.ResourceExamineManagement
|
|
|
var pickRst = await CreatePickBill(morders[0].morder_no, domain, userAccount);
|
|
|
if (pickRst != "ok")
|
|
|
{
|
|
|
+ new NLogHelper("ResourceExamineAppService").WriteLog("CreatePickBill", "生成领料单相关数据更新失败:" + pickRst, _currentTenant.Id.ToString());
|
|
|
return pickRst;
|
|
|
}
|
|
|
morders[0].morder_state = MorderEnum.Xd_state;
|
|
|
@@ -3196,6 +3201,7 @@ namespace Business.ResourceExamineManagement
|
|
|
AutoCreateBomBill(param.company_id.ToString(), autoCreates);
|
|
|
pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
|
|
|
}
|
|
|
+ AsyncItemStockFromWMS(pretreatments);
|
|
|
|
|
|
//增加特殊工单的预处理结果,因为特殊工单是自定义物料清单
|
|
|
var specialWork = mo_Mes_Morders.Where(x => tsWork.Contains(x.morder_type)).ToList();
|
|
|
@@ -3899,51 +3905,58 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void AsyncItemStockFromWMS(List<crm_seorderentry> sentrys)
|
|
|
+ public void AsyncItemStockFromWMS(List<b_bom_pretreatment> bom_Pretreatments)
|
|
|
{
|
|
|
//产品编码
|
|
|
- var itemList = sentrys.Select(a => a.item_number).Distinct().ToList();
|
|
|
+ var itemList = bom_Pretreatments.Select(a => a.item_number).Distinct().ToList();
|
|
|
List<string> itemChildList = new List<string>();
|
|
|
- itemList.ForEach(a =>
|
|
|
+ itemChildList.AddRange(itemList);
|
|
|
+ if (!itemChildList.Any())
|
|
|
{
|
|
|
- itemChildList.AddRange(GetChildItemNumber(a, new List<string>()));
|
|
|
- });
|
|
|
+ return;
|
|
|
+ }
|
|
|
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.QtyOnHand) }).ToList();
|
|
|
+
|
|
|
+
|
|
|
var itemNums = groupList.Select(b => b.ItemNum).ToList();//需要处理的dop物料编码集合
|
|
|
+ //根据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 itemIds = items.Select(b => b.Id).ToList();//需要处理的dop物料id集合
|
|
|
List<ic_item_stock> mysqlStock = _mysql_ic_item_stock.GetListAsync(a => itemIds.Contains(a.Id) && a.factory_id == param.factoryId && a.company_id == param.company_id).Result;
|
|
|
List<ic_item_stock> needAddList = new List<ic_item_stock>();
|
|
|
|
|
|
foreach (var stockWMS in groupList)
|
|
|
{
|
|
|
- foreach (var num in items)
|
|
|
+ var num = items.Find(x => x.number == stockWMS.ItemNum);
|
|
|
+ if (num != null)
|
|
|
{
|
|
|
- if (stockWMS.ItemNum == num.number)
|
|
|
+ var item = mysqlStock.Find(a => a.Id == num.Id);
|
|
|
+ if (item != null)
|
|
|
{
|
|
|
- var item = mysqlStock.Find(a => a.Id == num.Id);
|
|
|
- if (item != null)
|
|
|
- {
|
|
|
- item.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ic_item_stock stock = new ic_item_stock();
|
|
|
- stock.GenerateNewId(help.NextId());
|
|
|
- stock.factory_id = param.factoryId;
|
|
|
- stock.company_id = param.company_id;
|
|
|
- stock.icitem_id = num.Id;
|
|
|
- stock.icitem_name = num.name;
|
|
|
- stock.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
|
|
|
- needAddList.Add(stock);
|
|
|
- }
|
|
|
- break;
|
|
|
+ item.sqty = groupList.First(a => a.ItemNum == num.number).Qty;
|
|
|
}
|
|
|
- };
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
if (needAddList.Count > 0)
|
|
|
{
|
|
|
@@ -3951,21 +3964,6 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
_businessDbContext.BulkUpdate(mysqlStock);
|
|
|
}
|
|
|
- //循环获取子级物料编码,包括产品本身,有重复的结果去重即可
|
|
|
- public List<string> GetChildItemNumber(string itemNum, List<string> list)
|
|
|
- {
|
|
|
- list.Add(itemNum);
|
|
|
- var productStructures = _productStructureMaster.Select(p => p.ParentItem == itemNum && p.Domain == "1001" && p.IsActive);
|
|
|
- list.AddRange(productStructures.Select(a => a.ComponentItem));
|
|
|
- foreach (var item in productStructures)
|
|
|
- {
|
|
|
- if (item.StructureType.ToUpper() == "X")
|
|
|
- {
|
|
|
- GetChildItemNumber(item.ComponentItem, list);
|
|
|
- }
|
|
|
- }
|
|
|
- return list;
|
|
|
- }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 生成领料单
|
|
|
@@ -4073,7 +4071,6 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
//清理掉库存占用 这里考虑的是资源检查的占用没有完全占用备料单数据,而其他数据再进行齐套检查时,无法考虑到备料单的占用。
|
|
|
var itemstockoccupy = _mysql_ic_item_stockoccupy.GetListAsync(s => workOrdMasters.Select(x => x.WorkOrd).Contains(s.morder_mo) && s.factory_id.ToString() == domain).Result;
|
|
|
var icitem = _mysql_ic_item.GetListAsync(s => s.factory_id.ToString() == domain && nbrDetailList.Select(c => c.ItemNum).Contains(s.number)).Result;
|
|
|
@@ -4255,20 +4252,12 @@ namespace Business.ResourceExamineManagement
|
|
|
woDetail.Status = "";
|
|
|
woDetail.IsActive = true;
|
|
|
woDetail.CreateTime = DateTime.Now;
|
|
|
- decimal needCount = caleList.Sum(c => c.needCount.GetValueOrDefault());
|
|
|
- foreach (var structure in caleList)
|
|
|
- {
|
|
|
- if (woDetail.Op > structure.Op)
|
|
|
- {
|
|
|
- woDetail.Op = structure.Op;
|
|
|
- }
|
|
|
- var psm = productStructureMs.Find(x => x.ParentItem == item.morder_no && x.ComponentItem == structure.item_number);
|
|
|
- woDetail.Yield = psm == null ? 0 : psm.Scrap / 100;
|
|
|
- woDetail.QtyRequired += structure.needCount.GetValueOrDefault() * (1 + woDetail.Yield);
|
|
|
- }
|
|
|
+ woDetail.QtyRequired= caleList.Sum(c => c.needCount.GetValueOrDefault());
|
|
|
+ woDetail.Yield = caleList.Max(x => x.Scrap.GetValueOrDefault());
|
|
|
+ decimal needCount = caleList.Sum(c => c.needCountNoloss.GetValueOrDefault());
|
|
|
if (needCount != 0)
|
|
|
{
|
|
|
- woDetail.FrozenBOMQty = woDetail.QtyRequired / needCount;
|
|
|
+ woDetail.FrozenBOMQty = Math.Round(woDetail.QtyRequired / needCount, 8);
|
|
|
}
|
|
|
workOrdDetails.Add(woDetail);
|
|
|
}
|