From 8000b3a16fbea87ba4fcbc70a4540723849bf5a8 Mon Sep 17 00:00:00 2001
From: 快乐的昕的电脑 <快乐的昕的电脑@DESKTOP-C2BQPQU>
Date: 星期五, 21 十一月 2025 14:14:26 +0800
Subject: [PATCH] 开工数采逻辑优化

---
 Services/WomdaaManager.cs |  117 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 106 insertions(+), 11 deletions(-)

diff --git a/Services/WomdaaManager.cs b/Services/WomdaaManager.cs
index 4233ec3..eb09f37 100644
--- a/Services/WomdaaManager.cs
+++ b/Services/WomdaaManager.cs
@@ -125,7 +125,7 @@
                 .ToList();
 
             // 寮�宸ユ暟閲囷細鏈�鏃╀竴鏉�
-            vOrderBycl.StartCjNum = sortedList.First().CjNum ?? 0;
+            vOrderBycl.StartCjNum = vOrderBycl.preStartCjNum ?? (sortedList.First().CjNum ?? 0);
             // 褰撳墠鏁伴噰锛氭渶鏂颁竴鏉�
             vOrderBycl.CurrentCjNum = sortedList.Last().CjNum ?? 0;
         }
@@ -138,14 +138,25 @@
         // 鏌ヨ鎶ュ伐璁板綍锛岃幏鍙栨渶鍚庝竴鏉℃姤宸ヨ褰�
         var lastReport = Db.Queryable<MesReporting>()
             .AS("MES_REPORTING") // 寮哄埗琛ㄥ悕
-            .Where(r => r.BillNo == "MSD01-2507140001-g1-1")
+            .Where(r => r.BillNo == query.orderNo)
             .OrderBy(r => r.BgDate, OrderByType.Desc)
             .First();
 
         if (lastReport == null || !lastReport.BgDate.HasValue)
         {
-            // 娌℃湁鎶ュ伐璁板綍鎴栨姤宸ユ椂闂存棤鏁堬紝鍒濆閲囬泦鏁颁负寮�宸ラ噰鏁�
-            vOrderBycl.InitCjNum = vOrderBycl.StartCjNum;
+            if (string.IsNullOrEmpty(vOrderBycl.Daa016)) // 娌℃湁寮�宸ユ椂闂�
+            {
+                // 娌℃湁鎶ュ伐璁板綍涓旀病鏈夊紑宸ユ椂闂达紝鍒濆閲囬泦鏁颁负璋冩満鏃堕棿鍓嶄竴鏉$殑閲囬泦鏁伴噺
+                vOrderBycl.InitCjNum = vOrderBycl.preStartTjNum;
+            }
+            else
+            {
+                // 娌℃湁鎶ュ伐璁板綍锛屽垵濮嬮噰闆嗘暟涓哄紑宸ユ椂闂村墠涓�鏉$殑閲囬泦鏁伴噺
+                vOrderBycl.InitCjNum = vOrderBycl.preStartCjNum;
+            }
+
+            //// 娌℃湁鎶ュ伐璁板綍锛屽垵濮嬮噰闆嗘暟涓哄紑宸ラ噰鏁�
+            //VOrdrerBycl.InitCjNum = VOrdrerBycl.StartCjNum;
         }
         else
         {
@@ -212,7 +223,7 @@
         // 淇濈暀瑙嗗浘閲岀殑 todayRunTime 鍜� JDL锛屼笉鍋氫换浣曡祴鍊煎拰杞崲
         // VOrdrerBycl.todayRunTime 淇濇寔鍘熷��
         // VOrdrerBycl.JDL 淇濇寔鍘熷��
-        VOrdrerBycl.TodayFaultNum = 0;
+        //VOrdrerBycl.TodayFaultNum = 0;
 
         if (mesOrderSelect != null)
         {
@@ -246,7 +257,7 @@
                 .ToList();
 
             // 寮�宸ユ暟閲囷細鏈�鏃╀竴鏉�
-            VOrdrerBycl.StartCjNum = sortedList.First().CjNum ?? 0;
+            VOrdrerBycl.StartCjNum = VOrdrerBycl.preStartCjNum ?? (sortedList.First().CjNum ?? 0);
             // 褰撳墠鏁伴噰锛氭渶鏂颁竴鏉�
             VOrdrerBycl.CurrentCjNum = sortedList.Last().CjNum ?? 0;
         }
@@ -255,6 +266,15 @@
             VOrdrerBycl.StartCjNum = 0;
             VOrdrerBycl.CurrentCjNum = 0;
         }
+
+        // 璁$畻褰撳ぉ鍋滄満娆℃暟
+        //VOrdrerBycl.TodayDowntimeCount = GetTodayDowntimeCount(numericalList);
+
+        //璁$畻鏃ュ仠鏈烘鏁般�乼odayOnlineTime锛堟�诲湪绾挎椂闀匡級銆乼odayRunTime锛堝疄闄呰繍琛屾椂闀匡級銆佺鍔ㄧ巼锛堢櫨鍒嗘瘮锛屼繚鐣欎袱浣嶅皬鏁帮級
+        VOrdrerBycl.TodayDowntimeCount = GetTodayDowntimeStats(numericalList).downtimeCount;
+        VOrdrerBycl.TodayOnlineTime = GetTodayDowntimeStats(numericalList).todayOnlineTime;
+        VOrdrerBycl.todayRunTime = GetTodayDowntimeStats(numericalList).todayRunTime;
+        VOrdrerBycl.JDL = GetTodayDowntimeStats(numericalList).utilizationRate;
 
         Console.WriteLine($"orderNo: [{query.orderNo}]");
 
@@ -266,8 +286,19 @@
 
         if (lastReport == null || !lastReport.BgDate.HasValue)
         {
-            // 娌℃湁鎶ュ伐璁板綍锛屽垵濮嬮噰闆嗘暟涓哄紑宸ラ噰鏁�
-            VOrdrerBycl.InitCjNum = VOrdrerBycl.StartCjNum;
+            if (string.IsNullOrEmpty(VOrdrerBycl.Daa016)) // 娌℃湁寮�宸ユ椂闂�
+            {
+                // 娌℃湁鎶ュ伐璁板綍涓旀病鏈夊紑宸ユ椂闂达紝鍒濆閲囬泦鏁颁负璋冩満鏃堕棿鍓嶄竴鏉$殑閲囬泦鏁伴噺
+                VOrdrerBycl.InitCjNum = VOrdrerBycl.preStartTjNum;
+            }
+            else
+            {
+                // 娌℃湁鎶ュ伐璁板綍锛屽垵濮嬮噰闆嗘暟涓哄紑宸ユ椂闂村墠涓�鏉$殑閲囬泦鏁伴噺
+                VOrdrerBycl.InitCjNum = VOrdrerBycl.preStartCjNum;
+            }
+
+            //// 娌℃湁鎶ュ伐璁板綍锛屽垵濮嬮噰闆嗘暟涓哄紑宸ラ噰鏁�
+            //VOrdrerBycl.InitCjNum = VOrdrerBycl.StartCjNum;
         }
         else
         {
@@ -282,13 +313,77 @@
             VOrdrerBycl.InitCjNum = beforeOrEqualReportNum?.CjNum ?? VOrdrerBycl.StartCjNum;
         }
 
-        // 鎶ュ伐鏃堕噰闆嗘暟灏辨槸涓荤晫闈㈢殑褰撳墠閲囨暟
-        // VOrdrerBycl.CurrentCjNum 宸茶祴鍊硷紝鏃犻渶棰濆澶勭悊
-
         return VOrdrerBycl;
     }
 
     /// <summary>
+    /// 璁$畻鏃ュ仠鏈烘鏁�
+    /// </summary>
+    /// <param name="numericalList"></param>
+    /// <returns></returns>
+    public int GetTodayDowntimeCount(List<MesNumericalBycl> numericalList)
+    {
+        var today = DateTime.Now.Date;
+        // 1. 鍙繚鐣欏綋澶╂暟鎹紝骞惰浆鎹负 DateTime
+        var todayTimes = numericalList
+            .Where(x => DateTime.TryParse(x.CjTiem, out var dt) && dt.Date == today)
+            .Select(x => DateTime.Parse(x.CjTiem))
+            .OrderBy(x => x)
+            .ToList();
+
+        if (todayTimes.Count < 2)
+            return 0;
+
+        int downtimeCount = 0;
+        for (int i = 1; i < todayTimes.Count; i++)
+        {
+            var diff = (todayTimes[i] - todayTimes[i - 1]).TotalMinutes;
+            if (diff > 3)
+                downtimeCount++;
+        }
+        return downtimeCount;
+    }
+
+    /// <summary>
+    /// 璁$畻鏃ュ仠鏈烘鏁般�乼odayOnlineTime锛堟�诲湪绾挎椂闀匡級銆乼odayRunTime锛堝疄闄呰繍琛屾椂闀匡級銆佺鍔ㄧ巼锛堢櫨鍒嗘瘮锛屼繚鐣欎袱浣嶅皬鏁帮級
+    /// </summary>
+    public (int downtimeCount, double todayOnlineTime, double todayRunTime, double utilizationRate) GetTodayDowntimeStats(List<MesNumericalBycl> numericalList)
+    {
+        var today = DateTime.Now.Date;
+        var todayTimes = numericalList
+            .Where(x => DateTime.TryParse(x.CjTiem, out var dt) && dt.Date == today)
+            .Select(x => DateTime.Parse(x.CjTiem))
+            .OrderBy(x => x)
+            .ToList();
+
+        int downtimeCount = 0;
+        double downtimeMinutes = 0;
+        double todayOnlineTime = 0;
+        double todayRunTime = 0;
+        double utilizationRate = 0;
+
+        if (todayTimes.Count < 2)
+            return (0, 0, 0, 0);
+
+        for (int i = 1; i < todayTimes.Count; i++)
+        {
+            var diff = (todayTimes[i] - todayTimes[i - 1]).TotalMinutes;
+            if (diff > 3)
+            {
+                downtimeCount++;
+                downtimeMinutes += diff;
+            }
+        }
+
+        todayOnlineTime = (todayTimes.Last() - todayTimes.First()).TotalMinutes;
+        todayRunTime = todayOnlineTime - downtimeMinutes;
+        if (todayOnlineTime > 0)
+            utilizationRate = Math.Round(todayRunTime / todayOnlineTime * 100, 2);
+
+        return (downtimeCount, todayOnlineTime, todayRunTime, utilizationRate);
+    }
+
+    /// <summary>
     ///     鏍规嵁宸ュ崟ID鑾峰彇鎶ュ伐淇℃伅
     /// </summary>
     /// <param name="query">鍖呭惈宸ュ崟ID鐨勬煡璇㈡潯浠�</param>

--
Gitblit v1.9.3