Sfoglia il codice sorgente

领料单日期判断工作日。采购单同步逻辑调整。

tangdi 2 anni fa
parent
commit
f1e10f2259

+ 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);
+            }
+        }
+    }
+}

+ 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

@@ -1017,13 +1017,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(-7).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>();
@@ -1033,7 +1035,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
             {
@@ -1051,7 +1052,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;
@@ -1061,10 +1066,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;
@@ -1076,6 +1081,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);
                     }
@@ -1083,15 +1089,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);
                         }
@@ -1118,10 +1120,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;
@@ -1134,23 +1135,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);
+        }
     }
 }