|
|
@@ -50,6 +50,7 @@ using Hangfire.Server;
|
|
|
using WkHtmlToPdfDotNet;
|
|
|
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
|
|
using Microsoft.AspNetCore.SignalR;
|
|
|
+using System.Diagnostics;
|
|
|
|
|
|
namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
@@ -299,9 +300,9 @@ namespace Business.ResourceExamineManagement
|
|
|
_srm_po_list = srm_po_list;
|
|
|
_crm_seorder = crm_seorder;
|
|
|
_crm_seorderentry = crm_seorderentry;
|
|
|
- _srm_po_occupy= srm_po_occupy;
|
|
|
- _ic_item_pur= ic_item_pur;
|
|
|
- _ic_plan= ic_plan;
|
|
|
+ _srm_po_occupy = srm_po_occupy;
|
|
|
+ _ic_item_pur = ic_item_pur;
|
|
|
+ _ic_plan = ic_plan;
|
|
|
_ic_substitute = ic_substitute;
|
|
|
_ic_substitute_all = ic_substitute_all;
|
|
|
_ic_substitute_all_dtl = ic_substitute_all_dtl;
|
|
|
@@ -384,6 +385,34 @@ namespace Business.ResourceExamineManagement
|
|
|
//await _ic_item_stock.DeleteAll();
|
|
|
}
|
|
|
|
|
|
+ public void GetMongoDb(ic_bom bom, List<ic_bom> bomlist, List<ic_bom_child> bomchildlist, List<ic_item> icitemlist)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (bom != null)
|
|
|
+ {
|
|
|
+ bomlist.Add(bom);
|
|
|
+ var item = _ic_item.Find(s => s.Id == bom.icitem_id).Result.FirstOrDefault();
|
|
|
+ if (item != null)
|
|
|
+ {
|
|
|
+ icitemlist.Add(item);
|
|
|
+ }
|
|
|
+ List<ic_bom_child> childList = _ic_bom_child.GetManyByCondition(p => p.bom_id == bom.Id && p.IsDeleted == false).Result.ToList();
|
|
|
+ bomchildlist.AddRange(childList);
|
|
|
+ foreach (var childd in childList)
|
|
|
+ {
|
|
|
+ List<long> itemids = childList.Select(s => s.icitem_id).ToList();
|
|
|
+ var itemlist = _ic_item.GetManyByCondition(p => itemids.Contains(p.Id) && p.IsDeleted == false).Result;
|
|
|
+ var childBom = _ic_bom.GetManyByCondition(p => p.icitem_id == childd.icitem_id).Result.FirstOrDefault();
|
|
|
+ icitemlist.AddRange(itemlist);
|
|
|
+ if (childBom != null)
|
|
|
+ {
|
|
|
+ GetMongoDb(childBom, bomlist, bomchildlist, icitemlist);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 资源检查
|
|
|
/// </summary>
|
|
|
@@ -394,33 +423,40 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
//资源检查结果
|
|
|
PschedDto rtn = new PschedDto();
|
|
|
- rtn.sorderid = input.sorderId;
|
|
|
+ rtn.sorderid = input.sorderId;
|
|
|
|
|
|
//生成当前计算bangid
|
|
|
SnowFlake snow = new SnowFlake();
|
|
|
long bangid = snow.NextId();
|
|
|
|
|
|
//获取订单数据
|
|
|
- crm_seorder sorder = _mysql_crm_seorder.GetListAsync(p=>p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.Id == input.sorderId && p.IsDeleted ==false).Result.FirstOrDefault();
|
|
|
+ crm_seorder sorder = _mysql_crm_seorder.GetListAsync(p => p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.Id == input.sorderId && p.IsDeleted == false).Result.FirstOrDefault();
|
|
|
if (sorder == null)
|
|
|
{
|
|
|
throw new NotImplementedException("订单数据不存在!");
|
|
|
}
|
|
|
//获取订单行数据
|
|
|
List<crm_seorderentry> sentrys = _mysql_crm_seorderentry.GetListAsync(p => p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.seorder_id == input.sorderId && p.IsDeleted == false).Result;
|
|
|
-
|
|
|
+
|
|
|
//数据库快照-同步mysql库数据到mongoDB中
|
|
|
- await SyncData(input.tenantId, input.factoryId, bangid);
|
|
|
+ //await SyncData(input.tenantId, input.factoryId, bangid);
|
|
|
|
|
|
//资源检查结果list
|
|
|
List<ExamineResult> examines = new List<ExamineResult>();
|
|
|
ExamineResult dtl;
|
|
|
#region
|
|
|
- var bomlist = _ic_bom.GetAll().Result;
|
|
|
- var bomchildlist = _ic_bom_child.GetAll().Result;
|
|
|
- var icitemlist = _ic_item.GetAll().Result;
|
|
|
+ List<ic_bom> bomlist = new List<ic_bom>();
|
|
|
+ List<ic_bom_child> bomchildlist = new List<ic_bom_child>();
|
|
|
+ List<ic_item> icitemlist = new List<ic_item>();
|
|
|
+
|
|
|
+ //var bomlist = _ic_bom.GetAll().Result;
|
|
|
+ //var bomchildlist = _ic_bom_child.GetAll().Result;
|
|
|
+ //var icitemlist = _ic_item.GetAll().Result;
|
|
|
foreach (var o in sentrys)
|
|
|
{
|
|
|
+ var childBom = _ic_bom.GetManyByCondition(p => p.bom_number == o.bom_number).Result.FirstOrDefault();
|
|
|
+ GetMongoDb(childBom, bomlist, bomchildlist, icitemlist);
|
|
|
+
|
|
|
//工单资源检查信息
|
|
|
dtl = new ExamineResult();
|
|
|
dtl.sentry_id = o.Id;
|
|
|
@@ -433,8 +469,8 @@ namespace Business.ResourceExamineManagement
|
|
|
BomSubstitute(getBomList, bomlist, bomchildlist, icitemlist);
|
|
|
//库存初始化
|
|
|
BomStock(getBomList, bangid, input.factoryId);
|
|
|
- //
|
|
|
- calcTest(getBomList, bangid, o.Id, o.qty.Value);
|
|
|
+ //计算
|
|
|
+ calcTest(getBomList, bangid, o.Id, o.qty.Value, input, o.plan_date);
|
|
|
|
|
|
//TODO:最晚开始时间
|
|
|
//最晚开工时间=订单行客户要求交期-采购提前期-质检提前期-入库提前期-发料提前期
|
|
|
@@ -445,6 +481,8 @@ namespace Business.ResourceExamineManagement
|
|
|
dtl.substitutes = getBomList;
|
|
|
//添加订单行开工信息
|
|
|
examines.Add(dtl);
|
|
|
+ //生成工单 TODO:0=产品数量
|
|
|
+ //GenerateMorder(o, 0);
|
|
|
}
|
|
|
#endregion
|
|
|
//订单行资源检查明细list
|
|
|
@@ -765,7 +803,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="DeliverDate">交付日期</param>
|
|
|
/// <param name="seorderentry_id">销售订单子表ID</param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task GenerateMorder(crm_seorderentry seorderentry, decimal? Quantity)
|
|
|
+ public void GenerateMorder(crm_seorderentry seorderentry, decimal? Quantity)
|
|
|
{
|
|
|
//1.库存、在制工单检查完成后 当前BOM需要自制时 产生工单。
|
|
|
|
|
|
@@ -773,7 +811,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//查询销售订单子表数据
|
|
|
//var seorderentry = await _mysql_crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
|
|
|
//获取销售订单信息
|
|
|
- var seorder = await _mysql_crm_seorder.FindAsync(x => x.Id == seorderentry.seorder_id);
|
|
|
+ var seorder = _mysql_crm_seorder.FindAsync(x => x.Id == seorderentry.seorder_id).Result;
|
|
|
//物料BOM
|
|
|
// var ic_bom = _ic_bom.GetManyByCondition(x => x.bom_number == seorderentry.bom_number && x.factory_id == seorderentry.factory_id).Result.FirstOrDefault();
|
|
|
|
|
|
@@ -836,8 +874,8 @@ namespace Business.ResourceExamineManagement
|
|
|
mes_Moentry.factory_id = seorderentry.factory_id;
|
|
|
//using (TransactionScope scope = new TransactionScope())
|
|
|
// {
|
|
|
- await _mes_morder.InsertOne(mes_Morder);
|
|
|
- await _mes_moentry.InsertOne(mes_Moentry);
|
|
|
+ _mes_morder.InsertOne(mes_Morder);
|
|
|
+ _mes_moentry.InsertOne(mes_Moentry);
|
|
|
//scope.Complete();
|
|
|
//}
|
|
|
}
|
|
|
@@ -876,13 +914,14 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="DeliverDate">交付日期</param>
|
|
|
/// <param name="seorderentry_id">销售订单子表ID</param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task<bool> CheckMorder(string bomNumber, decimal? Quantity, DateTime DeliverDate, crm_seorderentry seorderentry)
|
|
|
+ public async Task<int> CheckMorder(string bomNumber, decimal? Quantity, DateTime DeliverDate, crm_seorderentry seorderentry)
|
|
|
{
|
|
|
if (string.IsNullOrEmpty(bomNumber) || Quantity == null)
|
|
|
{
|
|
|
//TODO:入参异常;
|
|
|
throw new NotImplementedException("BOM编码或需求数量不能为空!");
|
|
|
}
|
|
|
+ var Number = 3; //1,满足,2数量满足,时间不满足,3不满足
|
|
|
//获取销售订单信息
|
|
|
//var seorder = await _crm_seorder.FindAsync(x => x.Id == OrderId);
|
|
|
//var seorderentry = await _mysql_crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
|
|
|
@@ -901,6 +940,8 @@ namespace Business.ResourceExamineManagement
|
|
|
//当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
|
|
|
var morderDataList = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) < DeliverDate &&
|
|
|
(x.morder_production_number - x.inventory_number) > Quantity).ToList();
|
|
|
+
|
|
|
+
|
|
|
if (morderDataList.Count > 0)
|
|
|
{
|
|
|
//存在此数据满足当前BOM交付找到最早日期工单,则返回无需后续继续检查。
|
|
|
@@ -908,17 +949,12 @@ namespace Business.ResourceExamineManagement
|
|
|
var mooccupies = mes_mooccupyList.Where(x => x.moo_moid == morder.Id).ToList();
|
|
|
var mes_Mooccupy = GetMooccupies(seorderentry, ic_item, morder, mooccupies);
|
|
|
await _mes_mooccupy.InsertOne(mes_Mooccupy);
|
|
|
+ Number = 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// 寻找最早日期工单 && 计算生产数量-入库数据并且大于需求产品数量后累加直到满足需求产品数量
|
|
|
var morderListData = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
|
|
|
- if (morderListData.Count == 0)
|
|
|
- {
|
|
|
- //TODO:后期处理无在制工单返回内容
|
|
|
- //throw new NotImplementedException("无可用在制工单!");
|
|
|
- return false;
|
|
|
- }
|
|
|
List<mes_mooccupy> mes_Mooccupies = new List<mes_mooccupy>();
|
|
|
decimal? number = Quantity;
|
|
|
foreach (var item in morderListData)
|
|
|
@@ -933,8 +969,22 @@ namespace Business.ResourceExamineManagement
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ var morderDatas = morderList.Where(x => x.planner_end_date.Value.AddDays(-1) > DeliverDate &&
|
|
|
+ (x.morder_production_number - x.inventory_number) > Quantity).ToList();
|
|
|
+ if (number > 0)
|
|
|
+ {
|
|
|
+ Number = 3;
|
|
|
+ }
|
|
|
+ if (morderDatas.Count > 0)
|
|
|
+ {
|
|
|
+ Number = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Number = 1;
|
|
|
+ }
|
|
|
}
|
|
|
- return true;
|
|
|
+ return Number;
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 拼接工单占用表
|
|
|
@@ -1000,13 +1050,13 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
return returnlist;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
var dto = new BomChildExamineDto();
|
|
|
dto.item_id = bom.icitem_id;
|
|
|
dto.bom_id = BomId.Value;
|
|
|
dto.level = 1;
|
|
|
- dto.id = help.NextId();
|
|
|
- dto.parent_id = help.NextId();
|
|
|
+ dto.id = Guid.NewGuid();
|
|
|
+ dto.parent_id = Guid.NewGuid();
|
|
|
dto.qty = 1;
|
|
|
dto.num = "1";
|
|
|
dto.isbom = 1;
|
|
|
@@ -1038,7 +1088,8 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
item = icitemlist.Where(a => a.Id == bom.icitem_id).FirstOrDefault();
|
|
|
}
|
|
|
- else {
|
|
|
+ else
|
|
|
+ {
|
|
|
item = icitemlist.Where(a => a.Id == dto.item_id).FirstOrDefault();
|
|
|
}
|
|
|
if (item == null)
|
|
|
@@ -1068,7 +1119,7 @@ namespace Business.ResourceExamineManagement
|
|
|
if (childBom != null)
|
|
|
{
|
|
|
var cdto = new BomChildExamineDto();
|
|
|
- cdto.id = help.NextId();
|
|
|
+ cdto.id = Guid.NewGuid();
|
|
|
cdto.level = level;
|
|
|
cdto.parent_id = dto.id;
|
|
|
cdto.bom_child_id = c.Id;
|
|
|
@@ -1081,6 +1132,8 @@ namespace Business.ResourceExamineManagement
|
|
|
cdto.substitute_code = c.substitute_code;
|
|
|
cdto.icitem_ids = c.icitem_ids;
|
|
|
cdto.type = type;
|
|
|
+ cdto.item_id = childBom.icitem_id;
|
|
|
+ cdto.bom_id = childBom.Id;
|
|
|
//递归寻找子级
|
|
|
GetBomList(bomlist, bomchildlist, icitemlist, cdto, returnlist, type);
|
|
|
}
|
|
|
@@ -1092,7 +1145,7 @@ namespace Business.ResourceExamineManagement
|
|
|
childDto.level = level++;
|
|
|
childDto.bom_id = dto.bom_id;
|
|
|
childDto.bom_child_id = c.Id;
|
|
|
- childDto.id = help.NextId();
|
|
|
+ childDto.id = Guid.NewGuid();
|
|
|
childDto.parent_id = dto.id;
|
|
|
childDto.item_id = icitem.Id;
|
|
|
childDto.item_name = icitem.name;
|
|
|
@@ -1124,12 +1177,20 @@ namespace Business.ResourceExamineManagement
|
|
|
/// </summary>
|
|
|
public void BomSubstitute(List<BomChildExamineDto> returnlist, List<ic_bom> bomlist, List<ic_bom_child> bomchildlist, List<ic_item> icitemlist)
|
|
|
{
|
|
|
- var sublist = _ic_substitute.GetManyByCondition(s => s.substitute_code.IsIn(returnlist.Select(c => c.substitute_code))).Result.ToList();
|
|
|
- var suballlist = _ic_substitute_all.GetManyByCondition(s => s.substitute_id.IsIn(sublist.Select(c => c.Id))).Result.ToList();
|
|
|
- var subdtllist = _ic_substitute_all_dtl.GetManyByCondition(s => s.substitute_allid.IsIn(suballlist.Select(c => c.Id))).Result.ToList();
|
|
|
+ List<string> codeList = returnlist.Select(c => c.substitute_code).ToList();
|
|
|
+ var sublist = _ic_substitute.GetManyByCondition(p => codeList.Contains(p.substitute_code) && p.IsDeleted == false).Result;
|
|
|
+
|
|
|
+ List<long> subidlist = sublist.Select(c => c.Id).ToList();
|
|
|
+ var suballlist = _ic_substitute_all.GetManyByCondition(p => subidlist.Contains(p.substitute_id) && p.IsDeleted == false).Result;
|
|
|
+
|
|
|
+ List<long> suballidlist = suballlist.Select(c => c.Id).ToList();
|
|
|
+ var subdtllist = _ic_substitute_all_dtl.GetManyByCondition(p => suballidlist.Contains(p.substitute_allid) && p.IsDeleted == false).Result;
|
|
|
+
|
|
|
List<long> childidList = new List<long>();
|
|
|
var help = new SnowFlake();
|
|
|
int type = 1;
|
|
|
+ List<BomChildExamineDto> addlist = new List<BomChildExamineDto>();
|
|
|
+
|
|
|
//除顶级外,其他层级关系全带出来。生成平铺
|
|
|
foreach (var item in returnlist)
|
|
|
{
|
|
|
@@ -1161,12 +1222,15 @@ namespace Business.ResourceExamineManagement
|
|
|
foreach (var sal in sall)
|
|
|
{
|
|
|
var sadl = subdtllist.Where(s => s.substitute_allid == sal.Id).ToList();
|
|
|
+ List<long> dtlItemId = sadl.Select(m => m.icitem_id).ToList();
|
|
|
+ var dtlitemlist = _ic_item.GetManyByCondition(p => dtlItemId.Contains(p.Id) && p.IsDeleted == false).Result;
|
|
|
+ icitemlist.AddRange(dtlitemlist);
|
|
|
foreach (var dtl in sadl)
|
|
|
{
|
|
|
if (dtl.ismain != 0)//替代关系里,已经将BOM料当成主料存放于替代群组里了。
|
|
|
{
|
|
|
//递归将替代关系组装出来。
|
|
|
- SubstitutePretreatment(sl, sal, dtl, item, returnlist, icitemlist, bomlist, bomchildlist, type);
|
|
|
+ SubstitutePretreatment(sl, sal, dtl, item, addlist, icitemlist, bomlist, bomchildlist, type);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -1180,6 +1244,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ returnlist.AddRange(addlist);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -1205,7 +1270,7 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
- dto.id = help.NextId();
|
|
|
+ dto.id = Guid.NewGuid();
|
|
|
dto.level = toDto.level;
|
|
|
dto.parent_id = toDto.parent_id;
|
|
|
dto.item_id = icitem.Id;
|
|
|
@@ -1219,20 +1284,20 @@ namespace Business.ResourceExamineManagement
|
|
|
dto.backflush = toDto.backflush;
|
|
|
//dto.qty = toDto.qty;
|
|
|
//dto.replace_amount = dtl.replace_amount.Value;
|
|
|
- dto.qty = dtl.replace_amount.Value;
|
|
|
+ dto.qty = dtl.replace_amount == null ? 1 : dtl.replace_amount.Value;
|
|
|
dto.is_replace = 0;
|
|
|
dto.haveicsubs = 0;
|
|
|
dto.substitute_code = "";
|
|
|
dto.icitem_ids = "";
|
|
|
- dto.substitute_strategy = sl.substitute_strategy.Value;//替代策略
|
|
|
- dto.substitute_mode = sl.substitute_mode.Value;//替代方式
|
|
|
+ dto.substitute_strategy = sl.substitute_strategy == null ? 0 : sl.substitute_strategy.Value;//替代策略
|
|
|
+ dto.substitute_mode = sl.substitute_mode == null ? 0 : sl.substitute_mode.Value;//替代方式
|
|
|
dto.type = type;
|
|
|
dto.substitute_all_num = sal.order_num;//群组优先级
|
|
|
if (bom != null)
|
|
|
{
|
|
|
dto.bom_id = bom.Id;
|
|
|
|
|
|
- dto.qty = dtl.replace_amount.Value;
|
|
|
+ dto.qty = dtl.replace_amount == null ? 1 : dtl.replace_amount.Value;
|
|
|
dto.isbom = 1;
|
|
|
dto.is_replace = 0;
|
|
|
dto.haveicsubs = 0;
|
|
|
@@ -1279,7 +1344,8 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
|
|
|
//计算库存
|
|
|
- public void calcTest(List<BomChildExamineDto> returnlist, long bangid, long orderid,decimal count)
|
|
|
+ public void calcTest(List<BomChildExamineDto> returnlist, long bangid, long orderid, decimal count, SeorderentryDto input, DateTime
|
|
|
+ ? plan_date)
|
|
|
{
|
|
|
//占用情况
|
|
|
List<ic_item_stockoccupy> sklist = new List<ic_item_stockoccupy>();
|
|
|
@@ -1294,18 +1360,13 @@ namespace Business.ResourceExamineManagement
|
|
|
List<long> calcIds = new List<long>();
|
|
|
//先处理下最顶级的产品需要数量
|
|
|
returnlist[0].needCount = returnlist[0].qty * count;
|
|
|
- //returnlist[0].satisfyNum = returnlist[0].sqty;
|
|
|
returnlist[0].lack_qty = returnlist[0].needCount - returnlist[0].sqty;
|
|
|
- /*if (returnlist[0].lack_qty < 0)
|
|
|
+ if (returnlist[0].lack_qty > 0)
|
|
|
{
|
|
|
- //库存满足
|
|
|
- returnlist[0].stock_state = 1;
|
|
|
- returnlist[0].lack_qty = 0;
|
|
|
+ var seorderentry = _mysql_crm_seorderentry.FindAsync(x => x.Id == orderid).Result;
|
|
|
+ //生成自制工单
|
|
|
+ GenerateMorder(seorderentry, returnlist[0].lack_qty);
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- returnlist[0].stock_state = 0;
|
|
|
- }*/
|
|
|
foreach (var item in returnlist)
|
|
|
{
|
|
|
if (item.level == 1)
|
|
|
@@ -1328,11 +1389,32 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
//如果有替代关系,根据群组来明确使用哪个群组的替代料。按整批和混用逻辑来算
|
|
|
// 如果有群组替代,就移除掉被检查过的记录 item.icitem_ids
|
|
|
- CalcStrategy(item, returnlist, bangid, sklist);
|
|
|
+ CalcStrategy(item, returnlist, bangid, sklist, input, plan_date);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- //直接占用库存,缺料就生成采购
|
|
|
+ if (item.erp_cls == 1)
|
|
|
+ {
|
|
|
+ //走自制
|
|
|
+ }
|
|
|
+ else if (item.erp_cls == 2 || item.erp_cls == 3)
|
|
|
+ {
|
|
|
+ //直接占用库存,缺料就生成采购
|
|
|
+ ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
|
|
|
+ itemStockoccupyDto.bang_id = bangid;
|
|
|
+ itemStockoccupyDto.icitem_id = item.item_id;
|
|
|
+ itemStockoccupyDto.quantity = item.sqty;
|
|
|
+ sklist.Add(itemStockoccupyDto);
|
|
|
+ var leadTimeList = GetLeadTime(new List<BomChildExamineDto> { item }, input.tenantId, input.factoryId);//提前期列表
|
|
|
+ var supplierList = GetSupplier(new List<BomChildExamineDto> { item }, input.tenantId, input.factoryId);//供应商列表
|
|
|
+ var planList = GetICPlan(new List<BomChildExamineDto> { item }, input.tenantId, input.factoryId);//plan列表
|
|
|
+ item.kitting_time = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.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);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -1372,7 +1454,8 @@ namespace Business.ResourceExamineManagement
|
|
|
item.stock_state = item.lack_qty > 0 ? 0 : 1;
|
|
|
}
|
|
|
|
|
|
- public void CalcStrategy(BomChildExamineDto item, List<BomChildExamineDto> returnlist, long bangid, List<ic_item_stockoccupy> sklist)
|
|
|
+ public void CalcStrategy(BomChildExamineDto item, List<BomChildExamineDto> returnlist, long bangid, List<ic_item_stockoccupy> sklist, SeorderentryDto input, DateTime
|
|
|
+ ? plan_date)
|
|
|
{
|
|
|
//提取群组关系
|
|
|
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();
|
|
|
@@ -1383,22 +1466,22 @@ namespace Business.ResourceExamineManagement
|
|
|
case 0://整批
|
|
|
WholeBatchCheck(sublist, returnlist, sklist, select);
|
|
|
//如果都需要采购的情况下,则默认使用优先级最高的
|
|
|
- WholeBatch(item,sublist, returnlist, sklist, select, bangid, parent);
|
|
|
+ WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date);
|
|
|
break;
|
|
|
case 1://混用
|
|
|
- MixedUse(item,sublist, returnlist, sklist, bangid, parent);
|
|
|
+ MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date);
|
|
|
break;
|
|
|
case 2://整批加混用
|
|
|
WholeBatchCheck(sublist, returnlist, sklist, select);
|
|
|
if (select.Count() == 0)
|
|
|
{
|
|
|
//走混用
|
|
|
- MixedUse(item,sublist, returnlist, sklist, bangid, parent);
|
|
|
+ MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//走整批
|
|
|
- WholeBatch(item,sublist, returnlist, sklist, select, bangid, parent);
|
|
|
+ WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -1432,7 +1515,9 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
}
|
|
|
//整批占用
|
|
|
- public void WholeBatch(BomChildExamineDto item, List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<ic_item_stockoccupy> sklist, List<BomChildExamineDto> select, long bangid, BomChildExamineDto parent) {
|
|
|
+ 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)
|
|
|
+ {
|
|
|
if (select.Count() == 0)
|
|
|
{
|
|
|
//如果为空,则默认使用优先级为0的集合作为替代关系
|
|
|
@@ -1441,7 +1526,8 @@ namespace Business.ResourceExamineManagement
|
|
|
//替代
|
|
|
select = sublist.Where(s => s.type == 0).ToList();
|
|
|
}
|
|
|
- else {
|
|
|
+ else
|
|
|
+ {
|
|
|
//取代
|
|
|
select = sublist.Where(s => s.substitute_all_num == 0).ToList();
|
|
|
}
|
|
|
@@ -1455,27 +1541,31 @@ namespace Business.ResourceExamineManagement
|
|
|
itemStockoccupyDto.icitem_id = slt.item_id;
|
|
|
if (slt.lack_qty > 0)
|
|
|
{
|
|
|
+
|
|
|
itemStockoccupyDto.quantity = slt.sqty;
|
|
|
//库存不够的时候,根据属性生成采购和委外。
|
|
|
- var lack_qty = slt.lack_qty - itemStockoccupyDto.quantity;
|
|
|
if (slt.erp_cls == 1)
|
|
|
{
|
|
|
- slt.make_qty = lack_qty;
|
|
|
+ slt.make_qty = slt.lack_qty;
|
|
|
/*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.Subcontracting_qty = lack_qty;
|
|
|
- }
|
|
|
- else if (slt.erp_cls == 3)
|
|
|
- {
|
|
|
- //生成采购订单
|
|
|
- slt.purchase_qty = lack_qty;
|
|
|
+ else if (slt.erp_cls == 2 || slt.erp_cls == 3)
|
|
|
+ { //生成采购订单
|
|
|
+ //slt.purchase_qty = slt.lack_qty;
|
|
|
+ var leadTimeList = GetLeadTime(new List<BomChildExamineDto> { slt }, 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
|
|
|
@@ -1492,7 +1582,9 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
|
|
|
//混用占用数据
|
|
|
- public void MixedUse(BomChildExamineDto item, List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<ic_item_stockoccupy> sklist, long bangid, BomChildExamineDto parent) {
|
|
|
+ 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)
|
|
|
+ {
|
|
|
|
|
|
decimal parent_lack = 0;
|
|
|
if (parent != null)
|
|
|
@@ -1554,7 +1646,8 @@ namespace Business.ResourceExamineManagement
|
|
|
//替代
|
|
|
select = sublist.Where(s => s.type == 0).ToList();
|
|
|
}
|
|
|
- else {
|
|
|
+ else
|
|
|
+ {
|
|
|
//取代
|
|
|
select = sublist.Where(s => s.substitute_all_num == 0).ToList();
|
|
|
}
|
|
|
@@ -1569,15 +1662,17 @@ namespace Business.ResourceExamineManagement
|
|
|
//自制
|
|
|
//GenerateMorder()
|
|
|
}
|
|
|
- else if (sct.erp_cls == 2)
|
|
|
- {
|
|
|
- //委外
|
|
|
- //CreateMesOOder(returnlist,)
|
|
|
- }
|
|
|
- else if (sct.erp_cls == 3)
|
|
|
+ else if (sct.erp_cls == 2 || sct.erp_cls == 3)
|
|
|
{
|
|
|
- //外购
|
|
|
- //CreateSRMPR(returnlist,)
|
|
|
+ var leadTimeList = GetLeadTime(new List<BomChildExamineDto> { sct }, 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);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -2084,7 +2179,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// </summary>
|
|
|
/// <param name="returnlist"></param>
|
|
|
/// <param name="factoryid"></param>
|
|
|
- /// <param name="orderType">1委外采购申请单,2采购申请单</param>
|
|
|
+ /// <param name="orderType">2委外采购申请单,3采购申请单</param>
|
|
|
private DateTime 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)
|
|
|
{
|
|
|
var leadTime = iCItemLeadTimes.Find(x => x.item_id == returnlist.item_id);
|