Ver código fonte

Merge branch 'dev' of http://123.60.180.165:4647/ZZYDOP/DOPCore into dev

tangdi 3 anos atrás
pai
commit
24a34d0560

+ 3 - 3
MicroServices/Business/Business.Application/Quartz/ProductionScheduleAppService.cs

@@ -258,9 +258,9 @@ namespace Business.Quartz
             }
             _businessDbContext.UpdateRange(workOrds);
             //记录排产数据
-            _businessDbContext.BulkInsert(periodSequenceDtls);
-            _businessDbContext.BulkInsert(scheduleMasters);
-            _businessDbContext.BulkInsert(scheduleExceptions);
+            await _businessDbContext.BulkInsertAsync(periodSequenceDtls);
+            await _businessDbContext.BulkInsertAsync(scheduleMasters);
+            await _businessDbContext.BulkInsertAsync(scheduleExceptions);
         }
 
         /// <summary>

+ 148 - 1
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -210,6 +210,16 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         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>
@@ -316,7 +326,9 @@ namespace Business.ResourceExamineManagement
             MorderAppService morderAppService,
             BusinessBangDbContext businessBangDbContext,
             BusinessDbContext businessDbContext,
-            ProductionScheduleAppService productionScheduleAppService
+            ProductionScheduleAppService productionScheduleAppService,
+            ISqlRepository<RoutingOpDetail> routingOpDetail,
+            ISqlRepository<ProductStructureMaster> productStructureMaster
             )
         {
             _mes_technique = mes_technique;
@@ -379,6 +391,8 @@ namespace Business.ResourceExamineManagement
             _businessBangDbContext = businessBangDbContext;
             _businessDbContext = businessDbContext;
             _productionScheduleAppService= productionScheduleAppService;
+            _routingOpDetail = routingOpDetail;
+            _productStructureMaster = productStructureMaster;
         }
         #endregion
 
@@ -495,6 +509,9 @@ namespace Business.ResourceExamineManagement
                 var mesorders = ObjectMapper.Map<List<mo_mes_morder>, List<mes_morder>>(_CalcBomViewAppService.mordersInsertList);
                 _businessDbContext.BulkInsert(mesorders);
                 rtn.mordersList = _CalcBomViewAppService.mordersInsertList;
+
+                //插入工单相关数据
+                CreateWorkOrdDates(_CalcBomViewAppService.mordersInsertList);
             }
             if (_CalcBomViewAppService.mooccupyAllInsertList.Any())
             {
@@ -2226,6 +2243,136 @@ namespace Business.ResourceExamineManagement
             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)
         {
 

+ 11 - 0
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/DOP/BusinessDbContext.cs

@@ -132,6 +132,17 @@ namespace Business.EntityFrameworkCore
         /// </summary>
         public DbSet<HolidayMaster> HolidayMaster { get; set; }
 
+        /// <summary>
+        /// ¹¤ÒÕÁ÷³Ì±í
+        /// </summary>
+        public DbSet<RoutingOpDetail> RoutingOpDetail { get; set; }
+
+        /// <summary>
+        /// ±ê×¼BOM±í
+        /// </summary>
+        public DbSet<ProductStructureMaster> ProductStructureMaster { get; set; }
+        
+
         #endregion
 
         //Code generation...

+ 67 - 0
MicroServices/Business/Bussiness.Model/MES/IC/ProductStructureMaster.cs

@@ -0,0 +1,67 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.Model.MES.IC
+{
+    /// <summary>
+    /// 标准BOM表
+    /// </summary>
+    public class ProductStructureMaster
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [Comment("主键")]
+        [Key]
+        public int RecID { get; set; }
+
+        /// <summary>
+        /// 域名
+        /// </summary>
+        [Comment("域名")]
+        public string? Domain { get; set; }
+
+        /// <summary>
+        /// 父零件
+        /// </summary>
+        [Comment("父零件")]
+        public string ParentItem { get; set; }
+
+        /// <summary>
+        /// 子零件
+        /// </summary>
+        [Comment("子零件")]
+        public string ComponentItem { get; set; }
+
+        /// <summary>
+        /// 结构类型:X-虚拟件,需要通过ComponentItem查询其子级
+        /// </summary>
+        [Comment("结构类型")]
+        public string? StructureType { get; set; }
+
+        /// <summary>
+        /// 工序
+        /// </summary>
+        [Comment("工序")]
+        public int Op { get; set; }
+
+        /// <summary>
+        /// 数量
+        /// </summary>
+        [Comment("数量")]
+        public decimal Qty { get; set; }
+
+
+
+        /// <summary>
+        /// 是否有效:1-有效;0-无效
+        /// </summary>
+        [Comment("是否有效")]
+        public Boolean IsActive { get; set; }
+    }
+}

+ 77 - 0
MicroServices/Business/Bussiness.Model/Production/RoutingOpDetail.cs

@@ -0,0 +1,77 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.Model.Production
+{
+    /// <summary>
+    /// 工艺流程表
+    /// </summary>
+    public class RoutingOpDetail
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [Comment("主键")]
+        [Key]
+        public int RecID { get; set; }
+
+        /// <summary>
+        /// 域名
+        /// </summary>
+        [Comment("域名")]
+        public string Domain { get; set; }
+
+        /// <summary>
+        /// 流程代码
+        /// </summary>
+        [Comment("流程代码")]
+        public string RoutingCode { get; set; }
+
+        /// <summary>
+        /// 描述
+        /// </summary>
+        [Comment("描述")]
+        public string? Descr { get; set; }
+
+        /// <summary>
+        /// 关键工序
+        /// </summary>
+        [Comment("关键工序")]
+        public Boolean MilestoneOp { get; set; }
+
+        /// <summary>
+        /// 工序
+        /// </summary>
+        [Comment("工序")]
+        public int Op { get; set; }
+
+        /// <summary>
+        /// 父级工序
+        /// </summary>
+        [Comment("父级工序")]
+        public int ParentOp { get; set; }
+
+        /// <summary>
+        /// 运行时间(标准节拍)
+        /// </summary>
+        [Comment("运行时间")]
+        public decimal RunTime { get; set; }
+
+        /// <summary>
+        /// 平行加工件数,下序开工前置数量
+        /// </summary>
+        [Comment("平行加工件数")]
+        public int? OverlapUnits { get; set; }
+
+        /// <summary>
+        /// 是否有效:1-有效;0-无效
+        /// </summary>
+        [Comment("是否有效")]
+        public Boolean IsActive { get; set; }
+    }
+}