Murphy 2 лет назад
Родитель
Сommit
5fafd1aeb7

+ 215 - 29
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -26,6 +26,8 @@ using Business.StructuredDB.Replenishment;
 using System.ComponentModel.Design;
 using Newtonsoft.Json.Linq;
 using MathNet.Numerics.RootFinding;
+using Microsoft.EntityFrameworkCore;
+using System.ComponentModel.DataAnnotations;
 
 namespace Business.Replenishment
 {
@@ -57,6 +59,7 @@ namespace Business.Replenishment
         private readonly IRepository<srm_pr_main, long> _mysql_srm_pr_main;
         private readonly IRepository<mo_srm_po_occupy, long> _srm_po_occupy;
         private readonly IRepository<srm_po_occupy, long> _mysql_srm_po_occupy;
+        private readonly IRepository<srm_pr_main_occupy, long> _mysql_srm_pr_main_occupy;
         private readonly IRepository<mo_mes_morder, long> _mes_morder;
         private readonly IRepository<mo_mes_moentry, long> _mes_moentry;
         private readonly IRepository<mo_mes_mooccupy, long> _mes_mooccupy;
@@ -237,6 +240,7 @@ namespace Business.Replenishment
             IRepository<srm_pr_main, long> mysql_srm_pr_main,
             IRepository<mo_srm_po_occupy, long> srm_po_occupy,
             IRepository<srm_po_occupy, long> mysql_srm_po_occupy,
+            IRepository<srm_pr_main_occupy, long> mysql_srm_pr_main_occupy,
             IRepository<mo_mes_morder, long> mes_morder,
             IRepository<mo_mes_moentry, long> mes_moentry,
             IRepository<mo_mes_mooccupy, long> mes_mooccupy,
@@ -318,7 +322,8 @@ namespace Business.Replenishment
             _mysql_srm_pr_main= mysql_srm_pr_main;
             _srm_po_occupy = srm_po_occupy;
             _mysql_srm_po_occupy = mysql_srm_po_occupy;
-            _mes_morder= mes_morder;
+            _mysql_srm_pr_main_occupy = mysql_srm_pr_main_occupy;
+            _mes_morder = mes_morder;
             _mes_moentry = mes_moentry;
             _mes_mooccupy = mes_mooccupy;
             _mysql_mes_mooccupy = mysql_mes_mooccupy;
@@ -503,6 +508,11 @@ namespace Business.Replenishment
                 annualProductionOutline.Totalhours = annualProductionOutline.AssemblyHours + annualProductionOutline.HeatSealingHours + annualProductionOutline.Totalhours;
                 annualProductionOutline.OrderNum = item.OrderNum;
                 annualProductionOutlines.Add(annualProductionOutline);
+                annualProductionOutline.create_time= DateTime.Now;
+                annualProductionOutline.tenant_id = input.tenant_id;
+                annualProductionOutline.company_id= input.company_id;
+                annualProductionOutline.factory_id= input.factory_id;
+                annualProductionOutline.org_id= input.org_id;
                 frontYearDemand.Add(item);
             }
             //保存数据
@@ -531,34 +541,79 @@ namespace Business.Replenishment
         public async Task<string> SaveProductionMasterPlan(InputDto input)
         {
             //计算当前年月的N0,N+1,N+2
-            List<string> planMons = new List<string>();
-            string strN0 = input.year.ToString() + "-" + input.month.ToString("00");
-            planMons.Add(strN0);
-            int newYear = input.month == 12 ? input.year + 1 : input.year;
-            int newMonth = input.month == 12 ? 1 : input.month + 1;
-            string strN1 = newYear.ToString() + "-" + newMonth.ToString("00");
-            planMons.Add(strN1);
-            newYear = newMonth == 12 ? newYear + 1 : newYear;
-            newMonth = newMonth == 12 ? 1 : newMonth + 1;
-            string strN2 = newYear.ToString() + "-" + newMonth.ToString("00");
-            planMons.Add(strN2);
+            List<string> planMons = GetPlanMonth(3);
+            List<ProductionMasterPlan> productionMasters= new List<ProductionMasterPlan>();
+            List<ProductionMasterPlan> pre3MonthPlan = _productionMasterPlan.GetListAsync(a => GetPlanMonth(-3).Contains(a.PlanMonth) && a.factory_id == input.factory_id && a.tenant_id == input.tenant_id && a.company_id == input.company_id).Result;
             //N0,N+1,N+2月度发货计划
-            var productionMasterPlan = _productionMasterPlan.GetListAsync(x => x.Year == input.year && !x.IsDeleted && x.tenant_id == input.tenant_id && x.company_id == input.company_id && x.factory_id == input.factory_id && planMons.Contains(x.PlanMonth)).Result.OrderBy(p => p.OrderNum).ThenBy(o => o.PlanMonth).ToList();
-            foreach (var item in productionMasterPlan)
+            var annualProduction = _replenishmentAnnualProduction.GetListAsync(x => planMons.Contains(x.PlanMonth) && !x.IsDeleted && x.tenant_id == input.tenant_id && x.company_id == input.company_id && x.factory_id == input.factory_id).Result.OrderBy(p => p.PlanMonth).ThenBy(o => o.OrderNum).ToList();
+            
+            var productionMasterPlan = _productionMasterPlan.GetListAsync(x => planMons.Contains(x.PlanMonth) && !x.IsDeleted && x.tenant_id == input.tenant_id && x.company_id == input.company_id && x.factory_id == input.factory_id).Result.OrderBy(p => p.PlanMonth).ThenBy(o => o.OrderNum).ToList();
+            List<LocationDetail> locations = _locationDetail.Select(x => annualProduction.Select(m => m.SAPItemNumber).Contains(x.ItemNum) && x.Domain == input.factory_id.ToString() && x.IsActive).ToList();
+            var InProdcutQty=GetInProdcutQty(annualProduction.Select(m => m.SAPItemNumber).ToList(),input);
+            var itemStock = CalcStock(annualProduction.Select(m => m.SAPItemNumber).ToList(),input);
+            foreach (var item in annualProduction)
             {
+                ProductionMasterPlan plan = new ProductionMasterPlan();
+                plan.Area = item.Area;
+                plan.ProdLine = item.ProdLine;
+                plan.ProdRange = item.ProdRange;
+                plan.WorkshopLine = item.WorkshopLine;
+                plan.ItemNumber = item.SAPItemNumber;
+                plan.Model = item.Model;
+                plan.Languages = item.Languages;
+                plan.PlanMonth = item.PlanMonth;
+                plan.PlanShipQty = item.Qty;
+                //计划生产数量取下个月计划发货数量的一半
+                plan.PlanProductQty = item.Qty- itemStock.Find(a => a.ItemNumber == item.SAPItemNumber).Qty- InProdcutQty.Find(a => a.ItemNumber == item.SAPItemNumber).Qty;//发货计划-(库存+在制)
 
-            }
-
-
-
-
+                plan.PlanStockQty= item.Qty;//TODO:期末库存怎么算?
 
+                if(locations.FirstOrDefault(a => a.ItemNum == item.SAPItemNumber && a.Location == "8001")!=null)
+                {
+                    plan.Inventory = locations.FirstOrDefault(a => a.ItemNum == item.SAPItemNumber && a.Location == "8001").QtyOnHand;
+                }else
+                {
+                    plan.Inventory = 0;
+                }
+                if (locations.FirstOrDefault(a => a.ItemNum == item.SAPItemNumber && a.Location == "8000") != null)
+                {
+                    plan.Inventory1 = locations.FirstOrDefault(a => a.ItemNum == item.SAPItemNumber && a.Location == "8000").QtyOnHand;
+                }
+                else
+                {
+                    plan.Inventory1 = 0;
+                }
+                if (locations.FirstOrDefault(a => a.ItemNum == item.SAPItemNumber && a.Location == "5008") != null)
+                {
+                    plan.Inventory2 = locations.FirstOrDefault(a => a.ItemNum == item.SAPItemNumber && a.Location == "5008").QtyOnHand;
+                }
+                else
+                {
+                    plan.Inventory2 = 0;
+                }
+                plan.DuringSterilization = 0;//TODO:灭菌中需要从委外订单接口获取
+                plan.InProduction = InProdcutQty.Find(a=>a.ItemNumber==item.SAPItemNumber).Qty;
+                if(pre3MonthPlan.Where(a => a.ItemNumber == item.SAPItemNumber).Count()>0)
+                {
+                    plan.EconomicLotSize = pre3MonthPlan.Where(a => a.ItemNumber == item.SAPItemNumber).Average(a => a.PlanProductQty);
+                }else
+                {
+                    plan.EconomicLotSize = plan.PlanProductQty;
+                }
+                plan.tenant_id = input.tenant_id;
+                plan.factory_id = input.factory_id;
+                plan.company_id=input.company_id;
+                plan.org_id = input.org_id;
+                plan.create_time = DateTime.Now;
+                plan.OrderNum =item.OrderNum;
+                productionMasters.Add(plan);
+            }
             //保存数据
             using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
             {
                 try
                 {
-                    //await _annualProductionOutline.InsertManyAsync(annualProductionOutlines);
+                    await _productionMasterPlan.InsertManyAsync(productionMasters);
                     await unitOfWork.CompleteAsync();
                 }
                 catch (Exception e)
@@ -569,7 +624,55 @@ namespace Business.Replenishment
                 };
             }
             return "OK";
+        }
 
+        /// <summary>
+        /// 获取物料在制数量
+        /// </summary>
+        /// <param name="itemNumbers"></param>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public List<EOPDto> GetInProdcutQty(List<string> itemNumbers,InputDto input)
+        {
+            List<EOPDto> itemQty = new List<EOPDto>();
+            DateTime startYear = new DateTime(DateTime.Now.AddYears(-1).Year, 1, 1);
+            DateTime endYear = new DateTime(DateTime.Now.Year, 12, 31);
+            List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.Select(x => x.IsActive && x.QtyComplete > 0 && x.Domain == input.factory_id.ToString()).Where(p => p.DueDate >= startYear && p.DueDate <= endYear).ToList();
+            decimal? InProductionQty = 0.00m;
+            var workOrds = workOrdRoutings.GroupBy(x => x.WorkOrd).ToList();
+            Dictionary<string, decimal> dictInProduction = new Dictionary<string, decimal>();
+            //按照工单循环
+            //某工单10-90工序   Max(10-80工序QtyComplete)-90工序QtyComplete =在制数量
+            foreach (var item in workOrds)
+            {
+                var workOrdRoutingList = workOrdRoutings.Where(x => x.WorkOrd == item.Key).OrderByDescending(o => o.OP).ToList();
+                //找出最大工序
+                var MaxOp = workOrdRoutingList.FirstOrDefault();
+                //查询出其他工序最大值
+                var MaxQtyComplete = workOrdRoutingList.Where(x => x.RecID != MaxOp.RecID).ToList().Max(o => o.QtyComplete);
+                InProductionQty += MaxQtyComplete - MaxOp.QtyComplete;
+                if (dictInProduction.ContainsKey(MaxOp.ItemNum))
+                {
+                    dictInProduction[MaxOp.ItemNum] += InProductionQty.Value;
+                }
+                else
+                {
+                    dictInProduction.Add(MaxOp.ItemNum, InProductionQty.Value);
+                }
+            }
+
+            itemNumbers.ForEach(a =>
+            {
+                EOPDto eOP = new EOPDto();
+                eOP.ItemNumber = a;
+                eOP.Qty = 0;
+                if(dictInProduction.ContainsKey(a))
+                    eOP.Qty = dictInProduction[a];
+
+                itemQty.Add(eOP);
+
+            });
+            return itemQty;
         }
 
         /// <summary>
@@ -586,6 +689,9 @@ namespace Business.Replenishment
             string ropResult=await CalcROP(input);
             if(ropResult!="OK")
                 return ropResult;
+            string masterPlanResult = await SaveProductionMasterPlan(input);
+            if (masterPlanResult != "OK")
+                return masterPlanResult;
             return "OK|刷新成功!";
         }
 
@@ -848,6 +954,7 @@ namespace Business.Replenishment
                 rop.monthl_avg_demand = CalcAvgDemand(planList, a.SAPItemNumber);
                 rop.monthl_avg_demand_variance = Math.Ceiling(Convert.ToDecimal(CalcVariance(planList, a.SAPItemNumber)));
                 rop.monthl_avg_outstock = CalcAvgOutStock(ropModelList, replenishmentDto, rop.actual_out_qty.Value, a.SAPItemNumber);
+                rop.supply_leadtime = 1;//默认
                 if (mesItemList.Find(s => s.ItemNum == a.SAPItemNumber) != null)
                 {
                     rop.stock_turnover = mesItemList.Find(s => s.ItemNum == a.SAPItemNumber).StockTurnOver;
@@ -1041,15 +1148,21 @@ namespace Business.Replenishment
         /// <returns></returns>
         public async Task<string> CalcDayPlan(InputDto input)
         {
+            ReplenishmentDto replenishmentDto = GetROPParam(input.factory_id.ToString());
             //DOP运行资源检查每个成品和半成品SKU的可用库存,当可用库存 <= 修正后ROP时,自动生成月度计划订单(MPlan order,MPO48年月日3位流水号)= EOP;可用库存为没有被其他SO和PO占用的(合格成品或半成品库存 + WIP);
+            var ropModelList = _replenishmentROP.GetListAsync(a =>a.isparam && a.factory_id==input.factory_id && a.company_id==input.company_id && !a.IsDeleted).Result;
+            var itemStock=CalcStock(ropModelList.Select(a=>a.number).ToList(),input);
+            //成品半成品取下周一开始+取供应提前期为结束时间
+            //原材料取第二天开始+取供应提前期为结束时间
+
 
             //DOP运行资源检查每个原材料SKU的可用库存,当可用库存<=修正后ROP时,自动生成月度采购申请(Purchase request,PR46年月日4位流水号)=EOP;可用库存为没有被其他SO和PO占用的(合格原材料库存+在途库存);
 
             //每天DOP检查每个SKU的可用库存<=SS时,第二次触发PO或PR,每次补货数量=圆整后EOP;SKU可用库存=实际库存+WIP或在途库存-销售订单占用-计划订单占用;当M+1\M+2实际有销售订单产生时,相同SKU的销售订单和计划订单先进行冲销;
 
 
-            //1.获取补货模型全局参数
-            ReplenishmentDto replenishmentDto = GetROPParam(input.factory_id.ToString());
+
+
 
             //Step1:按照瑞奇、两大平台分别根据历史出库数据和预测出货数据计算ROP
             //Step2:计算瑞奇的M-M+2共12周补货(每次补EOP/4),计算海王的M-M+2共12周补货(每次补EOP/4),计算国科的M-M+2共12周补货(每次补EOP/4)
@@ -1070,8 +1183,6 @@ namespace Business.Replenishment
             var mesItemList = _itemMaster.Select(a => planList.Select(p => p.SAPItemNumber).Contains(a.ItemNum) && a.Domain == input.factory_id.ToString() && a.IsActive);
             var srm_purchaseList = _srmPurchase.GetListAsync(a => planList.Select(p => p.SAPItemNumber).Contains(a.number) && a.tenant_id == input.tenant_id && a.company_id == input.company_id && !a.IsDeleted).Result;
 
-            //获取补货模型前H周期和未来F个周期的数据
-            var ropModelList = _replenishmentROP.GetListAsync(a => a.zero_based_seqno >= -1 * replenishmentDto.HistoryOutStockMonth && a.zero_based_seqno <= replenishmentDto.SaleFcstMonth).Result;
             //发货计划物料列表
             List<string> planItemList = planList?.Select(a => a.SAPItemNumber).ToList();
             //获取成品库存、灭菌库存、在制库存(会从SAP同步的库存表更新到LocationDetail、ic_item表中)
@@ -1190,6 +1301,61 @@ namespace Business.Replenishment
             return "OK";
         }
 
+        /// <summary>
+        /// 根据物料编码获取可用库存
+        /// 成品半成品可用库存为没有被其他SO和PO占用的(合格成品或半成品库存+WIP)
+        /// 原材料可用库存为没有被其他SO和PO占用的(合格原材料库存+在途库存);
+        /// </summary>
+        /// <param name="itemNumbers">物料编码列表</param>
+        /// <returns></returns>
+        public List<EOPDto> CalcStock(List<string> itemNumbers,InputDto input)
+        {
+            List<EOPDto> itemQty = new List<EOPDto>();
+            var itemList=_mysql_ic_item.GetListAsync(a => itemNumbers.Contains(a.number) && a.factory_id == input.factory_id && a.company_id ==input.company_id && !a.IsDeleted).Result;
+            var itemStockList=_mysql_ic_item_stock.GetListAsync(a => itemNumbers.Contains(a.icitem_number) && a.factory_id == input.factory_id && a.company_id == input.company_id && !a.IsDeleted).Result;
+            var pooccupylist=_mysql_srm_po_occupy.GetListAsync(a => a.state == 1 && !a.IsDeleted && a.factory_id == input.factory_id && a.company_id == input.company_id && a.tenant_id == input.tenant_id).Result;
+            var poList = _mysql_srm_po_list.GetListAsync(a=> pooccupylist.Select(p=>p.polist_id).ToList().Contains(a.Id) && pooccupylist.Select(p => p.polist_row).ToList().Contains(a.polist_row) && a.factory_id == input.factory_id && a.company_id == input.company_id && !a.IsDeleted).Result;
+            var molist=_mysql_mes_morder.GetListAsync(a => itemNumbers.Contains(a.product_code) && a.factory_id == input.factory_id && a.company_id == input.company_id && !a.IsDeleted).Result;
+            var proccupylist=_mysql_srm_pr_main_occupy.GetListAsync(a=> molist.Select(p=>p.morder_no).ToList().Contains(a.morder_mo) && a.factory_id == input.factory_id && a.company_id == input.company_id && !a.IsDeleted).Result;
+
+            itemNumbers.ForEach(a =>
+            {
+                EOPDto eOPDto=new EOPDto();
+                eOPDto.ItemNumber = a;
+                decimal stockqty = 0;
+                if(itemStockList.Find(s => s.icitem_number == a)!=null)
+                {
+                    stockqty = itemStockList.Find(s => s.icitem_number == a).sqty.Value;
+                }
+                decimal poOccupyQty = 0;
+                for(int i=0;i<pooccupylist.Count;i++)
+                {
+                    for(int j=0;j<poList.Count;j++)
+                    {
+                        if (pooccupylist[i].polist_id== poList[j].Id && pooccupylist[i].polist_row == poList[j].polist_row && poList[j].ItemNum==a)
+                        {
+                            poOccupyQty += pooccupylist[i].qty.Value;
+                        }
+                    }
+                }
+
+                decimal prOccupyQty = 0;
+                for (int i = 0; i < proccupylist.Count; i++)
+                {
+                    for (int j = 0; j < molist.Count; j++)
+                    {
+                        if (proccupylist[i].morder_mo == molist[j].morder_no  && molist[j].product_code == a)
+                        {
+                            prOccupyQty += proccupylist[i].qty.Value;
+                        }
+                    }
+                }
+                eOPDto.Qty = stockqty - poOccupyQty - prOccupyQty;
+                itemQty.Add(eOPDto);
+            });
+            return itemQty;
+        }
+
         /// <summary>
         /// 计划工单齐套检查
         /// </summary>
@@ -2186,7 +2352,7 @@ namespace Business.Replenishment
         public async Task<string> CalcLongPeriodItemPR(InputDto input)
         {
             //获取滚动未来六个月数据
-            var monthlist = GetSixPlanMonth();
+            var monthlist = GetPlanMonth(6);
             var productList = _replenishmentAnnualProduction.GetListAsync(a => monthlist.Contains(a.PlanMonth) && !a.IsDeleted && a.factory_id == input.factory_id).Result.OrderBy(s=>s.OrderNum).ToList();
             var itemList= productList.Select(a=>a.SAPItemNumber).ToList();
             var planList=_mysql_ic_item.GetListAsync(a=>itemList.Contains(a.number) && a.factory_id==input.factory_id && !a.IsDeleted).Result.ToList();
@@ -2683,13 +2849,33 @@ namespace Business.Replenishment
             return getPreMonthEndTime().AddMonths(months + 1);
         }
 
-        public List<string> GetSixPlanMonth()
+        /// <summary>
+        /// 获取未来几个月PlanMonth
+        /// </summary>
+        /// <param name="monthCount"></param>
+        /// <returns></returns>
+        public List<string> GetPlanMonth(int monthCount)
         {
             List<string> result=new List<string>();
-            for(int i=0;i<6;i++)
+            for(int i=0;i< monthCount; i++)
+            {
+                var months = DateTime.Now.AddMonths(i);
+                result.Add($"{months.Year}-{months.Month.ToString("00")}");
+            }
+            return result;
+        }
+        /// <summary>
+        /// 获取前面几个月PlanMonth
+        /// </summary>
+        /// <param name="monthCount"></param>
+        /// <returns></returns>
+        public List<string> GetPrePlanMonth(int monthCount)
+        {
+            List<string> result = new List<string>();
+            for (int i = 0; i < monthCount; i++)
             {
-                var months = DateTime.Now.AddMonths(i + 1);
-                result.Add($"{months.Year}-{months.Month}");
+                var months = DateTime.Now.AddMonths(-1*(i));
+                result.Add($"{months.Year}-{months.Month.ToString("00")}");
             }
             return result;
         }

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

@@ -10,6 +10,7 @@ using Business.ResourceExamineManagement.Dto;
 using Business.StructuredDB.SaleFcst;
 using Business.StructuredDB.WMS;
 using EFCore.BulkExtensions;
+using IdentityModel.Client;
 using Microsoft.AspNetCore.DataProtection.Repositories;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Infrastructure;

+ 1 - 1
MicroServices/Business/Business.Domain/MongoDB/MES/IC/mo_ic_item.cs

@@ -681,7 +681,7 @@ namespace Business.Domain
         /// </summary>
         [StringLength(80)]
         [Comment("物料类型")]
-        public string item_type { get; set; }
+        public string? item_type { get; set; }
 
         /// <summary>
         /// 供应提前期

+ 48 - 0
MicroServices/Business/Business.Domain/MongoDB/SRM/mo_srm_pr_main_occupy.cs

@@ -0,0 +1,48 @@
+using Business.Core.Attributes;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Business.Domain
+{
+    /// <summary>
+    /// 采购申请单占用
+    /// </summary>
+    [CollectionName("dopbase", "srm_pr_main_occupy")]
+    [Comment("采购申请单占用")]
+    public class mo_srm_pr_main_occupy: MoBaseEntity
+    {
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        [Comment("工单ID")]
+        public long? morder_id { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        [Comment("工单编号")]
+        public string morder_mo { get; set; }
+
+        /// <summary>
+        /// 占用量
+        /// </summary>
+        [Precision(23, 10)]
+        [Comment("占用量")]
+        public decimal? qty { get; set; }
+
+        /// <summary>
+        /// 占用状态
+        /// </summary>
+        [Comment("占用状态")]
+        public int? state { get; set; }
+
+        /// <summary>
+        /// 计算ID
+        /// </summary>
+        [Comment("计算id")]
+        [NotMapped]
+        public long? bang_id { get; set; }
+    }
+}

+ 3 - 1
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ic_item.cs

@@ -287,12 +287,14 @@ namespace Business.Domain
         /// FMR分类:F-F类,M-M类,R-R类
         /// </summary>
         [Comment("FMR分类")]
+        [StringLength(80)]
         public string fmr { get; set; }
 
         /// <summary>
         /// ABC分类:A-A类,B-B类,C-C类
         /// </summary>
         [Comment("ABC分类")]
+        [StringLength(80)]
         public string abc { get; set; }
 
 
@@ -686,7 +688,7 @@ namespace Business.Domain
         /// </summary>
         [StringLength(80)]
         [Comment("物料类型")]
-        public string item_type { get; set; }
+        public string? item_type { get; set; }
 
         /// <summary>
         /// 供应提前期

+ 49 - 0
MicroServices/Business/Business.Domain/StructuredDB/SRM/srm_pr_main_occupy.cs

@@ -0,0 +1,49 @@
+using Business.Core.Attributes;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Business.Domain
+{
+    /// <summary>
+    /// 采购申请单占用
+    /// </summary>
+    [CollectionName("dopbase", "srm_pr_main_occupy")]
+    [Comment("采购申请单占用")]
+    [Index(nameof(morder_mo),nameof(morder_id), nameof(tenant_id), nameof(company_id), nameof(factory_id), IsUnique = true)]
+    public class srm_pr_main_occupy : BaseEntity
+    {
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        [Comment("工单ID")]
+        public long? morder_id { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        [Comment("工单编号")]
+        public string morder_mo { get; set; }
+
+        /// <summary>
+        /// 占用量
+        /// </summary>
+        [Precision(23, 10)]
+        [Comment("占用量")]
+        public decimal? qty { get; set; }
+
+        /// <summary>
+        /// 占用状态
+        /// </summary>
+        [Comment("占用状态")]
+        public int? state { get; set; }
+
+        /// <summary>
+        /// 计算ID
+        /// </summary>
+        [Comment("计算id")]
+        [NotMapped]
+        public long? bang_id { get; set; }
+    }
+}

+ 44 - 13
MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/ProductionMasterPlan.cs

@@ -1,6 +1,8 @@
 using Business.Domain;
+using Microsoft.EntityFrameworkCore;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -15,53 +17,80 @@ namespace Business.StructuredDB.SaleFcst
     {
 
         /// <summary>
-        ///     
+        /// 地区    
         /// </summary>
-        public int Year { get; set; }
+        [StringLength(50)]
+        public string Area { get; set; }
 
         /// <summary>
-        ///     
+        /// 产品线    
         /// </summary>
-        public int Month { get; set; }
+        [StringLength(128)]
+        public string ProdLine { get; set; }
 
         /// <summary>
-        /// 产品线    
+        /// 产品系列    
         /// </summary>
-        public string ProdLine { get; set; }
+        [StringLength(128)]
+        public string ProdRange { get; set; }
+
+        /// <summary>
+        /// 车间线体    
+        /// </summary>
+        [StringLength(128)]
+        public string WorkshopLine { get; set; }
+
+        /// <summary>
+        /// 物料编码    
+        /// </summary>
+        [StringLength(128)]
+        public string ItemNumber { get; set; }
 
         /// <summary>
         /// 规格型号    
         /// </summary>
+        [StringLength(128)]
         public string Model { get; set; }
 
         /// <summary>
-        /// 计划月份    
+        /// 语种    
+        /// </summary>
+        [StringLength(50)]
+        public string Languages { get; set; }
+        /// <summary>
+        /// 计划年月    
         /// </summary>
+        [StringLength(128)]
         public string PlanMonth { get; set; }
 
         /// <summary>
-        /// 类别枚举    
+        /// 计划发货数量    
         /// </summary>
-        public int TypeEnum { get; set; }
+        [Precision(18, 5)]
+        public decimal PlanShipQty { get; set; }
 
         /// <summary>
-        /// 类别名称    
+        /// 计划生产数量    
         /// </summary>
-        public string TypeName { get; set; }
+        [Precision(18, 5)]
+        public decimal PlanProductQty { get; set; }
 
         /// <summary>
-        /// 计划数量    
+        /// 期末库存    
         /// </summary>
-        public decimal Qty { get; set; }
+        [Precision(18, 5)]
+        public decimal PlanStockQty { get; set; }
 
         /// <summary>
         /// 8001库存    
         /// </summary>
+        [Precision(18, 5)]
         public decimal Inventory { get; set; }
 
         /// <summary>
         /// 8000库存    
         /// </summary>
+        [Precision(18,5)]
         public decimal Inventory1 { get; set; }
 
         /// <summary>
@@ -72,11 +101,13 @@ namespace Business.StructuredDB.SaleFcst
         /// <summary>
         /// 灭菌中    
         /// </summary>
+        [Precision(18, 5)]
         public decimal DuringSterilization { get; set; }
 
         /// <summary>
         /// 在制    
         /// </summary>
+        [Precision(18, 5)]
         public decimal InProduction { get; set; }
 
         /// <summary>

+ 0 - 67
MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/crm_weekplan.cs

@@ -1,67 +0,0 @@
-using Business.Domain;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Business.StructuredDB.SaleFcst
-{
-
-    /// <summary>
-    ///  crm_weekplan    
-    /// </summary>
-    public class crm_weekplan : BaseEntity
-    {
-        /// <summary>
-        /// 无    
-        /// </summary>
-       // public long Id { get; set; }
-
-        /// <summary>
-        /// 订单号    
-        /// </summary>
-        public string OrderNo { get; set; }
-
-        /// <summary>
-        /// 规格型号    
-        /// </summary>
-        public string Model { get; set; }
-
-        /// <summary>
-        /// 生产线    
-        /// </summary>
-        public string ProdLine { get; set; }
-
-        /// <summary>
-        /// 产品类型    
-        /// </summary>
-        public string ProdType { get; set; }
-
-        /// <summary>
-        /// 计划数量    
-        /// </summary>
-        public decimal Qty { get; set; }
-
-        /// <summary>
-        /// 优先级    
-        /// </summary>
-        public string Priority { get; set; }
-
-        /// <summary>
-        /// 是否调整生产顺序    
-        /// </summary>
-        public string IsAdjust { get; set; }
-
-        /// <summary>
-        /// 开工周次    
-        /// </summary>
-        public string StartWeeks { get; set; }
-
-        /// <summary>
-        /// 预计结束周    
-        /// </summary>
-        public string EndWeeks { get; set; }
-
-    }
-}

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

@@ -272,6 +272,8 @@ namespace Business.EntityFrameworkCore
 
         public DbSet<ReplenishmentServiceLevel> ReplenishmentServiceLevel { get; set; }
 
+        public DbSet<srm_pr_main_occupy> srm_pr_main_occupy { get; set; }
+
         #endregion
 
         //Code generation...

+ 52 - 0
MicroServices/Business/QuartzSettings/logs/logs.txt

@@ -283,3 +283,55 @@
 {"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:16:28.1628371+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
 {"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:16:28.1678907+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
 {"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:16:28.1702853+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:39:08.5126128+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:39:08.5805492+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:39:08.5864066+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:39:08.5886906+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:44:22.5043379+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:44:22.573075+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:44:22.5775203+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-07T10:44:22.5793879+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-07T11:42:14.9134976+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-07T11:42:14.9883633+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-07T11:42:14.9941236+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-07T11:42:14.9963303+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-07T14:24:42.3907879+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-07T14:24:42.4765557+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-07T14:24:42.4832007+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-07T14:24:42.486217+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-07T14:51:52.5447548+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-07T14:51:52.6045863+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-07T14:51:52.6115273+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-07T14:51:52.6141638+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-11T00:24:05.0676714+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-11T00:24:05.1137132+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-11T00:24:05.1171905+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-11T00:24:05.1188842+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-11T00:45:36.143403+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-11T00:45:36.1994635+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-11T00:45:36.2051427+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-11T00:45:36.2076277+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:10:37.0694589+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:10:37.1122008+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:10:37.1152274+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:10:37.1170631+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:16:25.6877274+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:16:25.7300796+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:16:25.7333422+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:16:25.7348709+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:23:56.0242551+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:23:56.076746+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:23:56.0814829+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:23:56.0835539+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:31:27.0260262+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:31:27.0674377+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:31:27.0704712+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:31:27.0720544+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:36:16.4596998+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:36:16.5055861+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:36:16.5093441+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:36:16.5109711+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:46:03.6791728+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:46:03.7186157+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:46:03.7210925+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"长周期物料PR","GroupName":"systemquartzjob","BeginDate":"2023-09-11T01:46:03.7225617+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}