|
|
@@ -211,6 +211,10 @@ namespace Business.ResourceExamineManagement
|
|
|
private List<ic_item_pur> supplierList;
|
|
|
|
|
|
private List<ic_plan> planList;
|
|
|
+
|
|
|
+ private List<SRMPRDto> SRMPRDtoList = new List<SRMPRDto>();
|
|
|
+
|
|
|
+ private List<mes_oorder> orderList = new List<mes_oorder>();
|
|
|
#endregion
|
|
|
|
|
|
#region 构造函数
|
|
|
@@ -396,7 +400,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//库存初始化
|
|
|
BomStock(getBomList);
|
|
|
//计算
|
|
|
- calcTest(getBomList, bangid, item.Id, item.qty.Value, input, item.plan_date, sklist);
|
|
|
+ calcTest(getBomList, bangid, item.Id, item.qty.Value, input, item.plan_date, sklist, item, icitemlist);
|
|
|
|
|
|
//TODO:最晚开始时间
|
|
|
var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
|
|
|
@@ -412,6 +416,8 @@ namespace Business.ResourceExamineManagement
|
|
|
//GenerateMorder(o, 0);
|
|
|
}
|
|
|
//订单行资源检查明细list
|
|
|
+ rtn.srm_pr_list = SRMPRDtoList;
|
|
|
+ rtn.order_list = orderList;
|
|
|
rtn.examines = examines;
|
|
|
rtn.sklist = sklist;
|
|
|
return JsonConvert.SerializeObject(rtn);
|
|
|
@@ -708,12 +714,12 @@ namespace Business.ResourceExamineManagement
|
|
|
foreach (var item in returnlist)
|
|
|
{
|
|
|
//最顶级、虚拟件
|
|
|
- if (item.level == 1 || item.erp_cls == 4 || !childidList.Contains(item.bom_child_id.GetValueOrDefault()))
|
|
|
+ if (item.level == 1 || item.erp_cls == 4 || childidList.Contains(item.bom_child_id.GetValueOrDefault()))
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
//有替代关系
|
|
|
- if (item.haveicsubs == 1)
|
|
|
+ if (item.haveicsubs != 1)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
@@ -868,11 +874,11 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="input"></param>
|
|
|
/// <param name="plan_date"></param>
|
|
|
public void calcTest(List<BomChildExamineDto> returnlist, long bangid, long orderid, decimal count, SeorderentryDto input, DateTime
|
|
|
- ? plan_date, List<ic_item_stockoccupy> sklist)
|
|
|
+ ? plan_date, List<ic_item_stockoccupy> sklist, crm_seorderentry sentrys,List<ic_item> icitemlist)
|
|
|
{
|
|
|
//第一级
|
|
|
returnlist = returnlist.OrderBy(s => s.num).ToList();
|
|
|
- var childList = returnlist.Where(s => s.parent_id == returnlist[0].id && s.type == 0).ToList();
|
|
|
+ var childList = returnlist.Where(s => s.parent_id == returnlist[0].id && s.type == 0).OrderBy(s => s.num).ToList();
|
|
|
|
|
|
var planList = GetICPlan(returnlist.Select(p => p.item_id).ToList(), bangid, param.factoryId);//plan列表
|
|
|
|
|
|
@@ -895,32 +901,55 @@ namespace Business.ResourceExamineManagement
|
|
|
Mes_MorderDto mes_MorderDto = new Mes_MorderDto();
|
|
|
if (returnlist[0].lack_qty > 0)
|
|
|
{
|
|
|
- var seorderentry = _mysql_crm_seorderentry.FindAsync(x => x.Id == orderid).Result;
|
|
|
-
|
|
|
//获取物料详情
|
|
|
- var ic_item = _ic_item.GetManyByCondition(x => x.number == seorderentry.item_number && x.tenant_id == seorderentry.tenant_id).Result.FirstOrDefault();
|
|
|
- GenerateMorderDto generateMorderDto = new GenerateMorderDto()
|
|
|
+ var ic_item = icitemlist.Find(s => s.Id == returnlist[0].item_id);
|
|
|
+ var mooccupylist = _morderAppService.CheckMorder(returnlist[0].bom_number, returnlist[0].lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item).Result;
|
|
|
+ decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
|
|
|
+ returnlist[0].mo_qty = moo_qty;
|
|
|
+ if (moo_qty == returnlist[0].lack_qty)
|
|
|
+ {
|
|
|
+ //在制完全足够
|
|
|
+ returnlist[0].lack_qty = 0;
|
|
|
+ returnlist[0].satisfy_time = mooccupylist[0].moo_etime;
|
|
|
+ returnlist[0].stock_state = 1;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- seorderentry = seorderentry,
|
|
|
- ic_Item = ic_item,
|
|
|
- BomNumber = returnlist[0].bom_number,
|
|
|
- version = returnlist[0].version,
|
|
|
- number = returnlist[0].item_number,
|
|
|
- Quantity = returnlist[0].lack_qty,
|
|
|
- morder_type = "销售工单",
|
|
|
- work_order_type = "常规工单",
|
|
|
- morder_state = "初始",
|
|
|
-
|
|
|
- };
|
|
|
- //生成主工单
|
|
|
- mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
|
|
|
+ //占用不够,占用后减少缺料数量
|
|
|
+ returnlist[0].lack_qty -= moo_qty;
|
|
|
+ //先设定在制的齐套时间
|
|
|
+ returnlist[0].satisfy_time = mooccupylist[0]?.moo_etime;
|
|
|
+ returnlist[0].stock_state = 0;
|
|
|
+ //生成主工单
|
|
|
+ GenerateMorderDto generateMorderDto = new GenerateMorderDto()
|
|
|
+ {
|
|
|
+ seorderentry = sentrys,
|
|
|
+ ic_Item = ic_item,
|
|
|
+ BomNumber = returnlist[0].bom_number,
|
|
|
+ version = returnlist[0].version,
|
|
|
+ number = returnlist[0].item_number,
|
|
|
+ Quantity = returnlist[0].lack_qty,
|
|
|
+ morder_type = "销售工单",
|
|
|
+ work_order_type = "常规工单",
|
|
|
+ morder_state = "初始",
|
|
|
+
|
|
|
+ };
|
|
|
+ //生成主工单
|
|
|
+ mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ returnlist[0].satisfy_time = DateTime.Now;
|
|
|
+ returnlist[0].stock_state = 1;
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
//这是从上往下展开计算缺料和可制
|
|
|
calcTest2(returnlist[0], childList, returnlist, sklist);
|
|
|
//returnlist[0].kz = childList.Min(s => s.kz);//得到最小可制数量。
|
|
|
//再加个循环,来根据替代关系里的检查结果,根据规则明确使用和生成占用关系。
|
|
|
- CalcIcitem(childList, returnlist, bangid, orderid, input, sklist, plan_date);
|
|
|
+ CalcIcitem(childList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys);
|
|
|
returnlist[0].kitting_time = childList.Max(s => s.kitting_time);
|
|
|
//这里更新产品得满足时间。
|
|
|
if (mes_MorderDto != null)
|
|
|
@@ -969,104 +998,137 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="input"></param>
|
|
|
/// <param name="sklist"></param>
|
|
|
/// <param name="plan_date"></param>
|
|
|
- public void CalcIcitem(List<BomChildExamineDto> childList, List<BomChildExamineDto> returnlist, long bangid, long orderid, SeorderentryDto input, List<ic_item_stockoccupy> sklist, DateTime
|
|
|
- ? plan_date)
|
|
|
+ public void CalcIcitem(List<BomChildExamineDto> childList, List<BomChildExamineDto> returnlist, long bangid, SeorderentryDto input, List<ic_item_stockoccupy> sklist, DateTime
|
|
|
+ ? plan_date, List<ic_item> icitemlist, crm_seorderentry sentrys)
|
|
|
{
|
|
|
foreach (var item in childList)
|
|
|
{
|
|
|
- var cilList = returnlist.Where(s => s.parent_id == item.id && s.type == 0).ToList();
|
|
|
+ var parent = returnlist.Find(s => s.id == item.parent_id);
|
|
|
+ if (parent.stock_state == 0)
|
|
|
+ {
|
|
|
+ if (item.haveicsubs == 1)
|
|
|
+ {
|
|
|
+ //如果有替代关系,根据群组来明确使用哪个群组的替代料。按整批和混用逻辑来算
|
|
|
+ // 如果有群组替代,就移除掉被检查过的记录 item.icitem_ids
|
|
|
+ CalcStrategy(item, returnlist, bangid, sklist, input, plan_date, icitemlist, sentrys);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Calczykc(item, parent, sklist);
|
|
|
|
|
|
- if (item.haveicsubs == 1)
|
|
|
+ //直接占用库存,缺料就生成采购
|
|
|
+ ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
|
|
|
+ itemStockoccupyDto.bang_id = bangid;
|
|
|
+ itemStockoccupyDto.icitem_id = item.item_id;
|
|
|
+ itemStockoccupyDto.item_no = item.num;
|
|
|
+ item.kitting_time = DateTime.Now;
|
|
|
+ item.is_use = true;
|
|
|
+ StartProcessing(item,icitemlist,returnlist,plan_date,sentrys,sklist,itemStockoccupyDto,bangid,input);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 针对缺料开始进行处理
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="item"></param>
|
|
|
+ /// <param name="icitemlist"></param>
|
|
|
+ /// <param name="returnlist"></param>
|
|
|
+ /// <param name="plan_date"></param>
|
|
|
+ /// <param name="sentrys"></param>
|
|
|
+ /// <param name="sklist"></param>
|
|
|
+ /// <param name="itemStockoccupyDto"></param>
|
|
|
+ /// <param name="bangid"></param>
|
|
|
+ /// <param name="input"></param>
|
|
|
+ public void StartProcessing(BomChildExamineDto item, List<ic_item> icitemlist, List<BomChildExamineDto> returnlist, DateTime
|
|
|
+ ? plan_date, crm_seorderentry sentrys, List<ic_item_stockoccupy> sklist, ic_item_stockoccupy itemStockoccupyDto, long bangid, SeorderentryDto input)
|
|
|
+ {
|
|
|
+ var parent = returnlist.Find(s => s.id == item.parent_id);
|
|
|
+ if (item.lack_qty > 0)
|
|
|
+ {
|
|
|
+ var cilList = returnlist.Where(s => s.parent_id == item.id && s.type == item.type).OrderBy(k => k.num).ToList();
|
|
|
+ //如果缺料,占用库存,然后走采购或自制
|
|
|
+ if (item.sqty > 0)
|
|
|
{
|
|
|
- //如果有替代关系,根据群组来明确使用哪个群组的替代料。按整批和混用逻辑来算
|
|
|
- // 如果有群组替代,就移除掉被检查过的记录 item.icitem_ids
|
|
|
- CalcStrategy(item, returnlist, bangid, sklist, input, plan_date);
|
|
|
+ itemStockoccupyDto.quantity = item.sqty;
|
|
|
+ sklist.Add(itemStockoccupyDto);
|
|
|
}
|
|
|
- else
|
|
|
+ item.use_qty = item.sqty;
|
|
|
+ if (item.erp_cls == 1)
|
|
|
{
|
|
|
- var parent = returnlist.Find(s => s.id == item.parent_id);
|
|
|
- Calczykc(item, parent, sklist);
|
|
|
-
|
|
|
- //直接占用库存,缺料就生成采购
|
|
|
- ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
|
|
|
- itemStockoccupyDto.bang_id = bangid;
|
|
|
- itemStockoccupyDto.icitem_id = item.item_id;
|
|
|
- item.kitting_time = DateTime.Now;
|
|
|
- if (cilList.Count() > 0)
|
|
|
+ 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;
|
|
|
+ if (moo_qty == returnlist[0].lack_qty)
|
|
|
{
|
|
|
- CalcIcitem(cilList, returnlist, bangid, orderid, input, sklist, plan_date);
|
|
|
- item.kitting_time = cilList.Max(s => s.kitting_time);
|
|
|
+ //在制完全足够
|
|
|
+ item.lack_qty = 0;
|
|
|
+ item.kitting_time = mooccupylist[0].moo_etime;
|
|
|
+ item.stock_state = 1;
|
|
|
}
|
|
|
-
|
|
|
- if (item.lack_qty > 0)
|
|
|
+ else
|
|
|
{
|
|
|
- //如果缺料,占用库存,然后走采购或自制
|
|
|
- itemStockoccupyDto.quantity = item.sqty;
|
|
|
- item.use_qty = item.sqty;
|
|
|
- sklist.Add(itemStockoccupyDto);
|
|
|
- if (item.erp_cls == 1)
|
|
|
+ item.lack_qty -= moo_qty;
|
|
|
+ item.kitting_time=DateTime.Now;
|
|
|
+ //先计算末级数据的齐套时间。
|
|
|
+ if (cilList.Count() > 0)
|
|
|
{
|
|
|
- //走自制
|
|
|
- //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
|
|
|
- ProdExamineParamDto prodExamine = new ProdExamineParamDto()
|
|
|
- {
|
|
|
- bom_number = item.bom_number,
|
|
|
- version = item.version,
|
|
|
- packages = item.lack_qty.GetInt(),
|
|
|
- tenantId = param.tenantId,
|
|
|
- factoryId = param.factoryId
|
|
|
-
|
|
|
- };
|
|
|
- var minute = _productExamineAppService.ProductiveExamine(prodExamine);
|
|
|
- //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
|
|
|
- //系统建议完工日期为 开工日期+产能检查时间=完工日期
|
|
|
- var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
|
|
|
- item.kitting_time = item.kitting_time.Value.AddDays((double)Day);
|
|
|
+ CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys);
|
|
|
+ item.kitting_time = cilList.Max(s => s.kitting_time);
|
|
|
}
|
|
|
- else if (item.erp_cls == 2)
|
|
|
- {
|
|
|
- //采购申请
|
|
|
- var SRMPRDto = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
|
|
|
- item.kitting_time = SRMPRDto.lastStartTmie;
|
|
|
- }
|
|
|
- else if (item.erp_cls == 3)
|
|
|
+
|
|
|
+ //走自制
|
|
|
+ //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
|
|
|
+ ProdExamineParamDto prodExamine = new ProdExamineParamDto()
|
|
|
{
|
|
|
+ bom_number = item.bom_number,
|
|
|
+ version = item.version,
|
|
|
+ packages = (int)item.lack_qty,
|
|
|
+ tenantId = param.tenantId,
|
|
|
+ factoryId = param.factoryId
|
|
|
|
|
|
- if (item.erp_cls == 3)
|
|
|
- {
|
|
|
- //1.先生成委外工单。
|
|
|
- CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
|
|
|
- //2.再根据委外工单需要检查库存材料,然后提供给第三方组装(委外生产)。
|
|
|
- //3.如果委外工单的物料库存不够,先生成物料采购申请单,再生成物料的采购订单,到货后再走委外流程。
|
|
|
- /*foreach (var cl in cilList)
|
|
|
- {
|
|
|
- if (cl.stock_state == 0 || cl.stock_state == 2)
|
|
|
- {
|
|
|
- //采购申请
|
|
|
- var SRMPRDto = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
|
|
|
- item.kitting_time = SRMPRDto.lastStartTmie;
|
|
|
- }
|
|
|
- }*/
|
|
|
- //4.再生成委外的采购申请单。
|
|
|
- }
|
|
|
- }
|
|
|
+ };
|
|
|
+ var minute = _productExamineAppService.ProductiveExamine(prodExamine);
|
|
|
+ //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
|
|
|
+ //系统建议完工日期为 开工日期+产能检查时间=完工日期
|
|
|
+ var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
|
|
|
+ var ktime = item.kitting_time.Value.AddDays((double)Day);
|
|
|
+ item.kitting_time = ktime > mooccupylist[0].moo_etime ? ktime : mooccupylist[0].moo_etime;
|
|
|
}
|
|
|
- else
|
|
|
+ }
|
|
|
+ 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.kitting_time = SRMPRDto.lastStartTmie;
|
|
|
+ SRMPRDtoList.Add(SRMPRDto);
|
|
|
+ }
|
|
|
+ else if (item.erp_cls == 2)
|
|
|
+ {
|
|
|
+ //先计算末级数据的齐套时间。
|
|
|
+ if (cilList.Count() > 0)
|
|
|
{
|
|
|
- item.use_qty = 0;
|
|
|
- if (parent.stock_state == 1)
|
|
|
- {
|
|
|
- //如果父级缺料,则本级等于父级缺料*本级使用数量
|
|
|
- item.use_qty = parent.lack_qty * item.qty;
|
|
|
- itemStockoccupyDto.quantity = item.use_qty;
|
|
|
- sklist.Add(itemStockoccupyDto);
|
|
|
- }
|
|
|
+ CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys);
|
|
|
+ item.kitting_time = cilList.Max(s => s.kitting_time);
|
|
|
}
|
|
|
- item.is_use = true;
|
|
|
-
|
|
|
-
|
|
|
+ //1.先生成委外工单。
|
|
|
+ var mesorder = CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
|
|
|
+ item.kitting_time = mesorder.ooentry_etime;
|
|
|
+ orderList.Add(mesorder);
|
|
|
}
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //如果父级缺料,则本级等于父级缺料*本级使用数量
|
|
|
+ if (parent != null)
|
|
|
+ {
|
|
|
+ item.use_qty = parent.lack_qty * item.qty;
|
|
|
+ itemStockoccupyDto.quantity = item.use_qty;
|
|
|
+ }
|
|
|
+ sklist.Add(itemStockoccupyDto);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1125,7 +1187,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="input"></param>
|
|
|
/// <param name="plan_date"></param>
|
|
|
public void CalcStrategy(BomChildExamineDto item, List<BomChildExamineDto> returnlist, long bangid, List<ic_item_stockoccupy> sklist, SeorderentryDto input, DateTime
|
|
|
- ? plan_date)
|
|
|
+ ? plan_date, List<ic_item> icitemlist, crm_seorderentry sentrys)
|
|
|
{
|
|
|
//提取群组关系
|
|
|
var sublist = returnlist.Where(s => s.parent_id == item.parent_id && s.num == item.num && s.level == item.level).OrderBy(c => c.substitute_all_num).ToList();
|
|
|
@@ -1136,22 +1198,22 @@ namespace Business.ResourceExamineManagement
|
|
|
case 0://整批
|
|
|
WholeBatchCheck(sublist, returnlist, sklist, select);
|
|
|
//如果都需要采购的情况下,则默认使用优先级最高的
|
|
|
- WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date);
|
|
|
+ WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date, icitemlist, sentrys);
|
|
|
break;
|
|
|
case 1://混用
|
|
|
- MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date);
|
|
|
+ MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date, icitemlist, sentrys);
|
|
|
break;
|
|
|
case 2://整批加混用
|
|
|
WholeBatchCheck(sublist, returnlist, sklist, select);
|
|
|
if (select.Count() == 0)
|
|
|
{
|
|
|
//走混用
|
|
|
- MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date);
|
|
|
+ MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date, icitemlist, sentrys);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//走整批
|
|
|
- WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date);
|
|
|
+ WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date, icitemlist, sentrys);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -1204,7 +1266,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="input"></param>
|
|
|
/// <param name="plan_date"></param>
|
|
|
public void WholeBatch(BomChildExamineDto item, List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<ic_item_stockoccupy> sklist, List<BomChildExamineDto> select, long bangid, BomChildExamineDto parent, SeorderentryDto input, DateTime
|
|
|
- ? plan_date)
|
|
|
+ ? plan_date, List<ic_item> icitemlist, crm_seorderentry sentrys)
|
|
|
{
|
|
|
if (select.Count() == 0)
|
|
|
{
|
|
|
@@ -1227,61 +1289,9 @@ namespace Business.ResourceExamineManagement
|
|
|
ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
|
|
|
itemStockoccupyDto.bang_id = bangid;
|
|
|
itemStockoccupyDto.icitem_id = slt.item_id;
|
|
|
+ itemStockoccupyDto.item_no = slt.num;
|
|
|
slt.is_use = true;
|
|
|
- if (slt.lack_qty > 0)
|
|
|
- {
|
|
|
- itemStockoccupyDto.quantity = slt.sqty;
|
|
|
- //库存不够的时候,根据属性生成采购和委外。
|
|
|
- if (slt.erp_cls == 1)
|
|
|
- {
|
|
|
- slt.make_qty = slt.lack_qty;
|
|
|
- //走自制
|
|
|
- //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
|
|
|
- ProdExamineParamDto prodExamine = new ProdExamineParamDto()
|
|
|
- {
|
|
|
- bom_number = item.bom_number,
|
|
|
- version = item.version,
|
|
|
- packages = item.lack_qty.GetInt(),
|
|
|
- tenantId = param.tenantId,
|
|
|
- factoryId = param.factoryId
|
|
|
-
|
|
|
- };
|
|
|
- var minute = _productExamineAppService.ProductiveExamine(prodExamine);
|
|
|
- //系统建议完工日期为 开工日期+产能检查时间=完工日期
|
|
|
- var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
|
|
|
- slt.kitting_time = slt.kitting_time.Value.AddDays((double)Day);
|
|
|
- /*var childList = returnlist.Where(s => s.parent_id == slt.id).ToList();
|
|
|
- if (childList.Count() > 0)
|
|
|
- {
|
|
|
- CalcStrategy(slt, returnlist, bangid, sklist);
|
|
|
- }*/
|
|
|
- }
|
|
|
- else if (slt.erp_cls == 2 || slt.erp_cls == 3)
|
|
|
- { /*//生成采购订单
|
|
|
- //slt.purchase_qty = slt.lack_qty;
|
|
|
- var leadTimeList = GetLeadTime(new List<long> { slt.item_id }, input.tenantId, input.factoryId);//提前期列表
|
|
|
- var supplierList = GetSupplier(new List<BomChildExamineDto> { slt }, input.tenantId, input.factoryId);//供应商列表
|
|
|
- var planList = GetICPlan(new List<BomChildExamineDto> { slt }, input.tenantId, input.factoryId);//plan列表
|
|
|
-
|
|
|
- slt.kitting_time = CreateSRMPR(slt, input.tenantId, input.factoryId, bangid, slt.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
|
|
|
- if (item.erp_cls == 3)
|
|
|
- {
|
|
|
- //生成委外工单
|
|
|
- CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
|
|
|
- }*/
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- slt.kitting_time = DateTime.Now;
|
|
|
- itemStockoccupyDto.quantity = slt.needCount;
|
|
|
- if (parent != null)
|
|
|
- { //如果不缺料的情况下,则占用掉父级缺料乘以当前子集使用料数量
|
|
|
- //itemStockoccupyDto.quantity = parent.lack_qty * slt.qty - slt.sqty;
|
|
|
- itemStockoccupyDto.quantity = parent.lack_qty * slt.qty;
|
|
|
- }
|
|
|
- }
|
|
|
- sklist.Add(itemStockoccupyDto);
|
|
|
+ StartProcessing(slt, icitemlist, returnlist, plan_date, sentrys, sklist, itemStockoccupyDto, bangid, input);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
@@ -1298,7 +1308,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<ic_item_stockoccupy> sklist, long bangid, BomChildExamineDto parent, SeorderentryDto input, DateTime
|
|
|
- ? plan_date)
|
|
|
+ ? plan_date, List<ic_item> icitemlist, crm_seorderentry sentrys)
|
|
|
{
|
|
|
|
|
|
decimal parent_lack = 0;
|
|
|
@@ -1320,12 +1330,21 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
RecalculationStock(s, returnlist, sklist);
|
|
|
}
|
|
|
- decimal minMake = 9999999;
|
|
|
+ decimal minMake = 99999999;
|
|
|
foreach (var hy in list)
|
|
|
{
|
|
|
//混用先使用掉当前要用的数量
|
|
|
//得到库存最小数量,去占用,然后剩余的丢第二个循环里去占用。
|
|
|
- decimal make = hy.sqty / hy.qty;
|
|
|
+ //获取物料详情
|
|
|
+ var ic_item = icitemlist.Find(s => s.Id == hy.item_id);
|
|
|
+ var mooccupylist = _morderAppService.CheckMorder(hy.bom_number, hy.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item).Result;
|
|
|
+ decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
|
|
|
+ decimal make = (hy.sqty + moo_qty) / hy.qty;
|
|
|
+ if (Math.Floor(hy.qty) == hy.qty)
|
|
|
+ {
|
|
|
+ //如果物料的使用数量是小数,则按小数计算。
|
|
|
+ make = Math.Floor(make);
|
|
|
+ }
|
|
|
if (minMake > make)
|
|
|
{
|
|
|
minMake = make;
|
|
|
@@ -1346,10 +1365,28 @@ namespace Business.ResourceExamineManagement
|
|
|
foreach (var zy in list)
|
|
|
{
|
|
|
zy.is_use = true;
|
|
|
+ zy.kitting_time = DateTime.Now;
|
|
|
+ if (parent_lack <= 0)
|
|
|
+ {
|
|
|
+ zy.stock_state = 1;
|
|
|
+ }
|
|
|
ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
|
|
|
itemStockoccupyDto.bang_id = bangid;
|
|
|
itemStockoccupyDto.icitem_id = zy.item_id;
|
|
|
- itemStockoccupyDto.quantity = use_p_num * zy.qty; ;
|
|
|
+ decimal moo_qty = use_p_num * zy.qty - zy.sqty;
|
|
|
+ if (moo_qty > 0)
|
|
|
+ {
|
|
|
+ var ic_item = icitemlist.Find(s => s.Id == zy.item_id);
|
|
|
+ var mooccupylist = _morderAppService.CheckMorder(zy.bom_number, moo_qty, plan_date.GetValueOrDefault(), sentrys, ic_item).Result;
|
|
|
+ itemStockoccupyDto.quantity = zy.sqty;
|
|
|
+ zy.use_qty = zy.sqty;
|
|
|
+ zy.mo_qty = moo_qty;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ zy.use_qty = use_p_num * zy.qty;
|
|
|
+ itemStockoccupyDto.quantity = zy.use_qty;
|
|
|
+ }
|
|
|
+ itemStockoccupyDto.item_no = zy.num;
|
|
|
sklist.Add(itemStockoccupyDto);
|
|
|
}
|
|
|
idx++;
|
|
|
@@ -1376,20 +1413,36 @@ namespace Business.ResourceExamineManagement
|
|
|
var num = parent_lack * sct.qty - itemSockoccupy.Sum(m => m.quantity);
|
|
|
if (sct.erp_cls == 1)
|
|
|
{
|
|
|
- //自制
|
|
|
- //GenerateMorder()
|
|
|
+ //走自制
|
|
|
+ //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 == 2 || sct.erp_cls == 3)
|
|
|
+ else if (sct.erp_cls == 3)
|
|
|
{
|
|
|
- /*var leadTimeList = GetLeadTime(new List<long> { sct.item_id }, input.tenantId, input.factoryId);//提前期列表
|
|
|
- var supplierList = GetSupplier(new List<BomChildExamineDto> { sct }, input.tenantId, input.factoryId);//供应商列表
|
|
|
- var planList = GetICPlan(new List<BomChildExamineDto> { sct }, input.tenantId, input.factoryId);//plan列表
|
|
|
- sct.kitting_time = CreateSRMPR(sct, input.tenantId, input.factoryId, bangid, sct.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
|
|
|
- if (item.erp_cls == 3)
|
|
|
- {
|
|
|
- //生成委外工单
|
|
|
- CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
|
|
|
- }*/
|
|
|
+ //采购申请
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ 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);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -1450,37 +1503,15 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
var childList = returnlist.Where(s => s.parent_id == item.id && s.type == 0).ToList();
|
|
|
|
|
|
- //存在替代关系
|
|
|
- if (item.haveicsubs == 1)
|
|
|
- {
|
|
|
- //提取群组关系
|
|
|
- var sublist = returnlist.Where(s => s.parent_id == item.parent_id && s.num == item.num && s.level == item.level).OrderBy(c => c.substitute_all_num).ToList();
|
|
|
- //循环计算群组,看哪个群组满足要求,然后使用此群组,将群组的库存和子物料占用掉。
|
|
|
- //计算此次群组是否有符合
|
|
|
- MaterialCalc(sublist, returnlist, sockoccupyList);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //根据占用情况计算库存
|
|
|
- Calczykc(item, parent, sockoccupyList);
|
|
|
-
|
|
|
- //如果有子集,则丢入循环,判断下库存可制等信息。
|
|
|
- calcTest2(item, childList, returnlist, sockoccupyList);
|
|
|
- /*item.kz = childList.Min(s => s.kz);
|
|
|
- if (item.kz >= item.lack_qty)
|
|
|
- {
|
|
|
- item.stock_state = 3;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- item.stock_state = 0;
|
|
|
- }*/
|
|
|
- }
|
|
|
+ //根据占用情况计算库存
|
|
|
+ Calczykc(item, parent, sockoccupyList);
|
|
|
+ //如果有子集,则丢入循环,判断下库存可制等信息。
|
|
|
+ calcTest2(item, childList, returnlist, sockoccupyList);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 递归计算物料信息
|
|
|
+ /// 递归计算物料信息--暂未使用
|
|
|
/// </summary>
|
|
|
/// <param name="sublist"></param>
|
|
|
public void MaterialCalc(List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<ic_item_stockoccupy> sockoccupyList)
|
|
|
@@ -1573,6 +1604,7 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
//判断缺料数量
|
|
|
item.lack_qty = parent.lack_qty * item.qty - item.sqty;
|
|
|
+ item.lack_qty = item.lack_qty < 0 ? 0 : item.lack_qty;
|
|
|
//判断状态
|
|
|
item.stock_state = item.lack_qty > 0 ? 0 : 1;
|
|
|
}
|
|
|
@@ -2035,14 +2067,19 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="orderType">2委外采购申请单,3采购申请单</param>
|
|
|
private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<ic_item_pur> supplierList, List<ic_plan> planList, DateTime deliveryDate)
|
|
|
{
|
|
|
+ SRMPRDto sRMPR = new SRMPRDto();
|
|
|
+ srm_pr_main srm_Pr = new srm_pr_main();
|
|
|
var leadTime = iCItemLeadTimes.Find(x => x.item_id == returnlist.item_id);
|
|
|
var supplier = supplierList.Find(x => x.icitem_id == returnlist.item_id);//默认取第一个供应商
|
|
|
var plan = planList.Find(x => x.icitem_id == returnlist.item_id);
|
|
|
if (leadTime == null || supplier == null || plan == null)
|
|
|
{
|
|
|
- throw new NotImplementedException("未找到物料ic_factory_details或ic_item_pur或ic_plan信息!");
|
|
|
+ sRMPR.srm_Pr_Main = null;
|
|
|
+ sRMPR.lastStartTmie = deliveryDate.AddDays(7 * -1);//减去提前期
|
|
|
+ return sRMPR;
|
|
|
+ //throw new NotImplementedException("未找到物料ic_factory_details或ic_item_pur或ic_plan信息!");
|
|
|
}
|
|
|
- srm_pr_main srm_Pr = new srm_pr_main();
|
|
|
+
|
|
|
srm_Pr.GenerateNewId();
|
|
|
srm_Pr.pr_billno = getOrderNum("PR");//pr单号
|
|
|
srm_Pr.pr_mono = "";//关联工单号
|
|
|
@@ -2078,7 +2115,7 @@ namespace Business.ResourceExamineManagement
|
|
|
srm_Pr.bang_id = bangId;
|
|
|
//_srm_pr_main.InsertOne(srm_Pr);
|
|
|
decimal? totalLeadTime = leadTime.transportation_leadtime + leadTime.stock_leadtime + leadTime.production_leadtime + leadTime.order_leadtime;
|
|
|
- SRMPRDto sRMPR = new SRMPRDto();
|
|
|
+
|
|
|
sRMPR.srm_Pr_Main = srm_Pr;
|
|
|
sRMPR.lastStartTmie = deliveryDate.AddDays((double)totalLeadTime * -1);//减去提前期
|
|
|
return sRMPR;
|