|
@@ -277,7 +277,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 生产排产
|
|
/// 生产排产
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
- private readonly ProdScheduleAppService _prodScheduleAppService;
|
|
|
|
|
|
|
+ private readonly ProductionScheduleAppService _productionScheduleAppService;
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 优先级
|
|
/// 优先级
|
|
@@ -357,7 +357,7 @@ namespace Business.ResourceExamineManagement
|
|
|
MorderAppService morderAppService,
|
|
MorderAppService morderAppService,
|
|
|
BusinessBangDbContext businessBangDbContext,
|
|
BusinessBangDbContext businessBangDbContext,
|
|
|
BusinessDbContext businessDbContext,
|
|
BusinessDbContext businessDbContext,
|
|
|
- ProdScheduleAppService prodScheduleAppService,
|
|
|
|
|
|
|
+ ProductionScheduleAppService productionScheduleAppService,
|
|
|
ISqlRepository<RoutingOpDetail> routingOpDetail,
|
|
ISqlRepository<RoutingOpDetail> routingOpDetail,
|
|
|
ISqlRepository<ProductStructureMaster> productStructureMaster,
|
|
ISqlRepository<ProductStructureMaster> productStructureMaster,
|
|
|
ISqlRepository<WorkOrdRouting> workOrdRouting,
|
|
ISqlRepository<WorkOrdRouting> workOrdRouting,
|
|
@@ -429,7 +429,7 @@ namespace Business.ResourceExamineManagement
|
|
|
_morderAppService = morderAppService;
|
|
_morderAppService = morderAppService;
|
|
|
_businessBangDbContext = businessBangDbContext;
|
|
_businessBangDbContext = businessBangDbContext;
|
|
|
_businessDbContext = businessDbContext;
|
|
_businessDbContext = businessDbContext;
|
|
|
- _prodScheduleAppService = prodScheduleAppService;
|
|
|
|
|
|
|
+ _productionScheduleAppService = productionScheduleAppService;
|
|
|
_routingOpDetail = routingOpDetail;
|
|
_routingOpDetail = routingOpDetail;
|
|
|
_productStructureMaster = productStructureMaster;
|
|
_productStructureMaster = productStructureMaster;
|
|
|
_workOrdRouting = workOrdRouting;
|
|
_workOrdRouting = workOrdRouting;
|
|
@@ -582,6 +582,8 @@ namespace Business.ResourceExamineManagement
|
|
|
var mesorders = ObjectMapper.Map<List<mo_mes_morder>, List<mes_morder>>(_CalcBomViewAppService.mordersInsertList);
|
|
var mesorders = ObjectMapper.Map<List<mo_mes_morder>, List<mes_morder>>(_CalcBomViewAppService.mordersInsertList);
|
|
|
_businessDbContext.BulkInsert(mesorders);
|
|
_businessDbContext.BulkInsert(mesorders);
|
|
|
rtn.mordersList = _CalcBomViewAppService.mordersInsertList;
|
|
rtn.mordersList = _CalcBomViewAppService.mordersInsertList;
|
|
|
|
|
+ //同步工单
|
|
|
|
|
+ CreateWorkOrdDates(mesorders);
|
|
|
}
|
|
}
|
|
|
if (_CalcBomViewAppService.mooccupyAllInsertList.Any())
|
|
if (_CalcBomViewAppService.mooccupyAllInsertList.Any())
|
|
|
{
|
|
{
|
|
@@ -2162,8 +2164,152 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
|
public async Task<string> ProductionSchedule(List<string> workOrds)
|
|
public async Task<string> ProductionSchedule(List<string> workOrds)
|
|
|
{
|
|
{
|
|
|
- await _prodScheduleAppService.ProductionSchedule(workOrds);
|
|
|
|
|
- return "ok";
|
|
|
|
|
|
|
+ if (workOrds.Count() == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+ //获取工单数据
|
|
|
|
|
+ var workOrdMasters = _workOrdMaster.Select(p => workOrds.Contains(p.WorkOrd));
|
|
|
|
|
+ //排产
|
|
|
|
|
+ await _productionScheduleAppService.DoProductShcedule(workOrdMasters);
|
|
|
|
|
+ return JsonConvert.SerializeObject("ok");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 同步工单等相关数据
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="morders"></param>
|
|
|
|
|
+ public void CreateWorkOrdDates(List<mes_morder> morders)
|
|
|
|
|
+ {
|
|
|
|
|
+ //获取工艺路线数据:product_code=物料编码
|
|
|
|
|
+ List<RoutingOpDetail> allRoutings = _routingOpDetail.Select(p => morders.Select(m => m.product_code).Contains(p.RoutingCode));
|
|
|
|
|
+ //获取标准BOM数据
|
|
|
|
|
+ List<ProductStructureMaster> productStructures = GetProductStructure(morders.Select(p => p.product_code).Distinct().ToList());
|
|
|
|
|
+ //工单主表
|
|
|
|
|
+ List<WorkOrdMaster> workOrds = new List<WorkOrdMaster>();
|
|
|
|
|
+ WorkOrdMaster workOrd;
|
|
|
|
|
+ //工单工艺路线表
|
|
|
|
|
+ List<WorkOrdRouting> workOrdRoutings = new List<WorkOrdRouting>();
|
|
|
|
|
+ WorkOrdRouting woRouting;
|
|
|
|
|
+ //工单物料表
|
|
|
|
|
+ List<WorkOrdDetail> workOrdDetails = new List<WorkOrdDetail>();
|
|
|
|
|
+ WorkOrdDetail woDetail;
|
|
|
|
|
+ foreach (var item in morders)
|
|
|
|
|
+ {
|
|
|
|
|
+ //添加工单数据
|
|
|
|
|
+ workOrd = new WorkOrdMaster();
|
|
|
|
|
+ workOrd.Domain = "1001";
|
|
|
|
|
+ workOrd.OrdDate = item.moentry_sys_stime;
|
|
|
|
|
+ workOrd.ReleaseDate = Convert.ToDateTime(item.moentry_sys_stime.GetValueOrDefault().ToString("u"));
|
|
|
|
|
+ workOrd.WorkOrd = item.morder_no;
|
|
|
|
|
+ workOrd.ItemNum = item.product_code;//物料编码
|
|
|
|
|
+ workOrd.QtyOrded = item.need_number.GetValueOrDefault();
|
|
|
|
|
+ workOrd.RoutingCode = item.product_code;
|
|
|
|
|
+ workOrd.Period = 1;
|
|
|
|
|
+ workOrd.Priority = item.urgent;
|
|
|
|
|
+ workOrd.Status = "";
|
|
|
|
|
+ workOrd.IsActive = true;
|
|
|
|
|
+ workOrd.IsConfirm = true;
|
|
|
|
|
+ workOrds.Add(workOrd);
|
|
|
|
|
+
|
|
|
|
|
+ //添加工单工艺路线数据
|
|
|
|
|
+ var curRoutings = allRoutings.Where(p => p.RoutingCode == item.product_code).ToList();
|
|
|
|
|
+ foreach (var dtl in curRoutings)
|
|
|
|
|
+ {
|
|
|
|
|
+ woRouting = new WorkOrdRouting();
|
|
|
|
|
+ woRouting.Domain = "1001";
|
|
|
|
|
+ woRouting.Descr = dtl.Descr;
|
|
|
|
|
+ woRouting.MilestoneOp = dtl.MilestoneOp;
|
|
|
|
|
+ woRouting.WorkOrd = item.morder_no;
|
|
|
|
|
+ woRouting.OP = dtl.Op;
|
|
|
|
|
+ woRouting.ParentOp = dtl.ParentOp;
|
|
|
|
|
+ woRouting.RunTime = dtl.RunTime;
|
|
|
|
|
+ woRouting.ItemNum = item.product_code;
|
|
|
|
|
+ woRouting.QtyOrded = item.need_number.GetValueOrDefault();
|
|
|
|
|
+ woRouting.OverlapUnits = dtl.OverlapUnits;
|
|
|
|
|
+ woRouting.Status = "";
|
|
|
|
|
+ woRouting.IsActive = true;
|
|
|
|
|
+ workOrdRoutings.Add(woRouting);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //添加工单物料数据
|
|
|
|
|
+ var curStructures = productStructures.Where(p => p.ParentItem == item.product_code).ToList();
|
|
|
|
|
+ foreach (var structure in curStructures)
|
|
|
|
|
+ {
|
|
|
|
|
+ //添加工单的物料信息
|
|
|
|
|
+ woDetail = new WorkOrdDetail();
|
|
|
|
|
+ woDetail.Domain = "1001";
|
|
|
|
|
+ woDetail.WorkOrd = item.morder_no;
|
|
|
|
|
+ woDetail.Op = structure.Op;
|
|
|
|
|
+ woDetail.ItemNum = structure.ComponentItem;
|
|
|
|
|
+ woDetail.QtyRequired = item.need_number.GetValueOrDefault() * structure.Qty;
|
|
|
|
|
+ woDetail.QtyPosted = 0m;
|
|
|
|
|
+ woDetail.QtyReturned = 0m;
|
|
|
|
|
+ woDetail.Status = "";
|
|
|
|
|
+ woDetail.IsActive = true;
|
|
|
|
|
+ workOrdDetails.Add(woDetail);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ _workOrdMaster.Insert(workOrds);
|
|
|
|
|
+ _workOrdRouting.Insert(workOrdRoutings);
|
|
|
|
|
+ _workOrdDetail.Insert(workOrdDetails);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 获取标准Bom数据--TODO:存在循环查询数据库问题,后续调整
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="itenNums">产品物料编码</param>
|
|
|
|
|
+ /// <returns></returns>
|
|
|
|
|
+ public List<ProductStructureMaster> GetProductStructure(List<string> itenNums)
|
|
|
|
|
+ {
|
|
|
|
|
+ List<ProductStructureMaster> rtnStructures = new List<ProductStructureMaster>();
|
|
|
|
|
+ //根据itemNum获取bom数据
|
|
|
|
|
+ var productStructures = _productStructureMaster.Select(p => itenNums.Contains(p.ParentItem) && p.Domain == "1001" && p.IsActive);
|
|
|
|
|
+ //添加非虚拟件
|
|
|
|
|
+ rtnStructures.AddRange(productStructures.Where(p => p.StructureType.ToUpper() != "X").ToList());
|
|
|
|
|
+ foreach (var item in itenNums)
|
|
|
|
|
+ {
|
|
|
|
|
+ //获取当前产品的虚拟件
|
|
|
|
|
+ var curPhantoms = productStructures.Where(p => p.ParentItem == item && p.StructureType.ToUpper() == "X").ToList();
|
|
|
|
|
+ if (curPhantoms.Count() == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ //递归获取所有虚拟件对应的子物料
|
|
|
|
|
+ RecursionProductStructure(item, curPhantoms, rtnStructures);
|
|
|
|
|
+ }
|
|
|
|
|
+ return rtnStructures;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 递归获取虚拟件的子物料
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="parentItem">产品的物料编码</param>
|
|
|
|
|
+ /// <param name="structures">当前产品的虚拟件</param>
|
|
|
|
|
+ /// <param name="rtnStructures"></param>
|
|
|
|
|
+ public void RecursionProductStructure(string parentItem, List<ProductStructureMaster> structures, List<ProductStructureMaster> rtnStructures)
|
|
|
|
|
+ {
|
|
|
|
|
+ //获取虚拟件的子物料
|
|
|
|
|
+ var chdStructures = _productStructureMaster.Select(p => structures.Select(m => m.ComponentItem).Contains(p.ParentItem) && p.Domain == "1001" && p.IsActive);
|
|
|
|
|
+ //非虚拟件
|
|
|
|
|
+ var notPhantoms = chdStructures.Where(p => p.StructureType.ToUpper() != "X").ToList();
|
|
|
|
|
+ //存在非虚拟件
|
|
|
|
|
+ if (notPhantoms.Count() > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ notPhantoms.ForEach(p =>
|
|
|
|
|
+ {
|
|
|
|
|
+ p.ParentItem = parentItem;
|
|
|
|
|
+ });
|
|
|
|
|
+ rtnStructures.AddRange(notPhantoms);
|
|
|
|
|
+ }
|
|
|
|
|
+ //虚拟件
|
|
|
|
|
+ var phantoms = chdStructures.Where(p => p.StructureType.ToUpper() == "X").ToList();
|
|
|
|
|
+ if (phantoms.Count() > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ //递归
|
|
|
|
|
+ RecursionProductStructure(parentItem, phantoms, rtnStructures);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|