Parcourir la source

日进出存计算逻辑修改

Murphy il y a 2 ans
Parent
commit
186de4bbc3

+ 28 - 26
MicroServices/Business/Business.Application/VSM/VSMAppService.cs

@@ -1221,7 +1221,7 @@ namespace Business.VSMManagement
         }
 
         /// <summary>
-        /// 从当前日期往前倒推进出存,最小默认取到2024-01-01
+        /// 从当前日期往前倒推进出存,最小默认取到2024-01-01,定时任务建议选择每天晚上9点-12点之间
         /// </summary>
         /// <param name="domain"></param>
         /// <returns></returns>
@@ -1231,17 +1231,18 @@ namespace Business.VSMManagement
             string sqlMaxHistDayTime = $"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 HistMaxTimeDayDto = _businessDbContext.InvTransHistDay.FromSqlRaw(sqlMaxHistDayTime).ToList();
 
-            string sqlHistDetail = $"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}' and CreateTime>='2024-01-01' group by ItemNum,CONVERT(varchar,a.createTime, 23)";
-            string sqlLastBalanceNum = $"select a.ItemNum,Sum(BeginBalance)+Sum(QtyChange) AS BalanceNum from InvTransHist a inner join (select ItemNum,LotSerial,Max(CreateTime) AS CreateTime from InvTransHist where CreateTime>='2024-01-01' 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";
+            string sqlHistDetail = $"select A.ItemNum,Loc,LotSerial,BeginBalance,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,createTime from InvTransHist A where Domain='{domain}' and CreateTime>='2024-01-01'";
             if (HistMaxTimeDayDto.Count>0)
             {
-                sqlHistDetail = $"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}' and CreateTime>='{HistMaxTimeDayDto[0].HistDayTime.Date}' group by ItemNum,CONVERT(varchar,a.createTime, 23)";
-                sqlLastBalanceNum = $"select a.ItemNum,Sum(BeginBalance)+Sum(QtyChange) AS BalanceNum from InvTransHist a inner join (select ItemNum,LotSerial,Max(CreateTime) AS CreateTime from InvTransHist where CreateTime>='{HistMaxTimeDayDto[0].HistDayTime.Date}' 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";
+                sqlHistDetail = $"select A.ItemNum,Loc,LotSerial,BeginBalance,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,createTime from InvTransHist A where Domain='{domain}' and CreateTime>='{HistMaxTimeDayDto[0].HistDayTime}'";
             }
             //取物料进出存明细
             var HistDetailDto = _businessDbContext.InvTransHistDetailDto.FromSqlRaw(sqlHistDetail).ToList();
-            //取物料的最新期末库存数
-            var LastBalanceNumDto = _businessDbContext.BalanceNumDto.FromSqlRaw(sqlLastBalanceNum).ToList();
+
+            //取出物料库位批次的最新一条记录用于计算期末库存
+            string lastDetail = "select a.ItemNum,a.Loc,a.LotSerial,BeginBalance,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 inner join(select ItemNum,Loc,LotSerial,MAX(CreateTime) AS CreateTime from InvTransHist group by ItemNum,Loc,LotSerial) b on a.ItemNum=b.ItemNum and a.Loc=b.Loc and a.LotSerial=b.LotSerial and a.CreateTime=b.CreateTime order by a.ItemNum,a.Loc,a.LotSerial";
+            var lastDetailDto = _businessDbContext.InvTransHistDetailDto.FromSqlRaw(lastDetail).ToList();
+
             //取出所有有进出存记录的物料
             string sqlItemList = $"select distinct ItemNum from InvTransHist where Domain='{domain}' and CreateTime>='2024-01-01' group by ItemNum";
             var QtyChangeDto = _businessDbContext.QtyChangeDto.FromSqlRaw(sqlItemList).ToList();
@@ -1253,6 +1254,10 @@ namespace Business.VSMManagement
                 {
                     dtMin = HistMaxTimeDayDto.Find(a => a.ItemNum == x.ItemNum).HistDayTime;
                 }
+                //物料期初总库存
+                var xBeginBalance = lastDetailDto.Where(a => a.ItemNum == x.ItemNum).Sum(a => a.BeginBalance);
+                //物料期末总库存
+                var xBalanceNum = lastDetailDto.Where(a => a.ItemNum == x.ItemNum).Sum(a => a.BalanceNum);
                 var xMaxDay = DateTime.Now;
                 int day = 0;
                 while (true)
@@ -1264,27 +1269,24 @@ namespace Business.VSMManagement
                     invTransHistDay.Domain = domain;
                     invTransHistDay.ItemNum = x.ItemNum;
                     invTransHistDay.HistDayTime = xMaxDay.AddDays(day).Date;
-                    //如果当前计算日期大于最大进出明细
-                    var xBalanceNum = LastBalanceNumDto.Find(b => b.ItemNum == x.ItemNum);
-                    var daydetail = HistDetailDto.Find(a => a.ItemNum == x.ItemNum && a.CreateTime == xMaxDay.AddDays(day).Date.ToString("yyyy-MM-dd"));
-                    if (xBalanceNum != null)
+                    var xQtyChangeAdvance = HistDetailDto.Where(a => a.ItemNum == x.ItemNum && a.CreateTime.Date == xMaxDay.AddDays(day).Date).Sum(a => a.QtyChangeAdvance);
+                    var xQtyChangeOut=HistDetailDto.Where(a => a.ItemNum == x.ItemNum && a.CreateTime.Date == xMaxDay.AddDays(day).Date).Sum(a => a.QtyChangeOut);
+
+
+                    invTransHistDay.QtyChangeAdvance = xQtyChangeAdvance;
+                    invTransHistDay.QtyChangeOut = xQtyChangeOut;
+                    if (day==0)
                     {
-                        invTransHistDay.QtyChangeAdvance = daydetail == null ? 0 : daydetail.QtyChangeAdvance;
-                        invTransHistDay.QtyChangeOut = daydetail == null ? 0 : daydetail.QtyChangeOut;
-                        if (day==0)
-                        {
-                            invTransHistDay.BeginBalance = daydetail == null ? xBalanceNum.BalanceNum : xBalanceNum.BalanceNum;
-                            invTransHistDay.BalanceNum = daydetail == null ? xBalanceNum.BalanceNum : xBalanceNum.BalanceNum;
-                        }else
-                        {
-                            var nextDayQty = daysHist.Find(a => a.HistDayTime == xMaxDay.AddDays(day + 1).Date && a.ItemNum == x.ItemNum);
-                            //倒推期初数
-                            invTransHistDay.BalanceNum = nextDayQty.BeginBalance;
-                            invTransHistDay.BeginBalance = daydetail == null ? nextDayQty.BeginBalance : nextDayQty.BeginBalance+daydetail.QtyChangeOut-daydetail.QtyChangeAdvance;
-                          
-                        }
-                        daysHist.Add(invTransHistDay);
+                        invTransHistDay.BeginBalance = xBeginBalance;
+                        invTransHistDay.BalanceNum =xBalanceNum;
+                    }else
+                    {
+                        var nextDayQty = daysHist.Find(a => a.HistDayTime == xMaxDay.AddDays(day + 1).Date && a.ItemNum == x.ItemNum);
+                        //倒推期初数
+                        invTransHistDay.BalanceNum = nextDayQty.BeginBalance;
+                        invTransHistDay.BeginBalance =nextDayQty.BeginBalance+ xQtyChangeOut - xQtyChangeAdvance;
                     }
+                    daysHist.Add(invTransHistDay);
                     day--;
                 }
             });

+ 26 - 3
MicroServices/Business/Business.Domain/StructuredDB/MES/InvTransHistDetailDto.cs

@@ -21,13 +21,30 @@ 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 QtyChangeAdvance { get; set; }
 
-
         /// <summary>
         /// 出库数
         /// </summary>
@@ -35,9 +52,15 @@ namespace Business.StructuredDB.MES
         public decimal QtyChangeOut { get; set; }
 
         /// <summary>
-        /// 发生时间(yyyy-MM-dd)
+        /// 出库数
+        /// </summary>
+        [Comment("期末数")]
+        public decimal BalanceNum { get; set; }
+
+        /// <summary>
+        /// 发生时间
         /// </summary>
         [Comment("发生时间")]
-        public string CreateTime { get; set; }
+        public DateTime CreateTime { get; set; }
     }
 }