Просмотр исходного кода

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

Murphy 2 лет назад
Родитель
Сommit
27e40b3c67

+ 7 - 0
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/IResourceExamineAppService.cs

@@ -139,5 +139,12 @@ namespace Business.ResourceExamineManagement
         /// <param name="dto"></param>
         /// <returns></returns>
         Task<string> PrSendSAP(string companyid);
+
+        /// <summary>
+        /// Éú²úÈռƻ®×Ô¶¯·¢²¼
+        /// </summary>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        Task<string> ProductionDailyPlanAutoPublish(string domain);
     }
 }

+ 63 - 0
MicroServices/Business/Business.Application/DOP/HolidayHelper.cs

@@ -0,0 +1,63 @@
+using Business.Domain;
+using Business.EntityFrameworkCore.SqlRepositories;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Services;
+
+namespace Business.DOP
+{
+    public class HolidayHelper : ApplicationService
+    {
+        /// <summary>
+        /// 节假日记录表
+        /// </summary>
+        private ISqlRepository<HolidayMaster> _holidayMaster;
+
+        public HolidayHelper(ISqlRepository<HolidayMaster> holidayMaster) {
+            _holidayMaster = holidayMaster;
+        }
+
+        /// <summary>
+        /// 向前推进num个工作日,去掉节假日
+        /// </summary>
+        /// <param name="toTime"></param>
+        /// <param name="day"></param>
+        /// <returns></returns>
+        public DateTime GetWorkDateByWorkCalendar(DateTime toTime, int num, List<HolidayMaster> holidayList)
+        {
+            DateTime newTime = toTime.AddDays(-num);
+            //向前推进时间
+            //1.首先读取时间所处年份的节假日配置
+            
+            return ForwardDay(newTime, holidayList);
+        }
+
+        private DateTime ForwardDay(DateTime toTime, List<HolidayMaster> holidayList)
+        {
+            //2.判断当前月-日是否在补班日期中。
+            if (holidayList.Where(x => x.Dated.GetValueOrDefault().Date == toTime.Date && x.Ufld1 == "调班").Any())
+            {
+                return toTime;
+            }
+            //3.判断当前日期是否在法定节假日中
+            if (holidayList.Where(x => x.Dated.GetValueOrDefault().Date == toTime.Date && x.Ufld1 == "休假").Any())
+            {
+                toTime = toTime.AddDays(-1);
+                return ForwardDay(toTime, holidayList);
+            }
+            int week = (int)toTime.DayOfWeek;
+            if (week != 0 && week != 6)
+            {
+                return toTime;
+            }
+            else
+            {
+                toTime = toTime.AddDays(-1);
+                return ForwardDay(toTime, holidayList);
+            }
+        }
+    }
+}

+ 51 - 43
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -199,7 +199,7 @@ namespace Business.ResourceExamineManagement
                 level1Dto.sqty = level1Dto.sqty < 0 ? 0 : level1Dto.sqty;
                 level1Dto.lack_qty = level1Dto.needCount - level1Dto.sqty;
                 level1Dto.lack_qty = level1Dto.lack_qty < 0 ? 0 : level1Dto.lack_qty;
-                level1Dto.needCount = level1Dto.lack_qty;
+                //level1Dto.needCount = level1Dto.lack_qty;
                 if (level1Dto.sqty != 0)
                 {
                     if (level1Dto.lack_qty > 0)
@@ -275,7 +275,7 @@ namespace Business.ResourceExamineManagement
                 {
                     //占用不够,占用后减少缺料数量
                     level1Dto.lack_qty -= moo_qty;
-                    level1Dto.needCount = level1Dto.lack_qty;
+                    //level1Dto.needCount = level1Dto.lack_qty;
                     //平铺需要数量
                     CaclMaterialShortage(returnlist);
                     //先设定在制的齐套时间
@@ -322,28 +322,30 @@ namespace Business.ResourceExamineManagement
                         else if (level1Dto.erp_cls == 3)
                         {
                             //先找在途
-                            CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault());
-                            if (level1Dto.lack_qty > 0)
+                            decimal occqty = CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault());
+                            if (level1Dto.lack_qty - occqty > 0)
                             {
                                 decimal itemPRQty = srm_Pr_Mains.Where(x => x.icitem_id.Value == level1Dto.item_id && x.pr_sarrive_date <= plan_date).Sum(y => y.pr_aqty.GetValueOrDefault());
-                                if (itemPRQty < level1Dto.lack_qty)
+                                if (itemPRQty < level1Dto.lack_qty - occqty)
                                 {
-                                    level1Dto.lack_qty = level1Dto.lack_qty - itemPRQty;
+                                    //level1Dto.lack_qty = level1Dto.lack_qty - itemPRQty;
+                                    decimal lack_qty = level1Dto.lack_qty - itemPRQty;
                                     //采购申请
-                                    PackageSRMPR(level1Dto, bangid, sentrys, plan_date);
+                                    PackageSRMPR(level1Dto, bangid, sentrys, plan_date, lack_qty);
                                 }
                             }
                         }
                         else if (level1Dto.erp_cls == 2)
                         {
                             //先找在途
-                            CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault());
-                            if (level1Dto.lack_qty > 0)
+                            decimal occqty = CalcInTransit(sentrys, level1Dto, bangid, plan_date.GetValueOrDefault());
+                            decimal lack_qty = level1Dto.lack_qty - occqty;
+                            if (lack_qty > 0)
                             {
                                 //1.先生成委外工单。
-                                var mesorder = CreateMesOOder(level1Dto, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                                var mesorder = CreateMesOOder(level1Dto, lack_qty, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
                                 mesorder.ooentry_etime = plan_date.GetValueOrDefault().AddDays(-1);
-                                var srmprDto = PackageSRMPR(level1Dto, bangid, sentrys, plan_date);
+                                var srmprDto = PackageSRMPR(level1Dto, bangid, sentrys, plan_date, lack_qty);
                                 mesorder.ooentry_stime = plan_date.GetValueOrDefault().AddDays(-srmprDto.totalLeadTime.GetValueOrDefault());
 
                                 //先计算末级数据的齐套时间。
@@ -353,7 +355,7 @@ namespace Business.ResourceExamineManagement
                                     level1Dto.kitting_time = childList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());//加上物料的采购提前期
                                 }
 
-                                level1Dto.subcontracting_qty = level1Dto.lack_qty;
+                                level1Dto.subcontracting_qty = lack_qty;
                                 level1Dto.subcontracting_list = new List<ooder>();
                                 ooder oo = new ooder();
                                 oo.Id = mesorder.Id;
@@ -848,11 +850,12 @@ namespace Business.ResourceExamineManagement
                     if (param.checkflag || param.checkPlan)
                     {
                         //先找在途
-                        CalcInTransit(sentrys, item, bangid, plan_date.GetValueOrDefault());
-                        if (item.lack_qty > 0)
+                        decimal occqty = CalcInTransit(sentrys, item, bangid, plan_date.GetValueOrDefault());
+                        decimal lack_qty = item.lack_qty - occqty;
+                        if (lack_qty > 0)
                         {
                             //采购申请
-                            PackageSRMPR(item, bangid, sentrys, plan_date);
+                            PackageSRMPR(item, bangid, sentrys, plan_date, lack_qty);
                         }
                     }
                 }
@@ -862,13 +865,14 @@ namespace Business.ResourceExamineManagement
                     if (param.checkflag || param.checkPlan)
                     {
                         //先找在途
-                        CalcInTransit(sentrys, item, bangid, plan_date.GetValueOrDefault());
-                        if (item.lack_qty > 0)
+                        decimal occqty = CalcInTransit(sentrys, item, bangid, plan_date.GetValueOrDefault());
+                        decimal lack_qty = item.lack_qty - occqty;
+                        if (lack_qty > 0)
                         {
                             //1.先生成委外工单。
-                            var mesorder = CreateMesOOder(item, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.GetValueOrDefault());
+                            var mesorder = CreateMesOOder(item, lack_qty, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.GetValueOrDefault());
                             mesorder.ooentry_etime = plan_date.GetValueOrDefault().AddDays(-1);
-                            var srmprDto = PackageSRMPR(item, bangid, sentrys, plan_date);
+                            var srmprDto = PackageSRMPR(item, bangid, sentrys, plan_date, lack_qty);
                             mesorder.ooentry_stime = mesorder.ooentry_etime.GetValueOrDefault().AddDays(-(srmprDto.totalLeadTime.GetValueOrDefault() - 1));
                             //先计算末级数据的齐套时间。
                             if (cilList.Count > 0)
@@ -885,7 +889,7 @@ namespace Business.ResourceExamineManagement
                                     mesorder.ooentry_etime = mesorder.ooentry_stime.GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());
                                 }
                             }
-                            item.subcontracting_qty = item.lack_qty;
+                            item.subcontracting_qty = lack_qty;
                             item.subcontracting_list = new List<ooder>();
                             ooder oo = new ooder();
                             oo.Id = mesorder.Id;
@@ -1400,11 +1404,12 @@ namespace Business.ResourceExamineManagement
                             if (param.checkflag || param.checkPlan)
                             {
                                 //先找在途
-                                CalcInTransit(sentrys, sct, bangid, plan_date.GetValueOrDefault());
-                                if (sct.lack_qty > 0)
+                                decimal occqty = CalcInTransit(sentrys, sct, bangid, plan_date.GetValueOrDefault());
+                                decimal lack_qty = sct.lack_qty - occqty;
+                                if (lack_qty > 0)
                                 {
                                     //采购申请
-                                    PackageSRMPR(sct, bangid, sentrys, plan_date);
+                                    PackageSRMPR(sct, bangid, sentrys, plan_date, lack_qty);
                                 }
                             }
                         }
@@ -1413,13 +1418,14 @@ namespace Business.ResourceExamineManagement
                             if (param.checkflag || param.checkPlan)
                             {
                                 //先找在途
-                                CalcInTransit(sentrys, sct, bangid, plan_date.GetValueOrDefault());
-                                if (sct.lack_qty > 0)
+                                decimal occqty = CalcInTransit(sentrys, sct, bangid, plan_date.GetValueOrDefault());
+                                decimal lack_qty = sct.lack_qty - occqty;
+                                if (lack_qty > 0)
                                 {
                                     //1.先生成委外工单。
-                                    var mesorder = CreateMesOOder(sct, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.GetValueOrDefault());
+                                    var mesorder = CreateMesOOder(sct, lack_qty, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.GetValueOrDefault());
                                     mesorder.ooentry_etime = plan_date.GetValueOrDefault().AddDays(-1);
-                                    var srmprDto = PackageSRMPR(sct, bangid, sentrys, plan_date);
+                                    var srmprDto = PackageSRMPR(sct, bangid, sentrys, plan_date, lack_qty);
                                     mesorder.start_time = mesorder.ooentry_etime.GetValueOrDefault().AddDays(-(srmprDto.totalLeadTime.GetValueOrDefault() - 1));
 
                                     //先计算末级数据的齐套时间。
@@ -1428,7 +1434,7 @@ namespace Business.ResourceExamineManagement
                                         CalcIcitem(cilList, returnlist, bangid, sklist, mesorder.ooentry_stime, icitemlist, sentrys, childidList);
                                         sct.kitting_time = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(srmprDto.totalLeadTime.GetValueOrDefault());//加上物料的采购提前期
                                     }
-                                    sct.subcontracting_qty = sct.lack_qty;
+                                    sct.subcontracting_qty = lack_qty;
                                     sct.subcontracting_list = new List<ooder>();
                                     ooder oo = new ooder();
                                     oo.Id = mesorder.Id;
@@ -1494,7 +1500,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="returnlist"></param>
         /// <param name="factoryid"></param>
         /// <param name="orderType">2委外采购申请单,3采购申请单</param>
-        private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, long? companyId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, List<mo_ic_item> planList, crm_seorderentry sentrys, DateTime? plan_date)
+        private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, decimal lack_qty, long? companyId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, List<mo_ic_item> planList, crm_seorderentry sentrys, DateTime? plan_date)
         {
             SRMPRDto sRMPR = new SRMPRDto();
             mo_srm_purchase supplier = null;
@@ -1607,16 +1613,16 @@ namespace Business.ResourceExamineManagement
             srm_Pr.pr_purchasename = supplier.supplier_name;//供应商名称
             srm_Pr.pr_purchaser = supplier.order_rector_name;//采购员
             srm_Pr.pr_purchaser_num = supplier.order_rector_num;//采购员工号(采购信息表)
-            decimal qty = returnlist.lack_qty;
+            decimal qty = lack_qty;
             //数量圆整 按最小包装量向上圆整
             if (supplier.packaging_qty.GetValueOrDefault() != 0)
             {
-                decimal count = Math.Ceiling(returnlist.lack_qty / supplier.packaging_qty.GetValueOrDefault());
+                decimal count = Math.Ceiling(lack_qty / supplier.packaging_qty.GetValueOrDefault());
                 qty = count * supplier.packaging_qty.GetValueOrDefault();
             }
             //判断最小起订量
             qty = qty > supplier.qty_min.GetValueOrDefault() ? qty : supplier.qty_min.GetValueOrDefault();
-            srm_Pr.pr_rqty = returnlist.lack_qty;//需求数量
+            srm_Pr.pr_rqty = lack_qty;//需求数量
             srm_Pr.pr_aqty = qty;//申请数量
             srm_Pr.pr_sqty = qty;//建议数量
             srm_Pr.icitem_id = returnlist.item_id;//物料id
@@ -1692,7 +1698,7 @@ namespace Business.ResourceExamineManagement
                 srm_Po_Occupy.morder_id = mes_morder.Id;
                 srm_Po_Occupy.morder_mo = mes_morder.morder_no;
             }
-            srm_Po_Occupy.qty = returnlist.lack_qty;
+            srm_Po_Occupy.qty = lack_qty;
             srm_Po_Occupy.type = MorderEnum.Zyjc_Type;//TODO:类型未知
             srm_Po_Occupy.stime = srm_Pr.pr_ssend_date;
             srm_Po_Occupy.etime = srm_Pr.pr_sarrive_date;
@@ -1718,7 +1724,7 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         /// <param name="returnlist"></param>
         /// <param name="factoryid"></param>
-        private mo_mes_oorder CreateMesOOder(BomChildExamineDto returnlist, long? companyId, long factoryid, long bangId, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, DateTime deliveryDate)
+        private mo_mes_oorder CreateMesOOder(BomChildExamineDto returnlist, decimal lack_qty, long? companyId, long factoryid, long bangId, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, DateTime deliveryDate)
         {
             mo_mes_oorder oOrder = new mo_mes_oorder();
             oOrder.GenerateNewId(help.NextId());
@@ -1742,9 +1748,9 @@ namespace Business.ResourceExamineManagement
             oOrder.bom_number = returnlist.bom_number;//bom编码
             oOrder.unit = returnlist.unit;//单位
             oOrder.morder_progress = "";//工单进度
-            oOrder.morder_production_number = returnlist.lack_qty;//工单生产数量(计划数量)
-            oOrder.need_number = returnlist.lack_qty;//需求数量
-            oOrder.remaining_number = returnlist.lack_qty;//剩余可用数量
+            oOrder.morder_production_number = lack_qty;//工单生产数量(计划数量)
+            oOrder.need_number = lack_qty;//需求数量
+            oOrder.remaining_number = lack_qty;//剩余可用数量
             oOrder.work_number = 0;//报工数量
             oOrder.inspection_number = 0;//报检数量
             oOrder.qualified_number = 0;//合格数量
@@ -1774,7 +1780,7 @@ namespace Business.ResourceExamineManagement
         /// <summary>
         /// 计算在途
         /// </summary>
-        public void CalcInTransit(crm_seorderentry sentrys, BomChildExamineDto item, long bangid, DateTime plan_date)
+        public decimal CalcInTransit(crm_seorderentry sentrys, BomChildExamineDto item, long bangid, DateTime plan_date)
         {
             _purchaseOrderAppService.mo_Srm_Po_Lists = srm_Po_Lists; //采购明细
             _purchaseOrderAppService.srm_Po_Occupies = srm_Po_Occupies; //采购明细
@@ -1782,11 +1788,12 @@ namespace Business.ResourceExamineManagement
             _purchaseOrderAppService.mes_morder = mes_morder;//当前工单传递进去。
 
             var occupylist = _purchaseOrderAppService.CheckPurchaseOrder(sentrys, item.item_id, item.lack_qty, plan_date, ic_item_List, bangid);
+            decimal occqty = 0;
             if (occupylist.Any())
             {
-                decimal occqty = occupylist.Sum(s => s.qty.GetValueOrDefault());
+                occqty = occupylist.Sum(s => s.qty.GetValueOrDefault());
                 item.purchase_occupy_qty = occqty;
-                item.lack_qty -= occqty;
+                //item.lack_qty -= occqty;
                 item.purchase_occupy_list = new List<purchase_occupy>();
                 item.kitting_time = occupylist[0].etime;
                 occupylist.ForEach(s => {
@@ -1811,12 +1818,13 @@ namespace Business.ResourceExamineManagement
                 srm_Po_Occupies.AddRange(occupylist);
                 srm_Po_OccupiesInsert.AddRange(occupylist);
             }
+            return occqty;
         }
 
-        public SRMPRDto PackageSRMPR(BomChildExamineDto item,long bangid, crm_seorderentry sentrys, DateTime? plan_date)
+        public SRMPRDto PackageSRMPR(BomChildExamineDto item,long bangid, crm_seorderentry sentrys, DateTime? plan_date, decimal lack_qty)
         {
             //采购申请
-            var SRMPRDto = CreateSRMPR(item, param.company_id, param.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, ic_item_List, sentrys, plan_date);
+            var SRMPRDto = CreateSRMPR(item, lack_qty, param.company_id, param.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, ic_item_List, sentrys, plan_date);
             item.purchase_list = new List<purchase>();
             if (SRMPRDto.srm_Pr_Main != null)
             {
@@ -1843,7 +1851,7 @@ namespace Business.ResourceExamineManagement
             }
             if (item.erp_cls == 3)
             {
-                item.purchase_qty = item.lack_qty;
+                item.purchase_qty = lack_qty;
                 item.purchase_list = new List<purchase>();
             }
             if (SRMPRDto.lastStartTmie > item.kitting_time)

+ 22 - 17
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs

@@ -4079,17 +4079,20 @@ namespace Business.ResourceExamineManagement
             //如果产线有准备时间记录且准备开始时间在当前时间之前,说明已在排产中,此时不需要重新获取产线
             if (curRecord != null && curRecord.StartTime < actStart)
             {
-                var curLine = lines.First(p=>p.Line == curRecord.Line);
-                //计算产线实际开始时间
-                //产线工作日历:当前产线的工作日历 + 默认工作日历
-                var curCalendars = calendars.Where(p => p.ProdLine == curLine.Line || string.IsNullOrEmpty(p.ProdLine)).ToList();
-                var curQtyDtls = qualityLines.Where(p => p.ProdLine == curLine.Line).ToList();
-                actStart = CalcActStartTime(curLine.Line, actStart, curCalendars, curQtyDtls);
-                lineStart.RecID = curLine.RecID;
-                lineStart.Line = curLine.Line;
-                lineStart.StartTime = actStart;
-                lineStart.setupTime = curLine.SetupTime;
-                lineStart.Rate = curLine.Rate;
+                var curLine = lines.FirstOrDefault(p=>p.Line == curRecord.Line);
+                if (curLine != null)
+                {
+                    //计算产线实际开始时间
+                    //产线工作日历:当前产线的工作日历 + 默认工作日历
+                    var curCalendars = calendars.Where(p => p.ProdLine == curLine.Line || string.IsNullOrEmpty(p.ProdLine)).ToList();
+                    var curQtyDtls = qualityLines.Where(p => p.ProdLine == curLine.Line).ToList();
+                    actStart = CalcActStartTime(curLine.Line, actStart, curCalendars, curQtyDtls);
+                    lineStart.RecID = curLine.RecID;
+                    lineStart.Line = curLine.Line;
+                    lineStart.StartTime = actStart;
+                    lineStart.setupTime = curLine.SetupTime;
+                    lineStart.Rate = curLine.Rate;
+                }
             }
             else {
                 //获取第一条产线排产结束时间
@@ -4480,12 +4483,14 @@ namespace Business.ResourceExamineManagement
             //如果产线有准备时间记录且准备开始时间在当前时间之前,说明已在排产中,此时不需要重新获取产线
             if (curRecord != null && curRecord.StartTime < scheTime)
             {
-                var curLine = lines.First(p => p.Line == curRecord.Line);
-                startDto.RecID = curLine.RecID;
-                startDto.Line = curLine.Line;
-                startDto.StartTime = scheTime;
-                startDto.setupTime = curLine.SetupTime;
-                startDto.Rate = curLine.Rate;
+                var curLine = lines.FirstOrDefault(p => p.Line == curRecord.Line);
+                if (curLine != null) {
+                    startDto.RecID = curLine.RecID;
+                    startDto.Line = curLine.Line;
+                    startDto.StartTime = scheTime;
+                    startDto.setupTime = curLine.SetupTime;
+                    startDto.Rate = curLine.Rate;
+                }
             }
             else {
                 //获取第一条产线排产结束时间

+ 86 - 7
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -2,6 +2,7 @@ using Amazon.Runtime.Internal.Util;
 using Business.Core.Enum;
 using Business.Core.Utilities;
 using Business.Domain;
+using Business.DOP;
 using Business.Dto;
 using Business.EntityFrameworkCore;
 using Business.EntityFrameworkCore.SqlRepositories;
@@ -313,6 +314,8 @@ namespace Business.ResourceExamineManagement
 
         private readonly SerialNumberAppService _serialNumberAppService;
 
+        private readonly HolidayHelper _holidayHelper;
+
         /// <summary>
         /// 优先级
         /// </summary>
@@ -492,6 +495,7 @@ namespace Business.ResourceExamineManagement
             IRepository<srm_purchase, long> srmPurchase,
             IUnitOfWorkManager unitOfWorkManager,
             SerialNumberAppService serialNumberAppService,
+            HolidayHelper holidayHelper,
             ReplenishmentAppService replenishmentAppService,
             IRepository<ReplenishmentWeekPlan,long> replenishmentWeekPlan,
             ISqlRepository<InvMaster> invMaster
@@ -584,6 +588,7 @@ namespace Business.ResourceExamineManagement
             _unitOfWorkManager = unitOfWorkManager;
             _scheduleResultOpMaster = scheduleResultOpMaster;
             _serialNumberAppService = serialNumberAppService;
+            _holidayHelper = holidayHelper;
             _replenishmentAppService = replenishmentAppService;
             _replenishmentWeekPlan = replenishmentWeekPlan;
             _invMaster = invMaster;
@@ -2854,12 +2859,12 @@ namespace Business.ResourceExamineManagement
         /// <returns></returns>
         public async Task<string> ProduceDayPlanKittingCheck(string startime,string endtime,string domain, string userAccount)
         {
-            DateTime stime = DateTime.Now.Date.AddDays(-100);
+            DateTime stime = DateTime.Now.AddDays(1).Date;
             if (!string.IsNullOrEmpty(startime))
             {
                 DateTime.TryParse(startime, out stime);
             }
-            DateTime etime = DateTime.Now.Date.AddYears(2);
+            DateTime etime = stime.AddDays(6);
             if (!string.IsNullOrEmpty(endtime))
             {
                 DateTime.TryParse(endtime, out etime);
@@ -3717,6 +3722,9 @@ namespace Business.ResourceExamineManagement
                 var Items = _mysql_ic_item.GetListAsync(s => workDetails.Select(c => c.ItemNum).Contains(s.number) && s.factory_id.ToString() == workOrdMasters[0].Domain).Result;
                 List<ItemMaster> itemMasterList = _itemMaster.Select(p => workDetails.Select(c => c.ItemNum).Contains(p.ItemNum) && p.Domain == workOrdMasters[0].Domain).Distinct().ToList();
 
+                //1.读取配置的补班、法休。默认周六周日休息,如果周六是工作日,需在配置中维护好每周六的都设置为补班。
+                var holidayList = _holidayMaster.Select(x => x.IsActive == true && x.Domain == workOrdMasters[0].Domain && (x.Dated.Value.Year == DateTime.Now.Year || x.Dated.Value.Year == DateTime.Now.Year + 1)).ToList();
+
                 //按照工单领料,之前是按照排产日期和产线分别领料
                 foreach (var workord in workOrdMasters)
                 {
@@ -3756,13 +3764,13 @@ namespace Business.ResourceExamineManagement
                     if (noCleanDetail.Any())
                     {
                         //无需前处理领料单
-                        GenerateNbr(workord, cleanTime, defaultLine, userAccount, nbrMasterList, nbrDetailList, noCleanDetail, itemLocList, ewdmList, LocationTo, user,"");
+                        GenerateNbr(workord, cleanTime, defaultLine, userAccount, nbrMasterList, nbrDetailList, noCleanDetail, itemLocList, ewdmList, LocationTo, user,"", holidayList);
                     }
                     if (cleanDetail.Any())
                     {
                         //需要前处理的领料单
                         cleanTime = Items.Where(s=> cleanDetail.Select(i=>i.ItemNum).Contains(s.number)).Max(s => s.clean_leadtime.GetValueOrDefault());
-                        GenerateNbr(workord, cleanTime, defaultLine, userAccount, nbrMasterList, nbrDetailList, cleanDetail, itemLocList, ewdmList, LocationTo, user, "PrevProcess");
+                        GenerateNbr(workord, cleanTime, defaultLine, userAccount, nbrMasterList, nbrDetailList, cleanDetail, itemLocList, ewdmList, LocationTo, user, "PrevProcess", holidayList);
                     }
                     
 
@@ -3836,15 +3844,20 @@ namespace Business.ResourceExamineManagement
             }
         }
 
-        private void GenerateNbr(WorkOrdMaster workord,decimal cleanTime, LineMaster defaultLine, string userAccount, List<NbrMaster> nbrMasterList, List<NbrDetail> nbrDetailList, List<WorkOrdDetail> detail, List<ItemMaster> itemLocList, List<EmpWorkDutyMaster> ewdmList, string LocationTo,EmployeeMaster user,string TransType)
+        private void GenerateNbr(WorkOrdMaster workord,decimal cleanTime, LineMaster defaultLine, string userAccount, List<NbrMaster> nbrMasterList, List<NbrDetail> nbrDetailList, List<WorkOrdDetail> detail, List<ItemMaster> itemLocList, List<EmpWorkDutyMaster> ewdmList, string LocationTo,EmployeeMaster user,string TransType, List<HolidayMaster> holidayList)
         {
             string Nbr = help.NextId().ToString();
-            DateTime eff = workord.OrdDate.GetValueOrDefault().Date.AddDays(-1);
-            DateTime start = eff.AddDays((double)(0 - cleanTime));
+            //DateTime eff = workord.OrdDate.GetValueOrDefault().Date.AddDays(-1);
+            DateTime eff = _holidayHelper.GetWorkDateByWorkCalendar(workord.OrdDate.GetValueOrDefault(), 1, holidayList);
+            DateTime start = _holidayHelper.GetWorkDateByWorkCalendar(eff, (int)Math.Ceiling(cleanTime), holidayList);
             if (start <= DateTime.Now.Date)
             {
                 start = DateTime.Now.Date;
             }
+            if (eff <= DateTime.Now.Date)
+            {
+                eff = DateTime.Now.Date;
+            }
             var newNbr = new NbrMaster
             {
                 Domain = workord.Domain,
@@ -4086,6 +4099,7 @@ namespace Business.ResourceExamineManagement
                     seqId++;
                 });
                 var nbrlistDto = _serialNumberAppService.GetBillNo(workOrdMasters[0].Domain, "SM", nbrMasterList.Count, userAccount, 1);
+
                 if (nbrlistDto.Any())
                 {
                     index = 0;
@@ -4897,5 +4911,70 @@ namespace Business.ResourceExamineManagement
                 return rst;
             }
         }
+
+        /// <summary>
+        /// 日计划自动发布
+        /// </summary>
+        public async Task<string> ProductionDailyPlanAutoPublish(string domain)
+        {
+            //取数开始时间为当前日期
+            DateTime startTime = DateTime.Now.Date;
+            DateTime endDate = DateTime.Now.Date.AddDays(4);
+
+            var periodList = _periodSequenceDet.Select(x => x.PlanDate >= startTime && x.PlanDate <= endDate && string.IsNullOrEmpty(x.Status) == true && x.Domain == domain).ToList();
+            if (periodList.Any())
+            {
+                try
+                {
+                    List<PeriodSequenceDet> updateList = new List<PeriodSequenceDet>();
+                    var workords = periodList.Select(s => s.WorkOrds);
+                    var workordList = _workOrdMaster.Select(x => x.Domain == domain && x.Status.ToLower() == "r" && workords.Contains(x.WorkOrd)).ToList();
+                    var nbrMasterList = _nbrMaster.Select(x => x.Domain == domain && x.Type == "SM" && workords.Contains(x.WorkOrd)).ToList();
+                    foreach (var work in workordList)
+                    {
+                        bool flag = false;
+                        var nbrlist = nbrMasterList.Where(s => s.WorkOrd == work.WorkOrd).ToList();
+                        if (nbrlist.Any())
+                        {
+                            flag = true;
+                            foreach (var nbr in nbrlist)
+                            {
+                                //还有未出库数据
+                                if (nbr.Status.ToLower() != "c")
+                                {
+                                    flag = false;
+                                    break;
+                                }
+                                //需要前处理,但是前处理还未完成
+                                if (nbr.TransType == "PrevProcess" && nbr.Ufld1 != "completed")
+                                {
+                                    flag = false;
+                                    break;
+                                }
+                            }
+                        }
+                        if (flag)
+                        {
+                            var publish = periodList.Where(x => x.WorkOrds == work.WorkOrd).ToList();
+                            publish.ForEach(x =>
+                            {
+                                x.Status = "r";
+                            });
+                            updateList.AddRange(publish);
+                        }
+                    }
+                    if (updateList.Any())
+                    {
+                        _periodSequenceDet.Update(updateList);
+                    }
+                }
+                catch (Exception e)
+                {
+                    new NLogHelper("ResourceExamineAppService").WriteLog("ProductionDailyPlanAutoPublish", "日计划自动任务失败:" + e.Message, _currentTenant.Id.ToString());
+                    return "保存失败,请联系管理员。";
+                }
+            }
+            return "ok";
+        }
     }
 }

+ 21 - 24
MicroServices/Business/Business.Application/SystemJobManagement/SystemJobAppService.cs

@@ -1018,13 +1018,15 @@ namespace Business.SystemJobManagement
 
         private async Task<string> SyncPurOrd(string domain,string companyid)
         {
-            DateTime time = DateTime.Now.AddMonths(-2).Date;
+            DateTime time = DateTime.Now.AddDays(-1).Date;
+
+            var masters = _purOrdMaster.Select(x => x.Domain == domain && x.UpdateTime >= time).ToList();
+            var details = _purOrdDetail.Select(x => x.Domain == domain && x.UpdateTime >= time).ToList();
+            var supplierList = _mysql_srm_supplier.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid && masters.Select(c => c.Supp).Contains(x.supplier_no)).Result;
 
-            var masters = _purOrdMaster.Select(x => x.Domain == domain && x.CreateTime>= time).ToList();
-            var details = _purOrdDetail.Select(x => x.Domain == domain && x.CreateTime >= time).ToList();
             //日期上多查询一天。
-            var pomains = _srm_po_main.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid && x.create_time >= time.AddDays(-1)).Result;
-            var polists = _srm_po_list.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid && x.create_time >= time.AddDays(-1)).Result;
+            var pomains = _srm_po_main.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid && masters.Select(c => c.PurOrd).Contains(x.po_billno)).Result;
+            var polists = _srm_po_list.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid && pomains.Select(c => c.Id).Contains(x.po_id.GetValueOrDefault())).Result;
             List<ic_item> itemList = _mysql_ic_item.GetListAsync(x => x.factory_id.ToString() == domain && x.company_id.ToString() == companyid).Result;
             List<srm_po_main> poList = new List<srm_po_main>();
             List<srm_po_list> detailList = new List<srm_po_list>();
@@ -1034,7 +1036,6 @@ namespace Business.SystemJobManagement
 
             List<srm_po_list> addPolist = new List<srm_po_list>();
             List<srm_po_list> updatePolist = new List<srm_po_list>();
-            List<srm_po_list> delPolist = new List<srm_po_list>();
 
             try
             {
@@ -1052,7 +1053,11 @@ namespace Business.SystemJobManagement
                         po.GenerateNewId(help.NextId());
                         po.po_billno = m.PurOrd;
                         //var pr = list.Find(s => s.Id == dto.polist[0].pr_id);
-                        //var itemsupplier = itemsupplierList.Find(a => a.Id == pr.pr_purchaseid);
+                        var itemsupplier = supplierList.Find(a => a.supplier_no == m.Supp);
+                        if (itemsupplier == null)
+                        {
+                            continue;
+                        }
                         //po.po_purchaser = m.;
                         po.po_purchaser_no = m.Buyer;
                         po.po_ssend_date = m.OrdDate;
@@ -1062,10 +1067,10 @@ namespace Business.SystemJobManagement
                         po.po_order_type = 1;
                         po.po_total = 0;
                         po.supplier_type = m.USAGE;
-                        //po.currency = pr.currencytype;
+                        po.currency = m.Curr == "CNY" ? 1 : 0;
                         po.bill_type = 1;
-                        //po.supplier_id = pr.pr_purchaseid;
-                        //po.supplier_name = m.;
+                        po.supplier_id = itemsupplier.Id;
+                        po.supplier_name = itemsupplier.supplier_name;
                         po.supplier_no = m.Supp;
                         //po.contact = m.cus;
                         po.suppliertelephone = m.CustPhone;
@@ -1077,6 +1082,7 @@ namespace Business.SystemJobManagement
                         po.create_time = DateTime.Now;
                         po.factory_id = long.Parse(domain);
                         po.company_id = long.Parse(companyid);
+                        po.tenant_id = long.Parse(companyid);
                         po.po_delivery = 1;
                         addPo.Add(po);
                     }
@@ -1084,15 +1090,11 @@ namespace Business.SystemJobManagement
 
                     var dtls = details.Where(x => x.PurOrdRecID == m.RecID).ToList();
                     var plists = polists.Where(x => x.po_id == po.Id).ToList();
-                    //所有数据先默认删除
-                    delPolist.AddRange(plists);
                     foreach (var dtl in dtls)
                     {
                         var plist = plists.Find(x => x.number == dtl.ItemNum);
                         if (plist != null)
                         {
-                            //如果有存在,则从删除集合移除
-                            delPolist.Remove(plist);
                             plist.state = dtl.Status.ToUpper() == "C" ? 0 : 1;
                             updatePolist.Add(plist);
                         }
@@ -1119,10 +1121,9 @@ namespace Business.SystemJobManagement
                             //plist.taxamount = item.pr_orderprice.GetValueOrDefault() - podetail.netmoney;
                             plist.plan_qty = dtl.QtyOrded.GetValueOrDefault();
                             plist.unit = icitem.unit;
-                            plist.state = dtl.Status.ToUpper() == "C" ? 0 : 1;
                             plist.rarrdate = dtl.DueDate;
                             plist.rnumber = 0;
-                            //plist.currencytype = m.Curr;
+                            plist.currencytype = po.currency;
                             plist.create_time = DateTime.Now;
                             plist.factory_id = po.factory_id;
                             plist.company_id = po.company_id;
@@ -1135,23 +1136,19 @@ namespace Business.SystemJobManagement
                 }
                 if (addPo.Any())
                 {
-                    await _srm_po_main.InsertManyAsync(addPo);
+                    await _businessDbContext.BulkInsertAsync(addPo);
                 }
                 if (updatePo.Any())
                 {
-                    await _srm_po_main.UpdateManyAsync(updatePo);
+                    await _businessDbContext.BulkUpdateAsync(updatePo);
                 }
                 if (addPolist.Any())
                 {
-                    await _srm_po_list.InsertManyAsync(addPolist);
+                    await _businessDbContext.BulkInsertAsync(addPolist);
                 }
                 if (updatePolist.Any())
                 {
-                    await _srm_po_list.UpdateManyAsync(updatePolist);
-                }
-                if (delPolist.Any())
-                {
-                    await _srm_po_list.HardDeleteAsync(delPolist);
+                    await _businessDbContext.BulkUpdateAsync(updatePolist);
                 }
             }
             catch(Exception ex)

+ 12 - 0
MicroServices/Business/Business.HttpApi/Controllers/ResourceExamineController.cs

@@ -248,5 +248,17 @@ namespace Business.Controllers
         {
             return _ResourceExamineAppService.PrSendSAP(companyid);
         }
+
+        /// <summary>
+        /// 生产日计划自动发布
+        /// </summary>
+        /// <param name="workOrd"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("ProductionDailyPlanAutoPublish")]
+        public Task<string> ProductionDailyPlanAutoPublish(string domain)
+        {
+            return _ResourceExamineAppService.ProductionDailyPlanAutoPublish(domain);
+        }
     }
 }