Переглянути джерело

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

tangdi 2 роки тому
батько
коміт
8a574eda9f
22 змінених файлів з 597 додано та 278 видалено
  1. 1 1
      MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/OrderCheckDto.cs
  2. 1 1
      MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/ResourceCheckInputDto.cs
  3. 1 1
      MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/SeorderentryDto.cs
  4. 7 0
      MicroServices/Business/Business.Application.Contracts/SaleForecast/IMonthlyCapacityLoadAppService.cs
  5. 5 0
      MicroServices/Business/Business.Application/BusinessApplicationAutoMapperProfile.cs
  6. 4 4
      MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs
  7. 11 11
      MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs
  8. 440 65
      MicroServices/Business/Business.Application/SaleForecastManagement/MonthlyCapacityLoadAppService.cs
  9. 1 2
      MicroServices/Business/Business.Domain/MongoDB/Base/MoBaseEntity.cs
  10. 2 3
      MicroServices/Business/Business.Domain/StructuredDB/Base/BaseEntity.cs
  11. 1 1
      MicroServices/Business/Business.Domain/StructuredDB/Production/MonthlyProdCapacityDtl.cs
  12. 1 1
      MicroServices/Business/Business.Domain/StructuredDB/Production/MonthlyProdCapacityMain.cs
  13. 0 93
      MicroServices/Business/Business.Domain/StructuredDB/Production/OverallDemandPlanDtl.cs
  14. 0 81
      MicroServices/Business/Business.Domain/StructuredDB/Production/OverallDemandPlanMain.cs
  15. 1 1
      MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/DomesticTerminalFcst.cs
  16. 61 0
      MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/OverallDemandPlan.cs
  17. 1 1
      MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/OverseasSaleFcst.cs
  18. 1 1
      MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/PlatformFcstCollect.cs
  19. 7 1
      MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/YearDemandManagementHistory.cs
  20. 5 10
      MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/DOP/BusinessDbContext.cs
  21. 12 0
      MicroServices/Business/Business.HttpApi/Controllers/MonthlyCapacityLoadController.cs
  22. 34 0
      MicroServices/Business/QuartzSettings/logs/logs.txt

+ 1 - 1
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/OrderCheckDto.cs

@@ -15,7 +15,7 @@ namespace Business.ResourceExamineManagement.Dto
         /// <summary>
         /// 企业id
         /// </summary>
-        public long company_id { get; set; }
+        public long? company_id { get; set; }
 
         /// <summary>
         /// 工厂id

+ 1 - 1
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/ResourceCheckInputDto.cs

@@ -30,6 +30,6 @@ namespace Business.ResourceExamineManagement.Dto
         /// <summary>
         /// 企业id
         /// </summary>
-        public long company_id { get; set; }
+        public long? company_id { get; set; }
     }
 }

+ 1 - 1
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/SeorderentryDto.cs

@@ -26,7 +26,7 @@ namespace Business.ResourceExamineManagement.Dto
         /// <summary>
         /// ¹«Ë¾ID
         /// </summary>
-        public long company_id { get; set; }
+        public long? company_id { get; set; }
         /// <summary>
         /// ×éÖ¯ID
         /// </summary>

+ 7 - 0
MicroServices/Business/Business.Application.Contracts/SaleForecast/IMonthlyCapacityLoadAppService.cs

@@ -27,5 +27,12 @@ namespace Business.SaleForecast
         /// <param name="input"></param>
         /// <returns></returns>
         Task<string> DemandAnalysis(InputDto input);
+
+        /// <summary>
+        /// 生成整体需求计划
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        Task<string> OverallDemandPlan(InputDto input);
     }
 }

+ 5 - 0
MicroServices/Business/Business.Application/BusinessApplicationAutoMapperProfile.cs

@@ -95,6 +95,11 @@ namespace Business
                .ForMember(d => d.Id, map => map.MapFrom(o => o.mysql_id));
             #endregion
 
+            #region 销售预测
+            CreateMap<YearDemandManagement, YearDemandManagementHistory>()
+                .ForMember(d=>d.Id, opt => opt.Ignore());
+            #endregion
+
             #region Bang
             CreateMap<BomChildExamineDto, b_bom_child_examine>();
 

+ 4 - 4
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -1190,7 +1190,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="returnlist"></param>
         /// <param name="factoryid"></param>
         /// <param name="orderType">2委外采购申请单,3采购申请单</param>
-        private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, List<mo_ic_item> planList, crm_seorderentry sentrys)
+        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)
         {
             SRMPRDto sRMPR = new SRMPRDto();
             var supplier = supplierList.Where(x => x.icitem_id == returnlist.item_id).ToList();//默认取第一个供应商
@@ -1244,7 +1244,7 @@ namespace Business.ResourceExamineManagement
                 srm_Pr.pr_type = orderType;//申请类型
                 srm_Pr.currencytype = x.currency_type == null ? 1 : x.currency_type.Value;//币种
                 srm_Pr.secInv_ratio = plan.secinv_ratio;//安全库存触发采购比例
-                srm_Pr.company_id = tenantId;
+                srm_Pr.company_id = companyId;
                 srm_Pr.factory_id = factoryid;
                 srm_Pr.bang_id = bangId;
                 if (sentrys != null)
@@ -1285,7 +1285,7 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         /// <param name="returnlist"></param>
         /// <param name="factoryid"></param>
-        private mo_mes_oorder CreateMesOOder(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, DateTime deliveryDate)
+        private mo_mes_oorder CreateMesOOder(BomChildExamineDto returnlist, 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());
@@ -1326,7 +1326,7 @@ namespace Business.ResourceExamineManagement
             oOrder.production_unit = returnlist.unit;//加工单位
             oOrder.production_unit_code = "";//加工单位编码
             oOrder.need_icitem_status = 1;//所需物料是否充足  1-充足 0-缺料
-            oOrder.company_id = tenantId;
+            oOrder.company_id = companyId;
             oOrder.factory_id = factoryid;
             oOrder.bang_id = bangId;
             oOrder.sentry_id = returnlist.sentry_id;

+ 11 - 11
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1699,7 +1699,7 @@ namespace Business.ResourceExamineManagement
         /// 数据库快照
         /// </summary>
         /// <returns></returns>
-        public async Task DbSnapShot(long tenantId, long factoryId, long bangid,List<b_bom_pretreatment> pretreatments)
+        public async Task DbSnapShot(long? companyId, long factoryId, long bangid,List<b_bom_pretreatment> pretreatments)
         {
             //TODO:申老师明确后续需要调整 根据需要使用的字段,来同步表数据。
             
@@ -1725,7 +1725,7 @@ namespace Business.ResourceExamineManagement
                 await _ic_item_stock.InsertManyAsync(moIcitemStokc);
             }
             //在制工单占用记录表
-            var mes_mooccupy = _mysql_mes_mooccupy.GetListAsync(x => x.company_id == tenantId && x.factory_id == factoryId).Result;
+            var mes_mooccupy = _mysql_mes_mooccupy.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
             if (mes_mooccupy.Count > 0)
             {
                 mes_mooccupy.ForEach(item => { item.bang_id = bangid; });
@@ -1734,7 +1734,7 @@ namespace Business.ResourceExamineManagement
                 await _mes_mooccupy.InsertManyAsync(moMes_mooccupy);
             }
             //工单主表
-            var mes_morder = _mysql_mes_morder.GetListAsync(x => x.company_id == tenantId && x.factory_id == factoryId).Result;
+            var mes_morder = _mysql_mes_morder.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
             if (mes_morder.Count > 0)
             {
                 mes_morder.ForEach(item => { item.bang_id = bangid; });
@@ -1743,7 +1743,7 @@ namespace Business.ResourceExamineManagement
                 await _mes_morder.InsertManyAsync(moMes_morder);
             }
             //工单子表
-            var mes_moentry = _mysql_mes_moentry.GetListAsync(x => x.company_id == tenantId && x.factory_id == factoryId).Result;
+            var mes_moentry = _mysql_mes_moentry.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
             if (mes_moentry.Count > 0)
             {
                 mes_moentry.ForEach(item => { item.bang_id = bangid; });
@@ -1754,7 +1754,7 @@ namespace Business.ResourceExamineManagement
 
             //TODO:要不要根据某些条件只同步有效的数据
             //采购订单
-            var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.company_id == tenantId && x.factory_id == factoryId).Result;
+            var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
             if (srm_po_main.Count > 0)
             {
                 srm_po_main.ForEach(item => { item.bang_id = bangid; });
@@ -1764,7 +1764,7 @@ namespace Business.ResourceExamineManagement
             }
 
             //采购订单明细
-            var srm_po_list = _mysql_srm_po_list.GetListAsync(x => x.company_id == tenantId && x.factory_id == factoryId).Result;
+            var srm_po_list = _mysql_srm_po_list.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
             if (srm_po_list.Count > 0)
             {
                 srm_po_list.ForEach(item => { item.bang_id = bangid; });
@@ -1774,7 +1774,7 @@ namespace Business.ResourceExamineManagement
             }
 
             //采购订单占用详情
-            var srm_po_occupy = _mysql_srm_po_occupy.GetListAsync(x => x.company_id == tenantId && x.factory_id == factoryId).Result;
+            var srm_po_occupy = _mysql_srm_po_occupy.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId).Result;
             if (srm_po_occupy.Count > 0)
             {
                 srm_po_occupy.ForEach(item => { item.bang_id = bangid; });
@@ -1819,9 +1819,9 @@ namespace Business.ResourceExamineManagement
         /// <param name="tenantId">企业id</param>
         /// <param name="factoryid">工厂id</param>
         /// <returns></returns>
-        private List<ICItemLeadTimeDto> GetLeadTime(List<mo_ic_item> icItemIds, long tenantId, long factoryid)
+        private List<ICItemLeadTimeDto> GetLeadTime(List<mo_ic_item> icItemIds, long? companyId, long factoryid)
         {
-            return icItemIds.Where(p => p.factory_id == factoryid && p.company_id == tenantId && !p.IsDeleted).
+            return icItemIds.Where(p => p.factory_id == factoryid && p.company_id == companyId && !p.IsDeleted).
                 Select(x => new ICItemLeadTimeDto
                 {
                     item_id = x.mysql_id,
@@ -1837,9 +1837,9 @@ namespace Business.ResourceExamineManagement
         }
 
         //根据物料id获取物料供应商
-        private List<mo_srm_purchase> GetSupplier(List<long> icItemIds, long tenantId, long factoryid)
+        private List<mo_srm_purchase> GetSupplier(List<long> icItemIds, long? companyId, long factoryid)
         {
-            return _srm_purchase.GetListAsync(p => icItemIds.Contains(p.icitem_id) && p.company_id == tenantId && p.factory_id == factoryid && !p.IsDeleted).Result;
+            return _srm_purchase.GetListAsync(p => icItemIds.Contains(p.icitem_id) && p.company_id == companyId && p.factory_id == factoryid && !p.IsDeleted).Result;
         }
 
         /// <summary>

+ 440 - 65
MicroServices/Business/Business.Application/SaleForecastManagement/MonthlyCapacityLoadAppService.cs

@@ -1,11 +1,16 @@
-using Business.Core.Utilities;
+using Azure.Identity;
+using Business.Core.Utilities;
 using Business.Domain;
 using Business.Dto;
 using Business.EntityFrameworkCore.SqlRepositories;
+using Business.ResourceExamineManagement.Dto;
 using Business.SaleForecast;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Spire.Pdf.General.Render.Decode.Jpeg2000.j2k.quantization;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Runtime.CompilerServices;
 using System.Threading.Tasks;
 using Volo.Abp.Application.Services;
 using Volo.Abp.DependencyInjection;
@@ -26,11 +31,6 @@ namespace Business.SaleForecastManagement
         /// </summary>
         private IRepository<ic_item, long> _ic_item;
 
-        /// <summary>
-        /// 整体需求计划明细
-        /// </summary>
-        private ISqlRepository<OverallDemandPlanDtl> _overallDemandPlanDtl;
-
         /// <summary>
         /// 生产线明细
         /// </summary>
@@ -76,6 +76,11 @@ namespace Business.SaleForecastManagement
         /// </summary>
         private IRepository<YearDemandManagement, long> _yearDemandManagement;
 
+        /// <summary>
+        /// 年度生产需求大纲历史记录
+        /// </summary>
+        private IRepository<YearDemandManagementHistory, long> _yearDemandManagementHistory;
+
         /// <summary>
         /// 国内终端预测
         /// </summary>
@@ -96,6 +101,21 @@ namespace Business.SaleForecastManagement
         /// </summary>
         private IRepository<StandardItemModelSet,long> _standardItemModelSet;
 
+        /// <summary>
+        /// 库存明细表
+        /// </summary>
+        private ISqlRepository<LocationDetail> _locationDetail;
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        private ISqlRepository<WorkOrdMaster> _workOrdMaster;
+
+        /// <summary>
+        /// 整体需求计划
+        /// </summary>
+        private IRepository<OverallDemandPlan, long> _overallDemandPlan;
+
         /// <summary>
         /// 雪花算法
         /// </summary>
@@ -108,7 +128,6 @@ namespace Business.SaleForecastManagement
         /// </summary>
         public MonthlyCapacityLoadAppService(
             IRepository<ic_item, long> ic_item,
-            ISqlRepository<OverallDemandPlanDtl> overallDemandPlanDtl,
             ISqlRepository<ProdLineDetail> prodLineDetail,
             ISqlRepository<ShopCalendarWorkCtr> shopCalendarWorkCtr,
             ISqlRepository<QualityLineWorkDetail> qualityLineWorkDetail,
@@ -121,11 +140,14 @@ namespace Business.SaleForecastManagement
             IRepository<YearDemandManagement, long> yearDemandManagement,
             IRepository<DomesticTerminalFcst, long> domesticTerminalFcst,
             IRepository<OverseasSaleFcst, long> overseasSaleFcst,
-            IRepository<PlatformFcstCollect, long> platformFcstCollect
+            IRepository<PlatformFcstCollect, long> platformFcstCollect,
+            IRepository<YearDemandManagementHistory, long> yearDemandManagementHistory,
+            ISqlRepository<LocationDetail> locationDetail,
+            ISqlRepository<WorkOrdMaster> workOrdMaster,
+            IRepository<OverallDemandPlan, long> overallDemandPlan
             )
         {
             _ic_item = ic_item;
-            _overallDemandPlanDtl = overallDemandPlanDtl;
             _prodLineDetail = prodLineDetail;
             _shopCalendarWorkCtr = shopCalendarWorkCtr;
             _qualityLineWorkDetail = qualityLineWorkDetail;
@@ -137,8 +159,12 @@ namespace Business.SaleForecastManagement
             _standardItemModelSet = standardItemModelSet;
             _yearDemandManagement= yearDemandManagement;
             _domesticTerminalFcst= domesticTerminalFcst;
-            _overallDemandPlanDtl= overallDemandPlanDtl;
+            _overseasSaleFcst = overseasSaleFcst;
             _platformFcstCollect= platformFcstCollect;
+            _yearDemandManagementHistory= yearDemandManagementHistory;
+            _locationDetail = locationDetail;
+            _workOrdMaster = workOrdMaster;
+            _overallDemandPlan = overallDemandPlan;
         }
         #endregion
 
@@ -263,25 +289,25 @@ namespace Business.SaleForecastManagement
         //    return "OK|发布成功!";
         //}
 
-        ///// <summary>
-        ///// 计算当月有多少个周末
-        ///// </summary>
-        ///// <param name="days"></param>
-        ///// <param name="startDay"></param>
-        ///// <returns></returns>
-        //private int CalcWeekDays(int days, DateTime startDay)
-        //{
-        //    int sumDays = 0;
-        //    for (int i = 0; i < days; i++)
-        //    {
-        //        int weekDays = (int)startDay.AddDays(i).DayOfWeek;
-        //        if (weekDays == 0 || weekDays == 6)
-        //        {
-        //            sumDays++;
-        //        }
-        //    }
-        //    return sumDays;
-        //}
+        /// <summary>
+        /// 计算当月有多少个周末
+        /// </summary>
+        /// <param name="days"></param>
+        /// <param name="startDay"></param>
+        /// <returns></returns>
+        private int CalcWeekDays(int days, DateTime startDay)
+        {
+            int sumDays = 0;
+            for (int i = 0; i < days; i++)
+            {
+                int weekDays = (int)startDay.AddDays(i).DayOfWeek;
+                if (weekDays == 0 || weekDays == 6)
+                {
+                    sumDays++;
+                }
+            }
+            return sumDays;
+        }
 
         /// <summary>
         /// 月度需求预测更新
@@ -291,66 +317,415 @@ namespace Business.SaleForecastManagement
         /// <exception cref="NotImplementedException"></exception>
         public async Task<string> DemandAnalysis(InputDto input)
         {
-            //1.0 获取年度生产需求大纲
-            List<YearDemandManagement> yearDemands = _yearDemandManagement.GetListAsync(p => p.Year == input.year && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
-            if (yearDemands.Count() == 0)
-            {
-                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "请导入" + input.year + "年年度生产需求数据后再操作!", _currentTenant.Id.ToString());
-                return "NO|请导入" + input.year + "年年度生产需求数据后再操作!";
-            }
+            //1.0 获取当前年年度生产需求大纲
+            List<YearDemandManagement> yearDemands = _yearDemandManagement.GetListAsync(p => p.Year == input.year && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result.OrderBy(p=>p.OrderNum).ToList();
+            //1.0 获取下一年年度生产大纲
+            List<YearDemandManagement> nextYearDemands = _yearDemandManagement.GetListAsync(p => p.Year == (input.year+1) && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result.OrderBy(p => p.OrderNum).ToList();
+            //记录历史版本:当前年+下一年
+            var updateMonth = input.year.ToString() + "-" + input.month.ToString("00");
+            var histories = ObjectMapper.Map<List<YearDemandManagement>, List<YearDemandManagementHistory>>(yearDemands);
+            histories.ForEach(p => {
+                p.UpdateMonth = updateMonth;
+            });
+            var nextHistories = ObjectMapper.Map<List<YearDemandManagement>, List<YearDemandManagementHistory>>(nextYearDemands);
+            nextHistories.ForEach(p => {
+                p.UpdateMonth = updateMonth;
+            });
             //1.1、获取海外销售预测数据
             List<OverseasSaleFcst> overseasSales = _overseasSaleFcst.GetListAsync(p => p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
-            if (overseasSales.Count() == 0)
-            {
-                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "请导入"+input.year+"年"+input.month+"月海外预测数据后再操作!", _currentTenant.Id.ToString());
-                return "NO|请导入"+input.year+"年"+input.month+"月海外预测数据后再操作!";
-            }
             //1.2、获取平台预测收集数据
             List<PlatformFcstCollect> platformFcsts = _platformFcstCollect.GetListAsync(p => p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
-            if (platformFcsts.Count() == 0)
-            {
-                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "请导入" + input.year + "年" + input.month + "月平台需求预测数据后再操作!", _currentTenant.Id.ToString());
-                return "NO|请导入" + input.year + "年" + input.month + "月平台需求预测数据后再操作!";
-            }
             //1.3、获取国内终端预测-T1汇总数据
-            List<DomesticTerminalFcst> domesticFcst = _domesticTerminalFcst.GetListAsync(p => p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
-            if (domesticFcst.Count() == 0)
+            List<DomesticTerminalFcst> domesticFcst = _domesticTerminalFcst.GetListAsync(p =>p.TypeEnum == 2 && p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
+            //1.4、根据年度生产大纲,获取规格型号对应的补货周期
+            List<string> allModels = yearDemands.Select(p=>p.Model).Distinct().ToList();
+            if (nextYearDemands.Any())
             {
-                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "请导入" + input.year + "年" + input.month + "月国内终端预测数据后再操作!", _currentTenant.Id.ToString());
-                return "NO|请导入" + input.year + "年" + input.month + "月国内终端预测数据后再操作!";
+                allModels.AddRange(nextYearDemands.Select(p => p.Model).ToList());
+                allModels = allModels.Distinct().ToList();
             }
-            //1.4、根据年度生产大纲,获取规格型号对应的补货周期
-            List<string> models = yearDemands.Select(p=>p.Model).Distinct().ToList();  
-            List<StandardItemModelSet> standards = _standardItemModelSet.GetListAsync(p=>models.Contains(p.Model) && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
-            //1.5、获取规格型号对应的标准SKU数据
+            List<StandardItemModelSet> standards = _standardItemModelSet.GetListAsync(p => allModels.Contains(p.Model) && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
+            //1.5、获取规格型号对应的标准SKU数据:获取最小包装单位
             List<string> itemNums = standards.Select(p=>p.ItemNumber).Distinct().ToList();
             List<ic_item> items = _ic_item.GetListAsync(p=> itemNums.Contains(p.number) && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result;
+            //1.6、获取成品库存、灭菌库存
+            //List<LocationDetail> locations = _locationDetail.Select(p=>p.Domain == input.factory_id.ToString() && p.IsActive && itemNums.Contains(p.ItemNum));
+            //1.7、获取在制库存:计划开始时间、计划结束时间都在本月,并且未关闭的工单
+            //DateTime monStart = Convert.ToDateTime(input.year + "-" + input.month + "-01");
+            //DateTime monEnd = monStart.AddMonths(1).AddDays(-1);
+            //List<WorkOrdMaster> workOrds = _workOrdMaster.Select(p=>p.Domain);
+            //1.9、获取节假日设置
+            List<HolidayMaster> holidays = _holidayMaster.Select(p => (p.Dated.Value.Year == input.year || p.Dated.Value.Year == (input.year + 1)) && p.Domain == input.factory_id.ToString() && p.IsActive);
+
+            #region 数据校验
+            //1、校验当前年的年度生产大纲是否导入
+            if (!yearDemands.Any())
+            {
+                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "请导入" + input.year + "年的年度生产需求后再操作!", _currentTenant.Id.ToString());
+                return "NO|请导入" + input.year + "年的年度生产需求后再操作!";
+            }
+            //2、如果当前月份大于10,则需校验下一年的年度生产大纲
+            if (input.month > 10 && !nextYearDemands.Any())
+            {
+                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "请导入" + (input.year+1) + "年的年度生产需求后再操作!", _currentTenant.Id.ToString());
+                return "NO|请导入" + (input.year + 1) + "年的年度生产需求后再操作!";
+            }
+            //3、校验当前月份的海外销售预测是否导入
+            if (!overseasSales.Any())
+            {
+                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "请导入" + input.year + "年" + input.month + "月海外销售预测后再操作!", _currentTenant.Id.ToString());
+                return "NO|请导入" + input.year + "年" + input.month + "月海外销售预测后再操作!";
+            }
+            //4、校验当前月份的平台预测收集是否导入
+            if (!platformFcsts.Any())
+            {
+                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "请导入" + input.year + "年" + input.month + "月平台需求收集后再操作!", _currentTenant.Id.ToString());
+                return "NO|请导入" + input.year + "年" + input.month + "月平台需求收集后再操作!";
+            }
+            //5、校验当前月份的国内终端预测是否导入
+            if (!domesticFcst.Any())
+            {
+                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "请导入" + input.year + "年" + input.month + "月国内终端预测后再操作!", _currentTenant.Id.ToString());
+                return "NO|请导入" + input.year + "年" + input.month + "月国内终端预测后再操作!";
+            }
+            //6、校验终端+平台导入的规格型号是否已维护标准SKU
+            if (allModels.Count() != standards.Count())
+            {
+                allModels.RemoveAll(standards.Select(p=>p.Model).ToList());
+                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "规格型号【" + string.Join(",",allModels) + "】没有维护标准SKU,请维护后再操作!", _currentTenant.Id.ToString());
+                return "NO|规格型号【" + string.Join(",", allModels) + "】没有维护标准SKU,请维护后再操作!";
+            }
+            //7、校验是否已维护补货周期
+            var zeros = standards.Where(p => p.ReplenishCycle == 0).ToList();
+            if (zeros.Any())
+            {
+                new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "规格型号【" + string.Join(",", zeros.Select(p=>p.Model).ToList()) + "】没有维护补货周期,请维护后再操作!", _currentTenant.Id.ToString());
+                return "NO|规格型号【" + string.Join(",", zeros.Select(p => p.Model).ToList()) + "】没有维护补货周期,请维护后再操作!";
+            }
+            #endregion
+
+            //计算当前年月的N+1,N+2
+            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");
+            newYear = newMonth == 12 ? newYear + 1 : newYear;
+            newMonth = newMonth == 12 ? 1 : newMonth + 1;
+            string strN2 = newYear.ToString() + "-" + newMonth.ToString("00");
 
-            //计算海外预测
+            //需要回写的数据
+            List<YearDemandManagement> updates = new List<YearDemandManagement>();
+            #region 计算国内终端预测,回写年度生产大纲
+            //获取导入的T1、平台数据
+            List<string> gnModels = new List<string>();
+            if (domesticFcst.Any())
+            {
+                gnModels.AddRange(domesticFcst.Select(p => p.Model).ToList());
+            }
+            if (platformFcsts.Any())
+            {
+                gnModels.AddRange(platformFcsts.Select(p => p.Model).ToList());
+            }
+            gnModels = gnModels.Distinct().ToList();
+            foreach (var gnModel in gnModels)
+            {
+                //N+1月
+                YearDemandManagement monthN1 = new YearDemandManagement();
+                //N+2月
+                YearDemandManagement monthN2 = new YearDemandManagement();
+                //获取需要回写的数据
+                if (input.month < 11)
+                {
+                    monthN1 = yearDemands.FirstOrDefault(p => p.Area == "国内" && p.Model == gnModel && p.PlanMonth == strN1);
+                    monthN2 = yearDemands.FirstOrDefault(p => p.Area == "国内" && p.Model == gnModel && p.PlanMonth == strN2);
+                }
+                if (input.month == 11)
+                {
+                    monthN1 = yearDemands.FirstOrDefault(p => p.Area == "国内" && p.Model == gnModel && p.PlanMonth == strN1);
+                    monthN2 = nextYearDemands.FirstOrDefault(p => p.Area == "国内" && p.Model == gnModel && p.PlanMonth == strN2);
+                }
+                if (input.month == 12)
+                {
+                    monthN1 = nextYearDemands.FirstOrDefault(p => p.Area == "国内" && p.Model == gnModel && p.PlanMonth == strN1);
+                    monthN2 = nextYearDemands.FirstOrDefault(p => p.Area == "国内" && p.Model == gnModel && p.PlanMonth == strN2);
+                }
+                if (monthN1 == null || monthN2 == null)
+                {
+                    continue;
+                }
+                //T1
+                var sumT1N1 = domesticFcst.Where(p => p.Model == gnModel && p.PlanMonth == strN1).Sum(p=>p.Qty);
+                var sumT1N2 = domesticFcst.Where(p => p.Model == gnModel && p.PlanMonth == strN2).Sum(p => p.Qty);
+                //平台
+                var sumPN1 = platformFcsts.Where(p => p.Model == gnModel && p.PlanMonth == strN1).Sum(p => p.Qty);
+                var sumPN2 = platformFcsts.Where(p => p.Model == gnModel && p.PlanMonth == strN2).Sum(p => p.Qty);
+                //合计
+                var sumN1 = sumT1N1+ sumPN1;
+                var sumN2 = sumT1N2 + sumPN2;
+
+                //当前规格型号对应标准SKU的最小包装单位、补货周期
+                var curStd = standards.FirstOrDefault(p => p.Model == gnModel);
+                decimal packQty = 1m;//最小包装单位
+                decimal cycle = 0m;//补货周期
+                if (curStd != null)
+                {
+                    var curItem = items.FirstOrDefault(p => p.number == curStd.ItemNumber);
+                    packQty = curItem == null ? 1 : (curItem.minpackqty.GetValueOrDefault() == 0.0m ? 1 : curItem.minpackqty.Value);
+                    cycle = curStd.ReplenishCycle;
+                }
+                //TODO:获取成品库存、在制库存、灭菌库存,参与计算
+                //N+1月使用N+2月的再订货点参与计算
+                decimal rop = CalcRop(strN2+"-01", sumN2, packQty, holidays, cycle);
+                monthN1.Qty = Math.Ceiling((sumN1 / 2 + sumN2 / 2 + rop - 0 - 0 - 0) / packQty) * packQty;
+                //N+2月使用本月的需求量,下一月的工作天数
+                rop = CalcRop(Convert.ToDateTime(strN2 + "-01").AddMonths(1).ToString("yyyy-MM-dd"), sumN2, packQty, holidays, cycle);
+                monthN2.Qty = Math.Ceiling((sumN2 + rop - 0 - 0 - 0) / packQty) * packQty;
+                //负数置0
+                monthN1.Qty = monthN1.Qty < 0 ? 0m : monthN1.Qty;
+                monthN2.Qty = monthN2.Qty < 0 ? 0m : monthN2.Qty;
+                //记录需要回写的数据
+                updates.Add(monthN1);
+                updates.Add(monthN2);
+            }
+            #endregion
+
+            #region 海外销售预测,回写年度生产大纲
+            List<string> hwModels = overseasSales.Select(p => p.Model).Distinct().ToList();
+            foreach (var hwModel in hwModels)
+            {
+                //N+1月
+                YearDemandManagement monthN1 = new YearDemandManagement();
+                //N+2月
+                YearDemandManagement monthN2 = new YearDemandManagement();
+                //获取需要回写的数据
+                if (input.month < 11)
+                {
+                    monthN1 = yearDemands.FirstOrDefault(p => p.Area == "海外" && p.Model == hwModel && p.PlanMonth == strN1);
+                    monthN2 = yearDemands.FirstOrDefault(p => p.Area == "海外" && p.Model == hwModel && p.PlanMonth == strN2);
+                }
+                if (input.month == 11)
+                {
+                    monthN1 = yearDemands.FirstOrDefault(p => p.Area == "海外" && p.Model == hwModel && p.PlanMonth == strN1);
+                    monthN2 = nextYearDemands.FirstOrDefault(p => p.Area == "海外" && p.Model == hwModel && p.PlanMonth == strN2);
+                }
+                if (input.month == 12)
+                {
+                    monthN1 = nextYearDemands.FirstOrDefault(p => p.Area == "海外" && p.Model == hwModel && p.PlanMonth == strN1);
+                    monthN2 = nextYearDemands.FirstOrDefault(p => p.Area == "海外" && p.Model == hwModel && p.PlanMonth == strN2);
+                }
+                if (monthN1 == null || monthN2 == null) {
+                    continue;
+                }
+                var sumN1 = overseasSales.Where(p => p.Model == hwModel && p.PlanMonth == strN1).Sum(p => p.Qty);
+                var sumN2 = overseasSales.Where(p => p.Model == hwModel && p.PlanMonth == strN2).Sum(p => p.Qty);
+
+                //当前规格型号对应标准SKU的最小包装单位、补货周期
+                var curStd = standards.FirstOrDefault(p => p.Model == hwModel);
+                decimal packQty = 1m;//最小包装单位
+                if (curStd != null)
+                {
+                    var curItem = items.FirstOrDefault(p => p.number == curStd.ItemNumber);
+                    packQty = curItem == null ? 1 : (curItem.minpackqty.GetValueOrDefault() == 0.0m ? 1 : curItem.minpackqty.Value);
+                }
+                //海外生产需求量=当月的50%+下一月的50%-成品库存-在制库存-灭菌库存
+                //TODO:获取成品库存、在制库存、灭菌库存,参与运算
+                //计算N+1月,N+2月
+                monthN1.Qty = Math.Ceiling((sumN1 / 2 + sumN2 / 2 - 0 - 0 - 0) / packQty) * packQty;
+                monthN2.Qty = Math.Ceiling((sumN2 - 0 - 0 - 0) / packQty) *packQty; ;
+                //负数置0
+                monthN1.Qty = monthN1.Qty < 0 ? 0m : monthN1.Qty;
+                monthN2.Qty = monthN2.Qty < 0 ? 0m : monthN2.Qty;
+                //记录需要回写的数据
+                updates.Add(monthN1);
+                updates.Add(monthN2);
+            }
+            #endregion
+
+            //保存数据
+            using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
+            {
+                try
+                {
+                    //判断是否存在当前年月的历史版本,不存在则插入
+                    var dbHistory =  _yearDemandManagementHistory.GetListAsync(p=>p.Year ==input.year && p.UpdateMonth == updateMonth && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id).Result;
+                    if (!dbHistory.Any())
+                    {
+                        await _yearDemandManagementHistory.InsertManyAsync(histories);
+                    }
+                    if (input.month > 10)
+                    {
+                        //判断是否存在下一年月的历史版本,不存在则插入
+                        dbHistory = _yearDemandManagementHistory.GetListAsync(p =>(p.Year == input.year + 1) && p.UpdateMonth == updateMonth && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id).Result;
+                        if (!dbHistory.Any())
+                        {
+                            await _yearDemandManagementHistory.InsertManyAsync(nextHistories);
+                        }
+                    }
+                    //回写年度生产大纲
+                    await _yearDemandManagement.UpdateManyAsync(updates);
+                    await unitOfWork.CompleteAsync();
+                }
+                catch (Exception e)
+                {
+                    unitOfWork.Dispose();
+                    new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("DemandAnalysis", "【" + input.year + "年" + input.month + "月】月度需求预测更新失败:" + e.Message, _currentTenant.Id.ToString());
+                    return "NO|" + e.Message;
+                };
+            }
+            return "OK|修订成功!";
+        }
+
+        /// <summary>
+        /// 计算再订货点
+        /// </summary>
+        /// <param name="planMonth">计划年月(yyyy-MM-dd)</param>
+        /// <param name="qty">需求量</param>
+        /// <param name="qty">最小包装数量</param>
+        /// <param name="holidays">节假日</param>
+        /// <param name="replenishCycle">补货周期</param>
+        /// <returns></returns>
+        private decimal CalcRop(string planMonth,decimal qty,decimal packQty,List<HolidayMaster> holidays,decimal replenishCycle)
+        {
+            decimal rop = 0.0m;
+            //获取当月天数
+            int year = Convert.ToInt16(planMonth.Substring(0, 4));
+            int month = Convert.ToInt16(planMonth.Substring(5, 2));
+            int days = DateTime.DaysInMonth(year, month);
+            //计算当前月的周末天数
+            int weeks = CalcWeekDays(days, Convert.ToDateTime(planMonth));
+            //获取当前年月的节假日设置
+            var curHolidays = holidays.Where(p => p.Dated.Value.Year == year && p.Dated.Value.Month == month).ToList();
+            //当月工作天数
+            int workDays = days - weeks - curHolidays.Where(p => p.Ufld1 == "休假").Count() + curHolidays.Where(p => p.Ufld1 == "调班").Count();
+            //rop = (需求量/月工作天数*补货周期)=>按照最小包装单位元整
+            rop = Math.Ceiling(qty / workDays * replenishCycle / packQty) * packQty;
+            return rop;
+        }
+
+        /// <summary>
+        /// 生成整体需求计划
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public async Task<string> OverallDemandPlan(InputDto input)
+        {
+            //1.1、获取海外销售预测数据
+            List<OverseasSaleFcst> overseasSales = _overseasSaleFcst.GetListAsync(p => p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result.OrderBy(p => p.OrderNum).ToList();
+            //1.2、获取平台预测收集数据
+            List<PlatformFcstCollect> platformFcsts = _platformFcstCollect.GetListAsync(p => p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result.OrderBy(p=>p.OrderNum).ToList();
+            //1.3、获取国内终端预测-T1汇总数据
+            List<DomesticTerminalFcst> domesticFcsts = _domesticTerminalFcst.GetListAsync(p => p.TypeEnum == 2 && p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id && !p.IsDeleted).Result.OrderBy(p => p.OrderNum).ToList();
+
+            //计算当前年月的N+1,N+2
+            string strN0 = input.year.ToString() + "-" + input.month.ToString("00");
+            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");
+            newYear = newMonth == 12 ? newYear + 1 : newYear;
+            newMonth = newMonth == 12 ? 1 : newMonth + 1;
+            string strN2 = newYear.ToString() + "-" + newMonth.ToString("00");
+
+            //整体需求计划
+            List<OverallDemandPlan> plans = new List<OverallDemandPlan>();
+            //计算海外
+            List<string> hwModels = overseasSales.Select(p => p.Model).Distinct().ToList();
+            int OrderNum = 1;
+            foreach (var item in hwModels)
+            {
+                var curFcsts = overseasSales.Where(p => p.Model == item).ToList();
+                OverallDemandPlan plan = new OverallDemandPlan();
+                plan.Area = "海外";
+                plan.Model = item;
+                plan.PlanMonth = strN0;
+                plan.Qty = curFcsts.Where(p => p.PlanMonth == strN0).Sum(p => p.Qty);
+                plan.OrderNum = OrderNum;
+                plans.Add(plan);
+
+                plan = new OverallDemandPlan();
+                plan.Area = "海外";
+                plan.Model = item;
+                plan.PlanMonth = strN1;
+                plan.Qty = curFcsts.Where(p => p.PlanMonth == strN1).Sum(p => p.Qty);
+                plan.OrderNum = OrderNum;
+                plans.Add(plan);
+
+                plan = new OverallDemandPlan();
+                plan.Area = "海外";
+                plan.Model = item;
+                plan.PlanMonth = strN2;
+                plan.Qty = curFcsts.Where(p => p.PlanMonth == strN2).Sum(p => p.Qty);
+                plan.OrderNum = OrderNum;
+                plans.Add(plan);
+
+                OrderNum += 1;
+            }
+            //计算国内
+            List<string> gnModels = domesticFcsts.Select(p=>p.Model).ToList();
+            gnModels.AddRange(platformFcsts.Select(p => p.Model).ToList());
+            gnModels = gnModels.Distinct().ToList();
+            OrderNum = 1;
+            foreach (var item in gnModels)
+            {
+                var curDFcsts = domesticFcsts.Where(p => p.Model == item).ToList();
+                var curPFcsts = platformFcsts.Where(p => p.Model == item).ToList();
+                OverallDemandPlan plan = new OverallDemandPlan();
+                plan.Area = "国内";
+                plan.Model = item;
+                plan.PlanMonth = strN0;
+                plan.Qty = curDFcsts.Where(p => p.PlanMonth == strN0).Sum(p => p.Qty) + curPFcsts.Where(p => p.PlanMonth == strN0).Sum(p => p.Qty);
+                plan.OrderNum = OrderNum;
+                plans.Add(plan);
+
+                plan = new OverallDemandPlan();
+                plan.Area = "国内";
+                plan.Model = item;
+                plan.PlanMonth = strN1;
+                plan.Qty = curDFcsts.Where(p => p.PlanMonth == strN1).Sum(p => p.Qty) + curPFcsts.Where(p => p.PlanMonth == strN1).Sum(p => p.Qty);
+                plan.OrderNum = OrderNum;
+                plans.Add(plan);
+
+                plan = new OverallDemandPlan();
+                plan.Area = "国内";
+                plan.Model = item;
+                plan.PlanMonth = strN2;
+                plan.Qty = curDFcsts.Where(p => p.PlanMonth == strN2).Sum(p => p.Qty) + curPFcsts.Where(p => p.PlanMonth == strN2).Sum(p => p.Qty);
+                plan.OrderNum = OrderNum;
+                plans.Add(plan);
+
+                OrderNum += 1;
+            }
 
+            plans.ForEach(p => {
+                p.Year= input.year;
+                p.Month= input.month;
+                p.tenant_id = input.tenant_id;
+                p.company_id = input.company_id;
+                p.factory_id= input.factory_id;
+                p.org_id= input.org_id;
+                p.create_by = input.create_by;
+                p.create_by_name= input.create_by_name;
+                p.create_time = DateTime.Now;
+            });
 
             //保存数据
             using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
             {
                 try
                 {
-                    ////先删除数据
-                    //_monthlyProdCapacityMain.Delete(p => p.tenant_id == input.tenant_id && p.factory_id == input.factory_id && p.Version.Contains(input.version.Substring(0, 7)));
-                    //_monthlyProdCapacityDtl.Delete(p => p.tenant_id == input.tenant_id && p.factory_id == input.factory_id && p.Version.Contains(input.version.Substring(0, 7)));
-
-                    ////插入数据
-                    //_monthlyProdCapacityMain.Insert(capacityMains);
-                    //_monthlyProdCapacityDtl.Insert(capacityDtls);
-                    //await unitOfWork.CompleteAsync();
+                    //先删除
+                    await _overallDemandPlan.HardDeleteAsync(p=>p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id);
+                    //保存整体需求计划
+                    await _overallDemandPlan.InsertManyAsync(plans);
+                    await unitOfWork.CompleteAsync();
                 }
                 catch (Exception e)
                 {
                     unitOfWork.Dispose();
-                    new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("CapacityAnalysis", "生成【" + input.year + "年" + input.month + "月】月度产能共识失败:" + e.Message, _currentTenant.Id.ToString());
+                    new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("OverallDemandPlan", "生成【" + input.year + "年" + input.month + "月】整体需求计划失败:" + e.Message, _currentTenant.Id.ToString());
                     return "NO|" + e.Message;
                 };
             }
-            return "OK|发布成功!";
+            return "OK|刷新成功!";
         }
     }
 }

+ 1 - 2
MicroServices/Business/Business.Domain/MongoDB/Base/MoBaseEntity.cs

@@ -77,9 +77,8 @@ namespace Business.Domain
         /// <summary>
         /// 公司ID
         /// </summary>
-        [Required]
         [Comment("公司ID")]
-        public virtual long company_id { get; set; }
+        public virtual long? company_id { get; set; }
 
         /// <summary>
         /// 工厂ID

+ 2 - 3
MicroServices/Business/Business.Domain/StructuredDB/Base/BaseEntity.cs

@@ -68,14 +68,13 @@ namespace Business.Domain
         [Required]
         [Comment("租户ID")]
         [DefaultValue(1000)]
-        public virtual long tenant_id { get; set; }
+        public virtual long? tenant_id { get; set; }
 
         /// <summary>
         /// 公司ID
         /// </summary>
-        [Required]
         [Comment("公司ID")]
-        public virtual long company_id { get; set; }
+        public virtual long? company_id { get; set; }
 
         /// <summary>
         /// 工厂ID

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/Production/MonthlyProdCapacityDtl.cs

@@ -13,7 +13,7 @@ namespace Business.Domain
     /// 月度产能共识明细表
     /// </summary>
     [Comment("月度产能共识主表")]
-    [Index(nameof(Year), nameof(Month), nameof(ProdLine), nameof(tenant_id), nameof(tenant_id), nameof(factory_id), IsUnique = true)]
+    [Index(nameof(Year), nameof(Month), nameof(ProdLine), nameof(tenant_id), nameof(factory_id), IsUnique = true)]
     public class MonthlyProdCapacityDtl
     {
         /// <summary>

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/Production/MonthlyProdCapacityMain.cs

@@ -13,7 +13,7 @@ namespace Business.Domain
     /// 月度产能共识主表
     /// </summary>
     [Comment("月度产能共识主表")]
-    [Index(nameof(Year), nameof(Month), nameof(ProdRange), nameof(Model), nameof(ProdLine), nameof(tenant_id), nameof(tenant_id), nameof(factory_id), IsUnique = true)]
+    [Index(nameof(Year), nameof(Month), nameof(ProdRange), nameof(Model), nameof(ProdLine), nameof(tenant_id), nameof(factory_id), IsUnique = true)]
     public class MonthlyProdCapacityMain
     {
         /// <summary>

+ 0 - 93
MicroServices/Business/Business.Domain/StructuredDB/Production/OverallDemandPlanDtl.cs

@@ -1,93 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Business.Domain
-{
-    /// <summary>
-    /// 整体需求计划明细表
-    /// </summary>
-    [Comment("整体需求计划明细表")]
-    [Index(nameof(Version), nameof(ProdRange), nameof(Model), nameof(PlanDate), nameof(tenant_id), nameof(tenant_id), nameof(factory_id), IsUnique = true)]
-    public class OverallDemandPlanDtl
-    {
-        /// <summary>
-        /// 主键
-        /// </summary>
-        [Comment("主键")]
-        [Key]
-        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
-        public long Id { get; set; }
-
-        /// <summary>
-        /// 年
-        /// </summary>
-        [Comment("年")]
-        public int? Year { get; set; }
-
-        /// <summary>
-        /// 月
-        /// </summary>
-        [Comment("月")]
-        public int? Month { get; set; }
-
-        /// <summary>
-        /// 版本号
-        /// </summary>
-        [Comment("版本号")]
-        public string Version { get; set; }
-
-        /// <summary>
-        /// 产品线
-        /// </summary>
-        [Comment("产品线")]
-        public string ProdLine { get; set; }
-
-        /// <summary>
-        /// 产品系列
-        /// </summary>
-        [Comment("产品系列")]
-        public string ProdRange { get; set; }
-
-        /// <summary>
-        /// 规格型号
-        /// </summary>
-        [Comment("规格型号")]
-        public string Model { get; set; }
-
-        /// <summary>
-        /// 计划月份
-        /// </summary>
-        [Comment("计划月份")]
-        public string PlanDate { get; set; }
-
-        /// <summary>
-        /// 月份计数:M0,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11
-        /// </summary>
-        [Comment("月份计数")]
-        public string MonthTimes { get; set; }
-
-        /// <summary>
-        /// 计划数量
-        /// </summary>
-        [Comment("计划数量")]
-        public decimal? Qty { get; set; }
-
-        /// <summary>
-        /// 集团id
-        /// </summary>
-        [Comment("集团id")]
-        public long? tenant_id { get; set; }
-
-        /// <summary>
-        /// 工厂id
-        /// </summary>
-        [Comment("工厂id")]
-        public long? factory_id { get; set; }
-    }
-}

+ 0 - 81
MicroServices/Business/Business.Domain/StructuredDB/Production/OverallDemandPlanMain.cs

@@ -1,81 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Business.Domain
-{
-    /// <summary>
-    /// 整体需求计划主表
-    /// </summary>
-    [Comment("整体需求计划主表")]
-    [Index(nameof(Version), nameof(tenant_id), nameof(factory_id), IsUnique = true)]
-    public class OverallDemandPlanMain
-    {
-        /// <summary>
-        /// 主键
-        /// </summary>
-        [Comment("主键")]
-        [Key]
-        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
-        public long Id { get; set; }
-
-        /// <summary>
-        /// 年
-        /// </summary>
-        [Comment("年")]
-        public int? Year { get; set; }
-
-        /// <summary>
-        /// 月
-        /// </summary>
-        [Comment("月")]
-        public int? Month { get; set; }
-
-        /// <summary>
-        /// 版本号
-        /// </summary>
-        [Comment("版本号")]
-        public string Version { get; set; }
-
-        /// <summary>
-        /// 操作人
-        /// </summary>
-        [Comment("操作人")]
-        public string UserName { get; set; }
-
-        /// <summary>
-        /// 操作人工号
-        /// </summary>
-        [Comment("操作人工号")]
-        public string Account { get; set; }
-
-        /// <summary>
-        /// 操作时间
-        /// </summary>
-        [Comment("操作时间")]
-        public DateTime? ImportDate { get; set; }
-
-        /// <summary>
-        /// 流水号
-        /// </summary>
-        [Comment("流水号")]
-        public int? SerialNum { get; set; }
-
-        /// <summary>
-        /// 集团id
-        /// </summary>
-        [Comment("集团id")]
-        public long? tenant_id { get; set; }
-
-        /// <summary>
-        /// 工厂id
-        /// </summary>
-        [Comment("工厂id")]
-        public long? factory_id { get; set; }
-    }
-}

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/DomesticTerminalFcst.cs

@@ -62,7 +62,7 @@ namespace Business.Domain
         /// 产品数量
         /// </summary>
         [Comment("产品数量")]
-        public decimal? Qty { get; set; }
+        public decimal Qty { get; set; }
 
         /// <summary>
         /// 排序编码

+ 61 - 0
MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/OverallDemandPlan.cs

@@ -0,0 +1,61 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.Domain
+{
+    /// <summary>
+    /// 整体需求计划表
+    /// </summary>
+    [Comment("整体需求计划表")]
+    [Index(nameof(Year), nameof(Month), nameof(Area), nameof(Model),nameof(PlanMonth),nameof(tenant_id),nameof(company_id), nameof(factory_id), IsUnique = true)]
+    public class OverallDemandPlan : BaseEntity
+    {
+        /// <summary>
+        /// 年
+        /// </summary>
+        [Comment("年")]
+        public int? Year { get; set; }
+
+        /// <summary>
+        /// 月
+        /// </summary>
+        [Comment("月")]
+        public int? Month { get; set; }
+
+        /// <summary>
+        /// 区域
+        /// </summary>
+        [Comment("区域")]
+        public string Area { get; set; }
+
+        /// <summary>
+        /// 规格型号
+        /// </summary>
+        [Comment("规格型号")]
+        public string Model { get; set; }
+
+        /// <summary>
+        /// 计划年月
+        /// </summary>
+        [Comment("计划年月")]
+        public string PlanMonth { get; set; }
+
+        /// <summary>
+        /// 产品数量
+        /// </summary>
+        [Comment("产品数量")]
+        public decimal Qty { get; set; }
+
+        /// <summary>
+        /// 排序编码
+        /// </summary>
+        [Comment("排序编码")]
+        public int OrderNum { get; set; }
+    }
+}

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/OverseasSaleFcst.cs

@@ -56,7 +56,7 @@ namespace Business.Domain
         /// 产品数量
         /// </summary>
         [Comment("产品数量")]
-        public decimal? Qty { get; set; }
+        public decimal Qty { get; set; }
 
         /// <summary>
         /// 排序编码

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/PlatformFcstCollect.cs

@@ -56,7 +56,7 @@ namespace Business.Domain
         /// 产品数量
         /// </summary>
         [Comment("产品数量")]
-        public decimal? Qty { get; set; }
+        public decimal Qty { get; set; }
 
         /// <summary>
         /// 排序编码

+ 7 - 1
MicroServices/Business/Business.Domain/StructuredDB/SaleFcst/YearDemandManagementHistory.cs

@@ -13,9 +13,15 @@ namespace Business.Domain
     /// 年度生产需求管理历史表
     /// </summary>
     [Comment("年度生产需求管理表")]
-    [Index(nameof(Year), nameof(Area), nameof(ProdLine),nameof(ProdRange), nameof(Line),nameof(Model),nameof(PlanMonth),nameof(tenant_id), nameof(company_id),nameof(factory_id), IsUnique = true)]
+    [Index(nameof(UpdateMonth),nameof(Year), nameof(Area), nameof(ProdLine),nameof(ProdRange), nameof(Line),nameof(Model),nameof(PlanMonth),nameof(tenant_id), nameof(company_id),nameof(factory_id), IsUnique = true)]
     public class YearDemandManagementHistory : BaseEntity
     {
+        /// <summary>
+        /// 更新年月
+        /// </summary>
+        [Comment("更新年月")]
+        public string UpdateMonth { get; set; }
+
         /// <summary>
         /// 年
         /// </summary>

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

@@ -153,16 +153,6 @@ namespace Business.EntityFrameworkCore
         /// </summary>
         public DbSet<MonthlyProdCapacityDtl> MonthlyProdCapacityDtl { get; set; }
 
-        /// <summary>
-        /// ÕûÌåÐèÇ󼯻®Ö÷±í
-        /// </summary>
-        public DbSet<OverallDemandPlanMain> OverallDemandPlanMain { get; set; }
-
-        /// <summary>
-        /// ÕûÌåÐèÇ󼯻®Ã÷ϸ±í
-        /// </summary>
-        public DbSet<OverallDemandPlanDtl> OverallDemandPlanDtl { get; set; }
-
         /// <summary>
         /// ±ê×¼ÎïÁϹæ¸ñÐͺÅÉèÖñí
         /// </summary>
@@ -193,6 +183,11 @@ namespace Business.EntityFrameworkCore
         /// </summary>
         public DbSet<YearDemandManagementHistory> YearDemandManagementHistory { get; set; }
 
+        /// <summary>
+        /// ÕûÌåÐèÇ󼯻®±í
+        /// </summary>
+        public DbSet<OverallDemandPlan> OverallDemandPlan { get; set; }
+
         /// <summary>
         /// ƽ̨¿â´æ¼à¿ØÉèÖñí
         /// </summary>

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

@@ -57,5 +57,17 @@ namespace Business.Controllers
         {
             return _MonthlyCapacityLoadAppService.DemandAnalysis(input);
         }
+
+        /// <summary>
+        /// 生成整体需求计划
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("overalldemandplan")]
+        public Task<string> OverallDemandPlan(InputDto input)
+        {
+            return _MonthlyCapacityLoadAppService.OverallDemandPlan(input);
+        }
     }
 }

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

@@ -106,3 +106,37 @@
 {"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-07T00:10:43.0575013+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
 {"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-07T00:10:43.1010296+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
 {"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-07T00:10:43.1043142+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-12T16:48:50.0122118+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-12T16:48:50.0454603+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-12T16:48:50.0484197+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:04:00.109041+08:00","EndDate":"2023-07-12T17:05:40.1597938+08:00","Msg":"The request was canceled due to the configured HttpClient.Timeout of 100 seconds elapsing.","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:25:03.113921+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:25:03.1780395+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:25:03.1815642+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:40:04.1783835+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:40:04.2400286+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:40:04.2429164+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:49:02.8551737+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:49:02.9039685+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-12T17:49:02.9100942+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:49:40.855118+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:49:40.8932889+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:49:40.8963079+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:50:20.8723405+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:50:20.931213+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:50:20.9357628+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:53:24.8701431+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:53:24.9008552+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:53:24.9037007+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:57:18.3251111+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:57:18.3756041+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-13T17:57:18.3776762+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-13T18:08:03.0977677+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-13T18:08:03.1523393+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-13T18:08:03.1573423+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-13T18:15:11.3044155+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-13T18:15:11.362084+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-13T18:15:11.3679583+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步WMS物料订单等基础数据到MySQL","GroupName":"systemquartzjob","BeginDate":"2023-07-13T18:19:21.7756453+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时创建NLog日志按月分表","GroupName":"systemquartzjob","BeginDate":"2023-07-13T18:19:21.8208718+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}
+{"TaskName":"定时同步MySQL基础数据到MongoDB","GroupName":"systemquartzjob","BeginDate":"2023-07-13T18:19:21.8258524+08:00","EndDate":null,"Msg":"任务初始化启动成功:6","id":0,"timeflag":null,"changetime":null}