From c134c9458fbbdd832db93c2e16fe55ff038fcc13 Mon Sep 17 00:00:00 2001
From: 快乐的昕的电脑 <快乐的昕的电脑@DESKTOP-C2BQPQU>
Date: 星期五, 17 十月 2025 14:10:50 +0800
Subject: [PATCH] 工单查询逻辑优化

---
 Services/WomdaaManager.cs |  140 +++++++++++++++++++++++++++++++++++-----------
 1 files changed, 105 insertions(+), 35 deletions(-)

diff --git a/Services/WomdaaManager.cs b/Services/WomdaaManager.cs
index 107eb79..3714c38 100644
--- a/Services/WomdaaManager.cs
+++ b/Services/WomdaaManager.cs
@@ -91,8 +91,7 @@
     {
         // 鏌ヨ闇�瑕佹樉绀虹殑宸ュ崟ID
         var ids = Db.Queryable<MesOrderSelect>()
-            .Where(b => b.MachineNo == query.machineNo
-                        && b.IsShow == 0)
+            .Where(b => b.MachineNo == query.machineNo && b.IsShow == 0)
             .Select(s => s.OrderId)
             .ToList();
 
@@ -104,12 +103,87 @@
         if (decimals.Count == 0)
             return new List<VOrderBycl>();
 
-        // 鏌ヨ宸ュ崟瑙嗗浘锛岀瓫閫夊嚭闇�瑕佹樉绀虹殑宸ュ崟
-        return Db.Queryable<VOrderBycl>()
+        // 鏌ヨ榻胯疆鏁伴噰琛�
+        var numericalList = Db.Queryable<MesNumericalBycl>()
+            .Where(x => ids.Contains(x.OrderId ?? 0))
+            .OrderBy(x => x.CjTiem)
+            .ToList();
+
+        var vOrderBycl = new VOrderBycl();
+        if (numericalList.Count > 0)
+        {
+            // 寮�宸ユ暟閲囷細鏈�鏃╀竴鏉�
+            vOrderBycl.StartCjNum = numericalList.First().CjNum ?? 0;
+            // 褰撳墠鏁伴噰锛氭渶鏂颁竴鏉�
+            vOrderBycl.CurrentCjNum = numericalList.Last().CjNum ?? 0;
+        }
+        else
+        {
+            vOrderBycl.StartCjNum = 0;
+            vOrderBycl.CurrentCjNum = 0;
+        }
+
+        // 鏌ヨ鎶ュ伐璁板綍锛岃幏鍙栨渶鍚庝竴鏉℃姤宸ヨ褰�
+        var lastReport = Db.Queryable<MesReporting>()
+            .Where(r => r.BillNo != null && r.BillNo.Contains(query.orderNo))
+            .OrderBy(r => r.Id, OrderByType.Desc)
+            .First();
+
+        if (lastReport == null || !lastReport.BgDate.HasValue)
+        {
+            // 娌℃湁鎶ュ伐璁板綍鎴栨姤宸ユ椂闂存棤鏁堬紝鍒濆閲囬泦鏁颁负寮�宸ラ噰鏁�
+            vOrderBycl.InitCjNum = vOrderBycl.StartCjNum;
+        }
+        else
+        {
+            // 鏈夋姤宸ヨ褰曪紝鍒濆閲囬泦鏁颁负涓婁竴娆℃姤宸ユ椂闂村悗鏈�杩戜竴鏉¢娇杞暟閲囪〃鐨勯噰闆嗘暟閲�
+            // 1. 绮剧‘鍖归厤鎶ュ伐鏃堕棿
+            var exactMatch = numericalList
+                .Select(x => new { Item = x, ParsedTime = DateTime.TryParse(x.CjTiem, out var dt) ? dt : (DateTime?)null })
+                .Where(x => x.ParsedTime.HasValue && x.ParsedTime.Value == lastReport.BgDate.Value)
+                .OrderBy(x => x.ParsedTime)
+                .Select(x => x.Item)
+                .FirstOrDefault();
+
+            if (exactMatch != null)
+            {
+                vOrderBycl.InitCjNum = exactMatch.CjNum ?? vOrderBycl.StartCjNum;
+            }
+            else
+            {
+                // 2. 鎵炬姤宸ユ椂闂翠箣鍚庣殑绗竴鏉�
+                var afterReportNum = numericalList
+                    .Select(x => new { Item = x, ParsedTime = DateTime.TryParse(x.CjTiem, out var dt) ? dt : (DateTime?)null })
+                    .Where(x => x.ParsedTime.HasValue && x.ParsedTime.Value > lastReport.BgDate.Value)
+                    .OrderBy(x => x.ParsedTime)
+                    .Select(x => x.Item)
+                    .FirstOrDefault();
+
+                vOrderBycl.InitCjNum = afterReportNum?.CjNum ?? vOrderBycl.StartCjNum;
+            }
+        }
+
+        var startCjNum = vOrderBycl.StartCjNum;
+        var currentCjNum = vOrderBycl.CurrentCjNum;
+        var initCjNum = vOrderBycl.InitCjNum;
+
+        // 鏌ヨ宸ュ崟瑙嗗浘锛岀瓫閫夊嚭闇�瑕佹樉绀虹殑宸ュ崟锛屽彧鍙栨渶鏂颁竴鏉�
+        var orders = Db.Queryable<VOrderBycl>()
             .Where(c =>
                 decimals.Contains(c.ID) &&
                 (c.EditDate == date || c.EditDate == null))
+            .OrderBy(c => c.EditDate, OrderByType.Desc)
+            .Take(1)
             .ToList();
+
+        foreach (var order in orders)
+        {
+            order.StartCjNum = startCjNum;
+            order.CurrentCjNum = currentCjNum;
+            order.InitCjNum = initCjNum;
+        }
+
+        return orders;
     }
 
     /// <summary>
@@ -171,38 +245,24 @@
         var sqlQuerySingle = Db.Ado.SqlQuerySingle<string>(sql);
         VOrdrerBycl.finalResult = sqlQuerySingle;
 
-        // 鏁伴噰璁板綍锛氬熀浜庝富閿甀D涓庢渶澶ч噰闆嗘暟閫昏緫锛岃В鍐冲悓涓�CJ_NUM鍦ㄤ笉鍚屾椂闂撮噸澶嶇殑闂
-        var numericalQuery = Db.Queryable<MesNumericalBycl>()
-            .Where(n => n.MachineNo == VOrdrerBycl.MachineNo
-                        && n.OrderId == VOrdrerBycl.ID
-                        && n.CjNum != null);
+        // 鏌ヨMES_NUMERICAL_BYCL琛紝鑾峰彇寮�宸ユ暟閲囧拰褰撳墠鏁伴噰
+        var numericalList = Db.Queryable<MesNumericalBycl>()
+            .Where(x => x.OrderId == VOrdrerBycl.ID)
+            .OrderBy(x => x.CjTiem)
+            .ToList();
 
-        // 寮�宸ラ噰闆嗗��=绗竴鏉¤褰�(鎸塈D鏈�灏�)
-        var startCjNum = numericalQuery
-            .OrderBy(n => n.Id)
-            .Select(n => n.CjNum)
-            .First();
-
-        // 鏈�澶ч噰闆嗘暟锛堢疮璁″綋鍓嶅�硷級
-        var maxCjNum = numericalQuery.Max(n => n.CjNum);
-
-        // 杈惧埌鏈�澶у�肩殑绗竴娆℃椂闂达紙濡傞渶灞曠ず鍙悗缁柊澧炲瓧娈碉級
-        var firstReachMaxTime = numericalQuery
-            .Where(n => n.CjNum == maxCjNum)
-            .OrderBy(n => n.Id)
-            .Select(n => n.CjTiem)
-            .First();
-
-        // 杈惧埌鏈�澶у�肩殑鏈�鍚庝竴娆℃椂闂达紙鑻ラ渶瑕佸垽鏂槸鍚︿粛鍦ㄥ闀匡紝鍙姣� first 涓� last锛�
-        var lastReachMaxTime = numericalQuery
-            .Where(n => n.CjNum == maxCjNum)
-            .OrderBy(n => n.Id, OrderByType.Desc)
-            .Select(n => n.CjTiem)
-            .First();
-
-        // 璧嬪�硷紙CurrentCjNum 閲囩敤绱鏈�澶у�硷紝閬垮厤 plateau 閲嶅璁板綍瀵艰嚧璇В锛�
-        VOrdrerBycl.StartCjNum = startCjNum ?? 0;
-        VOrdrerBycl.CurrentCjNum = maxCjNum ?? VOrdrerBycl.StartCjNum;
+        if (numericalList.Count > 0)
+        {
+            // 寮�宸ユ暟閲囷細鏈�鏃╀竴鏉�
+            VOrdrerBycl.StartCjNum = numericalList.First().CjNum ?? 0;
+            // 褰撳墠鏁伴噰锛氭渶鏂颁竴鏉�
+            VOrdrerBycl.CurrentCjNum = numericalList.Last().CjNum ?? 0;
+        }
+        else
+        {
+            VOrdrerBycl.StartCjNum = 0;
+            VOrdrerBycl.CurrentCjNum = 0;
+        }
 
         return VOrdrerBycl;
     }
@@ -240,6 +300,16 @@
         return vPrint;
     }
 
+    /// <summary>
+    /// 鎶ュ伐璁板綍琛�
+    /// </summary>
+    /// <param name="billNo"></param>
+    /// <param name="machineNo"></param>
+    /// <param name="from"></param>
+    /// <param name="to"></param>
+    /// <param name="pageIndex"></param>
+    /// <param name="pageSize"></param>
+    /// <returns></returns>
     public (List<MesReportingBgDto> tbBillList, int totalCount) GetByBillNoBG(
         string billNo, string machineNo, DateTime? from, DateTime? to, int pageIndex, int pageSize)
     {

--
Gitblit v1.9.3