Bladeren bron

VSM接口提交

Murphy 2 jaren geleden
bovenliggende
commit
e53a9c2d0b
17 gewijzigde bestanden met toevoegingen van 837 en 164 verwijderingen
  1. 21 0
      MicroServices/Business/Business.Application.Contracts/VSM/IVSMAppService.cs
  2. 315 126
      MicroServices/Business/Business.Application/VSM/VSMAppService.cs
  3. 30 0
      MicroServices/Business/Business.Domain/StructuredDB/MES/BalanceNumDto.cs
  4. 67 0
      MicroServices/Business/Business.Domain/StructuredDB/MES/InvTransHistDay.cs
  5. 30 0
      MicroServices/Business/Business.Domain/StructuredDB/MES/InvTransHistDayDto.cs
  6. 2 33
      MicroServices/Business/Business.Domain/StructuredDB/MES/InvTransHistDetailDto.cs
  7. 30 0
      MicroServices/Business/Business.Domain/StructuredDB/MES/QtyChangeDto.cs
  8. 58 5
      MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/BusinessDbContextModelCreatingExtensions.cs
  9. 5 0
      MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/BusinessEntityFrameworkCoreModule.cs
  10. 10 0
      MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/DOP/BusinessDbContext.cs
  11. 31 0
      MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/ExtRA/BusinessExtRADbContext.cs
  12. 25 0
      MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/ExtRA/BusinessExtRADbContextFactory.cs
  13. 21 0
      MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/ExtRA/BussinessExtRADbContextOptionsConfigurer.cs
  14. 122 0
      MicroServices/Business/Business.EntityFrameworkCore/Repository/SqlRepositories/ExtRASqlRepository.cs
  15. 34 0
      MicroServices/Business/Business.EntityFrameworkCore/Repository/SqlRepositories/IExtRASqlRepository.cs
  16. 1 0
      MicroServices/Business/Business.Host/Startup.cs
  17. 35 0
      MicroServices/Business/Business.HttpApi/Controllers/VSMController.cs

+ 21 - 0
MicroServices/Business/Business.Application.Contracts/VSM/IVSMAppService.cs

@@ -50,5 +50,26 @@ namespace Business.VSM
         /// <param name="id"></param>
         /// <returns></returns>
         string ChartLinePLTOption(string PLT);
+
+        /// <summary>
+        ///终端出货趋势柱状图
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        string ChartLineModelOption(string factory_id, string model, string avgHW, string avgGK, string avgT1, string avgTotal);
+
+        /// <summary>
+        ///终端出货趋势折线图
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        string ChartLineOutStockOption(string factory_id, string model);
+
+        /// <summary>
+        /// 每日计算进出存快照
+        /// </summary>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        string CalcInvDayHist(string domain);
     }
 }

+ 315 - 126
MicroServices/Business/Business.Application/VSM/VSMAppService.cs

@@ -7,14 +7,19 @@ using Business.EntityFrameworkCore;
 using Business.EntityFrameworkCore.SqlRepositories;
 using Business.ResourceExamineManagement;
 using Business.ResourceExamineManagement.Dto;
+using Business.StructuredDB.MES;
 using Business.StructuredDB.MES.IC;
+using Business.StructuredDB.WMS;
 using Business.VSM;
 using EFCore.BulkExtensions;
+using MathNet.Numerics.LinearAlgebra.Factorization;
 using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Internal;
 using Microsoft.Extensions.Configuration;
 using MongoDB.Driver.Linq;
 using Newtonsoft.Json;
 using NLog;
+using Org.BouncyCastle.Asn1.X509;
 using System;
 using System.Collections.Generic;
 using System.Data;
@@ -23,6 +28,7 @@ using System.Linq;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
+using System.Xml.Linq;
 using Volo.Abp.Application.Services;
 using Volo.Abp.Domain.Repositories;
 using Volo.Abp.MultiTenancy;
@@ -38,6 +44,11 @@ namespace Business.VSMManagement
         private readonly IRepository<srm_purchase> _srm_purchase;
         private readonly IRepository<ic_item> _ic_item;
         private readonly ISqlRepository<LocationDetail> _LocationDetail;
+        private readonly ISqlRepository<InvTransHistDay> _InvTransHistDay;
+        private readonly IExtRASqlRepository<DMS_IN_PODETAIL> _DMS_IN_PODETAIL;
+        private readonly IExtRASqlRepository<DMS_IN_LOCDETAIL> _DMS_IN_LOCDETAIL;
+        private readonly IExtRASqlRepository<DMS_IN_ITEMMAPPING> _DMS_IN_ITEMMAPPING;
+        private readonly ISqlRepository<SAPInv> _SAPInv;
         private readonly BusinessDbContext _businessDbContext;
         public VSMAppService(
          ISqlRepository<ItemMaster> itemMaster,
@@ -45,6 +56,11 @@ namespace Business.VSMManagement
          IRepository<srm_purchase> srm_purchase,
          IRepository<ic_item> ic_item,
          ISqlRepository<LocationDetail> locationDetail,
+         ISqlRepository<InvTransHistDay> invTransHistDay,
+         IExtRASqlRepository<DMS_IN_PODETAIL> dms_IN_PODETAIL,
+         IExtRASqlRepository<DMS_IN_LOCDETAIL> dms_IN_LOCDETAIL,
+         IExtRASqlRepository<DMS_IN_ITEMMAPPING> dms_IN_ITEMMAPPING,
+         ISqlRepository<SAPInv> SAPInv,
         BusinessDbContext businessDbContext
          )
         {
@@ -53,18 +69,23 @@ namespace Business.VSMManagement
             _srm_purchase = srm_purchase;
             _ic_item = ic_item;
             _LocationDetail=locationDetail;
+            _InvTransHistDay = invTransHistDay;
+            _DMS_IN_PODETAIL = dms_IN_PODETAIL;
+            _DMS_IN_LOCDETAIL= dms_IN_LOCDETAIL;
+            _DMS_IN_ITEMMAPPING= dms_IN_ITEMMAPPING;
+            _SAPInv=SAPInv;
             _businessDbContext = businessDbContext;
         }
         public string ValueFrequency(string Loc, string BeginDate, string EndDate, string KanBan, string Frequency)
         {
             try
             {
-                var itemLoc = _LocationDetail.Select(a => a.Location == Loc && a.Domain == "8010");
-                var itemList = itemLoc.Select(a => a.ItemNum).Distinct().ToList();
-                ValueFrequencyDto dto = new ValueFrequencyDto();
                 DateTime beginDate = Convert.ToDateTime(BeginDate);
                 DateTime endDate = Convert.ToDateTime(EndDate);
-                var itemTranList=_invTransHist.Select(a => a.Loc == Loc && a.CreateTime >= beginDate && a.CreateTime < endDate && itemList.Contains(a.ItemNum));
+                string sql = $"select distinct ItemNum,Min(CreateTime) AS HistMinTime from InvTransHist where Domain='8010' and createTime>='{beginDate}' and createTime<='{endDate}' group by ItemNum";
+                var InvTransHistDto = _businessDbContext.InvTransHistDayDto.FromSqlRaw(sql).ToList();
+                var itemList = InvTransHistDto.Select(a => a.ItemNum).Distinct().ToList();
+                ValueFrequencyDto dto = new ValueFrequencyDto();
                 List<ValueFrequencyKanBanDto> kanBanDtos = new List<ValueFrequencyKanBanDto>();
                 var icitems = _ic_item.GetListAsync(a => itemList.Contains(a.number)).Result;
                 var srm_purchases = _srm_purchase.GetListAsync(a => icitems.Select(b=>b.Id).ToList().Contains(a.icitem_id)).Result;
@@ -72,13 +93,7 @@ namespace Business.VSMManagement
                 string sqldzd = @"select MATNR AS ItemNum,MAx(NETPR)*10 AS NETPR from SupplierStatement group by  MATNR";
                 var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
 
-                string sql = @"select a.Loc as Loc,BeginBalance,BeginBalance+QtyChange as BalanceNum,a.ItemNum,
-                                             (case when a.QtyChange>0 then a.QtyChange else 0 end) as QtyChangeAdvance,
-                                             (case when a.QtyChange<0 then abs(a.QtyChange) else 0 end) as QtyChangeOut,
-                                             a.LotSerial,a.createTime from InvTransHist a inner join (select itemnum,LotSerial,Max(CreateTime) AS CreateTime from 
-                                             InvTransHist where  loc='1001' and domain='8010' group by itemnum,LotSerial) b on a.ItemNum=b.ItemNum 
-                                             and a.CreateTime=b.CreateTime and a.Loc='1001' and a.Domain='8010' and a.LotSerial=b.LotSerial";
-                var InvTransHistDto = _businessDbContext.InvTransHistDto.FromSqlRaw(sql).ToList();
+                var InvTransHistDayDto = _InvTransHistDay.Select(a => a.HistDayTime >= beginDate.Date && a.HistDayTime <= endDate);
                 itemList.ForEach(item =>
                 {
                     if(icitems.Any(a=>a.number==item))
@@ -104,15 +119,12 @@ namespace Business.VSMManagement
                             itemKanBanDto.NETPR = 1 * 10;
                         }
                         //出库总数
-                        var outstock = itemTranList.Where(a => a.ItemNum == item && a.QtyChange < 0).ToList();
-                        itemKanBanDto.OutStockQty = Math.Abs(outstock.Sum(a => a.QtyChange).Value);
+                        itemKanBanDto.OutStockQty = InvTransHistDayDto.Where(a => a.ItemNum == item).Sum(b => b.QtyChangeOut);
 
                         //库存数据取进出存期末数据
-                        if(InvTransHistDto.Any(a=>a.ItemNum==item))
-                        {
-                            itemKanBanDto.Amount = InvTransHistDto.Where(a=>a.ItemNum==item).Sum(a=>a.BalanceNum)* itemKanBanDto.NETPR;
-                        }
-                        itemKanBanDto.MoveCount = itemTranList.Where(a => a.ItemNum == item && a.QtyChange < 0).Count();
+                        itemKanBanDto.Amount = InvTransHistDayDto.Where(a => a.ItemNum == item).OrderByDescending(a => a.HistDayTime).First().BalanceNum * itemKanBanDto.NETPR;
+
+                        itemKanBanDto.MoveCount = InvTransHistDayDto.Where(a => a.ItemNum == item && a.QtyChangeOut > 0).Count();
                         int days = endDate.Subtract(beginDate).Days;
                         //同一天算1天
                         if (days == 0)
@@ -179,26 +191,22 @@ namespace Business.VSMManagement
                 List<ValueFrequencyDetailDto> dtos = new List<ValueFrequencyDetailDto>();
                 try
                 {
-                    var itemLoc = _LocationDetail.Select(a => a.Location == Loc && a.Domain == "8010");
-                    var itemList = itemLoc.Select(a => a.ItemNum).Distinct().ToList();
-                    ValueFrequencyDto dto = new ValueFrequencyDto();
                     DateTime beginDate = Convert.ToDateTime(BeginDate);
                     DateTime endDate = Convert.ToDateTime(EndDate);
-                    var itemTranList = _invTransHist.Select(a => a.Loc == Loc && a.CreateTime >= beginDate && a.CreateTime < endDate && itemList.Contains(a.ItemNum));
+                    string sql = $"select distinct ItemNum,Min(CreateTime) AS HistMinTime from InvTransHist where Domain='8010' and createTime>='{beginDate}' and createTime<='{endDate}' group by ItemNum";
+                    var InvTransHistDto = _businessDbContext.InvTransHistDayDto.FromSqlRaw(sql).ToList();
+                    var itemList = InvTransHistDto.Select(a => a.ItemNum).Distinct().ToList();
+                    ValueFrequencyDto dto = new ValueFrequencyDto();
+                    
+
                     List<ValueFrequencyKanBanDto> kanBanDtos = new List<ValueFrequencyKanBanDto>();
                     var icitems = _ic_item.GetListAsync(a => itemList.Contains(a.number)).Result;
                     var srm_purchases = _srm_purchase.GetListAsync(a => icitems.Select(b => b.Id).ToList().Contains(a.icitem_id)).Result;
 
-                    string sqldzd = @"select MATNR AS ItemNum,MAx(NETPR)*10 AS NETPR from SupplierStatement group by  MATNR";
+                    string sqldzd = @"select MATNR AS ItemNum,Max(NETPR)*10 AS NETPR from SupplierStatement group by  MATNR";
                     var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
 
-                    string sql = @"select a.Loc as Loc,BeginBalance,BeginBalance+QtyChange as BalanceNum,a.ItemNum,
-                                             (case when a.QtyChange>0 then a.QtyChange else 0 end) as QtyChangeAdvance,
-                                             (case when a.QtyChange<0 then abs(a.QtyChange) else 0 end) as QtyChangeOut,
-                                             a.LotSerial,a.createTime from InvTransHist a inner join (select itemnum,LotSerial,Max(CreateTime) AS CreateTime from 
-                                             InvTransHist where  loc='1001' and domain='8010' group by itemnum,LotSerial) b on a.ItemNum=b.ItemNum 
-                                             and a.CreateTime=b.CreateTime and a.Loc='1001' and a.Domain='8010' and a.LotSerial=b.LotSerial";
-                    var InvTransHistDto = _businessDbContext.InvTransHistDto.FromSqlRaw(sql).ToList();
+                    var InvTransHistDayDto = _InvTransHistDay.Select(a=>a.HistDayTime>= beginDate.Date && a.HistDayTime<= endDate);
                     itemList.ForEach(item =>
                     {
                         if (icitems.Any(a => a.number == item))
@@ -224,15 +232,12 @@ namespace Business.VSMManagement
                                 itemKanBanDto.NETPR = 1 * 10;
                             }
                             //出库总数
-                            var outstock = itemTranList.Where(a => a.ItemNum == item && a.QtyChange < 0).ToList();
-                            itemKanBanDto.OutStockQty = Math.Abs(outstock.Sum(a => a.QtyChange).Value);
+                            itemKanBanDto.OutStockQty = InvTransHistDayDto.Where(a=>a.ItemNum==item).Sum(b=>b.QtyChangeOut);
 
                             //库存数据取进出存期末数据
-                            if (InvTransHistDto.Any(a => a.ItemNum == item))
-                            {
-                                itemKanBanDto.Amount = InvTransHistDto.Where(a => a.ItemNum == item).Sum(a => a.BalanceNum) * itemKanBanDto.NETPR;
-                            }
-                            itemKanBanDto.MoveCount = itemTranList.Where(a => a.ItemNum == item && a.QtyChange < 0).Count();
+                            itemKanBanDto.Amount = InvTransHistDayDto.Where(a => a.ItemNum == item).OrderByDescending(a=>a.HistDayTime).First().BalanceNum * itemKanBanDto.NETPR;
+               
+                            itemKanBanDto.MoveCount = InvTransHistDayDto.Where(a => a.ItemNum == item && a.QtyChangeOut>0).Count();
                             int days = endDate.Subtract(beginDate).Days;
                             //同一天算1天
                             if (days == 0)
@@ -307,68 +312,68 @@ namespace Business.VSMManagement
 
         public string ChartLineOption(string Loc, string BeginDate, string EndDate, string ItemNum,string TurnOver,string KanBan)
         {
-            if(KanBan=="3")
-            {
-                string sql = @"select t.[Date] AS [Date],t.DateStockQty AS StockQty,t.DateOutStockQty AS OutStockQty,t.DateInStockQty AS InStockQty,[SuggestStockQty] AS SuggestQty  from [dbo].[3KanBan] t";
-                var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
-                StringBuilder sb = new StringBuilder();
-                StringBuilder sbDays = new StringBuilder();
-                StringBuilder sbDaysStock = new StringBuilder();
-                StringBuilder sbDaysInStock = new StringBuilder();
-                StringBuilder sbDaysOutStock = new StringBuilder();
-                StringBuilder sbDaysSuggest = new StringBuilder();
-                sb.Append("{tooltip:{trigger:'axis'},legend:{data: ['日库存数量','日出库数量','日入库数量','推荐日库存数量']},grid:{left:'3%',right:'4%',bottom:'3%',containLabel:true},toolbox:{feature:{saveAsImage: {}}},xAxis: {type:'category',boundaryGap: false,data:[");
-                chartDtosTest.ForEach(a =>
-                {
-                    sbDays.Append(string.Format("'{0}',", a.Date));
-                    sbDaysStock.Append(string.Format("{0},", a.StockQty));
-                    sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
-                    sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
-                    sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
-                });
-                sb.Append(sbDays.ToString().TrimEnd(',')).
-                   Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
-                   Append(sbDaysStock.ToString().TrimEnd(',')).
-                   Append("]},{name:'日出库数量',type:'line',data:[").
-                   Append(sbDaysOutStock.ToString().TrimEnd(',')).
-                   Append("]},{name:'日入库数量',type:'line',data:[").
-                   Append(sbDaysInStock.ToString().TrimEnd(',')).
-                   Append("]},{name:'推荐日库存数量',type:'line',data:[").
-                   Append(sbDaysSuggest.ToString().TrimEnd(',')).
-                   Append("]}]}");
-                return sb.ToString();
-            }
-            else if(KanBan=="2")
-            {
-                string sql = @"select t.[Date] AS [Date],t.DateStockQty AS StockQty,t.DateOutStockQty AS OutStockQty,t.DateInStockQty AS InStockQty,[SuggestStockQty] AS SuggestQty  from [dbo].[2KanBan] t";
-                var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
-                StringBuilder sb = new StringBuilder();
-                StringBuilder sbDays = new StringBuilder();
-                StringBuilder sbDaysStock = new StringBuilder();
-                StringBuilder sbDaysInStock = new StringBuilder();
-                StringBuilder sbDaysOutStock = new StringBuilder();
-                StringBuilder sbDaysSuggest = new StringBuilder();
-                sb.Append("{tooltip:{trigger:'axis'},legend:{data: ['日库存数量','日出库数量','日入库数量','推荐日库存数量']},grid:{left:'3%',right:'4%',bottom:'3%',containLabel:true},toolbox:{feature:{saveAsImage: {}}},xAxis: {type:'category',boundaryGap: false,data:[");
-                chartDtosTest.ForEach(a =>
-                {
-                    sbDays.Append(string.Format("'{0}',", a.Date));
-                    sbDaysStock.Append(string.Format("{0},", a.StockQty));
-                    sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
-                    sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
-                    sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
-                });
-                sb.Append(sbDays.ToString().TrimEnd(',')).
-                   Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
-                   Append(sbDaysStock.ToString().TrimEnd(',')).
-                   Append("]},{name:'日出库数量',type:'line',data:[").
-                   Append(sbDaysOutStock.ToString().TrimEnd(',')).
-                   Append("]},{name:'日入库数量',type:'line',data:[").
-                   Append(sbDaysInStock.ToString().TrimEnd(',')).
-                   Append("]},{name:'推荐日库存数量',type:'line',data:[").
-                   Append(sbDaysSuggest.ToString().TrimEnd(',')).
-                   Append("]}]}");
-                return sb.ToString();
-            }
+            //if(KanBan=="3")
+            //{
+            //    string sql = @"select t.[Date] AS [Date],t.DateStockQty AS StockQty,t.DateOutStockQty AS OutStockQty,t.DateInStockQty AS InStockQty,[SuggestStockQty] AS SuggestQty  from [dbo].[3KanBan] t";
+            //    var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
+            //    StringBuilder sb = new StringBuilder();
+            //    StringBuilder sbDays = new StringBuilder();
+            //    StringBuilder sbDaysStock = new StringBuilder();
+            //    StringBuilder sbDaysInStock = new StringBuilder();
+            //    StringBuilder sbDaysOutStock = new StringBuilder();
+            //    StringBuilder sbDaysSuggest = new StringBuilder();
+            //    sb.Append("{tooltip:{trigger:'axis'},legend:{data: ['日库存数量','日出库数量','日入库数量','推荐日库存数量']},grid:{left:'3%',right:'4%',bottom:'3%',containLabel:true},toolbox:{feature:{saveAsImage: {}}},xAxis: {type:'category',boundaryGap: false,data:[");
+            //    chartDtosTest.ForEach(a =>
+            //    {
+            //        sbDays.Append(string.Format("'{0}',", a.Date));
+            //        sbDaysStock.Append(string.Format("{0},", a.StockQty));
+            //        sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
+            //        sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
+            //        sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
+            //    });
+            //    sb.Append(sbDays.ToString().TrimEnd(',')).
+            //       Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
+            //       Append(sbDaysStock.ToString().TrimEnd(',')).
+            //       Append("]},{name:'日出库数量',type:'line',data:[").
+            //       Append(sbDaysOutStock.ToString().TrimEnd(',')).
+            //       Append("]},{name:'日入库数量',type:'line',data:[").
+            //       Append(sbDaysInStock.ToString().TrimEnd(',')).
+            //       Append("]},{name:'推荐日库存数量',type:'line',data:[").
+            //       Append(sbDaysSuggest.ToString().TrimEnd(',')).
+            //       Append("]}]}");
+            //    return sb.ToString();
+            //}
+            //else if(KanBan=="2")
+            //{
+            //    string sql = @"select t.[Date] AS [Date],t.DateStockQty AS StockQty,t.DateOutStockQty AS OutStockQty,t.DateInStockQty AS InStockQty,[SuggestStockQty] AS SuggestQty  from [dbo].[2KanBan] t";
+            //    var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
+            //    StringBuilder sb = new StringBuilder();
+            //    StringBuilder sbDays = new StringBuilder();
+            //    StringBuilder sbDaysStock = new StringBuilder();
+            //    StringBuilder sbDaysInStock = new StringBuilder();
+            //    StringBuilder sbDaysOutStock = new StringBuilder();
+            //    StringBuilder sbDaysSuggest = new StringBuilder();
+            //    sb.Append("{tooltip:{trigger:'axis'},legend:{data: ['日库存数量','日出库数量','日入库数量','推荐日库存数量']},grid:{left:'3%',right:'4%',bottom:'3%',containLabel:true},toolbox:{feature:{saveAsImage: {}}},xAxis: {type:'category',boundaryGap: false,data:[");
+            //    chartDtosTest.ForEach(a =>
+            //    {
+            //        sbDays.Append(string.Format("'{0}',", a.Date));
+            //        sbDaysStock.Append(string.Format("{0},", a.StockQty));
+            //        sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
+            //        sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
+            //        sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
+            //    });
+            //    sb.Append(sbDays.ToString().TrimEnd(',')).
+            //       Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
+            //       Append(sbDaysStock.ToString().TrimEnd(',')).
+            //       Append("]},{name:'日出库数量',type:'line',data:[").
+            //       Append(sbDaysOutStock.ToString().TrimEnd(',')).
+            //       Append("]},{name:'日入库数量',type:'line',data:[").
+            //       Append(sbDaysInStock.ToString().TrimEnd(',')).
+            //       Append("]},{name:'推荐日库存数量',type:'line',data:[").
+            //       Append(sbDaysSuggest.ToString().TrimEnd(',')).
+            //       Append("]}]}");
+            //    return sb.ToString();
+            //}
             try
             {
                 DateTime beginDate = Convert.ToDateTime(BeginDate);
@@ -381,38 +386,17 @@ namespace Business.VSMManagement
                 {
                     chartPLT = srm_purchases.Where(a => a.number == ItemNum && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
                 }
-                //string sqldzd = @"select MATNR AS ItemNum,MAx(NETPR)*10 AS NETPR from SupplierStatement group by  MATNR";
-                //var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
 
-                string sql = string.Format(@"select a.ItemNum,a.Loc,a.LotSerial,BeginBalance,a.QtyChange,(case when a.QtyChange>0 then a.QtyChange else 0 end) as QtyChangeAdvance,
-                                                   (case when a.QtyChange<0 then abs(a.QtyChange) else 0 end) as QtyChangeOut,BeginBalance+QtyChange as BalanceNum,
-                                                    a.CreateTime from InvTransHist a where  loc='{0}' and domain='8010' and itemnum='{1}' order by CreateTime", Loc,ItemNum);
-                var InvTransHistDto = _businessDbContext.InvTransHistDetailDto.FromSqlRaw(sql).ToList();
-                DateTime minTime = InvTransHistDto.Min(a => a.CreateTime);
-                DateTime maxTime = InvTransHistDto.Max(a => a.CreateTime);
-                if(beginDate<minTime)
-                {
-                    minTime = beginDate;
-                }
-                if(endDate>maxTime)
-                {
-                    maxTime = endDate;
-                }
-                int tranDays = (maxTime - minTime).Days;
+                var InvTransHistDayDto = _InvTransHistDay.Select(a => a.ItemNum== ItemNum && a.HistDayTime >= beginDate.Date && a.HistDayTime <= endDate);
+                int tranDays = (endDate-beginDate).Days;
                 List<ValueFrequencyChartDto> chartDtos = new List<ValueFrequencyChartDto>();
                 for(int i = 0; i < tranDays; i++)
                 {
                     ValueFrequencyChartDto dtoChart = new ValueFrequencyChartDto();
-                    dtoChart.Date = minTime.AddDays(i).ToString("yyyy-MM-dd");
-                    dtoChart.InStockQty = InvTransHistDto.Where(a => minTime.AddDays(i).Date==a.CreateTime.Date).Sum(a => a.QtyChangeAdvance);
-                    dtoChart.OutStockQty = InvTransHistDto.Where(a => minTime.AddDays(i).Date == a.CreateTime.Date).Sum(a => a.QtyChangeOut);
-                    if(i>0)
-                    {
-                        dtoChart.StockQty = chartDtos[i-1].StockQty + InvTransHistDto.Where(a => minTime.AddDays(i).Date == a.CreateTime.Date).Sum(a => a.QtyChange);
-                    }else
-                    {
-                        dtoChart.StockQty = InvTransHistDto.Where(a => minTime.AddDays(i).Date == a.CreateTime.Date).Sum(a => a.QtyChange);
-                    }
+                    dtoChart.Date = beginDate.AddDays(i).ToString("yyyy-MM-dd");
+                    dtoChart.InStockQty = InvTransHistDayDto.Where(a => beginDate.AddDays(i).Date== a.HistDayTime.Date).First().QtyChangeAdvance;
+                    dtoChart.OutStockQty = InvTransHistDayDto.Where(a => beginDate.AddDays(i).Date == a.HistDayTime.Date).First().QtyChangeOut;
+                    dtoChart.StockQty = InvTransHistDayDto.Where(a => beginDate.AddDays(i).Date == a.HistDayTime.Date).First().BalanceNum;
                     dtoChart.SuggestQty =chartKanBan*chartPLT;
                     chartDtos.Add(dtoChart);
                 }
@@ -512,5 +496,210 @@ namespace Business.VSMManagement
                 return sb.ToString();
             }
         }
+
+
+        public string ChartLineModelOption(string factory_id, string model,string avgHW, string avgGK, string avgT1, string avgTotal)
+        {
+            var loclist = _DMS_IN_LOCDETAIL.Select(a => a.UPN == model);
+            var lotList=loclist.Select(a => a.LOT).Distinct().ToList();
+            decimal? hw = 0;
+            decimal? gk = 0;
+            decimal? t1 = 0;
+            decimal? total = 0;
+            lotList.ForEach(a =>
+            {
+                var itemHW = loclist.Where(x => x.LOT == a && x.DealerLevel == "LP" && x.DealerCode == "RQ000002").ToList();
+                if(itemHW.Count>0)
+                {
+                    hw += itemHW.OrderByDescending(y => y.InventoryDate).First().Qty;
+                }
+
+                var itemGK = loclist.Where(x => x.LOT == a && x.DealerLevel == "LP" && x.DealerCode == "RQ000005").ToList();
+                if (itemGK.Count > 0)
+                {
+                    gk += itemGK.OrderByDescending(y => y.InventoryDate).First().Qty;
+                }
+
+                var itemT1 = loclist.Where(x => x.LOT == a && (x.DealerLevel == "T1" || x.DealerLevel == "LS")).ToList();
+                if (itemT1.Count > 0)
+                {
+                    t1 += itemT1.OrderByDescending(y => y.InventoryDate).First().Qty;
+                }
+            });
+            total=hw+gk+t1;
+            if(avgHW!="0")
+            {
+                string numDecimalStr = (hw.Value / decimal.Parse(avgHW)).ToString("#0.00");
+                hw = decimal.Parse(numDecimalStr);
+            }else
+            {
+                hw = 0;
+            }
+            if (avgGK != "0")
+            {
+                string numDecimalStr = (hw.Value / decimal.Parse(avgGK)).ToString("#0.00");
+                gk = decimal.Parse(numDecimalStr);
+            }
+            else
+            {
+                gk = 0;
+            }
+            if (avgT1 != "0")
+            {
+                string numDecimalStr = (hw.Value / decimal.Parse(avgT1)).ToString("#0.00");
+                t1 = decimal.Parse(numDecimalStr);
+            }
+            else
+            {
+                t1 = 0;
+            }
+            if (avgTotal != "0")
+            {
+                string numDecimalStr = (hw.Value / decimal.Parse(avgTotal)).ToString("#0.00");
+                total = decimal.Parse(numDecimalStr);
+            }
+            else
+            {
+                total = 0;
+            }
+            StringBuilder sb = new StringBuilder();
+            sb.Append("{xAxis:{type:'category',data:['海王库存','国科库存','T1','Total']},yAxis:{type:'value'},series:[{data:[" +hw+","+gk+","+t1+","+total+"],type:'bar',label:{show:true,position:'top'},itemStyle:{normal:{color:function(params){if(params.value<4){return 'red';}else{return '#5470c6';}}}}}]}");
+            return sb.ToString();
+        }
+
+        public string ChartLineOutStockOption(string factory_id, string model)
+        {
+            DateOnly dateOnly = DateOnly.FromDateTime(DateTime.Now.AddMonths(-14));
+            var polist=_DMS_IN_PODETAIL.Select(a => a.UPN == model && a.OrderStatus != "Revoked" && a.OrderStatus != "Rejected" && a.SubmitDate>=dateOnly);
+            StringBuilder sbDate = new StringBuilder();
+            StringBuilder sbHWOutStock = new StringBuilder();
+            StringBuilder sbGKOutStock = new StringBuilder();
+            StringBuilder sbT1OutStock = new StringBuilder();
+            StringBuilder sbTotalOutStock = new StringBuilder();
+            for (int i=-14;i<1;i++)
+            {
+                sbDate.Append(string.Format("'{0}',",DateTime.Now.AddMonths(i).Date.ToString("yyyy-MM-dd")));
+                var hw = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(i)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(i + 1)) && a.DealerCode== "RQ000002" && a.DealerLevel=="LP").Sum(a => a.RequiredQty);
+                var gk = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(i)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(i + 1)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty);
+                var t1 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(i)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(i + 1)) &&(a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty);
+                var total = hw + gk + t1;
+                sbHWOutStock.Append(string.Format("{0},", hw));
+                sbGKOutStock.Append(string.Format("{0},", gk));
+                sbT1OutStock.Append(string.Format("{0},", t1));
+                sbTotalOutStock.Append(string.Format("{0},", total));
+            }
+            StringBuilder sb = new StringBuilder();
+            sb.Append("{title: {text:'");
+            sb.Append(model+"出货趋势',");
+            sb.Append("left: 'center',},tooltip: {trigger: 'axis'},legend: {data:['海王', '国科', 'T1','Total'],bottom: '0',orient: 'horizontal'},grid: {left: '3%',right: '4%',bottom: '3%',containLabel: true},toolbox: {feature: {saveAsImage: {}}},xAxis:{type: 'category',boundaryGap: false,data:[");
+            sb.Append(sbDate.ToString().TrimEnd(',')).
+                  Append("]},yAxis:{type:'value',},series:[{name:'海王',type:'line',stack: 'Total',data:[").
+                  Append(sbHWOutStock.ToString().TrimEnd(',')).
+                  Append("]},{name:'国科',type:'line',stack:'Total',data:[").
+                  Append(sbGKOutStock.ToString().TrimEnd(',')).
+                  Append("]},{name:'T1',type:'line',stack:'Total',data:[").
+                  Append(sbT1OutStock.ToString().TrimEnd(',')).
+                  Append("]},{name:'Total',type:'line',stack:'Total',data:[").
+                  Append(sbTotalOutStock.ToString().TrimEnd(',')).
+                  Append("]}]}");
+            return sb.ToString();
+        }
+
+        public string CalcInvDayHist(string domain)
+        {
+            string sql = $"select distinct ItemNum,Min(CreateTime) AS HistMinTime from InvTransHist where Domain='{domain}' group by ItemNum";
+            var InvTransHistDto = _businessDbContext.InvTransHistDayDto.FromSqlRaw(sql).ToList();
+
+            string invHistTime = $"select A.ItemNum,Sum((case when a.QtyChange>0 then a.QtyChange else 0 end)) as QtyChangeAdvance,Sum((case when a.QtyChange<0 then abs(a.QtyChange) else 0 end)) as QtyChangeOut,CONVERT(varchar,a.createTime, 23) AS createTime from InvTransHist A where Domain='{domain}'  group by ItemNum,CONVERT(varchar,a.createTime, 23)";
+            var InvTransHistDetailDto = _businessDbContext.InvTransHistDetailDto.FromSqlRaw(invHistTime).ToList();
+
+            string sqlMaxTime = $"select t1.* from InvTransHistDay t1 inner join (SELECT max(HistDayTime) as HistDayTime, ItemNum FROM InvTransHistDay where Domain='{domain}' group by ItemNum) t2 on t1.HistDayTime=t2.HistDayTime and t1.ItemNum=t2.ItemNum and t1.Domain='{domain}'";
+            var InvTransHistMaxTimeDayDto = _businessDbContext.InvTransHistDay.FromSqlRaw(sqlMaxTime).ToList();
+
+            string sqlQtyChange = $"select ItemNum,Sum(QtyChange) AS QtyChange from InvTransHist where Domain='{domain}' group by ItemNum";
+            var QtyChangeDto = _businessDbContext.QtyChangeDto.FromSqlRaw(sqlQtyChange).ToList();
+
+            string sqlBalanceNum = $"select a.ItemNum,Sum(BeginBalance)+Sum(QtyChange) AS BalanceNum from InvTransHist a inner join (select ItemNum,LotSerial,Max(CreateTime) AS CreateTime from InvTransHist group by ItemNum,LotSerial ) b on a.ItemNum=b.ItemNum and a.LotSerial=b.LotSerial and a.CreateTime=b.CreateTime and Domain='{domain}' group by a.ItemNum";
+            var BalanceNumDto = _businessDbContext.BalanceNumDto.FromSqlRaw(sqlBalanceNum).ToList();
+
+            List<InvTransHistDay> daysHist = new List<InvTransHistDay>();
+            InvTransHistDto?.ForEach(x => {
+                if(InvTransHistMaxTimeDayDto.Any(a=>a.ItemNum==x.ItemNum))
+                {
+                    var xMaxDay = InvTransHistMaxTimeDayDto.Find(a => a.ItemNum == x.ItemNum).HistDayTime;
+                    int day = 1;
+                    while(true)
+                    {
+                        if(xMaxDay.AddDays(day).Date<=DateTime.Now.Date)
+                        {
+                            InvTransHistDay invTransHistDay = new InvTransHistDay();
+                            var daydetail = InvTransHistDetailDto.Find(a => a.ItemNum == x.ItemNum && a.CreateTime== xMaxDay.AddDays(day).Date.ToString("yyyy-MM-dd"));
+                            invTransHistDay.Domain = domain;
+                            invTransHistDay.ItemNum = x.ItemNum;
+                            if(day==1)
+                            {
+                                invTransHistDay.BeginBalance = InvTransHistMaxTimeDayDto.Find(a => a.ItemNum == x.ItemNum).BalanceNum;
+                            }else
+                            {
+                                invTransHistDay.BeginBalance = daysHist.Find(a => a.ItemNum == x.ItemNum && a.HistDayTime.Date == xMaxDay.AddDays(day - 1).Date).BalanceNum;
+                            }
+                            invTransHistDay.QtyChangeAdvance = daydetail == null ? 0 : daydetail.QtyChangeAdvance;
+                            invTransHistDay.QtyChangeOut = daydetail == null ? 0 : daydetail.QtyChangeOut;
+                            invTransHistDay.BalanceNum = invTransHistDay.BeginBalance + invTransHistDay.QtyChangeAdvance - invTransHistDay.QtyChangeOut;
+                            invTransHistDay.HistDayTime = xMaxDay.AddDays(day).Date;
+                            daysHist.Add(invTransHistDay);
+                            day++;
+                        }else
+                        {
+                            break;
+                        }
+                    }
+                }else
+                {
+                    var xMaxDay = InvTransHistDto.Find(a => a.ItemNum == x.ItemNum).HistMinTime.Value;
+                    int day = 0;
+                    while (true)
+                    {
+                        if (xMaxDay.AddDays(day).Date <= DateTime.Now.Date)
+                        {
+                            InvTransHistDay invTransHistDay = new InvTransHistDay();
+                            var daydetail = InvTransHistDetailDto.Find(a => a.ItemNum == x.ItemNum && a.CreateTime == xMaxDay.AddDays(day).Date.ToString("yyyy-MM-dd"));
+                            invTransHistDay.Domain = domain;
+                            invTransHistDay.ItemNum = x.ItemNum;
+                            if (day == 0)
+                            {
+                                var xBalanceNum = BalanceNumDto.Find(b => b.ItemNum == x.ItemNum);
+                                var xQtyChangeDto = QtyChangeDto.Find(b => b.ItemNum == x.ItemNum);
+                                if (xBalanceNum != null && xQtyChangeDto != null)
+                                {
+                                    invTransHistDay.BeginBalance = xBalanceNum.BalanceNum + xQtyChangeDto.QtyChange;
+                                }
+                                else
+                                {
+                                    invTransHistDay.BeginBalance = 0;
+                                }
+                            }
+                            else
+                            {
+                                var dayPredetail = daysHist.Find(a => a.ItemNum == x.ItemNum && a.HistDayTime.Date == xMaxDay.AddDays(day - 1).Date);
+                                invTransHistDay.BeginBalance = dayPredetail == null ? 0 : dayPredetail.BalanceNum;
+                            }
+                            invTransHistDay.QtyChangeAdvance = daydetail == null ? 0 : daydetail.QtyChangeAdvance;
+                            invTransHistDay.QtyChangeOut = daydetail == null ? 0 : daydetail.QtyChangeOut;
+                            invTransHistDay.BalanceNum = invTransHistDay.BeginBalance + invTransHistDay.QtyChangeAdvance - invTransHistDay.QtyChangeOut;
+                            invTransHistDay.HistDayTime = xMaxDay.AddDays(day).Date;
+                            daysHist.Add(invTransHistDay);
+                            day++;
+                        }
+                        else
+                        {
+                            break;
+                        }
+                    }
+                }
+            });
+            _businessDbContext.BulkInsert(daysHist);
+            return "ok";
+        }
     }
 }

+ 30 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/BalanceNumDto.cs

@@ -0,0 +1,30 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.StructuredDB.MES
+{
+    /// <summary>
+    /// 进出存记录
+    /// </summary>
+    [Comment("进出存记录")]
+    [Keyless]
+    public class BalanceNumDto
+    {
+        /// <summary>
+        /// 物料编号
+        /// </summary>
+        [Comment("物料编号")]
+        public string ItemNum { get; set; }
+
+        /// <summary>
+        /// 期末数
+        /// </summary>
+        [Comment("期末数")]
+        public decimal BalanceNum { get; set; }
+    }
+}

+ 67 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/InvTransHistDay.cs

@@ -0,0 +1,67 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.StructuredDB.MES
+{
+    /// <summary>
+    /// 进出存明细每日快照
+    /// </summary>
+    [Comment("进出存明细每日快照")]
+    public class InvTransHistDay
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        [Comment("主键")]
+        [Key]
+        public int RecID { get; set; }
+
+        /// <summary>
+        /// 域名
+        /// </summary>
+        [Comment("域名")]
+        public string Domain { get; set; }
+
+        /// <summary>
+        /// 物料编号
+        /// </summary>
+        [Comment("物料编号")]
+        public string ItemNum { get; set; }
+
+        /// <summary>
+        /// 期初数
+        /// </summary>
+        [Comment("期初数")]
+        public decimal BeginBalance { get; set; }
+
+        /// <summary>
+        /// 期末数
+        /// </summary>
+        [Comment("期末数")]
+        public decimal BalanceNum { get; set; }
+
+        /// <summary>
+        /// 入库数
+        /// </summary>
+        [Comment("入库数")]
+        public decimal QtyChangeAdvance { get; set; }
+
+
+        /// <summary>
+        /// 出库数
+        /// </summary>
+        [Comment("出库数")]
+        public decimal QtyChangeOut { get; set; }
+
+        /// <summary>
+        /// 库存日期
+        /// </summary>
+        [Comment("库存日期")]
+        public DateTime HistDayTime { get; set; }
+    }
+}

+ 30 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/InvTransHistDayDto.cs

@@ -0,0 +1,30 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.StructuredDB.MES
+{
+    /// <summary>
+    /// 物料编码列表
+    /// </summary>
+    [Comment("物料编码列表")]
+    [Keyless]
+    public partial class InvTransHistDayDto
+    {
+        /// <summary>
+        /// 物料编号
+        /// </summary>
+        [Comment("物料编号")]
+        public string ItemNum { get; set; }
+
+        /// <summary>
+        /// 快照最大计算时间
+        /// </summary>
+        [Comment("快照最大计算时间")]
+        public DateTime? HistMinTime { get; set; }
+    }
+}

+ 2 - 33
MicroServices/Business/Business.Domain/StructuredDB/MES/InvTransHistDetailDto.cs

@@ -21,30 +21,6 @@ namespace Business.StructuredDB.MES
         [Comment("物料编号")]
         public string ItemNum { get; set; }
 
-        /// <summary>
-        /// 库位
-        /// </summary>
-        [Comment("库位")]
-        public string Loc { get; set; }
-
-        /// <summary>
-        /// 批次
-        /// </summary>
-        [Comment("批次")]
-        public string LotSerial { get; set; }
-
-        /// <summary>
-        /// 期初数
-        /// </summary>
-        [Comment("期初数")]
-        public decimal BeginBalance { get; set; }
-
-        /// <summary>
-        /// 期末数
-        /// </summary>
-        [Comment("期末数")]
-        public decimal BalanceNum { get; set; }
-
         /// <summary>
         /// 入库数
         /// </summary>
@@ -59,16 +35,9 @@ namespace Business.StructuredDB.MES
         public decimal QtyChangeOut { get; set; }
 
         /// <summary>
-        /// 发生时间
+        /// 发生时间(yyyy-MM-dd)
         /// </summary>
         [Comment("发生时间")]
-        public DateTime CreateTime { get; set; }
-
-
-        /// <summary>
-        /// 变更数量
-        /// </summary>
-        [Comment("变更数量")]
-        public decimal QtyChange { get; set; }
+        public string CreateTime { get; set; }
     }
 }

+ 30 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/QtyChangeDto.cs

@@ -0,0 +1,30 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.StructuredDB.MES
+{
+    /// <summary>
+    /// 进出存记录
+    /// </summary>
+    [Comment("进出存记录")]
+    [Keyless]
+    public class QtyChangeDto
+    {
+        /// <summary>
+        /// 物料编号
+        /// </summary>
+        [Comment("物料编号")]
+        public string ItemNum { get; set; }
+
+        /// <summary>
+        /// 进出总数
+        /// </summary>
+        [Comment("进出总数")]
+        public decimal QtyChange { get; set; }
+    }
+}

+ 58 - 5
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/BusinessDbContextModelCreatingExtensions.cs

@@ -329,14 +329,14 @@ namespace Business.EntityFrameworkCore
             builder.Entity<DMS_IN_ITEMMAPPING>(b =>
             {
                 b.ToTable("DMS_IN_ITEMMAPPING");
-                b.HasKey(b => new { b.CfnCode, b.CfnERPCode});
+                b.HasNoKey();
                 b.ConfigureByConvention();
             });
 
             builder.Entity<DMS_IN_LOCDETAIL>(b =>
             {
                 b.ToTable("DMS_IN_LOCDETAIL");
-                b.HasKey(b => new { b.WarehouseName, b.UPN,b.LOT });
+                b.HasNoKey();
                 b.Property(b => b.ExpiredDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
                 b.Property(b => b.TransferDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
                 b.Property(b => b.InventoryDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
@@ -346,7 +346,7 @@ namespace Business.EntityFrameworkCore
             builder.Entity<DMS_IN_PODETAIL>(b =>
             {
                 b.ToTable("DMS_IN_PODETAIL");
-                b.HasKey(b => new { b.CreateDate,b.OrderNo,b.DealerCode,b.UPN, b.LOT });
+                b.HasNoKey();
                 b.Property(b => b.CreateDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
                 b.Property(b => b.ConfirmDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
                 b.Property(b => b.LatestAuditDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
@@ -359,14 +359,67 @@ namespace Business.EntityFrameworkCore
             builder.Entity<DMS_IN_RETAILER>(b =>
             {
                 b.ToTable("DMS_IN_RETAILER");
-                b.HasKey(b => new { b.DealerCode, b.DealerLevel, b.Region, b.District });
+                b.HasNoKey();
                 b.ConfigureByConvention();
             });
 
             builder.Entity<DMS_IN_SHIPPINGDETAIL>(b =>
             {
                 b.ToTable("DMS_IN_SHIPPINGDETAIL");
-                b.HasKey(b => new { b.QRCode, b.ShipmentNo}); 
+                b.HasNoKey();
+                b.Property(b => b.ExpiredDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.ShipmentDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.SubmitDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.UpdateDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.ConfigureByConvention();
+            });
+        }
+
+        public static void ConfigureBusinessExtRA(this ModelBuilder builder)
+        {
+            //TODO:这样太麻烦了,有时间研究一下批量
+            Check.NotNull(builder, nameof(builder));
+            builder.Entity<DMS_IN_ITEMMAPPING>(b =>
+            {
+                b.ToTable("DMS_IN_ITEMMAPPING");
+                b.HasNoKey();
+                b.ConfigureByConvention();
+            });
+
+            builder.Entity<DMS_IN_LOCDETAIL>(b =>
+            {
+                b.ToTable("DMS_IN_LOCDETAIL");
+                b.HasNoKey();
+                b.Property(b => b.ExpiredDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.TransferDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.InventoryDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.ConfigureByConvention();
+            });
+
+            builder.Entity<DMS_IN_PODETAIL>(b =>
+            {
+                b.ToTable("DMS_IN_PODETAIL");
+                b.HasNoKey();
+                b.Property(b => b.CreateDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.ConfirmDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.LatestAuditDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.RequiredDeliveryDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.SubmitDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.Property(b => b.UpdateDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
+                b.ConfigureByConvention();
+            });
+
+            builder.Entity<DMS_IN_RETAILER>(b =>
+            {
+                b.ToTable("DMS_IN_RETAILER");
+                b.HasNoKey();
+                b.ConfigureByConvention();
+            });
+
+            builder.Entity<DMS_IN_SHIPPINGDETAIL>(b =>
+            {
+                b.ToTable("DMS_IN_SHIPPINGDETAIL");
+                b.HasNoKey();
                 b.Property(b => b.ExpiredDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
                 b.Property(b => b.ShipmentDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));
                 b.Property(b => b.SubmitDate).HasConversion(d => d.GetValueOrDefault().ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d));

+ 5 - 0
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/BusinessEntityFrameworkCoreModule.cs

@@ -35,6 +35,11 @@ namespace Business.EntityFrameworkCore
                 options.AddDefaultRepositories(includeAllEntities: true);
             });
 
+            context.Services.AddAbpDbContext<BusinessExtRADbContext>(options =>
+            {
+                options.AddDefaultRepositories(includeAllEntities: true);
+            });
+
             context.Services.AddAbpDbContext<BusinessBangDbContext>(options =>
             {
                 options.AddDefaultRepositories(includeAllEntities: true);

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

@@ -55,6 +55,16 @@ namespace Business.EntityFrameworkCore
         /// </summary>
         public DbSet<DeliveryExceptionMaster> DeliveryExceptionMaster { get; set; }
 
+        /// <summary>
+        /// ½ø³ö´æÃ¿ÈÕ¿ìÕÕ
+        /// </summary>
+        public DbSet<InvTransHistDay> InvTransHistDay { get; set; }
+
+        public DbSet<InvTransHistDayDto> InvTransHistDayDto { get; set; }
+
+        public DbSet<QtyChangeDto> QtyChangeDto { get; set; }
+
+        public DbSet<BalanceNumDto> BalanceNumDto { get; set; }
         #endregion
         #region MES
         public DbSet<mes_producedailyplan> mes_Producedailyplans { get; set; }

+ 31 - 0
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/ExtRA/BusinessExtRADbContext.cs

@@ -0,0 +1,31 @@
+using Business.Domain;
+using Microsoft.EntityFrameworkCore;
+using Volo.Abp.Data;
+using Volo.Abp.EntityFrameworkCore;
+
+namespace Business.EntityFrameworkCore
+{
+    /// <summary>
+    /// DOPExtRAÊý¾Ý¿âµÄдÔÚÕâÀï
+    /// </summary>
+    [ConnectionStringName("DOPExtRA")]
+    public class BusinessExtRADbContext : AbpDbContext<BusinessExtRADbContext>
+    {
+        public DbSet<DMS_IN_ITEMMAPPING> DMS_IN_ITEMMAPPING { get; set; }
+        public DbSet<DMS_IN_LOCDETAIL> DMS_IN_LOCDETAIL { get; set; }   
+        public DbSet<DMS_IN_PODETAIL> DMS_IN_PODETAIL { get; set; }
+        public DbSet<DMS_IN_RETAILER> DMS_IN_RETAILER { get; set; }
+        public DbSet<DMS_IN_SHIPPINGDETAIL> DMS_IN_SHIPPINGDETAIL { get; set; }
+        public BusinessExtRADbContext(DbContextOptions<BusinessExtRADbContext> options)
+            : base(options)
+        {
+
+        }
+
+        protected override void OnModelCreating(ModelBuilder modelBuilder)
+        {
+            base.OnModelCreating(modelBuilder);
+            modelBuilder.ConfigureBusinessExtRA();
+        }
+    }
+}

+ 25 - 0
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/ExtRA/BusinessExtRADbContextFactory.cs

@@ -0,0 +1,25 @@
+using Business.Core.Configuration;
+using Business.Core.Web;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
+using Microsoft.Extensions.Configuration;
+
+namespace Business.EntityFrameworkCore
+{
+    /* This class is needed to run EF Core PMC commands. Not used anywhere else */
+    public class BusinessExtRADbContextFactory : IDesignTimeDbContextFactory<BusinessExtRADbContext>
+    {
+        public BusinessExtRADbContext CreateDbContext(string[] args)
+        {
+            var builder = new DbContextOptionsBuilder<BusinessExtRADbContext>();
+            var configuration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
+
+            BussinessExtRADbContextOptionsConfigurer.Configure(
+                builder,
+                configuration.GetConnectionString("DOPExtRA")
+            );
+
+            return new BusinessExtRADbContext(builder.Options);
+        }
+    }
+}

+ 21 - 0
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/ExtRA/BussinessExtRADbContextOptionsConfigurer.cs

@@ -0,0 +1,21 @@
+using System.Data.Common;
+using Business.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+
+namespace Business.EntityFrameworkCore
+{
+    public static class BussinessExtRADbContextOptionsConfigurer
+    {
+        public static void Configure(DbContextOptionsBuilder<BusinessExtRADbContext> dbContextOptions,string connectionString)
+        {
+            /* This is the single point to configure DbContextOptions for MultipleDbContextEfCoreDemoDbContext */
+            dbContextOptions.UseSqlServer(connectionString);
+        }
+
+        public static void Configure(DbContextOptionsBuilder<BusinessExtRADbContext> dbContextOptions,DbConnection connection)
+        {
+            /* This is the single point to configure DbContextOptions for MultipleDbContextEfCoreDemoDbContext */
+            dbContextOptions.UseSqlServer(connection);
+        }
+    }
+}

+ 122 - 0
MicroServices/Business/Business.EntityFrameworkCore/Repository/SqlRepositories/ExtRASqlRepository.cs

@@ -0,0 +1,122 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Common;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+using System.Collections;
+using Business.EntityFrameworkCore;
+using System.Linq.Expressions;
+using System.Data.SqlClient;
+using EFCore.BulkExtensions;
+
+namespace Business.EntityFrameworkCore.SqlRepositories
+{
+    public class ExtRASqlRepository<T>:IExtRASqlRepository<T> where T : class, new()
+    {
+        readonly BusinessExtRADbContext _dbContext;
+
+        public ExtRASqlRepository(BusinessExtRADbContext dbContext)
+        {
+            _dbContext = dbContext;
+        }
+        public  int Insert(T entity)
+        {
+            _dbContext.Set<T>().Add(entity);
+            return  _dbContext.SaveChanges();
+        }
+
+        public int Insert(List<T> entitylist)
+        {
+             _dbContext.Set<T>().AddRange(entitylist);
+            return  _dbContext.SaveChanges();
+        }
+
+        public  int Update(T entity)
+        {
+            _dbContext.Set<T>().Update(entity);
+           return _dbContext.SaveChanges();
+        }
+        public  int Update(List<T> entitylist)
+        {
+            _dbContext.Set<T>().UpdateRange(entitylist);
+           return  _dbContext.SaveChanges();
+        }
+
+        public int Update(Expression<Func<T, bool>> whereLambda, Expression<Func<T, T>> entity)
+        {
+            _dbContext.Set<T>().Where(whereLambda).BatchUpdate(entity);
+            return  _dbContext.SaveChanges();
+        }
+
+        public  int Delete(Expression<Func<T, bool>> whereLambda)
+        {
+            _dbContext.Set<T>().Where(whereLambda).BatchDelete();
+            return  _dbContext.SaveChanges();
+        }
+
+        public int Delete(List<T> entitylist)
+        {
+            _dbContext.Set<T>().RemoveRange(entitylist);
+            return _dbContext.SaveChanges();
+        }
+
+        public  bool IsExist(Expression<Func<T, bool>> whereLambda)
+        {
+            return  _dbContext.Set<T>().Any(whereLambda);
+        }
+
+        public  List<T> Select()
+        {
+            return  _dbContext.Set<T>().ToList();
+        }
+
+        public  List<T> Select(Expression<Func<T, bool>> whereLambda)
+        {
+            return _dbContext.Set<T>().Where(whereLambda).ToList();
+        }
+
+        public Tuple<List<T>, int> Select<S>(int pageSize, int pageIndex, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderByLambda, bool isAsc)
+        {
+            var total = _dbContext.Set<T>().Where(whereLambda).Count();
+
+            if (isAsc)
+            {
+                var entities =  _dbContext.Set<T>().Where(whereLambda)
+                                      .OrderBy<T, S>(orderByLambda)
+                                      .Skip(pageSize * (pageIndex - 1))
+                                      .Take(pageSize).ToList();
+
+                return  new Tuple<List<T>, int>(entities, total);
+            }
+            else
+            {
+                var entities = _dbContext.Set<T>().Where(whereLambda)
+                                      .OrderByDescending<T, S>(orderByLambda)
+                                      .Skip(pageSize * (pageIndex - 1))
+                                      .Take(pageSize).ToList();
+
+                return new Tuple<List<T>, int>(entities, total);
+            }
+        }
+
+        public DataSet SelectDataBaseBySql(string sql, string tableName)
+        {
+            DataSet ds = new DataSet();
+            try
+            {
+                string connectionString = _dbContext.Database.GetConnectionString();
+                SqlDataAdapter da = new SqlDataAdapter(sql, connectionString);
+                da.Fill(ds, tableName);
+            }
+            catch (Exception ex)
+            {
+            }
+            return ds;
+        }
+    }
+}

+ 34 - 0
MicroServices/Business/Business.EntityFrameworkCore/Repository/SqlRepositories/IExtRASqlRepository.cs

@@ -0,0 +1,34 @@
+using Microsoft.EntityFrameworkCore.ChangeTracking;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlClient;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+
+namespace Business.EntityFrameworkCore.SqlRepositories
+{
+    public interface IExtRASqlRepository<T> where T : class, new()
+    {
+        int Insert(T entity);
+        int Insert(List<T> entitylist);
+        int Update(T entity);
+        int Update(List<T> entitylist);
+
+        int Update(Expression<Func<T, bool>> whereLambda, Expression<Func<T, T>> entity);
+
+        int Delete(Expression<Func<T, bool>> whereLambda);
+
+        int Delete(List<T> entitylist);
+
+        bool IsExist(Expression<Func<T, bool>> whereLambda);
+
+        List<T> Select();
+
+        List<T> Select(Expression<Func<T, bool>> whereLambda);
+
+        Tuple<List<T>, int> Select<S>(int pageSize, int pageIndex, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderByLambda, bool isAsc);
+
+        DataSet SelectDataBaseBySql(string sql, string tableName);
+    }
+}

+ 1 - 0
MicroServices/Business/Business.Host/Startup.cs

@@ -15,6 +15,7 @@ namespace Business
             services.AddApplication<BusinessHostModule>();
             services.AddScoped(typeof(ISqlRepository<>), typeof(SqlRepository<>));
             services.AddScoped(typeof(IExtSqlRepository<>), typeof(ExtSqlRepository<>));
+            services.AddScoped(typeof(IExtRASqlRepository<>), typeof(ExtRASqlRepository<>));
             services.AddScoped(typeof(ISystemJobAppService), typeof(SystemJobAppService));
             services.AddScoped<GZY.Quartz.MUI.Areas.MyFeature.Pages.MainModel>();
         }

+ 35 - 0
MicroServices/Business/Business.HttpApi/Controllers/VSMController.cs

@@ -93,5 +93,40 @@ namespace Business.Controllers
         {
             return _VSMAppService.ChartLinePLTOption(PLT);
         }
+
+        /// <summary>
+        /// 终端出货趋势柱状图
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        [Route("chartlinemodeloption")]
+        public string ChartLineModelOption(string factory_id, string model, string avgHW, string avgGK, string avgT1, string avgTotal)
+        {
+            return _VSMAppService.ChartLineModelOption( factory_id,model,avgHW,avgGK,avgT1,avgTotal);
+        }
+
+
+        /// <summary>
+        /// 终端出货趋势折线图
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        [Route("chartlineoutstockoption")]
+        public string ChartLineOutStockOption(string factory_id, string model)
+        {
+            return _VSMAppService.ChartLineOutStockOption(factory_id, model);
+        }
+
+
+        /// <summary>
+        /// 每日计算进出存快照
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        [Route("calcinvdayhist")]
+        public string CalcInvDayHist(string domain)
+        {
+            return _VSMAppService.CalcInvDayHist(domain);
+        }
     }
 }