|
|
@@ -8,6 +8,7 @@ using Bussiness.MongoModel.MES.IC;
|
|
|
using Bussiness.MongoModel.Production;
|
|
|
using Bussiness.MongoModel.SRM;
|
|
|
using System;
|
|
|
+using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
@@ -233,6 +234,24 @@ namespace Business.ResourceExamineManagement
|
|
|
//满足资源检查的时间需加上提前期
|
|
|
level1Dto.satisfy_time = mes_Morders.moentry_sys_stime.Value.AddDays((double)LeadTime);
|
|
|
}
|
|
|
+ level1Dto.make_list = new List<moorder>();
|
|
|
+ mes_MorderDto.mes_Morders.ForEach(me =>
|
|
|
+ {
|
|
|
+ moorder mo = new moorder();
|
|
|
+ mo.moentry_stime = me.moentry_stime;
|
|
|
+ mo.moentry_etime = me.moentry_etime;
|
|
|
+ mo.moentry_wrkcname = me.moentry_wrkcname;
|
|
|
+ mo.moentry_sys_stime = me.moentry_sys_stime;
|
|
|
+ mo.moentry_sys_etime = me.moentry_sys_etime;
|
|
|
+ mo.moentry_prdname = me.moentry_prdname;
|
|
|
+ mo.morder_need_time = me.morder_need_time;
|
|
|
+ mo.morder_no = me.morder_no;
|
|
|
+ mo.morder_production_number = me.morder_production_number;
|
|
|
+ mo.need_number = me.need_number;
|
|
|
+ mo.reality_end_time = me.reality_end_time;
|
|
|
+ mo.reality_start_time = me.reality_start_time;
|
|
|
+ level1Dto.make_list.Add(mo);
|
|
|
+ });
|
|
|
//批量保存 后期考虑子工单
|
|
|
mordersList.AddRange(mes_MorderDto.mes_Morders);
|
|
|
moentriesList.AddRange(mes_MorderDto.mes_Moentries);
|
|
|
@@ -389,7 +408,17 @@ namespace Business.ResourceExamineManagement
|
|
|
/*var ic_item = icitemlist.Find(s => s.Id == item.item_id);
|
|
|
var mooccupylist = _morderAppService.CheckMorder(item.bom_number, item.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item).Result;
|
|
|
decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
|
|
|
- item.mo_qty = moo_qty;*/
|
|
|
+ item.mo_qty = moo_qty;
|
|
|
+ item.mo_occupy_list = new List<mo_occupy>();
|
|
|
+ mooccupylist.ForEach(s =>
|
|
|
+ {
|
|
|
+ mo_occupy mooc = new mo_occupy();
|
|
|
+ mooc.moo_mo = s.moo_mo;
|
|
|
+ mooc.moo_stime = s.moo_ctime;
|
|
|
+ mooc.moo_etime = s.moo_etime;
|
|
|
+ mooc.moo_qty = s.moo_qty;
|
|
|
+ item.mo_occupy_list.Add(mooc);
|
|
|
+ });*/
|
|
|
decimal moo_qty = 0;
|
|
|
if (moo_qty == returnlist[0].lack_qty)
|
|
|
{
|
|
|
@@ -421,6 +450,8 @@ namespace Business.ResourceExamineManagement
|
|
|
|
|
|
};
|
|
|
item.make_qty = item.lack_qty;
|
|
|
+ //todo:增加生成子工单后,这里需要加上生成的子工单的明细。
|
|
|
+ item.make_list = new List<moorder>();
|
|
|
var minute = _productExamineAppService.ProductiveExamine(prodExamine);
|
|
|
//系统建议完工日期为 开工日期+产能检查时间=完工日期
|
|
|
var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
|
|
|
@@ -431,14 +462,39 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
else if (item.erp_cls == 3)
|
|
|
{
|
|
|
+ //先找在途
|
|
|
+
|
|
|
+
|
|
|
//采购申请
|
|
|
var SRMPRDto = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
|
|
|
item.purchase_qty = item.lack_qty;
|
|
|
+ item.purchase_list = new List<purchase>();
|
|
|
+ if (SRMPRDto.srm_Pr_Main != null)
|
|
|
+ {
|
|
|
+ purchase pur = new purchase();
|
|
|
+ pur.pr_billno = SRMPRDto.srm_Pr_Main.pr_billno;
|
|
|
+ pur.pr_purchasenumber = SRMPRDto.srm_Pr_Main.pr_purchasenumber;
|
|
|
+ pur.pr_purchasename = SRMPRDto.srm_Pr_Main.pr_purchasename;
|
|
|
+ pur.pr_rqty = SRMPRDto.srm_Pr_Main.pr_rqty;
|
|
|
+ pur.pr_aqty = SRMPRDto.srm_Pr_Main.pr_aqty;
|
|
|
+ pur.pr_sqty = SRMPRDto.srm_Pr_Main.pr_sqty;
|
|
|
+ pur.pr_parrive_date = SRMPRDto.srm_Pr_Main.pr_parrive_date;
|
|
|
+ pur.pr_rarrive_date = SRMPRDto.srm_Pr_Main.pr_rarrive_date;
|
|
|
+ pur.pr_pur_affirm_date = SRMPRDto.srm_Pr_Main.pr_pur_affirm_date;
|
|
|
+ pur.pr_sysprice = SRMPRDto.srm_Pr_Main.pr_sysprice;
|
|
|
+ pur.pr_orderprice = SRMPRDto.srm_Pr_Main.pr_orderprice;
|
|
|
+ pur.pr_price = SRMPRDto.srm_Pr_Main.pr_price;
|
|
|
+ pur.pr_rate = SRMPRDto.srm_Pr_Main.pr_rate;
|
|
|
+ item.purchase_list.Add(pur);
|
|
|
+ }
|
|
|
item.kitting_time = SRMPRDto.lastStartTmie;
|
|
|
SRMPRDtoList.Add(SRMPRDto);
|
|
|
}
|
|
|
else if (item.erp_cls == 2)
|
|
|
{
|
|
|
+ //先找在途
|
|
|
+
|
|
|
+
|
|
|
//先计算末级数据的齐套时间。
|
|
|
if (cilList.Count() > 0)
|
|
|
{
|
|
|
@@ -448,6 +504,17 @@ namespace Business.ResourceExamineManagement
|
|
|
//1.先生成委外工单。
|
|
|
var mesorder = CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
|
|
|
item.subcontracting_qty = item.lack_qty;
|
|
|
+ item.subcontracting_list = new List<ooder>();
|
|
|
+ ooder oo = new ooder();
|
|
|
+ oo.morder_production_number = mesorder.morder_production_number;
|
|
|
+ oo.production_unit= mesorder.production_unit;
|
|
|
+ oo.production_unit_code = mesorder.production_unit_code;
|
|
|
+ oo.ooentry_prdname= mesorder.ooentry_prdname;
|
|
|
+ oo.ooentry_stime= mesorder.ooentry_stime;
|
|
|
+ oo.ooentry_etime= mesorder.ooentry_etime;
|
|
|
+ oo.oorder_date= mesorder.oorder_date;
|
|
|
+ oo.oorder_no= mesorder.oorder_no;
|
|
|
+ item.subcontracting_list.Add(oo);
|
|
|
item.kitting_time = mesorder.ooentry_etime;
|
|
|
orderList.Add(mesorder);
|
|
|
}
|
|
|
@@ -483,19 +550,19 @@ namespace Business.ResourceExamineManagement
|
|
|
switch (item.substitute_strategy)
|
|
|
{
|
|
|
case 0://整批
|
|
|
- WholeBatchCheck(sublist, returnlist, sklist, select);
|
|
|
+ WholeBatchCheck(sublist, returnlist, sklist, select, bangid);
|
|
|
//如果都需要采购的情况下,则默认使用优先级最高的
|
|
|
WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date, icitemlist, sentrys, childidList);
|
|
|
break;
|
|
|
case 1://混用
|
|
|
- MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date, icitemlist, sentrys);
|
|
|
+ MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date, icitemlist, sentrys, childidList);
|
|
|
break;
|
|
|
case 2://整批加混用
|
|
|
- WholeBatchCheck(sublist, returnlist, sklist, select);
|
|
|
+ WholeBatchCheck(sublist, returnlist, sklist, select, bangid);
|
|
|
if (select.Count() == 0)
|
|
|
{
|
|
|
//走混用
|
|
|
- MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date, icitemlist, sentrys);
|
|
|
+ MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date, icitemlist, sentrys, childidList);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -512,7 +579,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="returnlist"></param>
|
|
|
/// <param name="sklist"></param>
|
|
|
/// <param name="select"></param>
|
|
|
- public void WholeBatchCheck(List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<mo_ic_item_stockoccupy> sklist, List<BomChildExamineDto> select)
|
|
|
+ public void WholeBatchCheck(List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<mo_ic_item_stockoccupy> sklist, List<BomChildExamineDto> select,long bangid)
|
|
|
{
|
|
|
for (int idx = 0; idx < 99; idx++)
|
|
|
{
|
|
|
@@ -521,7 +588,7 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
foreach (var s in list)
|
|
|
{
|
|
|
- RecalculationStock(s, returnlist, sklist);
|
|
|
+ RecalculationStock(s, returnlist, sklist, bangid);
|
|
|
}
|
|
|
//可制计算:需要对list进行可制计算,按主料来算辅料
|
|
|
if (list.Where(s => s.stock_state != 1).Count() == 0)
|
|
|
@@ -595,7 +662,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="input"></param>
|
|
|
/// <param name="plan_date"></param>
|
|
|
public void MixedUse(BomChildExamineDto item, List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<mo_ic_item_stockoccupy> sklist, long bangid, BomChildExamineDto parent, SeorderentryDto input, DateTime
|
|
|
- ? plan_date, List<mo_ic_item> icitemlist, crm_seorderentry sentrys)
|
|
|
+ ? plan_date, List<mo_ic_item> icitemlist, crm_seorderentry sentrys, List<long> childidList)
|
|
|
{
|
|
|
|
|
|
decimal parent_lack = 0;
|
|
|
@@ -615,7 +682,7 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
foreach (var s in list)
|
|
|
{
|
|
|
- RecalculationStock(s, returnlist, sklist);
|
|
|
+ RecalculationStock(s, returnlist, sklist, bangid);
|
|
|
}
|
|
|
decimal minMake = 99999999;
|
|
|
foreach (var hy in list)
|
|
|
@@ -670,6 +737,7 @@ namespace Business.ResourceExamineManagement
|
|
|
zy.stock_state = 1;
|
|
|
}
|
|
|
mo_ic_item_stockoccupy itemStockoccupyDto = new mo_ic_item_stockoccupy();
|
|
|
+ itemStockoccupyDto.orderentry_id = sentrys.Id;
|
|
|
itemStockoccupyDto.bang_id = bangid;
|
|
|
itemStockoccupyDto.icitem_id = zy.item_id;
|
|
|
/*decimal moo_qty = use_p_num * zy.qty - zy.sqty;
|
|
|
@@ -680,6 +748,16 @@ namespace Business.ResourceExamineManagement
|
|
|
itemStockoccupyDto.quantity = zy.sqty;
|
|
|
zy.use_qty = zy.sqty;
|
|
|
zy.mo_qty = moo_qty;
|
|
|
+ zy.mo_occupy_list = new List<mo_occupy>();
|
|
|
+ mooccupylist.ForEach(s =>
|
|
|
+ {
|
|
|
+ mo_occupy mooc = new mo_occupy();
|
|
|
+ mooc.moo_mo = s.moo_mo;
|
|
|
+ mooc.moo_stime = s.moo_ctime;
|
|
|
+ mooc.moo_etime = s.moo_etime;
|
|
|
+ mooc.moo_qty = s.moo_qty;
|
|
|
+ zy.mo_occupy_list.Add(mooc);
|
|
|
+ });
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -708,45 +786,112 @@ namespace Business.ResourceExamineManagement
|
|
|
//取代
|
|
|
select = sublist.Where(s => s.substitute_all_num == 0).ToList();
|
|
|
}
|
|
|
- //对select执行采购
|
|
|
+ //对select执行补充(根据属性采购、外购、自制等)
|
|
|
foreach (var sct in select)
|
|
|
{
|
|
|
- //找到当前物料的占用记录
|
|
|
- var itemSockoccupy = sklist.Where(s => s.icitem_id == sct.item_id).ToList();
|
|
|
- var num = parent_lack * sct.qty - itemSockoccupy.Sum(m => m.quantity);
|
|
|
- if (sct.erp_cls == 1)
|
|
|
+ decimal sqty = sct.sqty - sct.use_qty;//这里得出前面混用使用后的库存。
|
|
|
+ decimal lack_Count = parent_lack * sct.qty;//混用后还缺的部分。
|
|
|
+ mo_ic_item_stockoccupy itemStockoccupyDto = new mo_ic_item_stockoccupy();
|
|
|
+ itemStockoccupyDto.orderentry_id = sentrys.Id;
|
|
|
+ itemStockoccupyDto.bang_id = bangid;
|
|
|
+ itemStockoccupyDto.icitem_id = sct.item_id;
|
|
|
+ itemStockoccupyDto.item_no = sct.num;
|
|
|
+ decimal lack_num = sqty - lack_Count;//库存还够缺的部分
|
|
|
+ if (lack_num >= 0)
|
|
|
{
|
|
|
- //走自制
|
|
|
- //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
|
|
|
- ProdExamineParamDto prodExamine = new ProdExamineParamDto()
|
|
|
- {
|
|
|
- bom_number = sct.bom_number,
|
|
|
- version = sct.version,
|
|
|
- packages = (int)sct.lack_qty,
|
|
|
- tenantId = param.tenantId,
|
|
|
- factoryId = param.factoryId
|
|
|
-
|
|
|
- };
|
|
|
- var minute = _productExamineAppService.ProductiveExamine(prodExamine);
|
|
|
- //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
|
|
|
- //系统建议完工日期为 开工日期+产能检查时间=完工日期
|
|
|
- var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
|
|
|
- sct.kitting_time = sct.kitting_time.Value.AddDays((double)Day);
|
|
|
- }
|
|
|
- else if (sct.erp_cls == 3)
|
|
|
- {
|
|
|
- //采购申请
|
|
|
- var SRMPRDto = CreateSRMPR(sct, input.tenantId, input.factoryId, bangid, sct.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
|
|
|
- sct.kitting_time = SRMPRDto.lastStartTmie;
|
|
|
- SRMPRDtoList.Add(SRMPRDto);
|
|
|
+ //剩余得库存还够还缺的部分
|
|
|
+ itemStockoccupyDto.quantity = lack_Count;
|
|
|
+ sct.use_qty += lack_Count;
|
|
|
+ sklist.Add(itemStockoccupyDto);
|
|
|
}
|
|
|
- else if (sct.erp_cls == 2)
|
|
|
- {
|
|
|
- //1.先生成委外工单。
|
|
|
- var mesorder = CreateMesOOder(sct, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
|
|
|
- sct.kitting_time = mesorder.ooentry_etime;
|
|
|
- orderList.Add(mesorder);
|
|
|
+ else {
|
|
|
+ var cilList = returnlist.Where(s => s.parent_id == sct.id && s.type == sct.type).OrderBy(k => k.num_order).ToList();
|
|
|
+
|
|
|
+ itemStockoccupyDto.quantity = sqty;
|
|
|
+ sklist.Add(itemStockoccupyDto);
|
|
|
+ sct.lack_qty = lack_num * -1;
|
|
|
+ sct.kitting_time = DateTime.Now;
|
|
|
+ sct.use_qty += sqty;
|
|
|
+
|
|
|
+ if (sct.erp_cls == 1)
|
|
|
+ {
|
|
|
+ //先计算末级数据的齐套时间。
|
|
|
+ if (cilList.Count() > 0)
|
|
|
+ {
|
|
|
+ CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys, childidList);
|
|
|
+ sct.kitting_time = cilList.Max(s => s.kitting_time);
|
|
|
+ }
|
|
|
+ //走自制
|
|
|
+ ProdExamineParamDto prodExamine = new ProdExamineParamDto()
|
|
|
+ {
|
|
|
+ bom_number = sct.bom_number,
|
|
|
+ version = sct.version,
|
|
|
+ packages = (int)sct.lack_qty,
|
|
|
+ tenantId = param.tenantId,
|
|
|
+ factoryId = param.factoryId
|
|
|
+ };
|
|
|
+ var minute = _productExamineAppService.ProductiveExamine(prodExamine);
|
|
|
+ //系统建议完工日期为 开工日期+产能检查时间=完工日期
|
|
|
+ var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
|
|
|
+ sct.kitting_time = sct.kitting_time.Value.AddDays((double)Day);
|
|
|
+ sct.make_qty = sct.lack_qty;
|
|
|
+ //todo:
|
|
|
+ sct.make_list = new List<moorder>();
|
|
|
+ }
|
|
|
+ else if (sct.erp_cls == 3)
|
|
|
+ {
|
|
|
+ //采购申请
|
|
|
+ var SRMPRDto = CreateSRMPR(sct, input.tenantId, input.factoryId, bangid, sct.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
|
|
|
+ sct.purchase_qty = sct.lack_qty;
|
|
|
+ sct.purchase_list = new List<purchase>();
|
|
|
+ if (SRMPRDto.srm_Pr_Main != null)
|
|
|
+ {
|
|
|
+ purchase pur = new purchase();
|
|
|
+ pur.pr_billno = SRMPRDto.srm_Pr_Main.pr_billno;
|
|
|
+ pur.pr_purchasenumber = SRMPRDto.srm_Pr_Main.pr_purchasenumber;
|
|
|
+ pur.pr_purchasename = SRMPRDto.srm_Pr_Main.pr_purchasename;
|
|
|
+ pur.pr_rqty = SRMPRDto.srm_Pr_Main.pr_rqty;
|
|
|
+ pur.pr_aqty = SRMPRDto.srm_Pr_Main.pr_aqty;
|
|
|
+ pur.pr_sqty = SRMPRDto.srm_Pr_Main.pr_sqty;
|
|
|
+ pur.pr_parrive_date = SRMPRDto.srm_Pr_Main.pr_parrive_date;
|
|
|
+ pur.pr_rarrive_date = SRMPRDto.srm_Pr_Main.pr_rarrive_date;
|
|
|
+ pur.pr_pur_affirm_date = SRMPRDto.srm_Pr_Main.pr_pur_affirm_date;
|
|
|
+ pur.pr_sysprice = SRMPRDto.srm_Pr_Main.pr_sysprice;
|
|
|
+ pur.pr_orderprice = SRMPRDto.srm_Pr_Main.pr_orderprice;
|
|
|
+ pur.pr_price = SRMPRDto.srm_Pr_Main.pr_price;
|
|
|
+ pur.pr_rate = SRMPRDto.srm_Pr_Main.pr_rate;
|
|
|
+ sct.purchase_list.Add(pur);
|
|
|
+ }
|
|
|
+ sct.kitting_time = SRMPRDto.lastStartTmie;
|
|
|
+ SRMPRDtoList.Add(SRMPRDto);
|
|
|
+ }
|
|
|
+ else if (sct.erp_cls == 2)
|
|
|
+ {
|
|
|
+ //先计算末级数据的齐套时间。
|
|
|
+ if (cilList.Count() > 0)
|
|
|
+ {
|
|
|
+ CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys, childidList);
|
|
|
+ sct.kitting_time = cilList.Max(s => s.kitting_time);
|
|
|
+ }
|
|
|
+ //1.先生成委外工单。
|
|
|
+ var mesorder = CreateMesOOder(sct, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
|
|
|
+ sct.subcontracting_qty = sct.lack_qty;
|
|
|
+ sct.subcontracting_list = new List<ooder>();
|
|
|
+ ooder oo = new ooder();
|
|
|
+ oo.morder_production_number = mesorder.morder_production_number;
|
|
|
+ oo.production_unit = mesorder.production_unit;
|
|
|
+ oo.production_unit_code = mesorder.production_unit_code;
|
|
|
+ oo.ooentry_prdname = mesorder.ooentry_prdname;
|
|
|
+ oo.ooentry_stime = mesorder.ooentry_stime;
|
|
|
+ oo.ooentry_etime = mesorder.ooentry_etime;
|
|
|
+ oo.oorder_date = mesorder.oorder_date;
|
|
|
+ oo.oorder_no = mesorder.oorder_no;
|
|
|
+ item.subcontracting_list.Add(oo);
|
|
|
+ sct.kitting_time = mesorder.ooentry_etime;
|
|
|
+ orderList.Add(mesorder);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -759,11 +904,11 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="item"></param>
|
|
|
/// <param name="returnlist"></param>
|
|
|
/// <param name="sklist"></param>
|
|
|
- public void RecalculationStock(BomChildExamineDto item, List<BomChildExamineDto> returnlist, List<mo_ic_item_stockoccupy> sklist)
|
|
|
+ public void RecalculationStock(BomChildExamineDto item, List<BomChildExamineDto> returnlist, List<mo_ic_item_stockoccupy> sklist, long bangid)
|
|
|
{
|
|
|
//再计算一边占用情况,这里根据父级产品额缺料量*当前子料的使用数量-子料库存量。得出当前子物料的缺料数量
|
|
|
var parent = returnlist.Find(s => s.id == item.parent_id);
|
|
|
- decimal stockQty = sklist.Where(s => s.icitem_id == item.item_id).Sum(p => p.quantity);
|
|
|
+ decimal stockQty = sklist.Where(s => s.icitem_id == item.item_id && s.bang_id == bangid).Sum(p => p.quantity);
|
|
|
item.sqty = item.sqty - stockQty;
|
|
|
item.lack_qty = parent.lack_qty * item.qty - item.sqty;
|
|
|
item.lack_qty = item.lack_qty > 0 ? item.lack_qty : 0;
|