From b079910e5de15863c26e479ffab15cc45d706f1a Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期一, 19 五月 2025 16:25:22 +0800
Subject: [PATCH] 测试修复轮询出库、抽检流程的问题

---
 Services/MoboxService.cs |  133 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 105 insertions(+), 28 deletions(-)

diff --git a/Services/MoboxService.cs b/Services/MoboxService.cs
index 680d804..1e82ed8 100644
--- a/Services/MoboxService.cs
+++ b/Services/MoboxService.cs
@@ -3,6 +3,7 @@
 using System.Linq;
 
 using HH.WCS.Mobox3.DSZSH.Consts;
+using HH.WCS.Mobox3.DSZSH.Dispatch;
 using HH.WCS.Mobox3.DSZSH.Helper;
 using HH.WCS.Mobox3.DSZSH.Helpers;
 using HH.WCS.Mobox3.DSZSH.Models;
@@ -371,11 +372,13 @@
         public static SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
             var db = DbHelper.GetDbClient();
             try {
+                var orderNo = GenerateOrderNo("鎶芥鍗曞彿", "CN");
+
                 // 缁戝畾鎿嶄綔锛氭彃鍏ュ嚭搴撳崟銆佹墍鏈夌殑鍑哄簱鍗曟槑缁�                 using (var tran = db.Ado.UseTran()) {
 
                     var order = new TN_Check_Order {
-                        S_NO = GenerateOrderNo("鎶芥鍗曞彿", "CN"),
+                        S_NO = orderNo,
                         S_ITEM_CODE = model.ItemCode,
                         //S_ITEM_NAME = model.ItemName,
                         S_BATCH_NO = model.BatchNo,
@@ -388,20 +391,33 @@
                         return BuildSimpleResult(2, "鐢熸垚 鎶芥鍗�澶辫触锛� + JsonConvert.SerializeObject(order));
                     }
 
-                    for (int i = 0; i < model.Qty; i++) {
-                        var detail = new TN_Check_Detail {
-                            S_NO = order.S_NO,
-                            S_ITEM_CODE = model.ItemCode,
-                            S_BATCH_NO = model.BatchNo,
-                            S_END_AREA = model.EndArea
-                        };
+                    var cgDetailList = SelectCgByTotalQty(model);
 
-                        if (db.Insertable<TN_Check_Detail>(detail).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return BuildSimpleResult(3, "鐢熸垚 鎶芥鍗曟槑缁�澶辫触锛� + JsonConvert.SerializeObject(detail));
-                        }
+                    if (cgDetailList.Count == 0) {
+                        return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ユ娊妫�);
                     }
 
+                    foreach (var cgDetail in cgDetailList) {
+                        var detail = new TN_Outbound_Detail {
+                            S_OO_NO = orderNo,
+                            S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+                            S_BATCH_NO = cgDetail.S_BATCH_NO,
+                            S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                            S_END_AREA = model.EndArea,
+                        };
+
+                        cgDetail.N_ITEM_STATE = 3;
+                        cgDetail.S_ITEM_STATE = "姝e湪妫�獙";
+
+                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0
+                            && db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
+                        }
+                        
+                        LogHelper.Debug("鍒涘缓鍑哄簱鍗曟槑缁嗘垚鍔燂細" + JsonConvert.SerializeObject(detail));
+                    }
+                    
                     tran.CommitTran();
                 }
                 return BuildSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛");
@@ -556,6 +572,56 @@
             }
         }
 
+        public static List<TN_CG_Detail> SelectCgByTotalQty(CreateCheckOrderInfo model) {
+            var db = DbHelper.GetDbClient();
+            var result = new List<TN_CG_Detail>();
+            var targetNum = model.Qty;
+
+            try {
+                var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
+                && a.N_ITEM_NUM > targetNum).
+                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
+                if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�+                {
+                    result.Add(targetCg);
+                    return result;
+                }
+
+                var sortedMaterials = new List<TN_CG_Detail>();
+
+                sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
+                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
+                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")
+                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
+                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+
+                if (sortedMaterials.Count == 0) //娌℃湁婊¤冻鏉′欢鐨�+                {
+                    return result;
+                }
+
+                int countNum = 0;
+                foreach (var mat in sortedMaterials) {
+                    countNum += mat.N_ITEM_NUM;
+                    result.Add(mat);
+                    if (countNum >= targetNum) {
+                        break;
+                    }
+                }
+                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
+                    return result;
+                }
+                else {
+                    result.Clear();
+                    return result;
+                }
+            }
+            catch (Exception ex) {
+                throw ex;
+            }
+        }
+
         #endregion
 
         #region Mobox 鍔熻兘
@@ -584,14 +650,13 @@
                         return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�);
                     }
 
-                    // NOTE 濡傛灉鍒涘缓order鐨勬椂鍊欏氨鎸囧畾鍏蜂綋鍑哄簱鐗╂枡鐨刢ntr锛岄偅涔堝鏋滃湪鍒涘缓浠诲姟鍓嶏紝杩欎釜鐗╂枡琚敊璇娊妫�簡鎬庝箞鍔�                     foreach (var cgDetail in cgDetailList) {
                         var detail = new TN_Outbound_Detail {
-                            S_NO = orderNo,
+                            S_OO_NO = orderNo,
                             S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                             S_BATCH_NO = cgDetail.S_BATCH_NO,
                             S_CNTR_CODE = cgDetail.S_CNTR_CODE,
-                            N_COUNT = cgDetail.N_QTY,
+                            N_COUNT = cgDetail.N_ITEM_NUM,
                             S_END_AREA = model.EndArea
                         };
 
@@ -646,10 +711,9 @@
                         return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�);
                     }
 
-                    // NOTE 濡傛灉鍒涘缓order鐨勬椂鍊欏氨鎸囧畾鍏蜂綋鍑哄簱鐗╂枡鐨刢ntr锛岄偅涔堝鏋滃湪鍒涘缓浠诲姟鍓嶏紝杩欎釜鐗╂枡琚敊璇娊妫�簡鎬庝箞鍔�                     foreach (var cgDetail in cgDetailList) {
                         var detail = new TN_Outbound_Detail {
-                            S_NO = orderNo,
+                            S_OO_NO = orderNo,
                             S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                             S_BATCH_NO = cgDetail.S_BATCH_NO,
                             S_CNTR_CODE = cgDetail.S_CNTR_CODE,
@@ -693,8 +757,8 @@
 
             try {
                 var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
-                && a.N_QTY > targetNum).
-                OrderBy(a => a.N_QTY, OrderByType.Asc).First();
+                && a.N_ITEM_NUM > targetNum).
+                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
                 if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�                 {
                     result.Add(targetCg);
@@ -702,29 +766,42 @@
                 }
 
                 // NOTE 鏍规嵁鎬婚噺閫塪etail鏃讹紝鏄惁闇�鑰冭檻璐т綅鐨勯珮浣庯紵
-                var sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
-                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_QTY > 0)
+
+                var sortedMaterials = new List<TN_CG_Detail>();
+
+                if (model.ForcedOut) {
+                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
                     .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
-                    .Where(d => (model.ForcedOut && d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸")
-                        || (!model.ForcedOut && (d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸"
-                        || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")))
-                    .OrderBy(d => d.N_QTY, OrderByType.Desc)
+                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸"
+                             || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")
+                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
                     .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+                }
+                else {
+                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
+                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
+                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸")
+                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
+                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+                }
+                
 
                 if (sortedMaterials.Count == 0) //娌℃湁婊¤冻鏉′欢鐨�                 {
                     return result;
                 }
 
-                float countNum = 0;
+                int countNum = 0;
                 foreach (var mat in sortedMaterials) {
-                    countNum += mat.N_QTY;
+                    countNum += mat.N_ITEM_NUM;
                     result.Add(mat);
                     if (countNum >= targetNum) {
                         break;
                     }
                 }
-                if (result.Sum(a => a.N_QTY) >= targetNum) {
+                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
                     return result;
                 }
                 else {

--
Gitblit v1.9.1