|
@@ -231,6 +231,11 @@ namespace Business.ResourceExamineManagement
|
|
|
/// 生产工单子表
|
|
/// 生产工单子表
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
private readonly IRepository<mes_moentry, long> _mysql_mes_moentry;
|
|
private readonly IRepository<mes_moentry, long> _mysql_mes_moentry;
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 资源检查入参
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ private readonly SeorderentryDto param = new SeorderentryDto();
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
#region 构造函数
|
|
#region 构造函数
|
|
@@ -337,87 +342,6 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
}
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
- /// <summary>
|
|
|
|
|
- /// mongoDB示例方法,后期删除
|
|
|
|
|
- /// </summary>
|
|
|
|
|
- /// <returns></returns>
|
|
|
|
|
- public async Task test()
|
|
|
|
|
- {
|
|
|
|
|
- ////多条插入
|
|
|
|
|
- //List<mes_technique> infos = new List<mes_technique>();
|
|
|
|
|
- //mes_technique info;
|
|
|
|
|
- //for (int i = 0; i < 3; i++)
|
|
|
|
|
- //{
|
|
|
|
|
- // info = new mes_technique();
|
|
|
|
|
- // info.GenerateNewId();
|
|
|
|
|
- // info.tech_name = "多条" + i;
|
|
|
|
|
- // info.level = i;
|
|
|
|
|
- // infos.Add(info);
|
|
|
|
|
- //}
|
|
|
|
|
- //await _mes_technique.InsertMany(infos);
|
|
|
|
|
-
|
|
|
|
|
- //var info2 = _mes_technique.GetAll().Result;
|
|
|
|
|
- //var a = new PschedDto();
|
|
|
|
|
- //a.count = info2.Count;
|
|
|
|
|
-
|
|
|
|
|
- ////获取数据
|
|
|
|
|
- //var info1 = await _mes_technique.GetOneByID((long)1732029975067480064);
|
|
|
|
|
-
|
|
|
|
|
- ////更新数据
|
|
|
|
|
- //info1.tech_name = "更新***";
|
|
|
|
|
- //var rlt = await _mes_technique.UpdateOne(info1, info1.Id);
|
|
|
|
|
-
|
|
|
|
|
- ////根据条件查询数据
|
|
|
|
|
- //Expression<Func<mes_technique, bool>> filter = x => x.Id == (long)1732376973889097728 && x.tech_name == "多条0";
|
|
|
|
|
- //var info3 = await _mes_technique.GetManyByCondition(filter);
|
|
|
|
|
-
|
|
|
|
|
- ////删除数据
|
|
|
|
|
- ////根据id删除数据
|
|
|
|
|
- ////await _ic_item_stock.DeleteByIds(136123);
|
|
|
|
|
-
|
|
|
|
|
- ////根据id删除表数据
|
|
|
|
|
- //List<long> aa = new List<long>();
|
|
|
|
|
- //aa.Add(136131);
|
|
|
|
|
- //aa.Add(136132);
|
|
|
|
|
- //aa.Add(136133);
|
|
|
|
|
- //FilterDefinition<ic_item_stock> filter = Builders<ic_item_stock>.Filter.In(s => s.icitem_id, aa);
|
|
|
|
|
- //await _ic_item_stock.Delete(filter);
|
|
|
|
|
-
|
|
|
|
|
- //根据条件删除数据
|
|
|
|
|
- //await _ic_item_stock.Delete(p=>p.icitem_name == "test");
|
|
|
|
|
-
|
|
|
|
|
- //await _ic_item_stock.DeleteByIds(aa);
|
|
|
|
|
- //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>
|
|
|
/// 资源检查
|
|
/// 资源检查
|
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -426,62 +350,76 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
|
public async Task<string> ReceiveResult(SeorderentryDto input)
|
|
public async Task<string> ReceiveResult(SeorderentryDto input)
|
|
|
{
|
|
{
|
|
|
|
|
+ //资源检查入参全局变量赋值
|
|
|
|
|
+ param.sorderId = input.sorderId;
|
|
|
|
|
+ param.tenantId = input.tenantId;
|
|
|
|
|
+ param.factoryId = input.factoryId;
|
|
|
|
|
+
|
|
|
//资源检查结果
|
|
//资源检查结果
|
|
|
PschedDto rtn = new PschedDto();
|
|
PschedDto rtn = new PschedDto();
|
|
|
rtn.sorderid = input.sorderId;
|
|
rtn.sorderid = input.sorderId;
|
|
|
|
|
+ //资源检查明细list
|
|
|
|
|
+ List<ExamineResult> examines = new List<ExamineResult>();
|
|
|
|
|
+ ExamineResult dtl;
|
|
|
|
|
|
|
|
//生成当前计算bangid
|
|
//生成当前计算bangid
|
|
|
SnowFlake snow = new SnowFlake();
|
|
SnowFlake snow = new SnowFlake();
|
|
|
long bangid = snow.NextId();
|
|
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).Result.FirstOrDefault();
|
|
|
if (sorder == null)
|
|
if (sorder == null)
|
|
|
{
|
|
{
|
|
|
throw new NotImplementedException("订单数据不存在!");
|
|
throw new NotImplementedException("订单数据不存在!");
|
|
|
}
|
|
}
|
|
|
//获取订单行数据
|
|
//获取订单行数据
|
|
|
- List<crm_seorderentry> sentrys =await _mysql_crm_seorderentry.GetListAsync(p => p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.seorder_id == input.sorderId && p.IsDeleted == false);
|
|
|
|
|
|
|
+ List<crm_seorderentry> sentrys =await _mysql_crm_seorderentry.GetListAsync(p => p.tenant_id == input.tenantId && p.factory_id == input.factoryId && p.seorder_id == input.sorderId && !p.IsDeleted);
|
|
|
|
|
|
|
|
//数据库快照-同步mysql库数据到mongoDB中
|
|
//数据库快照-同步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;
|
|
|
|
|
|
|
+ //通过订单行获取物料BOM数据
|
|
|
|
|
+ //FilterDefinition<ic_bom> filter = Builders<ic_bom>.Filter.In(s => s.bom_number, sentrys.Select(m => m.bom_number).ToList());
|
|
|
|
|
+ //List<ic_bom> boms = _ic_bom.GetManyByIds(filter).Result.Where(p => p.factory_id == input.factoryId && p.tenant_id == input.tenantId && !p.IsDeleted).ToList();
|
|
|
|
|
+ List<ic_bom> boms = _ic_bom.Find(p=>sentrys.Select(m=>m.bom_number).Contains(p.bom_number) && p.factory_id == input.factoryId && p.tenant_id == input.tenantId && !p.IsDeleted).Result.ToList();
|
|
|
|
|
+ //通过物料id获取产品提前期
|
|
|
|
|
+ List<ICItemLeadTimeDto> leadTimes = GetLeadTime(boms.Select(p => p.icitem_id).ToList(), input.tenantId, input.factoryId);
|
|
|
|
|
|
|
|
|
|
+ //物料bom
|
|
|
List<ic_bom> bomlist = new List<ic_bom>();
|
|
List<ic_bom> bomlist = new List<ic_bom>();
|
|
|
|
|
+ //物料bom明细
|
|
|
List<ic_bom_child> bomchildlist = new List<ic_bom_child>();
|
|
List<ic_bom_child> bomchildlist = new List<ic_bom_child>();
|
|
|
- List<ic_item> icitemlist = new List<ic_item>();
|
|
|
|
|
|
|
+ //获取物料bom,物料bom明细
|
|
|
|
|
+ GetIcBomData(boms, bomlist, bomchildlist);
|
|
|
|
|
+
|
|
|
|
|
+ //获取物料数据
|
|
|
|
|
+ List<long> itemIds = bomlist.Select(p => p.icitem_id).ToList();
|
|
|
|
|
+ itemIds.AddRange(bomchildlist.Select(p => p.icitem_id).ToList());
|
|
|
|
|
+ List<ic_item> icitemlist = _ic_item.GetManyByCondition(p => itemIds.Contains(p.Id) && !p.IsDeleted).Result;
|
|
|
|
|
|
|
|
- //通过订单行获取物料BOM数据
|
|
|
|
|
- FilterDefinition<ic_bom> filter = Builders<ic_bom>.Filter.In(s => s.bom_number, sentrys.Select(m => m.bom_number).ToList());
|
|
|
|
|
- List<ic_bom> boms = _ic_bom.GetManyByIds(filter).Result.Where(p=>p.factory_id == input.factoryId && p.tenant_id == input.tenantId && !p.IsDeleted).ToList();
|
|
|
|
|
- //计算产品提前期
|
|
|
|
|
- List<ICItemLeadTimeDto> leadTimes = GetLeadTime(boms.Select(p=>p.icitem_id).ToList(), input.tenantId, input.factoryId);
|
|
|
|
|
- foreach (var o in sentrys)
|
|
|
|
|
|
|
+ foreach (var item in sentrys)
|
|
|
{
|
|
{
|
|
|
- var childBom = boms.Where(p => p.bom_number == o.bom_number).FirstOrDefault();
|
|
|
|
|
- GetMongoDb(childBom, bomlist, bomchildlist, icitemlist);
|
|
|
|
|
-
|
|
|
|
|
//工单资源检查信息
|
|
//工单资源检查信息
|
|
|
dtl = new ExamineResult();
|
|
dtl = new ExamineResult();
|
|
|
- dtl.sentry_id = o.Id;
|
|
|
|
|
|
|
+ dtl.sentry_id = item.Id;
|
|
|
//TODO:最早开始时间默认3天后(后期调整)
|
|
//TODO:最早开始时间默认3天后(后期调整)
|
|
|
dtl.earliest_times = DateTime.Now.Date.AddDays(3);
|
|
dtl.earliest_times = DateTime.Now.Date.AddDays(3);
|
|
|
|
|
|
|
|
|
|
+ //获取当前物料bom数据
|
|
|
|
|
+ var childBom = boms.Where(p => p.bom_number == item.bom_number).FirstOrDefault();
|
|
|
//bom层级组装
|
|
//bom层级组装
|
|
|
- var getBomList = BomPretreatment(o.Id, childBom.Id, o.qty.GetInt(), bomlist, bomchildlist, icitemlist);
|
|
|
|
|
|
|
+ var getBomList = BomPretreatment(item.Id, childBom.Id, item.qty.GetInt(), bomlist, bomchildlist, icitemlist);
|
|
|
//bom替代关系组装
|
|
//bom替代关系组装
|
|
|
BomSubstitute(getBomList, bomlist, bomchildlist, icitemlist);
|
|
BomSubstitute(getBomList, bomlist, bomchildlist, icitemlist);
|
|
|
//库存初始化
|
|
//库存初始化
|
|
|
BomStock(getBomList, bangid, input.factoryId);
|
|
BomStock(getBomList, bangid, input.factoryId);
|
|
|
//计算
|
|
//计算
|
|
|
- calcTest(getBomList, bangid, o.Id, o.qty.Value, input, o.plan_date);
|
|
|
|
|
|
|
+ calcTest(getBomList, bangid, item.Id, item.qty.Value, input, item.plan_date);
|
|
|
|
|
+
|
|
|
//TODO:最晚开始时间
|
|
//TODO:最晚开始时间
|
|
|
- var curFacDtl = leadTimes.FirstOrDefault(p=>p.item_id == childBom.icitem_id);
|
|
|
|
|
|
|
+ var curFacDtl = leadTimes.FirstOrDefault(p => p.item_id == childBom.icitem_id);
|
|
|
//最晚开工时间=订单行客户要求交期-运输提前期-库存提前期-生产提前期-下单提前期
|
|
//最晚开工时间=订单行客户要求交期-运输提前期-库存提前期-生产提前期-下单提前期
|
|
|
- dtl.latest_times = o.plan_date.GetValueOrDefault().AddDays(-Convert.ToDouble(curFacDtl?.transportation_leadtime.GetValueOrDefault() + curFacDtl?.stock_leadtime.GetValueOrDefault() + curFacDtl?.production_leadtime.GetValueOrDefault() + curFacDtl?.order_leadtime.GetValueOrDefault()));
|
|
|
|
|
|
|
+ dtl.latest_times = item.plan_date.GetValueOrDefault().AddDays(-Convert.ToDouble(curFacDtl?.transportation_leadtime.GetValueOrDefault() + curFacDtl?.stock_leadtime.GetValueOrDefault() + curFacDtl?.production_leadtime.GetValueOrDefault() + curFacDtl?.order_leadtime.GetValueOrDefault()));
|
|
|
//物料齐套时间
|
|
//物料齐套时间
|
|
|
dtl.kitting_times = getBomList.Where(p => p.is_use).OrderByDescending(m => m.kitting_time).First().kitting_time.GetValueOrDefault();
|
|
dtl.kitting_times = getBomList.Where(p => p.is_use).OrderByDescending(m => m.kitting_time).First().kitting_time.GetValueOrDefault();
|
|
|
//替代关系展开list
|
|
//替代关系展开list
|
|
@@ -495,82 +433,36 @@ namespace Business.ResourceExamineManagement
|
|
|
rtn.examines = examines;
|
|
rtn.examines = examines;
|
|
|
return JsonConvert.SerializeObject(rtn);
|
|
return JsonConvert.SerializeObject(rtn);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
- /// 测试使用新增销售订单数据
|
|
|
|
|
|
|
+ /// 递归:获取icbom,icbomchild数据
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
- /// <param name="tenantId"></param>
|
|
|
|
|
- /// <param name="factoryId"></param>
|
|
|
|
|
- /// <returns></returns>
|
|
|
|
|
- public long Save(long tenantId, long factoryId)
|
|
|
|
|
|
|
+ /// <param name="icBoms"></param>
|
|
|
|
|
+ /// <param name="bomlist"></param>
|
|
|
|
|
+ /// <param name="bomchildlist"></param>
|
|
|
|
|
+ public void GetIcBomData(List<ic_bom> icBoms, List<ic_bom> bomlist, List<ic_bom_child> bomchildlist)
|
|
|
{
|
|
{
|
|
|
- //销售订单
|
|
|
|
|
- crm_seorder crm_Seorder = new crm_seorder()
|
|
|
|
|
- {
|
|
|
|
|
- IsDeleted = false,
|
|
|
|
|
- bill_no = "SO201900000020",
|
|
|
|
|
- order_type = 1,
|
|
|
|
|
- trade_type = 1,
|
|
|
|
|
- sale_style = 1,
|
|
|
|
|
- custom_id = 1001,
|
|
|
|
|
- custom_name = "温州正泰电器科技有限公司",
|
|
|
|
|
- custom_no = "01.0098",
|
|
|
|
|
- date = DateTime.Now.Date,
|
|
|
|
|
- currency = 1,
|
|
|
|
|
- exchange_rate = 1,
|
|
|
|
|
- biller = "张晓延",
|
|
|
|
|
- emp_no = "8604",
|
|
|
|
|
- emp_name = "王劲松",
|
|
|
|
|
- auditor = "邹晓燕",
|
|
|
|
|
- audit_date = DateTime.Now.Date,
|
|
|
|
|
- status = 1,
|
|
|
|
|
- closed = true,
|
|
|
|
|
- op_time = DateTime.Now.Date,
|
|
|
|
|
- tenant_id = tenantId,
|
|
|
|
|
- factory_id = factoryId,
|
|
|
|
|
- org_id = tenantId
|
|
|
|
|
- };
|
|
|
|
|
- crm_Seorder.GenerateNewId();
|
|
|
|
|
- crm_seorderentry crm_Seorderentry = new crm_seorderentry()
|
|
|
|
|
- {
|
|
|
|
|
- IsDeleted = false,
|
|
|
|
|
- seorder_id = crm_Seorder.Id,
|
|
|
|
|
- bill_no = "SO201900000020",
|
|
|
|
|
- entry_seq = 1,
|
|
|
|
|
- map_name = "自动转换开关电器",
|
|
|
|
|
- map_number = "L6.733036.5",
|
|
|
|
|
- item_number = "9.1.03.01.0541",
|
|
|
|
|
- item_name = "自动转换开关电器",
|
|
|
|
|
- fms_number = "988123",
|
|
|
|
|
- specification = "FDQ3-RMQ6-63/4JC1R_基本型",
|
|
|
|
|
- bom_number = "BOM00042070",
|
|
|
|
|
- unit = "台",
|
|
|
|
|
- qty = 1000,
|
|
|
|
|
- price = 100,
|
|
|
|
|
- tax_price = 0,
|
|
|
|
|
- amount = 0,
|
|
|
|
|
- tax_rate = 13,
|
|
|
|
|
- discount_amount = 0,
|
|
|
|
|
- discount_rate = 0,
|
|
|
|
|
- aux_price_discount = 70,
|
|
|
|
|
- total_amount = 0,
|
|
|
|
|
- plan_date = DateTime.Parse("2023-04-29 00:00:00"),
|
|
|
|
|
- planner_name = "钱萍萍",
|
|
|
|
|
- planner_no = "9022",
|
|
|
|
|
- state = true,
|
|
|
|
|
- rstate = 0,
|
|
|
|
|
- is_checked = true,
|
|
|
|
|
- deliver_count = 0,
|
|
|
|
|
- deliver_notice_count = 0,
|
|
|
|
|
- tenant_id = tenantId,
|
|
|
|
|
- factory_id = factoryId,
|
|
|
|
|
- org_id = tenantId,
|
|
|
|
|
- };
|
|
|
|
|
- crm_Seorderentry.GenerateNewId();
|
|
|
|
|
-
|
|
|
|
|
- _mysql_crm_seorder.InsertAsync(crm_Seorder);
|
|
|
|
|
- _mysql_crm_seorderentry.InsertAsync(crm_Seorderentry);
|
|
|
|
|
-
|
|
|
|
|
- return crm_Seorderentry.Id;
|
|
|
|
|
|
|
+ if (icBoms.Count() == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ //添加物料bom数据
|
|
|
|
|
+ bomlist.AddRange(icBoms);
|
|
|
|
|
+ //获取物料bom明细数据
|
|
|
|
|
+ List<ic_bom_child> childList = _ic_bom_child.GetManyByCondition(p => icBoms.Select(m=>m.Id).Contains(p.bom_id) && p.use_status == 1 && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted).Result.ToList();
|
|
|
|
|
+ //没有明细数据,终止
|
|
|
|
|
+ if (childList.Count == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ bomchildlist.AddRange(childList);
|
|
|
|
|
+ //通过物料bom明细数据反查物料bom数据
|
|
|
|
|
+ var boms = _ic_bom.GetManyByCondition(p => childList.Select(m=>m.icitem_id).ToList().Contains(p.icitem_id) && p.fse_status == 1 && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted).Result.ToList();
|
|
|
|
|
+ foreach (var chd in childList)
|
|
|
|
|
+ {
|
|
|
|
|
+ var curBoms = boms.Where(p => p.icitem_id == chd.icitem_id).ToList();
|
|
|
|
|
+ GetIcBomData(curBoms, bomlist, bomchildlist);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
@@ -690,14 +582,14 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
}
|
|
|
#region 1、数据准备
|
|
#region 1、数据准备
|
|
|
//1.1、获取工艺路径数据
|
|
//1.1、获取工艺路径数据
|
|
|
- mes_technique tech = _mes_technique.Find(p => p.bom == bom_number && p.IsDeleted == false).Result.FirstOrDefault();
|
|
|
|
|
|
|
+ mes_technique tech = _mes_technique.Find(p => p.bom == bom_number && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted).Result.FirstOrDefault();
|
|
|
if (tech == null)
|
|
if (tech == null)
|
|
|
{
|
|
{
|
|
|
throw new NotImplementedException("请先配置工艺路径!");
|
|
throw new NotImplementedException("请先配置工艺路径!");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//1.2、获取工艺路径关联工序数据
|
|
//1.2、获取工艺路径关联工序数据
|
|
|
- List<mes_tech_process> tech_Processes = await _mes_tech_process.GetManyByCondition(p => p.tech_id == tech.Id && p.IsDeleted == false);
|
|
|
|
|
|
|
+ List<mes_tech_process> tech_Processes = await _mes_tech_process.GetManyByCondition(p => p.tech_id == tech.Id && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted);
|
|
|
if (tech_Processes.Count == 0)
|
|
if (tech_Processes.Count == 0)
|
|
|
{
|
|
{
|
|
|
throw new NotImplementedException("请先配置工序!");
|
|
throw new NotImplementedException("请先配置工序!");
|
|
@@ -707,11 +599,11 @@ namespace Business.ResourceExamineManagement
|
|
|
//FilterDefinition<mes_process> filter = Builders<mes_process>.Filter.In(s => s.Id, tech_Processes.Select(m => m.proc_id).ToList());
|
|
//FilterDefinition<mes_process> filter = Builders<mes_process>.Filter.In(s => s.Id, tech_Processes.Select(m => m.proc_id).ToList());
|
|
|
//List<mes_process> process = await _mes_process.GetManyByIds(filter);
|
|
//List<mes_process> process = await _mes_process.GetManyByIds(filter);
|
|
|
List<long> procIds = tech_Processes.Select(m => m.proc_id.Value).ToList();
|
|
List<long> procIds = tech_Processes.Select(m => m.proc_id.Value).ToList();
|
|
|
- List<mes_process> process = await _mes_process.GetManyByCondition(p => procIds.Contains(p.Id) && p.IsDeleted == false);
|
|
|
|
|
|
|
+ List<mes_process> process = await _mes_process.GetManyByCondition(p => procIds.Contains(p.Id) && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted);
|
|
|
|
|
|
|
|
//1.3、获取工艺工序关联工位信息
|
|
//1.3、获取工艺工序关联工位信息
|
|
|
List<long> techProcIds = tech_Processes.Select(m => m.Id).ToList();
|
|
List<long> techProcIds = tech_Processes.Select(m => m.Id).ToList();
|
|
|
- List<mes_tech_proc_workshop> tech_Proc_Workshops = await _mes_tech_proc_workshop.GetManyByCondition(p => techProcIds.Contains(p.tech_proc_id.Value) && p.IsDeleted == false);
|
|
|
|
|
|
|
+ List<mes_tech_proc_workshop> tech_Proc_Workshops = await _mes_tech_proc_workshop.GetManyByCondition(p => techProcIds.Contains(p.tech_proc_id.Value) && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted);
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
#region 计算产能,得到耗时
|
|
#region 计算产能,得到耗时
|
|
@@ -801,54 +693,56 @@ namespace Business.ResourceExamineManagement
|
|
|
return takeTime;
|
|
return takeTime;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 生成工单
|
|
/// 生成工单
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
- /// <param name="BomNumber">Bom编码</param>
|
|
|
|
|
- /// <param name="Quantity">需要数量</param>
|
|
|
|
|
- /// <param name="DeliverDate">交付日期</param>
|
|
|
|
|
- /// <param name="seorderentry_id">销售订单子表ID</param>
|
|
|
|
|
- /// <returns></returns>
|
|
|
|
|
- public void GenerateMorder(crm_seorderentry seorderentry, decimal? Quantity)
|
|
|
|
|
|
|
+ /// <param name="seorderentry">销售订单子表</param>
|
|
|
|
|
+ /// <param name="BomNumber">Bom编号</param>
|
|
|
|
|
+ /// <param name="number">物料编码</param>
|
|
|
|
|
+ /// <param name="Quantity"></param>
|
|
|
|
|
+ /// <param name="ParentId"></param>
|
|
|
|
|
+ public void GenerateMorder(crm_seorderentry seorderentry, string BomNumber, string number, decimal? Quantity, long? ParentId)
|
|
|
{
|
|
{
|
|
|
//1.库存、在制工单检查完成后 当前BOM需要自制时 产生工单。
|
|
//1.库存、在制工单检查完成后 当前BOM需要自制时 产生工单。
|
|
|
|
|
|
|
|
//2.每一个销售订单行对应一个工单。
|
|
//2.每一个销售订单行对应一个工单。
|
|
|
- //查询销售订单子表数据
|
|
|
|
|
- //var seorderentry = await _mysql_crm_seorderentry.FindAsync(x => x.Id == seorderentry_id);
|
|
|
|
|
|
|
+ //TODO:考虑性能问题 循环调用,后期改造传递数组,批量处理数据后,批量保存。
|
|
|
//获取销售订单信息
|
|
//获取销售订单信息
|
|
|
var seorder = _mysql_crm_seorder.FindAsync(x => x.Id == seorderentry.seorder_id).Result;
|
|
var seorder = _mysql_crm_seorder.FindAsync(x => x.Id == seorderentry.seorder_id).Result;
|
|
|
//物料BOM
|
|
//物料BOM
|
|
|
- // var ic_bom = _ic_bom.GetManyByCondition(x => x.bom_number == seorderentry.bom_number && x.factory_id == seorderentry.factory_id).Result.FirstOrDefault();
|
|
|
|
|
-
|
|
|
|
|
- var ic_bom = _ic_bom.GetManyByCondition(x => x.bom_number == seorderentry.bom_number).Result.FirstOrDefault();
|
|
|
|
|
-
|
|
|
|
|
- var Number = seorderentry.qty - Quantity;
|
|
|
|
|
|
|
+ //var ic_bom = _ic_bom.GetManyByCondition(x => x.bom_number == BomNumber && x.factory_id == seorderentry.factory_id).Result.FirstOrDefault();
|
|
|
|
|
+ //物料详情
|
|
|
|
|
+ var ic_item = _ic_item.GetManyByCondition(x => x.number == number && x.factory_id == seorderentry.factory_id).Result.FirstOrDefault();
|
|
|
|
|
|
|
|
mes_morder mes_Morder = new mes_morder();
|
|
mes_morder mes_Morder = new mes_morder();
|
|
|
mes_Morder.GenerateNewId();
|
|
mes_Morder.GenerateNewId();
|
|
|
mes_Morder.morder_type = "销售工单";
|
|
mes_Morder.morder_type = "销售工单";
|
|
|
|
|
+ mes_Morder.parent_id = ParentId;
|
|
|
//mes_Morder.morder_icitem_type
|
|
//mes_Morder.morder_icitem_type
|
|
|
mes_Morder.work_order_type = "常规工单";
|
|
mes_Morder.work_order_type = "常规工单";
|
|
|
mes_Morder.morder_state = "初始";
|
|
mes_Morder.morder_state = "初始";
|
|
|
mes_Morder.morder_no = string.Format("VMO{0}", DateTime.Now.ToString("yyyyMMddhhmmss"));//测试编码
|
|
mes_Morder.morder_no = string.Format("VMO{0}", DateTime.Now.ToString("yyyyMMddhhmmss"));//测试编码
|
|
|
- mes_Morder.fms_number = seorderentry.fms_number;
|
|
|
|
|
- mes_Morder.bom_number = seorderentry.bom_number;
|
|
|
|
|
- mes_Morder.fmodel = seorderentry.specification;
|
|
|
|
|
|
|
+ mes_Morder.fms_number = ic_item.fms_number;
|
|
|
|
|
+ mes_Morder.bom_number = BomNumber;
|
|
|
|
|
+ mes_Morder.fmodel = ic_item.model;
|
|
|
//最早的开工时间3天后、 最晚时间为订单承诺时间-采购提前期-质检提前期-入库提前期-发料提前期 =最晚开工时间 最早或最晚为系统建议开工日期
|
|
//最早的开工时间3天后、 最晚时间为订单承诺时间-采购提前期-质检提前期-入库提前期-发料提前期 =最晚开工时间 最早或最晚为系统建议开工日期
|
|
|
//根绝系统配置参数 取最早或者最晚开始日期
|
|
//根绝系统配置参数 取最早或者最晚开始日期
|
|
|
var StartDate = DateTime.Now.Date.AddDays(3);
|
|
var StartDate = DateTime.Now.Date.AddDays(3);
|
|
|
mes_Morder.moentry_sys_stime = StartDate;
|
|
mes_Morder.moentry_sys_stime = StartDate;
|
|
|
- var ProductiveDate = ProductiveExamine(ic_bom.bom_number, (int)(Number.Value));
|
|
|
|
|
- //系统建议完工日期为 开工日期+产能检查时间=完工日期
|
|
|
|
|
- var Day = ProductiveDate.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
|
|
|
|
|
- mes_Morder.moentry_sys_etime = StartDate.AddDays((double)Day);
|
|
|
|
|
- mes_Morder.morder_need_time = ProductiveDate.Result;
|
|
|
|
|
|
|
+ if (!string.IsNullOrEmpty(BomNumber))
|
|
|
|
|
+ {
|
|
|
|
|
+ var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
|
|
|
|
|
+ //系统建议完工日期为 开工日期+产能检查时间=完工日期
|
|
|
|
|
+ var Day = ProductiveDate.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
|
|
|
|
|
+ mes_Morder.moentry_sys_etime = StartDate.AddDays((double)Day);
|
|
|
|
|
+ mes_Morder.morder_need_time = ProductiveDate.Result;
|
|
|
|
|
+ }
|
|
|
mes_Morder.moentry_startup_status = 0;
|
|
mes_Morder.moentry_startup_status = 0;
|
|
|
mes_Morder.tenant_id = seorderentry.tenant_id;
|
|
mes_Morder.tenant_id = seorderentry.tenant_id;
|
|
|
mes_Morder.factory_id = seorderentry.factory_id;
|
|
mes_Morder.factory_id = seorderentry.factory_id;
|
|
|
- mes_Morder.product_code = seorderentry.item_number;
|
|
|
|
|
- mes_Morder.product_name = seorderentry.item_name;
|
|
|
|
|
|
|
+ mes_Morder.product_code = number;
|
|
|
|
|
+ mes_Morder.product_name = ic_item.name;
|
|
|
mes_Morder.project_name = seorder.project_name;
|
|
mes_Morder.project_name = seorder.project_name;
|
|
|
mes_Morder.planner_num = seorderentry.planner_no;
|
|
mes_Morder.planner_num = seorderentry.planner_no;
|
|
|
mes_Morder.planner_name = seorderentry.planner_name;
|
|
mes_Morder.planner_name = seorderentry.planner_name;
|
|
@@ -861,9 +755,9 @@ namespace Business.ResourceExamineManagement
|
|
|
mes_Morder.moentry_wrkcname = null;
|
|
mes_Morder.moentry_wrkcname = null;
|
|
|
mes_Morder.picking_qty = 0;
|
|
mes_Morder.picking_qty = 0;
|
|
|
//TODO:可删除主表字段
|
|
//TODO:可删除主表字段
|
|
|
- mes_Morder.unit = seorderentry.unit;
|
|
|
|
|
- mes_Morder.morder_production_number = Number;
|
|
|
|
|
- mes_Morder.need_number = Number;
|
|
|
|
|
|
|
+ mes_Morder.unit = ic_item.unit;
|
|
|
|
|
+ mes_Morder.morder_production_number = Quantity;
|
|
|
|
|
+ mes_Morder.need_number = Quantity;
|
|
|
mes_Morder.remaining_number = 0;
|
|
mes_Morder.remaining_number = 0;
|
|
|
//生成工单子表数据
|
|
//生成工单子表数据
|
|
|
mes_moentry mes_Moentry = new mes_moentry();
|
|
mes_moentry mes_Moentry = new mes_moentry();
|
|
@@ -873,9 +767,9 @@ namespace Business.ResourceExamineManagement
|
|
|
mes_Moentry.soentry_id = seorderentry.Id;
|
|
mes_Moentry.soentry_id = seorderentry.Id;
|
|
|
mes_Moentry.fbill_no = seorderentry.bill_no;
|
|
mes_Moentry.fbill_no = seorderentry.bill_no;
|
|
|
mes_Moentry.fentry_id = seorderentry.entry_seq.Value;
|
|
mes_Moentry.fentry_id = seorderentry.entry_seq.Value;
|
|
|
- mes_Moentry.unit = seorderentry.unit;
|
|
|
|
|
- mes_Moentry.morder_production_number = Number;
|
|
|
|
|
- mes_Moentry.need_number = Number;
|
|
|
|
|
|
|
+ mes_Moentry.unit = ic_item.unit;
|
|
|
|
|
+ mes_Moentry.morder_production_number = Quantity;
|
|
|
|
|
+ mes_Moentry.need_number = Quantity;
|
|
|
mes_Moentry.remaining_number = 0;
|
|
mes_Moentry.remaining_number = 0;
|
|
|
mes_Moentry.factory_id = seorderentry.factory_id;
|
|
mes_Moentry.factory_id = seorderentry.factory_id;
|
|
|
//using (TransactionScope scope = new TransactionScope())
|
|
//using (TransactionScope scope = new TransactionScope())
|
|
@@ -934,13 +828,13 @@ namespace Business.ResourceExamineManagement
|
|
|
//根据Bom编码查询出对应工单并且状态不为完成、关闭,非委外工单。
|
|
//根据Bom编码查询出对应工单并且状态不为完成、关闭,非委外工单。
|
|
|
//TODO:工单类型;
|
|
//TODO:工单类型;
|
|
|
var morderList = await _mes_morder.GetManyByCondition(x => x.bom_number == bomNumber && (x.morder_state != "完成" || x.morder_state != "关闭"
|
|
var morderList = await _mes_morder.GetManyByCondition(x => x.bom_number == bomNumber && (x.morder_state != "完成" || x.morder_state != "关闭"
|
|
|
- && x.morder_icitem_type != "相关委外工单") && x.IsDeleted == false && x.tenant_id == seorderentry.tenant_id);
|
|
|
|
|
|
|
+ && x.morder_icitem_type != "相关委外工单") && !x.IsDeleted && x.tenant_id == seorderentry.tenant_id);
|
|
|
|
|
|
|
|
//获取物料详情
|
|
//获取物料详情
|
|
|
var ic_item = _ic_item.GetManyByCondition(x => x.number == seorderentry.item_number && x.tenant_id == seorderentry.tenant_id).Result.FirstOrDefault();
|
|
var ic_item = _ic_item.GetManyByCondition(x => x.number == seorderentry.item_number && x.tenant_id == seorderentry.tenant_id).Result.FirstOrDefault();
|
|
|
|
|
|
|
|
//工单已被占用后要与占用表关联查询...减去占用量后 剩下生产数量可供下个销售工单使用。
|
|
//工单已被占用后要与占用表关联查询...减去占用量后 剩下生产数量可供下个销售工单使用。
|
|
|
- var mes_mooccupyList = await _mes_mooccupy.GetManyByCondition(x => x.moo_state == 1 && x.IsDeleted == false && x.tenant_id == seorderentry.tenant_id);
|
|
|
|
|
|
|
+ var mes_mooccupyList = await _mes_mooccupy.GetManyByCondition(x => x.moo_state == 1 && !x.IsDeleted && x.tenant_id == seorderentry.tenant_id);
|
|
|
|
|
|
|
|
//首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
|
|
//首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
|
|
|
//当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
|
|
//当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
|
|
@@ -1182,13 +1076,13 @@ namespace Business.ResourceExamineManagement
|
|
|
public void BomSubstitute(List<BomChildExamineDto> returnlist, List<ic_bom> bomlist, List<ic_bom_child> bomchildlist, List<ic_item> icitemlist)
|
|
public void BomSubstitute(List<BomChildExamineDto> returnlist, List<ic_bom> bomlist, List<ic_bom_child> bomchildlist, List<ic_item> icitemlist)
|
|
|
{
|
|
{
|
|
|
List<string> codeList = returnlist.Select(c => c.substitute_code).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;
|
|
|
|
|
|
|
+ var sublist = _ic_substitute.GetManyByCondition(p => codeList.Contains(p.substitute_code) && !p.IsDeleted).Result;
|
|
|
|
|
|
|
|
List<long> subidlist = sublist.Select(c => c.Id).ToList();
|
|
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;
|
|
|
|
|
|
|
+ var suballlist = _ic_substitute_all.GetManyByCondition(p => subidlist.Contains(p.substitute_id) && !p.IsDeleted).Result;
|
|
|
|
|
|
|
|
List<long> suballidlist = suballlist.Select(c => c.Id).ToList();
|
|
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;
|
|
|
|
|
|
|
+ var subdtllist = _ic_substitute_all_dtl.GetManyByCondition(p => suballidlist.Contains(p.substitute_allid) && !p.IsDeleted).Result;
|
|
|
|
|
|
|
|
List<long> childidList = new List<long>();
|
|
List<long> childidList = new List<long>();
|
|
|
int type = 1;
|
|
int type = 1;
|
|
@@ -1226,7 +1120,7 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
{
|
|
|
var sadl = subdtllist.Where(s => s.substitute_allid == sal.Id).ToList();
|
|
var sadl = subdtllist.Where(s => s.substitute_allid == sal.Id).ToList();
|
|
|
List<long> dtlItemId = sadl.Select(m => m.icitem_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;
|
|
|
|
|
|
|
+ var dtlitemlist = _ic_item.GetManyByCondition(p => dtlItemId.Contains(p.Id) && !p.IsDeleted).Result;
|
|
|
icitemlist.AddRange(dtlitemlist);
|
|
icitemlist.AddRange(dtlitemlist);
|
|
|
foreach (var dtl in sadl)
|
|
foreach (var dtl in sadl)
|
|
|
{
|
|
{
|
|
@@ -2149,7 +2043,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//ToDo:企业Id,数据状态过滤以及isdeleted
|
|
//ToDo:企业Id,数据状态过滤以及isdeleted
|
|
|
var po_list = _srm_po_list.Find(p => returnlist.Select(x => x.item_id).Contains(p.icitem_id.Value) && p.tenant_id == tenantId && p.factory_id == factoryid && p.rarrdate >= DateTime.Now && p.rarrdate < deliveryDate && !p.IsDeleted).Result;
|
|
var po_list = _srm_po_list.Find(p => returnlist.Select(x => x.item_id).Contains(p.icitem_id.Value) && p.tenant_id == tenantId && p.factory_id == factoryid && p.rarrdate >= DateTime.Now && p.rarrdate < deliveryDate && !p.IsDeleted).Result;
|
|
|
var itemlist = new List<ICItemDateDto>();//需要生成采购申请单的物料信息
|
|
var itemlist = new List<ICItemDateDto>();//需要生成采购申请单的物料信息
|
|
|
- var leadTimeList = GetLeadTime(returnlist.Select(p=>p.item_id).ToList(), tenantId, factoryid);//提前期列表
|
|
|
|
|
|
|
+ var leadTimeList = GetLeadTime(returnlist.Select(p => p.item_id).ToList(), tenantId, factoryid);//提前期列表
|
|
|
var supplierList = GetSupplier(returnlist, tenantId, factoryid);//供应商列表
|
|
var supplierList = GetSupplier(returnlist, tenantId, factoryid);//供应商列表
|
|
|
var planList = GetICPlan(returnlist, tenantId, factoryid);//plan列表
|
|
var planList = GetICPlan(returnlist, tenantId, factoryid);//plan列表
|
|
|
foreach (var item in returnlist)
|
|
foreach (var item in returnlist)
|