Browse Source

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

# Conflicts:
#	MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs
heteng 2 years ago
parent
commit
7f4f3ea58c

+ 12 - 3
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/IResourceExamineAppService.cs

@@ -5,6 +5,7 @@ using Volo.Abp.Application.Dtos;
 using Volo.Abp.Application.Services;
 using Business.ResourceExamineManagement.Dto;
 using Business.Dto;
+using Business.Domain;
 
 namespace Business.ResourceExamineManagement
 {
@@ -25,7 +26,7 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         /// <param name="workOrds"></param>
         /// <returns></returns>
-        Task<string> CreatePickBill(string workOrds, string domain);
+        Task<string> CreatePickBill(string workOrds, string domain, string userAccount);
 
         /// <summary>
         /// 栗都쇱꿴
@@ -35,11 +36,11 @@ namespace Business.ResourceExamineManagement
         Task<string> ReceiveResult(string ids, int type,string companyid);
 
         /// <summary>
-        /// 묏데쇱꿴
+        /// 객휑퍅렀鍋묏데쇱꿴
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
-        Task<string> OrderResourceCheck(int day, string companyid);
+        Task<string> ProduceDayPlanKittingCheck(string startime, string endtime, string domain, string userAccount);
 
         /// <summary>
         /// 競덜죕쇱꿴
@@ -96,5 +97,13 @@ namespace Business.ResourceExamineManagement
         /// <param name="ids"></param>
         /// <returns></returns>
         Task<string> PrApprove(string ids);
+
+        /// <summary>
+        /// 객묏데쇱꿴
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        Task<string> ProduceWorkOrdKittingCheck(string workord, string domain, string userAccount);
+
     }
 }

+ 66 - 9
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -15,8 +15,7 @@ using System.Transactions;
 using Volo.Abp.Application.Services;
 using Volo.Abp.MultiTenancy;
 using Microsoft.Extensions.Configuration;
-using Org.BouncyCastle.Asn1.Crmf;
-using System.Runtime.CompilerServices;
+using MongoDB.Driver.Linq;
 
 namespace Business.ResourceExamineManagement
 {
@@ -84,6 +83,10 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         private ISqlRepository<ResourceOccupancyTime> _resourceOccupancyTime;
         /// <summary>
+        /// 加班设置表
+        /// </summary>
+        private ISqlRepository<GeneralizedCodeMaster> _generalizedCodeMaster;
+        /// <summary>
         /// 节假日记录表
         /// </summary>
         private ISqlRepository<HolidayMaster> _holidayMaster;
@@ -134,6 +137,7 @@ namespace Business.ResourceExamineManagement
             ISqlRepository<ShopCalendarWorkCtr> shopCalendarWorkCtr,
             ISqlRepository<QualityLineWorkDetail> qualityLineWorkDetail,
             ISqlRepository<HolidayMaster> holidayMaster,
+            ISqlRepository<GeneralizedCodeMaster> generalizedCodeMaster,
             ICurrentTenant currentTenant
             )
         {
@@ -150,6 +154,7 @@ namespace Business.ResourceExamineManagement
             _shopCalendarWorkCtr = shopCalendarWorkCtr;
             _qualityLineWorkDetail = qualityLineWorkDetail;
             _holidayMaster = holidayMaster;
+            _generalizedCodeMaster = generalizedCodeMaster;
             _currentTenant = currentTenant;
         }
         #endregion
@@ -163,9 +168,17 @@ namespace Business.ResourceExamineManagement
             IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
             domain = configuration.GetConnectionString("Factory_id");
 
-            //获取需要排产的工单:TODO-郑立阳
-            List<WorkOrdMaster> workOrds = new List<WorkOrdMaster>();
-
+            //获取提前期
+            var generalizedCodeMaster = _generalizedCodeMaster.Select(x => x.FldName == "SystemConfig" && x.Val == "WorkOrderLockPeriod" && x.Domain == domain).FirstOrDefault();
+            decimal Udecil = 0;
+            if (generalizedCodeMaster != null)
+            {
+                Udecil = generalizedCodeMaster.UDeci1;
+            }
+            //排产取4周工单排产
+            DateTime dateTime = DateTime.Now.AddDays(30);
+            DateTime date = DateTime.Now.AddDays((double)Udecil);
+            var workOrds = _workOrdMaster.Select(x => x.IsActive && x.Domain == domain && x.OrdDate < dateTime && x.OrdDate > date && x.Status == "初始").ToList();
             await DoProductShcedule(workOrds, domain);
         }
 
@@ -223,7 +236,54 @@ namespace Business.ResourceExamineManagement
                 var curRoutings = workOrdRoutings.Where(p => p.ItemNum == item.ItemNum && p.ParentOp == 0 && p.MilestoneOp).OrderBy(p=>p.OP).ToList();
                 //当前工单的产线明细
                 var curProdLines = prodLines.Where(p => p.Part == item.ItemNum).ToList();
-                //排产前数据校验:TODO-郑立阳
+                
+                #region 校验
+                //工单工艺多产线关键工序、物料对应的生产线信息:物料,工序对应的生产线、工作日历数据
+                var workOrdRouting = workOrdRoutings.Where(x => x.WorkOrd == item.WorkOrd && x.ParentOp == 0).ToList();
+                if (workOrdRouting.Count == 0)
+                {
+                    //记录排产异常原因
+                    new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductShcedule", "工单<" + item.WorkOrd + ">的工单工艺流程数据维护为空", _currentTenant.Id.ToString());
+                    continue;
+                }
+                //TODO:多个关键工序校验
+
+                //物料对应生产线校验
+                var ProdLineDetails = prodLines.Where(x => x.Part == item.ItemNum).ToList();
+                if (ProdLineDetails.Count == 0)
+                {
+                    //记录排产异常原因
+                    new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductShcedule", "工单<" + item.WorkOrd + ">的生产线物料数据维护为空", _currentTenant.Id.ToString());
+                    continue;
+                }
+                var calendarsList = calendars.Where(x => ProdLineDetails.Select(p => p.Line).Contains(x.ProdLine) || string.IsNullOrEmpty(x.ProdLine)).ToList();
+                //校验每个层级是否维护了工作日历
+                bool flag = false;
+                foreach (var rut in ProdLineDetails)
+                {
+                    var lineCals = calendarsList.Where(p => p.ProdLine == rut.Line).ToList();
+                    //当前产线未配置工作日历取标准无产线工作日历使用
+                    if (lineCals.Count == 0)
+                    {
+                        lineCals = calendars.Where(p => string.IsNullOrEmpty(p.ProdLine)).ToList();
+                        if (lineCals.Count == 0)
+                        {
+                            break;
+                        }
+                    }
+                    if (lineCals.Select(p => p.WeekDay).Distinct().Count() != 7)
+                    {
+                        flag = true;
+                        break;
+                    }
+                }
+                if (flag)
+                {
+                    //记录排产异常原因
+                    new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductShcedule", "工单<" + item.WorkOrd + ">的<" + item.ProdLine + ">工作日历数据维护错误", _currentTenant.Id.ToString());
+                    continue;
+                }
+                #endregion
 
                 //产线排产
                 LineSchedule(item, curRoutings, curProdLines, periodSequenceDtls, scheduleMasters,allResults);
@@ -234,9 +294,6 @@ namespace Business.ResourceExamineManagement
                     item.OrdDate = scheduleList.Min(s => s.WorkStartTime.Date);
                     item.DueDate = scheduleList.Max(s => s.WorkEndTime.Date);
                 }
-
-                /*//更新工单表
-                item.Status = "r";*/
             }
             using (TransactionScope scope = new TransactionScope())
             {

+ 209 - 35
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1,3 +1,4 @@
+using Amazon.Runtime.Internal.Util;
 using Business.Core.Enum;
 using Business.Core.Utilities;
 using Business.Domain;
@@ -6,15 +7,18 @@ using Business.EntityFrameworkCore;
 using Business.EntityFrameworkCore.SqlRepositories;
 using Business.PriorityManagement;
 using Business.ResourceExamineManagement.Dto;
+using Business.StructuredDB.WMS;
 using EFCore.BulkExtensions;
 using Microsoft.EntityFrameworkCore;
 using MongoDB.Driver;
 using MongoDB.Driver.Linq;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
+using SixLabors.ImageSharp;
 using Spire.Pdf.General.Render.Decode.Jpeg2000.j2k.wavelet.synthesis;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.Design;
 using System.Linq;
 using System.Linq.Dynamic.Core;
 using System.Threading.Tasks;
@@ -203,6 +207,16 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         private readonly ISqlRepository<PeriodSequenceDet> _periodSequenceDet;
 
+        /// <summary>
+        /// 物料职责表
+        /// </summary>
+        private readonly ISqlRepository<EmpWorkDutyMaster> _empWorkDutyMaster;
+
+        /// <summary>
+        /// 雇员信息表
+        /// </summary>
+        private readonly ISqlRepository<EmployeeMaster> _employeeMaster;
+
         /// <summary>
         /// 排产结果明细
         /// </summary>
@@ -394,6 +408,8 @@ namespace Business.ResourceExamineManagement
             IRepository<srm_supplier, long> mysql_srm_supplier,
             ISqlRepository<TagMaster> tagMasterRepository,
             ISqlRepository<PeriodSequenceDet> periodSequenceDet,
+            ISqlRepository<EmployeeMaster> employeeMaster,
+            ISqlRepository<EmpWorkDutyMaster> empWorkDutyMaster,
             ISqlRepository<LineMaster> lineMaster,
             ISqlRepository<ItemMaster> itemMaster,
             PretreatmentAppService pretreatmentAppService,
@@ -476,6 +492,8 @@ namespace Business.ResourceExamineManagement
             _mysql_srm_supplier = mysql_srm_supplier;
             _tagMasterRepository = tagMasterRepository;
             _periodSequenceDet = periodSequenceDet;
+            _employeeMaster = employeeMaster;
+            _empWorkDutyMaster = empWorkDutyMaster;
             _pretreatmentAppService = pretreatmentAppService;
             _CalcBomViewAppService = calcbomviewAppService;
             _purchaseOrderAppService = purchaseOrderAppService;
@@ -2329,28 +2347,18 @@ namespace Business.ResourceExamineManagement
 
 
         /// <summary>
-        /// 按未来N天工单齐套检查
+        /// 按工单齐套检查
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
-        public async Task<string> OrderResourceCheck(int day, string companyid)
+        public async Task<string> OrderResourceCheck(List<mes_morder> mo_Mes_Morders,string domain, string userAccount)
         {
-            List<mes_morder> mo_Mes_Morders = new List<mes_morder>();
-            if (day <= 0)
-            {
-                return "请选择开工时间在今天之后的工单。";
-            }
-            else
-            {
-                mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => companyid == x.company_id.ToString() && x.moentry_sys_stime >= DateTime.Now.Date.AddDays(1) && x.moentry_sys_stime <= DateTime.Now.Date.AddDays(day) && x.morder_state == MorderEnum.Initial_state && !x.IsDeleted).Result;
-            }
-
             List<mes_morder> checkMo = new List<mes_morder>();
             //只做库存是否齐套检查
             if (mo_Mes_Morders.Any())
             {
                 //检查工单是否已经下了领料单
-                var nbrList = _nbrMaster.Select(a => a.Domain == mo_Mes_Morders[0].factory_id.GetValueOrDefault().ToString() && a.Type == "SM" && mo_Mes_Morders.Select(c => c.morder_no).Contains(a.WorkOrd));
+                var nbrList = _nbrMaster.Select(a => a.Domain == domain && a.Type == "SM" && mo_Mes_Morders.Select(c => c.morder_no).Contains(a.WorkOrd));
                 foreach (var mo in mo_Mes_Morders)
                 {
                     //查出已产生领料单、过滤掉,取出未领料的工单
@@ -2392,7 +2400,7 @@ namespace Business.ResourceExamineManagement
                     var rtn = await OrderKittingCheck(checkMo);
                     if (rtn != null && rtn.examines != null)
                     {
-                        var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "WorkOrderLockPeriod" && s.Domain == companyid).ToList();
+                        var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "WorkOrderLockPeriod" && s.Domain == domain).ToList();
                         decimal lookDay = 0;
                         if (sysSet.Any())
                         {
@@ -2457,7 +2465,12 @@ namespace Business.ResourceExamineManagement
                 {
                     workords = workords.Substring(1, workords.Length - 1);
                     //如果生成领料单,需清理掉当前工单的占用,然后根据领料单的数据,来生成工单的占用
-                    await CreatePickBill(workords, mo_Mes_Morders[0].factory_id.GetValueOrDefault().ToString());
+                    await CreatePickBill(workords, domain, userAccount);
+                    var insertList = GetCopyOP(workords, domain);
+                    if (insertList.Any())
+                    {
+                        _periodSequenceDet.Insert(insertList);
+                    }
                 }
                 return "ok";
             }
@@ -2466,6 +2479,137 @@ namespace Business.ResourceExamineManagement
             }
         }
 
+        //寻找子工序生成排产计划
+        public List<PeriodSequenceDet> GetCopyOP(string workords,string domain)
+        {
+            List<PeriodSequenceDet> returnList = new List<PeriodSequenceDet>();
+            if (string.IsNullOrEmpty(workords))
+            {
+                return returnList;
+            }
+            List<string> workOrd = workords.Split(",").ToList();
+            
+            //工单信息
+            var workOrdMasters = _workOrdMaster.Select(p => p.Domain == domain && workOrd.Contains(p.WorkOrd));
+            //当前工单所有工序
+            var workordRList = _workOrdRouting.Select(s => s.Domain == domain && workOrd.Contains(s.WorkOrd)).ToList();
+            //产线
+            List<ProdLineDetail> prodLines = _prodLineDetail.Select(p => workOrdMasters.Select(m => m.ItemNum).Contains(p.Part) && p.Domain == domain && p.IsActive);
+            //获取已排产的工单
+            List<PeriodSequenceDet> dbPeriodSequences = _periodSequenceDet.Select(p => workOrd.Contains(p.WorkOrds) && p.Domain == domain && p.IsActive);
+
+            List<WorkOrdRouting> copyList = new List<WorkOrdRouting>();
+            foreach (var work in workOrd)
+            {
+                List<WorkOrdRouting> alllist = workordRList.Where(s => s.WorkOrd == work).ToList();
+                List<WorkOrdRouting> parentlist = alllist.Where(s => s.WorkOrd == work && s.ParentOp == 0).ToList();
+                copyList.AddRange(parentlist.Where(s => s.MilestoneOp == false).ToList());
+                GetChildOP(parentlist, alllist, copyList);
+            }
+            foreach (var wor in copyList)
+            {
+                var workPsd = dbPeriodSequences.Where(s => s.ItemNum == wor.ItemNum && s.WorkOrds == wor.WorkOrd).ToList();
+                var line = prodLines.Where(p => p.Part == wor.ItemNum && p.Op == wor.OP).FirstOrDefault();
+                foreach (var psd in workPsd)
+                {
+                    var newPsd = new PeriodSequenceDet
+                    {
+                        Domain = domain,
+                        //Line = item.Line,
+                        ItemNum = wor.ItemNum,
+                        PlanDate = psd.PlanDate,
+                        Period = 1,//目前只考虑一班制
+                        OrdQty = psd.OrdQty,
+                        WorkOrds = wor.WorkOrd,
+                        Op = wor.OP,
+                        IsActive = true,
+                        Status = "",
+                        CreateTime = DateTime.Now
+                    };
+                    if (line != null)
+                    {
+                        newPsd.Line = line.Line;
+                    }
+                    else
+                    {
+                        newPsd.Line = psd.Line;
+                    }
+                    returnList.Add(newPsd);
+                }
+            }
+            return returnList;
+        }
+
+        //递归寻找到子级工序里工序编码最大的一条记录。
+        public void GetChildOP(List<WorkOrdRouting> parentlist, List<WorkOrdRouting> alllist, List<WorkOrdRouting> copyList)
+        {
+            foreach (var parent in parentlist)
+            {
+                var list = alllist.Where(s => s.ParentOp == parent.OP).ToList();
+                if (list.Any())
+                {
+                    var maxOp = list.OrderByDescending(s => s.OP).FirstOrDefault();
+                    if (maxOp != null)
+                    {
+                        copyList.Add(maxOp);
+                    }
+                    GetChildOP(list, alllist, copyList);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 范围内工单齐套检查并下达
+        /// </summary>
+        /// <param name="startime"></param>
+        /// <param name="endtime"></param>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        public async Task<string> ProduceDayPlanKittingCheck(string startime,string endtime,string domain, string userAccount)
+        {
+            DateTime stime = DateTime.Now.Date.AddDays(-100);
+            if (!string.IsNullOrEmpty(startime))
+            {
+                DateTime.TryParse(startime, out stime);
+            }
+            DateTime etime = DateTime.Now.Date.AddYears(2);
+            if (!string.IsNullOrEmpty(endtime))
+            {
+                DateTime.TryParse(startime, out etime);
+            }
+
+            var periodSd = _periodSequenceDet.Select(s => s.Domain == domain && (s.Status == "" || s.Status == "r") && stime <= s.PlanDate && s.PlanDate <= etime).ToList();
+            if (periodSd.Any())
+            {
+                periodSd.Select(s => s.WorkOrds).ToList();
+                List<mes_morder> mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => domain == x.factory_id.ToString() && periodSd.Select(s => s.WorkOrds).Contains(x.morder_no) && (x.morder_state == MorderEnum.Initial_state || x.morder_state == MorderEnum.Xd_state) && !x.IsDeleted).Result;
+                return await OrderResourceCheck(mo_Mes_Morders, domain, userAccount);
+            }
+            else { 
+                return "没有需要检查的工单";
+            }
+        }
+
+        /// <summary>
+        /// 工单齐套检查并下达
+        /// </summary>
+        /// <param name="startime"></param>
+        /// <param name="endtime"></param>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        public async Task<string> ProduceWorkOrdKittingCheck(string workord, string domain,string userAccount)
+        {
+            if (!string.IsNullOrEmpty(workord))
+            {
+                List<mes_morder> mo_Mes_Morders = _mysql_mes_morder.GetListAsync(x => domain == x.factory_id.ToString() && x.morder_no == workord && x.morder_state == MorderEnum.Initial_state && !x.IsDeleted).Result;
+                return await OrderResourceCheck(mo_Mes_Morders, domain, userAccount);
+            }
+            else
+            {
+                return "没有需要检查的工单";
+            }
+        }
+
         /// <summary>
         /// 工单齐套检查/替代料齐套检查结果保存
         /// </summary>
@@ -3083,25 +3227,37 @@ namespace Business.ResourceExamineManagement
             AutoCreateBomBill(companyid);
         }
 
-        public async Task AutoCreatePickBill(List<WorkOrdMaster> workOrdMasters, List<PeriodSequenceDet> dbPeriodSequences, List<NbrMaster> nbrMasterList, List<NbrDetail> nbrDetailList)
+        public async Task AutoCreatePickBill(List<WorkOrdMaster> workOrdMasters, List<PeriodSequenceDet> dbPeriodSequences, List<NbrMaster> nbrMasterList, List<NbrDetail> nbrDetailList, string userAccount)
         {
             if (dbPeriodSequences.Any())
             {
                 List<string> AllLines = dbPeriodSequences.Where(a => workOrdMasters.Select(b=>b.WorkOrd).Contains(a.WorkOrds)).Select(a => a.Line).Distinct().ToList();
                 List<LineMaster> AllLineMasters = _lineMaster.Select(p => AllLines.Contains(p.Line) && p.Domain == workOrdMasters[0].Domain && p.IsActive);
-
-
+                var user = _employeeMaster.Select(s => s.Employee == userAccount && s.Domain == workOrdMasters[0].Domain).FirstOrDefault();
+                var ewdmList = _empWorkDutyMaster.Select(s => s.Domain == workOrdMasters[0].Domain).ToList();
                 //按照工单领料,一个工单一个领料单,之前是按照排产日期和产线分别领料
                 foreach (var workord in workOrdMasters)
                 {
                     Dictionary<string, decimal> dictItemQty = new Dictionary<string, decimal>();
                     decimal QtyOrdSum = workord.QtyOrded;
-                    List<string> lines = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).Select(a => a.Line).Distinct().ToList();
-                    List<LineMaster> lineMasters = AllLineMasters.Where(p => lines.Contains(p.Line) && p.Domain == workord.Domain && p.IsActive).ToList();
+                    string LocationTo = "";
+                    LineMaster defaultLine = null;
+
+                    var dftPs = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).OrderBy(s => s.CreateTime).FirstOrDefault();
+                    if (dftPs != null)
+                    {
+                        List<LineMaster> lineMasters = AllLineMasters.Where(p => p.Line == dftPs.Line && p.Domain == workord.Domain && p.IsActive).ToList();
+                        if (lineMasters.Any())
+                        {
+                            defaultLine = lineMasters.FirstOrDefault();
+                        }
+                        LocationTo = defaultLine?.VLocation;
+                    }
+                    
                     List<ProductStructureMaster> itemList = GetProductStructure(dbPeriodSequences.First(a => a.WorkOrds == workord.WorkOrd).ItemNum, QtyOrdSum, workord.Domain);
                     var childrenList = itemList.Select(a => a.ComponentItem).Distinct().ToList();
                     List<ItemMaster> itemLocList = _itemMaster.Select(p => childrenList.Contains(p.ItemNum) && p.Domain == workord.Domain && p.IsActive).Distinct().ToList();
-                    var dopIcitems = _ic_item.GetListAsync(s => itemLocList.Select(c => c.ItemNum).Contains(s.number)).Result;
+                    var dopIcitems = _ic_item.GetListAsync(s => itemLocList.Select(c => c.ItemNum).Contains(s.number) && s.factory_id.ToString() == workord.Domain).Result;
                     //获取预处理提前期最大值
                     decimal cleanTime = 0;
                     if (dopIcitems.Any())
@@ -3111,21 +3267,20 @@ namespace Business.ResourceExamineManagement
                     List<ItemPackMaster> itemPackList = _itemPackMaster.Select(p => childrenList.Contains(p.ItemNum) && p.Domain == workord.Domain && p.IsActive).Distinct().ToList();
                     var Nbr = GetMaxSerialNumber(417416915624005);
                     
-                    string LocationTo= lineMasters.FirstOrDefault()?.Location;
                     DateTime eff = workord.OrdDate.GetValueOrDefault().Date.AddDays(-1);
                     DateTime start = eff.AddDays((double)(0 - cleanTime - 1));
                     if (start <= DateTime.Now.Date)
                     {
                         start = DateTime.Now.Date;
                     }
-                    nbrMasterList.Add(new NbrMaster
+                    var newNbr = new NbrMaster
                     {
-                        Domain = workOrdMasters[0].Domain,
+                        Domain = workord.Domain,
                         Type = "SM",
                         Nbr = Nbr,
                         Remark = "下达自动领料",
                         //Date = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).Min(a => a.PlanDate),
-                        //ProdLine = item.Line,
+                        ProdLine = defaultLine?.Line,
                         EffDate = eff,
                         Date = start,
                         Status = "",
@@ -3133,13 +3288,15 @@ namespace Business.ResourceExamineManagement
                         QtyOrd = QtyOrdSum,
                         IsActive = true,
                         IsChanged = true,
-                        Name = workOrdMasters[0].Domain,
+                        Name = userAccount,
                         Department = "101",
                         CreateTime = DateTime.Now,
                         UpdateTime = DateTime.Now,
-                        CreateUser = workOrdMasters[0].Domain,
-                        UpdateUser = workOrdMasters[0].Domain
-                    });
+                        CreateUser = user?.Name,
+                        UpdateUser = user?.Name,
+                    };
+                    nbrMasterList.Add(newNbr);
+                    List<string> headAccount = new List<string>();
                     int i = 1;
                     itemList?.ForEach(a =>
                     {
@@ -3148,14 +3305,22 @@ namespace Business.ResourceExamineManagement
                         if (find != null)
                         {
                             LocationFrom = find.Location;
+                            //找出职责范围负责人
+                            //s.ItemNum1 <= a.ComponentItem && a.ComponentItem <= s.ItemNum2
+                           var ewdm = ewdmList.Find(s => 0 >= string.Compare(s.ItemNum1, a.ComponentItem) && 0 >= string.Compare(a.ComponentItem, s.ItemNum2));
+                            if (ewdm != null && !string.IsNullOrEmpty(ewdm.Employee))
+                            {
+                                headAccount.Add(ewdm.Employee);
+                            }
                         }
+                        
                         //相同物料汇总
                         var itemComponent = nbrDetailList.Find(b => b.Nbr == Nbr && b.ItemNum == a.ComponentItem);
                         if (itemComponent == null)
                         {
                             nbrDetailList.Add(new NbrDetail
                             {
-                                Domain = workOrdMasters[0].Domain,
+                                Domain = workord.Domain,
                                 Type = "SM",
                                 Nbr = Nbr,
                                 ItemNum = a.ComponentItem,
@@ -3170,8 +3335,8 @@ namespace Business.ResourceExamineManagement
                                 IsActive = true,
                                 CreateTime = DateTime.Now,
                                 UpdateTime = DateTime.Now,
-                                CreateUser = workOrdMasters[0].Domain,
-                                UpdateUser = workOrdMasters[0].Domain,
+                                CreateUser = user?.Name,
+                                UpdateUser = user?.Name,
                                 UM = a.UM
                             });
                             i++;
@@ -3182,6 +3347,15 @@ namespace Business.ResourceExamineManagement
                             nbrDetailList.First(b => b.Nbr == Nbr && b.ItemNum == a.ComponentItem).CurrQtyOpened = itemComponent.CurrQtyOpened + a.Qty;
                         }
                     });
+
+                    if (headAccount.Any())
+                    {
+                        headAccount.Distinct();
+                        newNbr.User1 = string.Join(",", headAccount);
+                        string[] user2 = headAccount.ToArray();
+                        newNbr.User2 =JsonConvert.SerializeObject(user2);
+                    }
+
                     //先屏蔽备料单扣除库存的DEMO演示。
                     /*nbrDetailList.ForEach(a =>
                     {
@@ -3379,7 +3553,7 @@ namespace Business.ResourceExamineManagement
         /// 生成领料单
         /// </summary>
         /// <param name="workOrd"></param>
-        public async Task<string> CreatePickBill(string workOrd, string domain)
+        public async Task<string> CreatePickBill(string workOrd, string domain, string userAccount)
         {
             List<string> workOrds = new List<string>();
             List<WorkOrdMaster> workOrdMasters = new List<WorkOrdMaster>();
@@ -3407,7 +3581,7 @@ namespace Business.ResourceExamineManagement
             //查出已排产的工单
             workOrdMasters = workOrdMasters.Where(p => dbWorkOrds.Contains(p.WorkOrd)).ToList();
             //查出已产生领料单、过滤掉,取出未领料的工单
-            var nbrList = _nbrMaster.Select(a => a.Domain == workOrdMasters[0].Domain && a.Type == "SM" && dbWorkOrds.Contains(a.WorkOrd));
+            var nbrList = _nbrMaster.Select(a => a.Domain == domain && a.Type == "SM" && dbWorkOrds.Contains(a.WorkOrd));
             var noNbrlist = nbrList.Select(p => p.WorkOrd).ToList();
             workOrdMasters = workOrdMasters.Where(p => !noNbrlist.Contains(p.WorkOrd)).ToList();
             if (workOrdMasters.Count == 0)
@@ -3428,7 +3602,7 @@ namespace Business.ResourceExamineManagement
             var ords = workOrdMasters.Select(p => p.WorkOrd).ToList();
 
             dbPeriodSequences = dbPeriodSequences.Where(p => ords.Contains(p.WorkOrds)).ToList();
-            await AutoCreatePickBill(workOrdMasters, dbPeriodSequences, nbrMasterList, nbrDetailList);
+            await AutoCreatePickBill(workOrdMasters, dbPeriodSequences, nbrMasterList, nbrDetailList, userAccount);
             if (nbrMasterList.Any())
             {
                 dbPeriodSequences.ForEach(p => { p.Status = "r"; });

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/NbrMaster.cs

@@ -112,6 +112,12 @@ namespace Business.Domain
         [Comment("备料人")]
         public string User1 { get; set; }
 
+        /// <summary>
+        /// 备料人
+        /// </summary>
+        [Comment("备料人")]
+        public string User2 { get; set; }
+
         /// <summary>
         /// 完成日期
         /// </summary>

+ 48 - 0
MicroServices/Business/Business.Domain/StructuredDB/WMS/EmpWorkDutyMaster.cs

@@ -0,0 +1,48 @@
+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.StructuredDB.WMS
+{
+    /// <summary>
+    /// 物料职责表
+    /// </summary>
+    [Comment("物料职责表")]
+    public class EmpWorkDutyMaster
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [Comment("主键")]
+        [Key]
+        public int RecID { get; set; }
+
+        /// <summary>
+        /// 域名
+        /// </summary>
+        [Comment("域名")]
+        public string Domain { get; set; }
+
+        /// <summary>
+        /// 账号
+        /// </summary>
+        [Comment("账号")]
+        public string Employee { get; set; }
+
+        /// <summary>
+        /// 起始编码
+        /// </summary>
+        [Comment("起始编码")]
+        public string ItemNum1 { get; set; }
+
+        /// <summary>
+        /// 结束编码
+        /// </summary>
+        [Comment("结束编码")]
+        public string ItemNum2 { get; set; }
+    }
+}

+ 42 - 0
MicroServices/Business/Business.Domain/StructuredDB/WMS/EmployeeMaster.cs

@@ -0,0 +1,42 @@
+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.StructuredDB.WMS
+{
+    /// <summary>
+    /// 雇员信息表
+    /// </summary>
+    [Comment("雇员信息表")]
+    public class EmployeeMaster
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [Comment("主键")]
+        [Key]
+        public int RecID { get; set; }
+
+        /// <summary>
+        /// 域名
+        /// </summary>
+        [Comment("域名")]
+        public string Domain { get; set; }
+
+        /// <summary>
+        /// 账号
+        /// </summary>
+        [Comment("账号")]
+        public string Employee { get; set; }
+
+        /// <summary>
+        /// 名称
+        /// </summary>
+        [Comment("名称")]
+        public string Name { get; set; }
+    }
+}

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

@@ -92,6 +92,16 @@ namespace Business.EntityFrameworkCore
         /// </summary>
         public DbSet<PeriodSequenceDet> PeriodSequenceDet { get; set; }
 
+        /// <summary>
+        /// 雇员信息表
+        /// </summary>
+        public DbSet<EmployeeMaster> EmployeeMaster { get; set; }
+
+        /// <summary>
+        /// 物料职责表
+        /// </summary>
+        public DbSet<EmpWorkDutyMaster> EmpWorkDutyMaster { get; set; }
+
         /// <summary>
         /// 生产线明细表
         /// </summary>

+ 15 - 7
MicroServices/Business/Business.HttpApi/Controllers/ResourceExamineController.cs

@@ -1,4 +1,5 @@
-using Business.Dto;
+using Business.Domain;
+using Business.Dto;
 using Business.ResourceExamineManagement;
 using Business.ResourceExamineManagement.Dto;
 using Microsoft.AspNetCore.Mvc;
@@ -50,9 +51,9 @@ namespace Business.Controllers
         /// <returns></returns>
         [HttpPost]
         [Route("CreatePickBill")]
-        public Task<string> CreatePickBill(string workOrds, string domain)
+        public Task<string> CreatePickBill(string workOrds, string domain, string userAccount)
         {
-            return _ResourceExamineAppService.CreatePickBill(workOrds, domain);
+            return _ResourceExamineAppService.CreatePickBill(workOrds, domain, userAccount);
         }
 
         /// <summary>
@@ -68,15 +69,15 @@ namespace Business.Controllers
         }
 
         /// <summary>
-        /// 资源检查
+        /// 齐套检查下达
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
         [HttpGet]
-        [Route("orderresourcecheck")]
-        public Task<string> OrderResourceCheck(int day, string companyid)
+        [Route("producedayplankittingcheck")]
+        public Task<string> ProduceDayPlanKittingCheck(string startime, string endtime, string domain, string userAccount)
         {
-            return _ResourceExamineAppService.OrderResourceCheck(day, companyid);
+            return _ResourceExamineAppService.ProduceDayPlanKittingCheck(startime, endtime, domain, userAccount);
         }
 
         /// <summary>
@@ -173,5 +174,12 @@ namespace Business.Controllers
         {
             return _ResourceExamineAppService.PrApprove(ids);
         }
+
+        [HttpGet]
+        [Route("ProduceWorkOrdKittingCheck")]
+        public Task<string> ProduceWorkOrdKittingCheck(string workord, string domain, string userAccount)
+        {
+            return _ResourceExamineAppService.ProduceWorkOrdKittingCheck(workord, domain, userAccount);
+        }
     }
 }