|
|
@@ -21,6 +21,7 @@ using Volo.Abp.Application.Services;
|
|
|
using Volo.Abp.DependencyInjection;
|
|
|
using Volo.Abp.Domain.Repositories;
|
|
|
using Volo.Abp.MultiTenancy;
|
|
|
+using Volo.Abp.ObjectMapping;
|
|
|
using Volo.Abp.Uow;
|
|
|
|
|
|
namespace Business.ResourceExamineManagement
|
|
|
@@ -617,7 +618,7 @@ namespace Business.ResourceExamineManagement
|
|
|
|
|
|
//记录订单行的物料齐套时间
|
|
|
List<KittingTimeDto> kittingTimes = new List<KittingTimeDto>();
|
|
|
- DataInitialization(boms, bangid, icitemlist, stocklist, pretreatments);
|
|
|
+ DataInitialization(boms, bangid, icitemlist, stocklist, pretreatments, sklist);
|
|
|
foreach (var sorder in sorders)
|
|
|
{
|
|
|
param.sorderId = sorder.Id;
|
|
|
@@ -745,7 +746,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
if (_CalcBomViewAppService.mooccupyAllInsertList.Any())
|
|
|
{
|
|
|
- _CalcBomViewAppService.mooccupyAllInsertList.ForEach(s => { s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
+ _CalcBomViewAppService.mooccupyAllInsertList.ForEach(s => { s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
await _mes_mooccupy.InsertManyAsync(_CalcBomViewAppService.mooccupyAllInsertList);
|
|
|
/*var moOccupy = ObjectMapper.Map<List<mo_mes_mooccupy>, List<mes_mooccupy>>(_CalcBomViewAppService.mooccupyAllInsertList);
|
|
|
_businessDbContext.BulkInsert(moOccupy);*/
|
|
|
@@ -753,14 +754,14 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
if (_CalcBomViewAppService.moentriesInsertList.Any())
|
|
|
{
|
|
|
- _CalcBomViewAppService.moentriesInsertList.ForEach(s => { s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
+ _CalcBomViewAppService.moentriesInsertList.ForEach(s => { s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
await _mes_moentry.InsertManyAsync(_CalcBomViewAppService.moentriesInsertList);
|
|
|
/*var mesmoentrys = ObjectMapper.Map<List<mo_mes_moentry>, List<mes_moentry>>(_CalcBomViewAppService.moentriesInsertList);
|
|
|
_businessDbContext.BulkInsert(mesmoentrys);*/
|
|
|
}
|
|
|
if (_CalcBomViewAppService.orderList.Any())
|
|
|
{
|
|
|
- _CalcBomViewAppService.orderList.ForEach(s => { s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
+ _CalcBomViewAppService.orderList.ForEach(s => { s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
await _mes_oorder.InsertManyAsync(_CalcBomViewAppService.orderList);
|
|
|
/*var ooders = ObjectMapper.Map<List<mo_mes_oorder>, List<mes_oorder>>(_CalcBomViewAppService.orderList);
|
|
|
_businessDbContext.BulkInsert(ooders);*/
|
|
|
@@ -768,12 +769,12 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
if (_CalcBomViewAppService.newStockOccList.Any())
|
|
|
{
|
|
|
- _CalcBomViewAppService.newStockOccList.ForEach(s => {s.GenerateNewId(help.NextId()); s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
+ _CalcBomViewAppService.newStockOccList.ForEach(s => { s.GenerateNewId(help.NextId()); s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
await _ic_item_stockoccupy.InsertManyAsync(_CalcBomViewAppService.newStockOccList);
|
|
|
}
|
|
|
if (_CalcBomViewAppService.srm_Po_OccupiesInsert.Any())
|
|
|
{
|
|
|
- _CalcBomViewAppService.srm_Po_OccupiesInsert.ForEach(s => { s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
+ _CalcBomViewAppService.srm_Po_OccupiesInsert.ForEach(s => { s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
await _srm_po_occupy.InsertManyAsync(_CalcBomViewAppService.srm_Po_OccupiesInsert);
|
|
|
/*var poOccupies = ObjectMapper.Map<List<mo_srm_po_occupy>, List<srm_po_occupy>>(_CalcBomViewAppService.srm_Po_OccupiesInsert);
|
|
|
_businessDbContext.BulkInsert(poOccupies);*/
|
|
|
@@ -829,6 +830,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
b_ex.create_time = DateTime.Now;
|
|
|
b_ex.company_id = param.company_id;
|
|
|
+ b_ex.tenant_id = param.company_id;
|
|
|
b_ex.factory_id = param.factoryId;
|
|
|
examineList.Add(b_ex);
|
|
|
ex.BomChildExamineList.ForEach(s =>
|
|
|
@@ -837,6 +839,7 @@ namespace Business.ResourceExamineManagement
|
|
|
bc_ex.GenerateNewId(help.NextId());
|
|
|
bc_ex.examine_id = b_ex.Id;
|
|
|
bc_ex.company_id = param.company_id;
|
|
|
+ bc_ex.tenant_id = param.company_id;
|
|
|
bc_ex.factory_id = param.factoryId;
|
|
|
bc_ex.create_time = DateTime.Now;
|
|
|
bomExamineList.Add(bc_ex);
|
|
|
@@ -846,7 +849,7 @@ namespace Business.ResourceExamineManagement
|
|
|
var olist = ObjectMapper.Map<List<mo_occupy>, List<b_mo_occupy>>(s.mo_occupy_list);
|
|
|
olist.ForEach(o =>
|
|
|
{
|
|
|
- o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id;
|
|
|
+ o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
|
|
|
o.factory_id = param.factoryId;
|
|
|
});
|
|
|
mooccupyList.AddRange(olist);
|
|
|
@@ -856,7 +859,7 @@ namespace Business.ResourceExamineManagement
|
|
|
var mlist = ObjectMapper.Map<List<moorder>, List<b_mo_order>>(s.make_list);
|
|
|
mlist.ForEach(o =>
|
|
|
{
|
|
|
- o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id;
|
|
|
+ o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
|
|
|
o.factory_id = param.factoryId;
|
|
|
});
|
|
|
moorderList.AddRange(mlist);
|
|
|
@@ -866,7 +869,7 @@ namespace Business.ResourceExamineManagement
|
|
|
var slist = ObjectMapper.Map<List<ooder>, List<b_ooder>>(s.subcontracting_list);
|
|
|
slist.ForEach(o =>
|
|
|
{
|
|
|
- o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id;
|
|
|
+ o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
|
|
|
o.factory_id = param.factoryId;
|
|
|
});
|
|
|
ooderList.AddRange(slist);
|
|
|
@@ -876,7 +879,7 @@ namespace Business.ResourceExamineManagement
|
|
|
var plist = ObjectMapper.Map<List<purchase>, List<b_purchase>>(s.purchase_list);
|
|
|
plist.ForEach(o =>
|
|
|
{
|
|
|
- o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id;
|
|
|
+ o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
|
|
|
o.factory_id = param.factoryId;
|
|
|
});
|
|
|
purchaseList.AddRange(plist);
|
|
|
@@ -886,7 +889,7 @@ namespace Business.ResourceExamineManagement
|
|
|
var purlist = ObjectMapper.Map<List<purchase_occupy>, List<b_purchase_occupy>>(s.purchase_occupy_list);
|
|
|
purlist.ForEach(o =>
|
|
|
{
|
|
|
- o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id;
|
|
|
+ o.bom_child_examine_id = bc_ex.Id; o.company_id = param.company_id; o.tenant_id = param.company_id;
|
|
|
o.factory_id = param.factoryId;
|
|
|
});
|
|
|
purchaseoccupyList.AddRange(purlist);
|
|
|
@@ -1449,7 +1452,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());
|
|
|
@@ -1505,6 +1508,16 @@ namespace Business.ResourceExamineManagement
|
|
|
WriteMorder = WriteMorder.Where(x => !dborders.Select(c => c.Id).Contains(x.mysql_id)).ToList();
|
|
|
#endregion
|
|
|
|
|
|
+ List<mo_ic_item_stockoccupy> item_stockoccupy1 = await _ic_item_stockoccupy.GetListAsync(s => seIds.Contains(s.orderentry_id.Value) && bangidList.Contains(s.bang_id));
|
|
|
+ if (item_stockoccupy1.Any())
|
|
|
+ {
|
|
|
+ item_stockoccupy1.ForEach(s => { s.mysql_id = help.NextId(); });
|
|
|
+ var sklist = ObjectMapper.Map<List<mo_ic_item_stockoccupy>, List<ic_item_stockoccupy>>(item_stockoccupy1);
|
|
|
+ sklist.ForEach(s => { s.create_time = DateTime.Now; });
|
|
|
+ _businessDbContext.BulkInsert(sklist);
|
|
|
+ return "ok";
|
|
|
+ }
|
|
|
+
|
|
|
//批量保存 后期考虑子工单
|
|
|
List<mes_morder> moderlist = new List<mes_morder>();
|
|
|
List<WorkOrdMaster> workOrds = new List<WorkOrdMaster>();
|
|
|
@@ -1526,6 +1539,8 @@ namespace Business.ResourceExamineManagement
|
|
|
//PO占用记录
|
|
|
List<mo_srm_po_occupy> po_occupy = await _srm_po_occupy.GetListAsync(s => seIds.Contains(s.eid.Value) && bangidList.Contains(s.bang_id.Value));
|
|
|
List<mo_srm_pr_main> prmainlist = await _srm_pr_main.GetListAsync(s => seIds.Contains(s.sentry_id.Value) && bangidList.Contains(s.bang_id.Value));
|
|
|
+ List<mo_ic_item_stockoccupy> item_stockoccupy = await _ic_item_stockoccupy.GetListAsync(s => seIds.Contains(s.orderentry_id.Value) && bangidList.Contains(s.bang_id));
|
|
|
+
|
|
|
|
|
|
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
|
{
|
|
|
@@ -1566,12 +1581,13 @@ namespace Business.ResourceExamineManagement
|
|
|
var ooders = ObjectMapper.Map<List<mo_mes_oorder>, List<mes_oorder>>(oorderList);
|
|
|
_businessDbContext.BulkInsert(ooders);
|
|
|
}
|
|
|
- //沟通方老师与何腾,库存与库存占用,使用方老师得locationDetail和workorddetital 做需求数量和已发数量来实现库存占用和已扣减库存?
|
|
|
- /*if (sklist.Any())
|
|
|
+
|
|
|
+ if (item_stockoccupy.Any())
|
|
|
{
|
|
|
- sklist.ForEach(s => { s.id = help.NextId(); s.tenant_id = param.tenantId; s.factory_id = param.factoryId; });
|
|
|
- await _ic_item_stockoccupy.InsertMany(sklist);
|
|
|
- }*/
|
|
|
+ var sklist = ObjectMapper.Map<List<mo_ic_item_stockoccupy>, List<ic_item_stockoccupy>>(item_stockoccupy);
|
|
|
+ sklist.ForEach(s => { s.create_time = DateTime.Now; });
|
|
|
+ _businessDbContext.BulkInsert(sklist);
|
|
|
+ }
|
|
|
if (po_occupy.Any())
|
|
|
{
|
|
|
po_occupy.ForEach(s => { s.create_time = DateTime.Now; });
|
|
|
@@ -1712,7 +1728,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//同步物料库存数据 根据预处理,来只找出部分数据同步。
|
|
|
List<long> itemIds = pretreatments.Select(s => s.item_id.GetValueOrDefault()).ToList();
|
|
|
//var icitemStokc = _mysql_ic_item_stock.GetListAsync(p => p.tenant_id == tenantId && p.factory_id == factoryId).Result;
|
|
|
- var icitemStokc = _mysql_ic_item_stock.GetListAsync(p => itemIds.Contains(p.icitem_id)).Result;
|
|
|
+ var icitemStokc = _mysql_ic_item_stock.GetListAsync(p => p.company_id == companyId && itemIds.Contains(p.icitem_id)).Result;
|
|
|
if (icitemStokc.Count > 0)
|
|
|
{
|
|
|
List<string> numbers = pretreatments.Select(s => s.item_number).ToList();
|
|
|
@@ -1730,31 +1746,75 @@ namespace Business.ResourceExamineManagement
|
|
|
//插入数据
|
|
|
await _ic_item_stock.InsertManyAsync(moIcitemStokc);
|
|
|
}
|
|
|
- //在制工单占用记录表
|
|
|
- var mes_mooccupy = _mysql_mes_mooccupy.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
|
|
|
- if (mes_mooccupy.Count > 0)
|
|
|
- {
|
|
|
- var moMes_mooccupy = ObjectMapper.Map<List<mes_mooccupy>, List<mo_mes_mooccupy>>(mes_mooccupy);
|
|
|
- moMes_mooccupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
|
|
|
- await _mes_mooccupy.InsertManyAsync(moMes_mooccupy);
|
|
|
- }
|
|
|
- //工单主表
|
|
|
- var mes_morder = _mysql_mes_morder.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
|
|
|
- if (mes_morder.Count > 0)
|
|
|
- {
|
|
|
- var moMes_morder = ObjectMapper.Map<List<mes_morder>, List<mo_mes_morder>>(mes_morder);
|
|
|
- moMes_morder.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
|
|
|
- await _mes_morder.InsertManyAsync(moMes_morder);
|
|
|
- }
|
|
|
- //工单子表
|
|
|
- var mes_moentry = _mysql_mes_moentry.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
|
|
|
- if (mes_moentry.Count > 0)
|
|
|
+
|
|
|
+ var workordmsters = _workOrdMaster.Select(s => s.Domain == factoryId.ToString() && s.Status.ToLower() != "c");
|
|
|
+ if (workordmsters.Any())
|
|
|
{
|
|
|
- var moMes_moentry = ObjectMapper.Map<List<mes_moentry>, List<mo_mes_moentry>>(mes_moentry);
|
|
|
- moMes_moentry.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
|
|
|
- await _mes_moentry.InsertManyAsync(moMes_moentry);
|
|
|
- }
|
|
|
+ //根据工单表找到工单明细,然后根据DOP工单占用记录,对比工单明细发货数量,来做冲销。
|
|
|
+ var workdetails = _workOrdDetail.Select(s => workordmsters.Select(c => c.WorkOrd).Contains(s.WorkOrd));
|
|
|
+
|
|
|
+ //物料库存占用记录表
|
|
|
+ var 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())
|
|
|
+ {
|
|
|
+ item_occupy.ForEach(s =>
|
|
|
+ {
|
|
|
+ //TODO:对发布数量和占用数量进行对冲,因为目前没有处理不同层级下使用相同物料的占用的问题。dop占用有项次号,而wms的发布数量明细没有项次号
|
|
|
+ var wdtl = workdetails.Where(x => x.WorkOrd == s.morder_mo && x.ItemNum == s.icitem_number).ToList();
|
|
|
+ if (wdtl.Any())
|
|
|
+ {
|
|
|
+ foreach (var dtl in wdtl)
|
|
|
+ {
|
|
|
+ if (s.quantity - dtl.QtyPosted > 0)
|
|
|
+ {
|
|
|
+ s.quantity -= dtl.QtyPosted;
|
|
|
+ dtl.QtyPosted = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dtl.QtyPosted -= s.quantity;
|
|
|
+ s.quantity = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ 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 _ic_item_stockoccupy.InsertManyAsync(mo_item_occupy);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //工单主表
|
|
|
+ var mes_morder = _mysql_mes_morder.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && workordmsters.Select(c => c.WorkOrd).Contains(x.morder_no)).Result;
|
|
|
+ if (mes_morder.Count > 0)
|
|
|
+ {
|
|
|
+ mes_morder.ForEach(item => { item.bang_id = bangid; });
|
|
|
+ var moMes_morder = ObjectMapper.Map<List<mes_morder>, List<mo_mes_morder>>(mes_morder);
|
|
|
+ moMes_morder.ForEach(item => { item.GenerateNewId(help.NextId()); });
|
|
|
+ await _mes_morder.InsertManyAsync(moMes_morder);
|
|
|
+ }
|
|
|
+ //工单子表
|
|
|
+ var mes_moentry = _mysql_mes_moentry.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
|
|
|
+ if (mes_moentry.Count > 0)
|
|
|
+ {
|
|
|
+ mes_moentry.ForEach(item => { item.bang_id = bangid; });
|
|
|
+ var moMes_moentry = ObjectMapper.Map<List<mes_moentry>, List<mo_mes_moentry>>(mes_moentry);
|
|
|
+ moMes_moentry.ForEach(item => { item.GenerateNewId(help.NextId()); });
|
|
|
+ await _mes_moentry.InsertManyAsync(moMes_moentry);
|
|
|
+ }
|
|
|
|
|
|
+ //在制工单占用记录表
|
|
|
+ var mes_mooccupy = _mysql_mes_mooccupy.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && mes_morder.Select(c => c.morder_no).Contains(x.moo_mo)).Result;
|
|
|
+ if (mes_mooccupy.Count > 0)
|
|
|
+ {
|
|
|
+ var moMes_mooccupy = ObjectMapper.Map<List<mes_mooccupy>, List<mo_mes_mooccupy>>(mes_mooccupy);
|
|
|
+ moMes_mooccupy.ForEach(item => { item.GenerateNewId(help.NextId()); item.bang_id = bangid; });
|
|
|
+ await _mes_mooccupy.InsertManyAsync(moMes_mooccupy);
|
|
|
+ }
|
|
|
+ }
|
|
|
//TODO:要不要根据某些条件只同步有效的数据
|
|
|
//采购订单
|
|
|
var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
|
|
|
@@ -1794,7 +1854,7 @@ namespace Business.ResourceExamineManagement
|
|
|
await _ic_item_stock.DeleteAsync(p => p.bang_id == bangid);
|
|
|
|
|
|
//清除工单占用记录表
|
|
|
- await _mes_mooccupy.DeleteAsync(p => p.bang_id == bangid);
|
|
|
+ //await _mes_mooccupy.DeleteAsync(p => p.bang_id == bangid);
|
|
|
|
|
|
//清除工单主表
|
|
|
//await _mes_morder.Delete(p => p.bang_id == bangid);
|
|
|
@@ -1809,7 +1869,7 @@ namespace Business.ResourceExamineManagement
|
|
|
await _srm_po_list.DeleteAsync(p => p.bang_id == bangid);
|
|
|
|
|
|
//清除采购订单占用详情
|
|
|
- await _srm_po_occupy.DeleteAsync(p => p.bang_id == bangid);
|
|
|
+ //await _srm_po_occupy.DeleteAsync(p => p.bang_id == bangid);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -2193,16 +2253,18 @@ namespace Business.ResourceExamineManagement
|
|
|
foreach (var pr in prlist)
|
|
|
{
|
|
|
//找到没有关闭的PR,如果关联上的PR都是已关闭,则说明已经转了PO。
|
|
|
+ //TODO:解决Database operation expected to affect 1 row(s) but actually affected 0 row(s). 如果业务逻辑有问题自行修改
|
|
|
var getPr = RerunPr(pr, alllist);
|
|
|
if (getPr != null)
|
|
|
{
|
|
|
- getPr.pr_aqty = getPr.pr_aqty - pr.pr_aqty;
|
|
|
- if (getPr.pr_aqty <= 0)
|
|
|
+ if (getPr.pr_aqty - pr.pr_aqty <= 0)
|
|
|
{
|
|
|
//删除这个pr,没有小于0则是更新
|
|
|
dellist.Add(getPr);
|
|
|
}
|
|
|
- else {
|
|
|
+ else
|
|
|
+ {
|
|
|
+ getPr.pr_aqty = getPr.pr_aqty - pr.pr_aqty;
|
|
|
updatelist.Add(getPr);
|
|
|
}
|
|
|
}
|
|
|
@@ -2217,7 +2279,12 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
_businessDbContext.BulkDelete(dellist);
|
|
|
}
|
|
|
-
|
|
|
+ //清理掉库存占用
|
|
|
+ var itemstockoccupy = _mysql_ic_item_stockoccupy.GetListAsync(s => monolist.Contains(s.morder_mo)).Result;
|
|
|
+ if (itemstockoccupy.Any())
|
|
|
+ {
|
|
|
+ _businessDbContext.BulkDelete(itemstockoccupy);
|
|
|
+ }
|
|
|
//清理锁定期外的排程数据.
|
|
|
var periodList = _periodSequenceDet.Select(s => monolist.Contains(s.WorkOrds));
|
|
|
if (periodList.Any())
|
|
|
@@ -2655,7 +2722,7 @@ namespace Business.ResourceExamineManagement
|
|
|
List<mo_ic_item_stock> stocklist = new List<mo_ic_item_stock>();
|
|
|
//物料占用记录
|
|
|
List<mo_ic_item_stockoccupy> sklist = new List<mo_ic_item_stockoccupy>();
|
|
|
-
|
|
|
+
|
|
|
//sorder=null 是因为齐套检查不需要生成工单、采购、委外等信息,所以不需要关联的工单信息传递进去。
|
|
|
var pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
|
|
|
List<mo_ic_bom> autoCreates = new List<mo_ic_bom>();
|
|
|
@@ -2675,7 +2742,12 @@ namespace Business.ResourceExamineManagement
|
|
|
//数据库快照-同步mysql库数据到mongoDB中
|
|
|
await DbSnapShot(input.company_id, input.factoryId, bangid, pretreatments);
|
|
|
|
|
|
- DataInitialization(boms, bangid, icitemlist, stocklist, pretreatments);
|
|
|
+ DataInitialization(boms, bangid, icitemlist, stocklist, pretreatments, sklist);
|
|
|
+ if (!planCheck)
|
|
|
+ {
|
|
|
+ //如果是齐套检查,则不考虑其他数据的占用,只看原材料库存
|
|
|
+ sklist = new List<mo_ic_item_stockoccupy>();
|
|
|
+ }
|
|
|
_morderAppService.param = param;
|
|
|
_purchaseOrderAppService.param = param;
|
|
|
_CalcBomViewAppService.param = param;
|
|
|
@@ -2782,7 +2854,7 @@ namespace Business.ResourceExamineManagement
|
|
|
var wkordPrList = prmainlist.Where(s => s.pr_mono == wod.WorkOrd).ToList();
|
|
|
|
|
|
//反算所有的PR,根据时间减去提前期 //按最大预处理时间倒排
|
|
|
- var moIcitems = icitemlist.Where(s => wkordPrList.Select(c => c.icitem_id).Contains(s.Id)).ToList();
|
|
|
+ var moIcitems = icitemlist.Where(s => wkordPrList.Select(c => c.icitem_id).Contains(s.mysql_id)).ToList();
|
|
|
var maxTime = moIcitems.Max(s => s.clean_leadtime.GetValueOrDefault());
|
|
|
wkordPrList.ForEach(pr =>
|
|
|
{
|
|
|
@@ -2797,7 +2869,6 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
-
|
|
|
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
|
{
|
|
|
try
|
|
|
@@ -2808,6 +2879,12 @@ namespace Business.ResourceExamineManagement
|
|
|
var pr_mainlist = ObjectMapper.Map<List<mo_srm_pr_main>, List<srm_pr_main>>(prmainlist);
|
|
|
_businessDbContext.BulkInsert(pr_mainlist);
|
|
|
}
|
|
|
+ if (_CalcBomViewAppService.newStockOccList.Any())
|
|
|
+ {
|
|
|
+ var stockoccupylist = ObjectMapper.Map<List<mo_ic_item_stockoccupy>, List<ic_item_stockoccupy>>(_CalcBomViewAppService.newStockOccList);
|
|
|
+ stockoccupylist.ForEach(s => { s.create_time = DateTime.Now; s.tenant_id = param.company_id.GetValueOrDefault(); s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
+ _businessDbContext.BulkInsert(stockoccupylist);
|
|
|
+ }
|
|
|
if (_CalcBomViewAppService.srm_Po_OccupiesInsert.Any())
|
|
|
{
|
|
|
_CalcBomViewAppService.srm_Po_OccupiesInsert.ForEach(s => { s.company_id = param.company_id; s.factory_id = param.factoryId; });
|
|
|
@@ -2845,7 +2922,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="stocklist"></param>
|
|
|
/// <param name="sklist"></param>
|
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
|
- public void DataInitialization(List<mo_ic_bom> boms, long bangid, List<mo_ic_item> icitemlist, List<mo_ic_item_stock> stocklist, List<b_bom_pretreatment> pretreatments)
|
|
|
+ public void DataInitialization(List<mo_ic_bom> boms, long bangid, List<mo_ic_item> icitemlist, List<mo_ic_item_stock> stocklist, List<b_bom_pretreatment> pretreatments, List<mo_ic_item_stockoccupy> sklist)
|
|
|
{
|
|
|
List<long> itemIds = pretreatments.Select(p => p.item_id.GetValueOrDefault()).ToList();
|
|
|
icitemlist.AddRange(_ic_item.GetListAsync(p => itemIds.Contains(p.mysql_id) && !p.IsDeleted).Result);
|
|
|
@@ -2884,6 +2961,8 @@ namespace Business.ResourceExamineManagement
|
|
|
|
|
|
//物料库存
|
|
|
stocklist.AddRange(_ic_item_stock.GetListAsync(p => p.factory_id == param.factoryId && p.bang_id == bangid && itemIds.Contains(p.icitem_id)).Result);
|
|
|
+ //物料库存占用表
|
|
|
+ sklist.AddRange(_ic_item_stockoccupy.GetListAsync(x => x.bang_id == bangid && !x.IsDeleted).Result);
|
|
|
|
|
|
//物料提前期
|
|
|
leadTimeList = GetLeadTime(icitemlist, param.company_id, param.factoryId);//提前期列表
|
|
|
@@ -3032,9 +3111,10 @@ namespace Business.ResourceExamineManagement
|
|
|
foreach (var workord in workOrdMasters)
|
|
|
{
|
|
|
Dictionary<string, decimal> dictItemQty = new Dictionary<string, decimal>();
|
|
|
+ decimal QtyOrdSum = workord.QtyOrded;
|
|
|
List<string> lines = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).Select(a => a.Line).Distinct().ToList();
|
|
|
List<LineMaster> lineMasters = AllLineMasters.Where(p => lines.Contains(p.Line) && p.Domain == workord.Domain && p.IsActive).ToList();
|
|
|
- List<ProductStructureMaster> itemList = GetProductStructure(dbPeriodSequences.First(a => a.WorkOrds == workord.WorkOrd).ItemNum);
|
|
|
+ List<ProductStructureMaster> itemList = GetProductStructure(dbPeriodSequences.First(a => a.WorkOrds == workord.WorkOrd).ItemNum, QtyOrdSum, workord.Domain);
|
|
|
var childrenList = itemList.Select(a => a.ComponentItem).Distinct().ToList();
|
|
|
List<ItemMaster> itemLocList = _itemMaster.Select(p => childrenList.Contains(p.ItemNum) && p.Domain == workord.Domain && p.IsActive).Distinct().ToList();
|
|
|
var dopIcitems = _ic_item.GetListAsync(s => itemLocList.Select(c => c.ItemNum).Contains(s.number)).Result;
|
|
|
@@ -3046,8 +3126,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
List<ItemPackMaster> itemPackList = _itemPackMaster.Select(p => childrenList.Contains(p.ItemNum) && p.Domain == workord.Domain && p.IsActive).Distinct().ToList();
|
|
|
var Nbr = GetMaxSerialNumber(417416915624005);
|
|
|
- //根据某一产线汇总即该工单的总数
|
|
|
- decimal QtyOrdSum = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd && a.Line == lines[0]).Sum(a => a.OrdQty.GetValueOrDefault());
|
|
|
+
|
|
|
string LocationTo= lineMasters.FirstOrDefault()?.Location;
|
|
|
DateTime eff = workord.OrdDate.GetValueOrDefault().Date.AddDays(-1);
|
|
|
DateTime start = eff.AddDays((double)(0 - cleanTime - 1));
|
|
|
@@ -3057,7 +3136,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
nbrMasterList.Add(new NbrMaster
|
|
|
{
|
|
|
- Domain = "1001",
|
|
|
+ Domain = workOrdMasters[0].Domain,
|
|
|
Type = "SM",
|
|
|
Nbr = Nbr,
|
|
|
Remark = "下达自动领料",
|
|
|
@@ -3070,12 +3149,12 @@ namespace Business.ResourceExamineManagement
|
|
|
QtyOrd = QtyOrdSum,
|
|
|
IsActive = true,
|
|
|
IsChanged = true,
|
|
|
- Name = "1001",
|
|
|
+ Name = workOrdMasters[0].Domain,
|
|
|
Department = "101",
|
|
|
CreateTime = DateTime.Now,
|
|
|
UpdateTime = DateTime.Now,
|
|
|
- CreateUser = "1001",
|
|
|
- UpdateUser = "1001"
|
|
|
+ CreateUser = workOrdMasters[0].Domain,
|
|
|
+ UpdateUser = workOrdMasters[0].Domain
|
|
|
});
|
|
|
int i = 1;
|
|
|
itemList?.ForEach(a =>
|
|
|
@@ -3092,7 +3171,7 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
nbrDetailList.Add(new NbrDetail
|
|
|
{
|
|
|
- Domain = "1001",
|
|
|
+ Domain = workOrdMasters[0].Domain,
|
|
|
Type = "SM",
|
|
|
Nbr = Nbr,
|
|
|
ItemNum = a.ComponentItem,
|
|
|
@@ -3101,25 +3180,26 @@ namespace Business.ResourceExamineManagement
|
|
|
LocationFrom = LocationFrom,
|
|
|
LocationTo = LocationTo,//现在这几条线是同一线边仓,暂时不考虑多个线边仓
|
|
|
WorkOrd = workord.WorkOrd,
|
|
|
- QtyOrd = QtyOrdSum * a.Qty,
|
|
|
- CurrQtyOpened = QtyOrdSum * a.Qty,
|
|
|
+ QtyOrd = a.Qty,
|
|
|
+ CurrQtyOpened = a.Qty,
|
|
|
Line = i,
|
|
|
IsActive = true,
|
|
|
CreateTime = DateTime.Now,
|
|
|
UpdateTime = DateTime.Now,
|
|
|
- CreateUser = "1001",
|
|
|
- UpdateUser = "1001",
|
|
|
+ CreateUser = workOrdMasters[0].Domain,
|
|
|
+ UpdateUser = workOrdMasters[0].Domain,
|
|
|
UM = a.UM
|
|
|
});
|
|
|
i++;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- nbrDetailList.First(b => b.Nbr == Nbr && b.ItemNum == a.ComponentItem).QtyOrd = itemComponent.QtyOrd + QtyOrdSum * a.Qty;
|
|
|
- nbrDetailList.First(b => b.Nbr == Nbr && b.ItemNum == a.ComponentItem).CurrQtyOpened = itemComponent.CurrQtyOpened + QtyOrdSum * a.Qty;
|
|
|
+ nbrDetailList.First(b => b.Nbr == Nbr && b.ItemNum == a.ComponentItem).QtyOrd = itemComponent.QtyOrd + a.Qty;
|
|
|
+ nbrDetailList.First(b => b.Nbr == Nbr && b.ItemNum == a.ComponentItem).CurrQtyOpened = itemComponent.CurrQtyOpened + a.Qty;
|
|
|
}
|
|
|
});
|
|
|
- nbrDetailList.ForEach(a =>
|
|
|
+ //先屏蔽备料单扣除库存的DEMO演示。
|
|
|
+ /*nbrDetailList.ForEach(a =>
|
|
|
{
|
|
|
if (a.Nbr == Nbr)
|
|
|
{
|
|
|
@@ -3150,7 +3230,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//TODO:
|
|
|
//因为我们并没有模拟发料的过程,在自动生成领料单的时候就要扣减库存,实际业务不能这么做。
|
|
|
//在有上料和追溯的系统,可以在扫码上料或报工时(从线边仓)扣减。或者在实际发料出库时扣减。
|
|
|
- var locStock = _locationDetail.Select(a => itemKeys.Contains(a.ItemNum) && a.IsActive && a.Domain == "1001");
|
|
|
+ var locStock = _locationDetail.Select(a => itemKeys.Contains(a.ItemNum) && a.IsActive && a.Domain == workOrdMasters[0].Domain);
|
|
|
locStock?.ForEach(a =>
|
|
|
{
|
|
|
nbrDetailList.ForEach(b =>
|
|
|
@@ -3161,7 +3241,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
- _locationDetail.Update(locStock);
|
|
|
+ _locationDetail.Update(locStock);*/
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -3337,13 +3417,13 @@ namespace Business.ResourceExamineManagement
|
|
|
return "没有需要下达的工单。";
|
|
|
}
|
|
|
//获取已排产的工单
|
|
|
- List<PeriodSequenceDet> dbPeriodSequences = _periodSequenceDet.Select(p => workOrds.Contains(p.WorkOrds) && p.Domain == "1001" && p.IsActive);
|
|
|
+ List<PeriodSequenceDet> dbPeriodSequences = _periodSequenceDet.Select(p => workOrds.Contains(p.WorkOrds) && p.Domain == workOrdMasters[0].Domain && p.IsActive);
|
|
|
List<string> dbWorkOrds = dbPeriodSequences.Select(p => p.WorkOrds).Distinct().ToList();
|
|
|
|
|
|
//查出已排产的工单
|
|
|
workOrdMasters = workOrdMasters.Where(p => dbWorkOrds.Contains(p.WorkOrd)).ToList();
|
|
|
//查出已产生领料单、过滤掉,取出未领料的工单
|
|
|
- var nbrList = _nbrMaster.Select(a => a.Domain == "1001" && a.Type == "SM" && dbWorkOrds.Contains(a.WorkOrd));
|
|
|
+ var nbrList = _nbrMaster.Select(a => a.Domain == workOrdMasters[0].Domain && a.Type == "SM" && dbWorkOrds.Contains(a.WorkOrd));
|
|
|
var noNbrlist = nbrList.Select(p => p.WorkOrd).ToList();
|
|
|
workOrdMasters = workOrdMasters.Where(p => !noNbrlist.Contains(p.WorkOrd)).ToList();
|
|
|
if (workOrdMasters.Count == 0)
|
|
|
@@ -3362,7 +3442,7 @@ namespace Business.ResourceExamineManagement
|
|
|
dbPeriodSequences.ForEach(p => { p.Status = "r"; });
|
|
|
workOrdMasters.ForEach(p => { p.Status = "r"; });
|
|
|
//获取工单工艺路径数据
|
|
|
- List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.Select(p => ords.Contains(p.WorkOrd) && p.MilestoneOp && p.Domain == "1001" && p.Status != "C" && p.IsActive);
|
|
|
+ List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.Select(p => ords.Contains(p.WorkOrd) && p.MilestoneOp && p.Domain == workOrdMasters[0].Domain && p.Status != "C" && p.IsActive);
|
|
|
workOrdRoutings.ForEach(p => { p.Status = "r"; });
|
|
|
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
|
{
|
|
|
@@ -3376,7 +3456,7 @@ namespace Business.ResourceExamineManagement
|
|
|
});
|
|
|
//快开平台用自增列RecId关联,所以需要插入后再查给明细表赋相应的值
|
|
|
List<string> nbrs = nbrMasterList.Select(a => a.Nbr).ToList();
|
|
|
- var DBnbrList = _nbrMaster.Select(a => a.Domain == "1001" && a.Type == "SM" && nbrs.Contains(a.Nbr));
|
|
|
+ var DBnbrList = _nbrMaster.Select(a => a.Domain == workOrdMasters[0].Domain && a.Type == "SM" && nbrs.Contains(a.Nbr));
|
|
|
nbrDetailList.ForEach(c =>
|
|
|
{
|
|
|
c.NbrRecID = DBnbrList.Where(a => a.Nbr == c.Nbr).First().RecID;
|
|
|
@@ -3418,7 +3498,7 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
//添加工单数据
|
|
|
workOrd = new WorkOrdMaster();
|
|
|
- workOrd.Domain = "1001";
|
|
|
+ workOrd.Domain = item.factory_id.ToString();
|
|
|
workOrd.OrdDate = item.moentry_sys_stime;
|
|
|
workOrd.ReleaseDate = Convert.ToDateTime(item.moentry_sys_stime.GetValueOrDefault().ToString("u"));
|
|
|
workOrd.WorkOrd = item.morder_no;
|
|
|
@@ -3440,7 +3520,7 @@ namespace Business.ResourceExamineManagement
|
|
|
foreach (var dtl in curRoutings)
|
|
|
{
|
|
|
woRouting = new WorkOrdRouting();
|
|
|
- woRouting.Domain = "1001";
|
|
|
+ woRouting.Domain = item.factory_id.ToString();
|
|
|
woRouting.Descr = dtl.Descr;
|
|
|
woRouting.MilestoneOp = dtl.MilestoneOp;
|
|
|
woRouting.WorkOrd = item.morder_no;
|
|
|
@@ -3457,16 +3537,16 @@ namespace Business.ResourceExamineManagement
|
|
|
workOrdRoutings.Add(woRouting);
|
|
|
}
|
|
|
|
|
|
- List<ProductStructureMaster> curStructures = GetProductStructure(item.product_code);
|
|
|
+ List<ProductStructureMaster> curStructures = GetProductStructure(item.product_code, workOrd.QtyOrded, item.factory_id.ToString());
|
|
|
foreach (var structure in curStructures)
|
|
|
{
|
|
|
//添加工单的物料信息
|
|
|
woDetail = new WorkOrdDetail();
|
|
|
- woDetail.Domain = "1001";
|
|
|
+ woDetail.Domain = item.factory_id.ToString();
|
|
|
woDetail.WorkOrd = item.morder_no;
|
|
|
woDetail.Op = structure.Op;
|
|
|
woDetail.ItemNum = structure.ComponentItem;
|
|
|
- woDetail.QtyRequired = item.need_number.GetValueOrDefault() * structure.Qty;
|
|
|
+ woDetail.QtyRequired = structure.Qty;
|
|
|
woDetail.QtyPosted = 0m;
|
|
|
woDetail.QtyReturned = 0m;
|
|
|
woDetail.FrozenBOMQty = structure.Qty;
|
|
|
@@ -3483,11 +3563,12 @@ namespace Business.ResourceExamineManagement
|
|
|
/// </summary>
|
|
|
/// <param name="itenNum">产品物料编码</param>
|
|
|
/// <returns></returns>
|
|
|
- public List<ProductStructureMaster> GetProductStructure(string itenNum)
|
|
|
+ public List<ProductStructureMaster> GetProductStructure(string itenNum,decimal QtyOrdSum, string domain)
|
|
|
{
|
|
|
List<ProductStructureMaster> rtnStructures = new List<ProductStructureMaster>();
|
|
|
//根据itemNum获取bom数据
|
|
|
- var productStructures = _productStructureMaster.Select(p => itenNum == p.ParentItem && p.Domain == "1001" && p.IsActive);
|
|
|
+ var productStructures = _productStructureMaster.Select(p => itenNum == p.ParentItem && p.Domain == domain && p.IsActive);
|
|
|
+ productStructures.ForEach(s => { s.Qty = s.Qty * QtyOrdSum; });
|
|
|
//添加非虚拟件
|
|
|
rtnStructures.AddRange(productStructures.Where(p => p.StructureType.ToUpper() != "X").ToList());
|
|
|
|
|
|
@@ -3498,7 +3579,7 @@ namespace Business.ResourceExamineManagement
|
|
|
return rtnStructures;
|
|
|
}
|
|
|
//递归获取所有虚拟件对应的子物料
|
|
|
- RecursionProductStructure(itenNum, curPhantoms, rtnStructures);
|
|
|
+ RecursionProductStructure(curPhantoms, rtnStructures);
|
|
|
|
|
|
return rtnStructures;
|
|
|
}
|
|
|
@@ -3509,17 +3590,18 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="parentItem">产品的物料编码</param>
|
|
|
/// <param name="structures">当前产品的虚拟件</param>
|
|
|
/// <param name="rtnStructures"></param>
|
|
|
- public void RecursionProductStructure(string parentItem, List<ProductStructureMaster> structures, List<ProductStructureMaster> rtnStructures)
|
|
|
+ public void RecursionProductStructure(List<ProductStructureMaster> structures, List<ProductStructureMaster> rtnStructures)
|
|
|
{
|
|
|
//获取虚拟件的子物料
|
|
|
List<ProductStructureMaster> chdStructures = _productStructureMaster.Select(p => structures.Select(m => m.ComponentItem).Contains(p.ParentItem) && p.Domain == "1001" && p.IsActive);
|
|
|
+ chdStructures.ForEach(s =>
|
|
|
+ {
|
|
|
+ var parent = structures.Find(x => x.ComponentItem == s.ParentItem);
|
|
|
+ s.Qty = parent.Qty * s.Qty;
|
|
|
+ });
|
|
|
+
|
|
|
//非虚拟件
|
|
|
var notPhantoms = chdStructures.Where(p => p.StructureType.ToUpper() != "X").ToList();
|
|
|
- //存在非虚拟件
|
|
|
- foreach (var item in notPhantoms)
|
|
|
- {
|
|
|
- item.ParentItem = parentItem;
|
|
|
- }
|
|
|
rtnStructures.AddRange(notPhantoms);
|
|
|
|
|
|
//虚拟件
|
|
|
@@ -3527,7 +3609,7 @@ namespace Business.ResourceExamineManagement
|
|
|
if (phantoms.Count > 0)
|
|
|
{
|
|
|
//递归
|
|
|
- RecursionProductStructure(parentItem, phantoms, rtnStructures);
|
|
|
+ RecursionProductStructure(phantoms, rtnStructures);
|
|
|
}
|
|
|
}
|
|
|
|