|
@@ -210,6 +210,16 @@ 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 ISqlRepository<RoutingOpDetail> _routingOpDetail;
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 标准BOM表
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ private readonly ISqlRepository<ProductStructureMaster> _productStructureMaster;
|
|
|
|
|
+
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 资源检查入参
|
|
/// 资源检查入参
|
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -316,7 +326,9 @@ namespace Business.ResourceExamineManagement
|
|
|
MorderAppService morderAppService,
|
|
MorderAppService morderAppService,
|
|
|
BusinessBangDbContext businessBangDbContext,
|
|
BusinessBangDbContext businessBangDbContext,
|
|
|
BusinessDbContext businessDbContext,
|
|
BusinessDbContext businessDbContext,
|
|
|
- ProductionScheduleAppService productionScheduleAppService
|
|
|
|
|
|
|
+ ProductionScheduleAppService productionScheduleAppService,
|
|
|
|
|
+ ISqlRepository<RoutingOpDetail> routingOpDetail,
|
|
|
|
|
+ ISqlRepository<ProductStructureMaster> productStructureMaster
|
|
|
)
|
|
)
|
|
|
{
|
|
{
|
|
|
_mes_technique = mes_technique;
|
|
_mes_technique = mes_technique;
|
|
@@ -379,6 +391,8 @@ namespace Business.ResourceExamineManagement
|
|
|
_businessBangDbContext = businessBangDbContext;
|
|
_businessBangDbContext = businessBangDbContext;
|
|
|
_businessDbContext = businessDbContext;
|
|
_businessDbContext = businessDbContext;
|
|
|
_productionScheduleAppService= productionScheduleAppService;
|
|
_productionScheduleAppService= productionScheduleAppService;
|
|
|
|
|
+ _routingOpDetail = routingOpDetail;
|
|
|
|
|
+ _productStructureMaster = productStructureMaster;
|
|
|
}
|
|
}
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
@@ -495,6 +509,9 @@ 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(_CalcBomViewAppService.mordersInsertList);
|
|
|
}
|
|
}
|
|
|
if (_CalcBomViewAppService.mooccupyAllInsertList.Any())
|
|
if (_CalcBomViewAppService.mooccupyAllInsertList.Any())
|
|
|
{
|
|
{
|
|
@@ -2226,6 +2243,136 @@ namespace Business.ResourceExamineManagement
|
|
|
AutoCreateBomBill();
|
|
AutoCreateBomBill();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 同步工单等相关数据
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="morders"></param>
|
|
|
|
|
+ public void CreateWorkOrdDates(List<mo_mes_morder> morders)
|
|
|
|
|
+ {
|
|
|
|
|
+ //获取工艺路线数据:product_code=物料编码
|
|
|
|
|
+ List<RoutingOpDetail> allRoutings = _routingOpDetail.Select(p => morders.Select(m => m.product_code).Contains(p.RoutingCode)).Result;
|
|
|
|
|
+ //获取标准BOM数据
|
|
|
|
|
+ List<ProductStructureMaster> productStructures = GetProductStructure(morders);
|
|
|
|
|
+ //工单主表
|
|
|
|
|
+ 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 = item.moentry_sys_stime;
|
|
|
|
|
+ workOrd.WorkOrd = item.morder_no;
|
|
|
|
|
+ workOrd.ItemNum = item.product_code;//物料编码
|
|
|
|
|
+ workOrd.QtyOrded = item.need_number.GetValueOrDefault();
|
|
|
|
|
+ workOrd.RoutingCode = item.product_code;
|
|
|
|
|
+ workOrd.Status ="";
|
|
|
|
|
+ workOrd.IsActive = 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.product_code;
|
|
|
|
|
+ woDetail.Op = structure.Op;
|
|
|
|
|
+ woDetail.ItemNum = structure.ComponentItem;
|
|
|
|
|
+ woDetail.QtyReturned = item.need_number.GetValueOrDefault() * structure.Qty;
|
|
|
|
|
+ woDetail.Status = "";
|
|
|
|
|
+ woDetail.IsActive = true;
|
|
|
|
|
+ workOrdDetails.Add(woDetail);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ _businessDbContext.BulkInsertAsync(workOrds);
|
|
|
|
|
+ _businessDbContext.BulkInsertAsync(workOrdRoutings);
|
|
|
|
|
+ _businessDbContext.BulkInsertAsync(workOrdDetails);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 获取标准工艺路线数据--TODO:存在循环查询数据库问题,后续调整
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="morders"></param>
|
|
|
|
|
+ /// <returns></returns>
|
|
|
|
|
+ public List<ProductStructureMaster> GetProductStructure(List<mo_mes_morder> morders)
|
|
|
|
|
+ {
|
|
|
|
|
+ List<ProductStructureMaster> rtnStructures = new List<ProductStructureMaster>();
|
|
|
|
|
+ //根据itemNum获取bom数据
|
|
|
|
|
+ var productStructures = _productStructureMaster.Select(p => morders.Select(m => m.product_code).Contains(p.ParentItem) && p.Domain =="1001" && p.IsActive).Result;
|
|
|
|
|
+ //添加非虚拟件
|
|
|
|
|
+ rtnStructures.AddRange(productStructures.Where(p=>p.StructureType != "X").ToList());
|
|
|
|
|
+ foreach (var item in morders)
|
|
|
|
|
+ {
|
|
|
|
|
+ //获取当前产品的虚拟件
|
|
|
|
|
+ var curPhantoms = productStructures.Where(p => p.ParentItem == item.product_code && p.StructureType == "X").ToList();
|
|
|
|
|
+ if (curPhantoms.Count() == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ //递归获取所有虚拟件对应的子物料
|
|
|
|
|
+ RecursionProductStructure(item.product_code, 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).Result;
|
|
|
|
|
+ //非虚拟件
|
|
|
|
|
+ var notPhantoms = chdStructures.Where(p => p.StructureType != "X").ToList();
|
|
|
|
|
+ //存在非虚拟件
|
|
|
|
|
+ if (notPhantoms.Count() > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ notPhantoms.ForEach(p => {
|
|
|
|
|
+ p.ParentItem = parentItem;
|
|
|
|
|
+ });
|
|
|
|
|
+ rtnStructures.AddRange(notPhantoms);
|
|
|
|
|
+ }
|
|
|
|
|
+ //虚拟件
|
|
|
|
|
+ var phantoms = chdStructures.Where(p => p.StructureType == "X").ToList();
|
|
|
|
|
+ if (phantoms.Count() > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ //递归
|
|
|
|
|
+ RecursionProductStructure(parentItem, phantoms, rtnStructures);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public void AutoCreatePickBill(List<string> WorkOrds)
|
|
public void AutoCreatePickBill(List<string> WorkOrds)
|
|
|
{
|
|
{
|
|
|
|
|
|