From b183905d45e279eca8a845f532fc2d2edd540edb Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期四, 10 七月 2025 17:27:42 +0800
Subject: [PATCH] 重构盘点单表结构,修复部分盘点逻辑

---
 api/ApiHelper.cs |  889 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 779 insertions(+), 110 deletions(-)

diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
index 9b0fc26..10aca34 100644
--- a/api/ApiHelper.cs
+++ b/api/ApiHelper.cs
@@ -9,6 +9,10 @@
 using HH.WCS.Mobox3.AnGang.util;
 using HH.WCS.Mobox3.AnGang.wms;
 
+using Newtonsoft.Json;
+
+using Swashbuckle.Swagger;
+
 using static HH.WCS.Mobox3.AnGang.api.ApiModel;
 using static HH.WCS.Mobox3.AnGang.api.OtherModel;
 
@@ -30,7 +34,7 @@
                 var startLoc = db.Queryable<TN_Location>()
                     .Where(a => a.S_CODE == model.StartLoc)
                     .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y")
-                    //.Where(a => a.N_CURRENT_NUM == 0)
+                    .Where(a => a.N_CURRENT_NUM == 0)
                     .Where(a => startAreas.Contains(a.S_AREA_CODE))
                     .First();
 
@@ -38,16 +42,16 @@
                     return BuildSimpleResult(1, $"璧风偣浣嶇疆{model.StartLoc}涓嶅瓨鍦ㄦ垨涓嶆弧瓒宠姹傦細(1)娌℃湁閿佺姸鎬�(2)灞炰簬鍙栨斁璐у尯");
                 }
 
-                var locCntrRelOld = db.Queryable<TN_Loc_Container>()
-                    .Where(c => c.S_LOC_CODE == model.StartLoc).First();
+                //var locCntrRelOld = db.Queryable<TN_Loc_Container>()
+                //    .Where(c => c.S_LOC_CODE == model.StartLoc).First();
 
-                // 浜у搧鍏ュ簱锛氬亣瀹氱敤鎴蜂笉浼氬皢鏂板叆搴撶墿鏂欙紝鏀惧埌宸叉湁鐗╂枡鐨勬敹鍙戣揣鍖哄叆搴�-                // 鏂颁骇鍝佸叆搴撴椂锛屽鏋滃瓨鍦ㄦ棫鐨勮揣浣嶇粦瀹氭暟鎹紙鍑哄簱閬楃暀椤圭洰锛夌洿鎺ュ垹闄�-                TN_CG_Detail cgDetailOld = null;
-                if (locCntrRelOld != null) {
-                    cgDetailOld = db.Queryable<TN_CG_Detail>()
-                        .Where(d => d.S_CNTR_CODE == locCntrRelOld.S_CNTR_CODE).First();
-                }
+                //// 浜у搧鍏ュ簱锛氬亣瀹氱敤鎴蜂笉浼氬皢鏂板叆搴撶墿鏂欙紝鏀惧埌宸叉湁鐗╂枡鐨勬敹鍙戣揣鍖哄叆搴�+                //// 鏂颁骇鍝佸叆搴撴椂锛屽鏋滃瓨鍦ㄦ棫鐨勮揣浣嶇粦瀹氭暟鎹紙鍑哄簱閬楃暀椤圭洰锛夌洿鎺ュ垹闄�+                //TN_CG_Detail cgDetailOld = null;
+                //if (locCntrRelOld != null) {
+                //    cgDetailOld = db.Queryable<TN_CG_Detail>()
+                //        .Where(d => d.S_CNTR_CODE == locCntrRelOld.S_CNTR_CODE).First();
+                //}
 
                 // 瀹瑰櫒 ID 鍜�鐗╂枡 ID 鏈寚瀹氾紝鐢辩郴缁熺洿鎺ョ敓鎴�                 //var cntId = Guid.NewGuid().ToString("D");
@@ -64,6 +68,7 @@
                 var cgDetail = new TN_CG_Detail() {
                     S_ITEM_CODE = cgId,
                     S_CNTR_CODE = cntId,
+                    S_LOC_CODE = startLoc.S_CODE, // ADD锛氳ˉ鍏呴拡瀵筆DA鍒嗘嫞
                 };
 
                 startLoc.N_CURRENT_NUM = 1;
@@ -76,9 +81,9 @@
                     if (!int.TryParse(model.Row.Trim(), out int row)) {
                         return BuildSimpleResult(2, $"{model.Row} 涓嶅悎娉曪細鏃犳硶杞垚鏁存暟绫诲瀷");
                     }
-                    // 璐ф灦鎺掑彿鍙兘鏄�0 - 8
-                    if (row <= 0 || row > 8) {
-                        return BuildSimpleResult(2, $"璐ф灦鍙�{model.Row} 蹇呴』鏄�-8涔嬮棿鐨勬暣鏁�);
+                    // 璐ф灦鎺掑彿鍙兘鏄�0 - 8锛�11-118锛�+                    if (row <= 110 || row > 118) {
+                        return BuildSimpleResult(2, $"璐ф灦鍙�{model.Row} 蹇呴』鏄�11-118涔嬮棿鐨勬暣鏁�);
                     }
                 }
 
@@ -87,20 +92,20 @@
 
                 // 鏃犺鏄惁閫夋嫨缁堢偣璐ф灦锛岄兘绛夊埌绉伴噸涔嬪悗鍐嶈绠楃粓鐐硅揣浣�                 using (var tran = db.Ado.UseTran()) {
-                    if (locCntrRelOld != null) {
-                        if (db.Deleteable<TN_Loc_Container>(locCntrRelOld).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return BuildSimpleResult(500,
-                                $"鍒犻櫎璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐ワ細璐т綅{locCntrRelOld.S_LOC_CODE}锛屽鍣▄locCntrRelOld.S_CNTR_CODE}");
-                        }
-                    }
-                    if (cgDetailOld != null) {
-                        if (db.Deleteable<TN_CG_Detail>(cgDetailOld).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return BuildSimpleResult(500,
-                                $"鍒犻櫎鏃у鍣ㄨ揣鍝佹槑缁嗚〃澶辫触锛氬鍣▄cgDetailOld.S_CNTR_CODE}锛岀墿鏂檣cgDetailOld.S_ITEM_CODE}");
-                        }
-                    }
+                    //if (locCntrRelOld != null) {
+                    //    if (db.Deleteable<TN_Loc_Container>(locCntrRelOld).ExecuteCommand() <= 0) {
+                    //        tran.RollbackTran();
+                    //        return BuildSimpleResult(500,
+                    //            $"鍒犻櫎璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐ワ細璐т綅{locCntrRelOld.S_LOC_CODE}锛屽鍣▄locCntrRelOld.S_CNTR_CODE}");
+                    //    }
+                    //}
+                    //if (cgDetailOld != null) {
+                    //    if (db.Deleteable<TN_CG_Detail>(cgDetailOld).ExecuteCommand() <= 0) {
+                    //        tran.RollbackTran();
+                    //        return BuildSimpleResult(500,
+                    //            $"鍒犻櫎鏃у鍣ㄨ揣鍝佹槑缁嗚〃澶辫触锛氬鍣▄cgDetailOld.S_CNTR_CODE}锛岀墿鏂檣cgDetailOld.S_ITEM_CODE}");
+                    //    }
+                    //}
 
                     if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
@@ -116,6 +121,133 @@
 
                     if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
                         it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY, it.N_CURRENT_NUM }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鏇存柊璧风偣璐т綅閿佺姸鎬佸け璐ワ細璧风偣璐т綅{startLoc.S_CODE}");
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚浠诲姟 {taskName} 澶辫触锛氬鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLocCode} 锛岀粓鐐硅揣浣嶆湭鎸囧畾");
+                    }
+
+                    tran.CommitTran();
+                    return BuildSimpleResult(0,
+                        $"鐢熸垚浠诲姟 {taskName} 鎴愬姛锛氬鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLocCode} 锛岀粓鐐硅揣浣嶆湭鎸囧畾");
+                }
+            }
+            catch (Exception ex) {
+                return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
+            }
+        }
+        
+        public static SimpleResult InboundData(InboundDataInfo model) {
+            var taskName = TaskName.浜у搧鍏ュ簱;
+            var db = new SqlHelper<object>().GetInstance();
+
+            var startAreas = Settings.Areas[AreaIndex.Q鍙栬揣鍖篯;
+
+            try {
+                // 璧风偣浣嶇疆蹇呴』锛氫负绌恒�鏃犻攣銆佸惎鐢ㄣ�灞炰簬鏀跺彂鍖哄煙
+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(a => a.S_CODE == model.StartLoc)
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y")
+                    .Where(a => a.N_CURRENT_NUM == 0)
+                    .Where(a => startAreas.Contains(a.S_AREA_CODE))
+                    .First();
+
+                if (startLoc == null) {
+                    return BuildSimpleResult(1, $"璧风偣浣嶇疆{model.StartLoc}涓嶅瓨鍦ㄦ垨涓嶆弧瓒宠姹傦細(1)娌℃湁閿佺姸鎬�(2)灞炰簬鍙栨斁璐у尯");
+                }
+
+                //var locCntrRelOld = db.Queryable<TN_Loc_Container>()
+                //    .Where(c => c.S_LOC_CODE == model.StartLoc).First();
+
+                //// 浜у搧鍏ュ簱锛氬亣瀹氱敤鎴蜂笉浼氬皢鏂板叆搴撶墿鏂欙紝鏀惧埌宸叉湁鐗╂枡鐨勬敹鍙戣揣鍖哄叆搴�+                //// 鏂颁骇鍝佸叆搴撴椂锛屽鏋滃瓨鍦ㄦ棫鐨勮揣浣嶇粦瀹氭暟鎹紙鍑哄簱閬楃暀椤圭洰锛夌洿鎺ュ垹闄�+                //TN_CG_Detail cgDetailOld = null;
+                //if (locCntrRelOld != null) {
+                //    cgDetailOld = db.Queryable<TN_CG_Detail>()
+                //        .Where(d => d.S_CNTR_CODE == locCntrRelOld.S_CNTR_CODE).First();
+                //}
+
+                // 瀹瑰櫒 ID 鍜�鐗╂枡 ID 鏈寚瀹氾紝鐢辩郴缁熺洿鎺ョ敓鎴�+                //var cntId = Guid.NewGuid().ToString("D");
+                //var CgId = Guid.NewGuid().ToString("D");
+                var cntId = GenerateNo("瀹瑰櫒鍙�, "CN");
+                //var cgId = GenerateNo("鐗╂枡鍙�, "CG");
+                var cgId = string.IsNullOrEmpty(model.ItemCode) ? GenerateNo("鐗╂枡鍙�, "CG") : model.ItemCode ;
+
+                // 棣栨鍏ュ簱锛氱粦瀹氫俊鎭紝鍏堝皢璧风偣浣嶇疆涓庡鍣ㄧ粦瀹氾紝瀹瑰櫒涓庣墿鏂欑粦瀹�+                var locCntrRel = new TN_Loc_Container() {
+                    S_LOC_CODE = startLoc.S_CODE,
+                    S_CNTR_CODE = cntId,
+                    N_LOCK_STATE = string.IsNullOrEmpty(model.ItemCode) ? 0 : 1,
+                };
+
+                var cgDetail = new TN_CG_Detail() {
+                    S_ITEM_CODE = cgId,
+                    S_CNTR_CODE = cntId,
+                    //S_ITEM_NAME = model.ItemName,
+                    S_LOC_CODE = startLoc.S_CODE, // ADD锛氳ˉ鍏呴拡瀵筆DA鍒嗘嫞
+                };
+
+                startLoc.N_CURRENT_NUM = 1;
+
+                var endLocCode = "0"; // 鍋囩殑榛樿缁堢偣鍦板潃
+
+                // 鎸囧畾璐т綅鎺掑彿锛堜笉鑳戒负绌恒�绌哄瓧绗︿覆鎴栫┖鏍硷級
+                if (model.Row != null && model.Row.Trim() != "") {
+                    endLocCode = model.Row; // 鐢ㄦ帓鍙峰瓧绗︿覆褰撳仛鍋囧湴鍧�+                    if (!int.TryParse(model.Row.Trim(), out int row)) {
+                        return BuildSimpleResult(2, $"{model.Row} 涓嶅悎娉曪細鏃犳硶杞垚鏁存暟绫诲瀷");
+                    }
+                    // 璐ф灦鎺掑彿鍙兘鏄�0 - 8锛�11-118锛�+                    if (row <= 110 || row > 118) {
+                        return BuildSimpleResult(2, $"璐ф灦鍙�{model.Row} 蹇呴』鏄�11-118涔嬮棿鐨勬暣鏁�);
+                    }
+                }
+
+                var task = WCSHelper.BuildInboundTask(startLoc, endLocCode, cntId);
+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+
+                // 鏃犺鏄惁閫夋嫨缁堢偣璐ф灦锛岄兘绛夊埌绉伴噸涔嬪悗鍐嶈绠楃粓鐐硅揣浣�+                using (var tran = db.Ado.UseTran()) {
+                    //if (locCntrRelOld != null) {
+                    //    if (db.Deleteable<TN_Loc_Container>(locCntrRelOld).ExecuteCommand() <= 0) {
+                    //        tran.RollbackTran();
+                    //        return BuildSimpleResult(500,
+                    //            $"鍒犻櫎璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐ワ細璐т綅{locCntrRelOld.S_LOC_CODE}锛屽鍣▄locCntrRelOld.S_CNTR_CODE}");
+                    //    }
+                    //}
+                    //if (cgDetailOld != null) {
+                    //    if (db.Deleteable<TN_CG_Detail>(cgDetailOld).ExecuteCommand() <= 0) {
+                    //        tran.RollbackTran();
+                    //        return BuildSimpleResult(500,
+                    //            $"鍒犻櫎鏃у鍣ㄨ揣鍝佹槑缁嗚〃澶辫触锛氬鍣▄cgDetailOld.S_CNTR_CODE}锛岀墿鏂檣cgDetailOld.S_ITEM_CODE}");
+                    //    }
+                    //}
+
+                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐ワ細璐т綅{locCntrRel.S_LOC_CODE}锛屽鍣▄locCntrRel.S_CNTR_CODE}");
+                    }
+
+                    if (db.Insertable<TN_CG_Detail>(cgDetail).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鎻掑叆瀹瑰櫒璐у搧鏄庣粏琛ㄥけ璐ワ細瀹瑰櫒{cgDetail.S_CNTR_CODE}锛岀墿鏂檣cgDetail.S_ITEM_CODE}");
+                    }
+
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY,
+                        it.N_CURRENT_NUM
+                    }).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
                         return BuildSimpleResult(500,
                             $"鏇存柊璧风偣璐т綅閿佺姸鎬佸け璐ワ細璧风偣璐т綅{startLoc.S_CODE}");
@@ -202,9 +334,9 @@
                     if (!int.TryParse(model.Row.Trim(), out int row)) {
                         return BuildSimpleResult(2, $"{model.Row} 涓嶅悎娉曪細鏃犳硶杞垚鏁存暟绫诲瀷");
                     }
-                    // 璐ф灦鎺掑彿鍙兘鏄�0 - 8
-                    if (row <= 0 || row > 8) {
-                        return BuildSimpleResult(2, $"璐ф灦鍙�{model.Row} 蹇呴』鏄�-8涔嬮棿鐨勬暣鏁�);
+                    // 璐ф灦鎺掑彿鍙兘鏄�0 - 8锛�11-118锛�+                    if (row <= 110 || row > 118) {
+                        return BuildSimpleResult(2, $"璐ф灦鍙�{model.Row} 蹇呴』鏄�11-118涔嬮棿鐨勬暣鏁�);
                     }
                 }
 
@@ -226,7 +358,7 @@
                                 $"鎻掑叆瀹瑰櫒璐у搧鏄庣粏琛ㄥけ璐ワ細瀹瑰櫒{cgDetail.S_CNTR_CODE}锛岀墿鏂檣cgDetail.S_ITEM_CODE}");
                         }
                     }
-
+                    
                     if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
                         it.N_LOCK_STATE,
                         it.S_LOCK_STATE,
@@ -292,17 +424,25 @@
                 var endLoc = new TN_Location();
                 if (cgDetail.F_QTY > 2000) {
                     // 閲嶉噺瓒呰繃2t锛屾姤閿�-                    if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
-                        type_name = "GET_DST",
-                        interaction_info_id = int.Parse(task.S_EQ_TASK_CODE),
-                        info_status = "error",
-                    })) {
-                        LogHelper.Info($"鍥借嚜AGV鎺ュ彈瓒呴噸鍙栨秷淇℃伅鎴愬姛", "HosttoagvTask");
+                    if (GZRobot.TryGetInteractionInfoId(task.S_CODE, out var id1)) {
+                        if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
+                            type_name = "GET_DST",
+                            interaction_info_id = id1,
+                            info_status = "error",
+                        })) {
+                            LogHelper.Info($"鍥借嚜AGV鎺ュ彈瓒呴噸鍙栨秷淇℃伅鎴愬姛", "HosttoagvTask");
+                        }
+                        else {
+                            LogHelper.Info($"鍥借嚜AGV鎺ュ彈瓒呴噸鍙栨秷淇℃伅澶辫触", "HosttoagvTask");
+                            //return BuildSimpleResult(7, $"鍥借嚜AGV鎺ュ彈缁堢偣淇℃伅澶辫触");
+                        }
                     }
                     else {
-                        LogHelper.Info($"鍥借嚜AGV鎺ュ彈瓒呴噸鍙栨秷淇℃伅澶辫触", "HosttoagvTask");
+                        //return BuildSimpleResult(7, $"鑾峰彇浠诲姟{task.S_CODE}鐨刟gv interaction_info_id澶辫触锛�);
+                        LogHelper.Info($"AGV锛氳幏鍙栦换鍔task.S_CODE}鐨刬nteraction_info_id澶辫触锛�, "HosttoagvTask");
+                        //return BuildSimpleResult(8, $"鍥借嚜AGV鎺ュ彈缁堢偣淇℃伅澶辫触");
                     }
-                    
+
                     return BuildSimpleResult(8, $"鐗╂枡閲嶉噺{cgDetail.F_QTY}瓒呰繃2t");
                 }
                 else if (cgDetail.F_QTY > 1500) {
@@ -338,18 +478,24 @@
                 task.S_END_LOC = endLoc.S_CODE;
                 LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
-                if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
-                    type_name = "GET_DST",
-                    interaction_info_id = int.Parse(task.S_EQ_TASK_CODE),
-                    info_status = "invalid",
-                    return_value = LocationHelper.GetAgvSite(task.S_END_LOC), // 鐩墠浣跨敤agvsite
-                })) {
-                    LogHelper.Info($"鍥借嚜AGV鎺ュ彈缁堢偣淇℃伅鎴愬姛", "HosttoagvTask");
+                if (GZRobot.TryGetInteractionInfoId(task.S_CODE, out var id2)) {
+                    if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
+                        type_name = "GET_DST",
+                        interaction_info_id = id2,
+                        info_status = "invalid",
+                        return_value = LocationHelper.GetAgvSite(task.S_END_LOC), // 鐩墠浣跨敤agvsite
+                    })) {
+                        LogHelper.Info($"鍥借嚜AGV鎺ュ彈缁堢偣淇℃伅鎴愬姛", "HosttoagvTask");
+                    }
+                    else {
+                        LogHelper.Info($"鍥借嚜AGV鎺ュ彈缁堢偣淇℃伅澶辫触", "HosttoagvTask");
+                        return BuildSimpleResult(7, $"鍥借嚜AGV鎺ュ彈缁堢偣淇℃伅澶辫触");
+                    }
                 }
                 else {
-                    LogHelper.Info($"鍥借嚜AGV鎺ュ彈缁堢偣淇℃伅澶辫触", "HosttoagvTask");
+                    LogHelper.Info($"AGV锛氳幏鍙栦换鍔task.S_CODE}鐨刬nteraction_info_id澶辫触锛�, "HosttoagvTask");
+                    return BuildSimpleResult(8, $"鍥借嚜AGV鎺ュ彈缁堢偣淇℃伅澶辫触");
                 }
-
 
                 using (var tran = db.Ado.UseTran()) {
                     if (db.Updateable<TN_Task>(task).UpdateColumns(a => a.S_END_LOC).ExecuteCommand() <= 0) {
@@ -394,13 +540,17 @@
                     .First();
 
                 if (startLoc == null) {
-                    return BuildSimpleResult(2, $"璧风偣浣嶇疆 {model.startLoc} 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
+                    return BuildSimpleResult(2, $"璧风偣浣嶇疆 {model.startLoc} 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹傦紒");
                 }
 
                 var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc);
 
                 if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 {model.startLoc} 娌℃湁缁戝畾瀹瑰櫒锛屾棤鍙嚭搴撶殑鐗╂枡");
+                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 {model.startLoc} 娌℃湁缁戝畾瀹瑰櫒锛屾棤鍙嚭搴撶殑鐗╂枡锛�);
+                }
+
+                if (locCntrRel.N_LOCK_STATE == 0) {
+                    return BuildSimpleResult(5, $"璧风偣浣嶇疆'{model.startLoc}'鐨勮揣浣嶏紝璐т綅瀹瑰櫒鍏崇郴涓婇攣锛岀墿鏂欎俊鎭皻鏈紶閫掞紝鏃犳硶鍑哄簱锛�);
                 }
 
                 var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.endLoc && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y" && endAreas.Contains(a.S_AREA_CODE));
@@ -513,6 +663,80 @@
             }
         }
 
+        /// <summary>
+        /// 浜у搧閮ㄥ垎鍥炲簱锛堜笉鎸囧畾缁堢偣锛屽鐢級
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResult PartInboundAuto(PartInboundInfo model) {
+            var taskName = TaskName.浜у搧閮ㄥ垎鍥炲簱;
+            var db = new SqlHelper<object>().GetInstance();
+
+            var startAreas = Settings.Areas[AreaIndex.X鍗歌揣鍖篯;
+            var endAreas = Settings.Areas[AreaIndex.H璐ф灦鍖篯;
+
+            try {
+                // 璧风偣浣嶇疆锛氬彇鏀捐揣鍖猴紙鏈夎揣鐗┿�娌℃湁閿併�宸插惎鐢級
+                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y" && startAreas.Contains(a.S_AREA_CODE));
+                if (startLoc == null) {
+                    return BuildSimpleResult(2, $"璧风偣浣嶇疆 {model.startLoc} 涓嶇鍚堝洖搴撴潯浠�);
+                }
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc);
+                if (locCntrRel == null) {
+                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 {model.startLoc} 娌℃湁缁戝畾瀹瑰櫒锛屾棤鍙洖搴撶殑鐗╂枡");
+                }
+
+                // 缁堢偣浣嶇疆锛氳揣鏋讹紙娌℃湁璐х墿锛屾病鏈夐攣锛�+                var endLoc = db.Queryable<TN_Location>().First(a => a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y" && endAreas.Contains(a.S_AREA_CODE));
+                if (endLoc == null) {
+                    return BuildSimpleResult(4, $"娌℃湁鎵惧埌鍚堥�鐨勭粓鐐硅揣浣�);
+                }
+
+                var cntId = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    tran.CommitTran();
+                    return BuildSimpleResult(0,
+                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
+            }
+        }
+
         public static SimpleResult CancelTask(CancelTaskInfo model) {
             var db = new SqlHelper<object>().GetInstance();
             var info = "";
@@ -595,9 +819,9 @@
 
                 }
                 else {
-                    return BuildSimpleResult(3, $"鍙湁浠诲姟鍙风姸鎬佷负 绛夊緟 鎴�宸叉帹閫�鐨勪换鍔℃墠鑳藉彇娑�);
+                    //return BuildSimpleResult(3, $"鍙湁浠诲姟鍙风姸鎬佷负 绛夊緟 鎴�宸叉帹閫�鐨勪换鍔℃墠鑳藉彇娑�);
 
-                    // return CancelTaskIfForced(model, task); // 澶囩敤鍑芥暟锛屽鏋滅敳鏂硅姹備换鍔℃墽琛屼腑涔熷彇娑堬紝鍐嶈皟鐢�+                    return CancelTaskIfForced(model, task); // 澶囩敤鍑芥暟锛屽鏋滅敳鏂硅姹備换鍔℃墽琛屼腑涔熷彇娑堬紝鍐嶈皟鐢�                 }
 
             }
@@ -606,25 +830,112 @@
             }
         }
 
-        public static SimpleResult CancelTaskIfForced(CancleTaskInfo model, TN_Task task) {
-            return BuildSimpleResult(3, $"鍙湁浠诲姟鍙风姸鎬佷负 绛夊緟 鎴�宸叉帹閫�鐨勪换鍔℃墠鑳藉彇娑�);
-        }
+        public static SimpleResult CancelTaskIfForced(CancelTaskInfo model, TN_Task task) {
 
-        
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                var startloc = db.Queryable<TN_Location>().First(a => a.S_CODE == task.S_START_LOC);
+                var endloc = db.Queryable<TN_Location>().First(a => a.S_CODE == task.S_END_LOC);
+                //var locCnt = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == task.S_CNTR_CODE);
+                //var cg = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == task.S_CNTR_CODE);
+
+                if (startloc != null) {
+                    startloc.N_LOCK_STATE = 0;
+                    startloc.S_LOCK_STATE = "鏃�;
+                    //starloc.N_CURRENT_NUM = 0;
+                    startloc.T_MODIFY = System.DateTime.Now;
+                }
+
+                if (endloc != null) {
+                    endloc.N_LOCK_STATE = 0;
+                    endloc.S_LOCK_STATE = "鏃�;
+                    //endloc.N_CURRENT_NUM = 0;
+                    endloc.T_MODIFY = System.DateTime.Now;
+                }
+
+                if (task.N_B_STATE == 1) {
+                    if (!int.TryParse(task.S_EQ_TASK_CODE, out var code)) {
+                        LogHelper.Info($"褰撳墠浠诲姟{task.S_CODE}娌℃湁鎵惧埌瀵瑰簲鐨勫浗鑷狝GV orderId锛�);
+                    }
+                    else {
+                        var res = GZRobot.CancelGZOrder(code);
+                        if (!res) {
+                            LogHelper.Info($"鍥借嚜AGV鍙栨秷浠诲姟澶辫触锛�, "HosttoagvTask");
+                        }
+                        else {
+                            LogHelper.Info($"鍥借嚜AGV鍙栨秷浠诲姟鎴愬姛锛�, "HosttoagvTask");
+                        }
+                    }
+                }
+
+                task.N_B_STATE = 4;
+                task.S_B_STATE = "鍙栨秷";
+
+                // 鍓嶉潰閿佺姸鎬佺殑閮ㄥ垎涓嶉渶瑕佷慨鏀癸細鏃犺鏈夋病鏈夋仮澶嶏紝閮藉己鍒舵仮澶嶏紝鏈�粓缁撴灉閮芥槸鏃犻攣鐘舵�
+
+                // 宸叉墽琛岋細闇�娣诲姞鐨勯�杈戯細閽堝瑙i攣/缁戝畾鐨勮揣浣嶅鍣ㄨ〃锛堝ソ鍍忎笉闇�鍏冲績锛屽厛涓嶅仛浠讳綍鎿嶄綔锛�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startloc).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"浠诲姟{task.S_CODE}鍙栨秷澶辫触锛氫慨鏀硅捣鐐硅揣浣嶉攣鐘舵�澶辫触";
+                        return BuildSimpleResult(500, info);
+                    }
+
+                    if (endloc != null) {
+                        if (db.Updateable<TN_Location>(endloc).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"浠诲姟{task.S_CODE}鍙栨秷澶辫触锛氫慨鏀圭粓鐐硅揣浣嶉攣鐘舵�澶辫触";
+                            return BuildSimpleResult(500, info);
+                        }
+                    }
+
+                    if (db.Updateable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"浠诲姟{task.S_CODE}鍙栨秷澶辫触";
+                        return BuildSimpleResult(500, info);
+                    }
+
+                    tran.CommitTran();
+                    info = $"浠诲姟{task.S_CODE}鍙栨秷鎴愬姛";
+                    return BuildSimpleResult(0, info);
+                }
+            }
+            catch (Exception) {
+                throw; // 澶栭儴catch
+            }
+
+            //return BuildSimpleResult(3, $"鍙湁浠诲姟鍙风姸鎬佷负 绛夊緟 鎴�宸叉帹閫�鐨勪换鍔℃墠鑳藉彇娑�);
+        }
 
         public static ErpResult InboundDataSync(InboundDataSyncInfo model) {
             //return BuildErpResult(1, "娴嬭瘯");
 
             var db = new SqlHelper<object>().GetInstance();
             try {
-                var err = "";
-                var cgDetailList = new List<TN_CG_Detail>();
-                var recordList = new List<TN_Inbound_DataRecord>();
+                if (model.stockTransactions == null && model.stockTransactions.Count == 0) {
+                    return BuildErpResult(400, "涓嶈兘浼犲叆绌虹殑鏁版嵁鍒楄〃");
+                }
+
+                //var info = "";
+                //var cgDetailList = new List<TN_CG_Detail>();
+                var insetRecordList = new List<TN_Inbound_DataRecord>();
+                var deleteRecordOldList = new List<TN_Inbound_DataRecord> ();
+                //var errList = new List<TN_Inbound_DataRecord>();
 
                 foreach (var transaction in model.stockTransactions) {
+                    var recordOld = db.Queryable<TN_Inbound_DataRecord>()
+                        .Where(r => r.S_LOCATION_CODE == "HJQ-" + transaction.locationCode.Trim()).First();
+                    if (recordOld != null) {
+                        deleteRecordOldList.Add(recordOld);
+                        //errList.Add(recordOld);
+                        //continue;
+                    }
+
                     // 鍐欏叆璁板綍琛�                     var record = new TN_Inbound_DataRecord {
-                        S_LOCATION_CODE = transaction.locationCode,
+                        S_LOCATION_CODE = "HJQ-" + transaction.locationCode.Trim(),
                         S_STOCK_TRANS = transaction.stockTransactionId,
                         S_ITEM_CODE = transaction.itemCode,
                         S_ITEM_NAME = transaction.itemName,
@@ -639,44 +950,58 @@
                         S_SUPPLIER_NAME = transaction.supplierName,
                         S_INVENTORY_MAN = transaction.inventoryManager
                     };
-                    recordList.Add(record);
+                    insetRecordList.Add(record);
 
-                    // 鏌ヨ瀵瑰簲鐗╂枡
-                    var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
-                        ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
-                        .Where(l => l.S_CODE == transaction.locationCode)
-                        .Select((l, c, d) => d)
-                        .First();
+                    //// 鏌ヨ瀵瑰簲鐗╂枡
+                    //var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
+                    //    ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
+                    //    .Where(l => l.S_CODE == transaction.locationCode)
+                    //    .Select((l, c, d) => d)
+                    //    .First();
 
-                    if (cgDetail == null) {
-                        err += $"鍌ㄤ綅鐮亄transaction.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
-                        continue;
-                    }
-                    cgDetail.S_ITEM_CODE = transaction.itemCode;
-                    cgDetail.S_ITEM_NAME = transaction.itemName;
+                    //if (cgDetail == null) {
+                    //    err += $"鍌ㄤ綅鐮亄transaction.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
+                    //    continue;
+                    //}
+                    //cgDetail.S_ITEM_CODE = transaction.itemCode;
+                    //cgDetail.S_ITEM_NAME = transaction.itemName;
 
-                    cgDetailList.Add(cgDetail);
+                    //cgDetailList.Add(cgDetail);
                 }
-                 
+                
                 using (var tran = db.Ado.UseTran()) {
-                    if (db.Insertable<TN_Inbound_DataRecord>(recordList).ExecuteCommand() <= 0) {
+                    if (deleteRecordOldList.Count != 0 && db.Deleteable<TN_Inbound_DataRecord>(deleteRecordOldList).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return BuildErpResult(500, $"鍐欏叆鍏ュ簱璁板綍琛ㄥけ璐�);
+                        return BuildErpResult(500, $"鍒犻櫎鏃у叆搴撹褰曟暟鎹け璐ワ細{JsonConvert.SerializeObject(deleteRecordOldList)}");
                     }
 
-                    if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) {
+                    if (db.Insertable<TN_Inbound_DataRecord>(insetRecordList).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return BuildErpResult(500, $"鏇存敼鐗╂枡淇℃伅澶辫触");
+                        return BuildErpResult(500, $"鍐欏叆鍏ュ簱璁板綍琛ㄥけ璐�");
                     }
+
+                    //if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) {
+                    //    tran.RollbackTran();
+                    //    return BuildErpResult(500, $"鏇存敼鐗╂枡淇℃伅澶辫触锛佸緟鏇存柊鐗╂枡淇℃伅鏁伴噺={cgDetailList.Count}");
+                    //}
 
                     tran.CommitTran();
+                    return BuildErpResult(0, $"鍐欏叆鍏ュ簱璁板綍琛ㄦ垚鍔�");
                 }
 
-                if (err != "") {
-                    return BuildErpResult(2, err + "鍏朵粬淇℃伅姝e父宸插啓鍏�);
-                }
-                return BuildErpResult(0, $"鏇存敼鐗╂枡淇℃伅鎴愬姛");
+                //if (err != "") {
+                //    return BuildErpResult(2, err + "鍏朵粬淇℃伅姝e父宸插啓鍏�);
+                //}
+                //return BuildErpResult(0, $"鏇存敼鐗╂枡淇℃伅鎴愬姛");
 
+                // NOTE锛氭殏鏃朵笉妫�煡锛屼竾涓�RP鍙戦敊浜嗭紝鍙互閫夋嫨閲嶅彂
+
+                //if (errList.Count > 0) {
+                //    info = "鏇存敼鐗╂枡淇℃伅閮ㄥ垎鎴愬姛锛岄儴鍒嗗け璐ワ紝鍘熷洜锛氬綋鍓嶈揣浣嶅凡缁忕粰杩囩墿鏂欎俊鎭�;
+                //}
+                //else {
+                //    info = "鏇存敼鐗╂枡淇℃伅鎴愬姛!";
+                //}
             }
             catch (Exception ex) {
                 return BuildErpResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
@@ -688,14 +1013,27 @@
 
             var db = new SqlHelper<object>().GetInstance();
             try {
-                var err = "";
-                var cgDetailList = new List<TN_CG_Detail>();
-                var recordList = new List<TN_Outbound_DataRecord>();
+                if (model.materialIssues == null || model.materialIssues.Count == 0) {
+                    return BuildErpResult(400, "涓嶈兘浼犲叆绌虹殑鏁版嵁鍒楄〃");
+                }
 
+                //var err = "";
+                //var cgDetailList = new List<TN_CG_Detail>();
+                //var recordList = new List<TN_Outbound_DataRecord>();
+                var insetRecordList = new List<TN_Outbound_DataRecord>();
+                var deleteRecordOldList = new List<TN_Outbound_DataRecord>();
                 foreach (var issue in model.materialIssues) {
+                    var recordOld = db.Queryable<TN_Outbound_DataRecord>()
+                        .Where(r => r.S_LOCATION_CODE == "HJQ-" + issue.locationCode.Trim()).First();
+                    if (recordOld != null) {
+                        deleteRecordOldList.Add(recordOld);
+                        //errList.Add(recordOld);
+                        //continue;
+                    }
+
                     // 鍐欏叆璁板綍琛�                     var record = new TN_Outbound_DataRecord {
-                        S_LOCATION_CODE = issue.locationCode,
+                        S_LOCATION_CODE = "HJQ-" + issue.locationCode.Trim(),
                         S_ORDER_NO = issue.withdrawalOrderNo,
                         S_ITEM_CODE = issue.itemCode,
                         S_ITEM_NAME = issue.itemName,
@@ -709,49 +1047,380 @@
                         S_LINE_CODE = issue.lineCode,
                         S_BATCH_NO = issue.batchNo
                     };
-                    recordList.Add(record);
+                    insetRecordList.Add(record);
 
-                    // 鏌ヨ瀵瑰簲鐗╂枡
-                    var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
-                        ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
-                        .Where(l => l.S_CODE == issue.locationCode)
-                        .Select((l, c, d) => d)
-                        .First();
+                    //// 鏌ヨ瀵瑰簲鐗╂枡
+                    //var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
+                    //    ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
+                    //    .Where(l => l.S_CODE == issue.locationCode)
+                    //    .Select((l, c, d) => d)
+                    //    .First();
 
-                    if (cgDetail == null) {
-                        err += $"鍌ㄤ綅鐮亄issue.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
-                        continue;
-                    }
+                    //if (cgDetail == null) {
+                    //    err += $"鍌ㄤ綅鐮亄issue.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
+                    //    continue;
+                    //}
 
-                    cgDetail.S_ITEM_CODE = issue.itemCode;
-                    cgDetail.S_ITEM_NAME = issue.itemName;
+                    //cgDetail.S_ITEM_CODE = issue.itemCode;
+                    //cgDetail.S_ITEM_NAME = issue.itemName;
 
-                    cgDetailList.Add(cgDetail);
+                    //cgDetailList.Add(cgDetail);
                 }
 
                 using (var tran = db.Ado.UseTran()) {
-                    if (db.Insertable<TN_Outbound_DataRecord>(recordList).ExecuteCommand() <= 0) {
+                    if (deleteRecordOldList.Count != 0 && db.Deleteable<TN_Outbound_DataRecord>(deleteRecordOldList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildErpResult(500, $"鍒犻櫎鏃у嚭搴撹褰曟暟鎹け璐ワ細{JsonConvert.SerializeObject(deleteRecordOldList)}");
+                    }
+
+                    if (db.Insertable<TN_Outbound_DataRecord>(insetRecordList).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
                         return BuildErpResult(500, $"鍐欏叆鍑哄簱璁板綍琛ㄥけ璐�);
                     }
 
-                    if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return BuildErpResult(500, $"鏇存敼鐗╂枡淇℃伅澶辫触");
-                    } 
+                    //if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) {
+                    //    tran.RollbackTran();
+                    //    return BuildErpResult(500, $"鏇存敼鐗╂枡淇℃伅澶辫触");
+                    //} 
 
                     tran.CommitTran();
+                    return BuildErpResult(0, $"鍐欏叆鍑哄簱璁板綍琛ㄦ垚鍔�");
                 }
 
-                if (err != "") {
-                    return BuildErpResult(2, err + "鍏朵粬淇℃伅姝e父宸插啓鍏�);
-                }
-                return BuildErpResult(0, $"鏇存敼鐗╂枡淇℃伅鎴愬姛");
+                //if (err != "") {
+                //    return BuildErpResult(2, err + "鍏朵粬淇℃伅姝e父宸插啓鍏�);
+                //}
+                //return BuildErpResult(0, $"鏇存敼鐗╂枡淇℃伅鎴愬姛");
 
             }
             catch (Exception ex) {
                 return BuildErpResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
             }
         }
+
+        // 鐩樼偣鍔熻兘锛堟柊锛�+
+
+
+        // 澶囩敤锛氱洏鐐圭浉鍏冲姛鑳斤紙鎭㈠锛�-----------------------------
+
+        /// <summary>
+        /// 鐩樼偣鐞嗚揣鍑哄簱(WMS)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResult CheckOutbound(CheckOutboundInfo model) {
+            var taskName = TaskName.鐩樼偣鐞嗚揣鍑哄簱;
+            var db = new SqlHelper<object>().GetInstance();
+
+            try {
+                // 璧风偣浣嶇疆锛氬彇鏀捐揣鍖猴紙鏈夎揣鐗┿�娌℃湁閿併�宸插惎鐢級
+                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y" && Settings.Areas[AreaIndex.H璐ф灦鍖篯.Contains(a.S_AREA_CODE));
+                if (startLoc == null) {
+                    return BuildSimpleResult(2, $"璧风偣浣嶇疆 {model.startLoc} 涓嶇鍚堝嚭搴撴潯浠�);
+                }
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc);
+                if (locCntrRel == null) {
+                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 {model.startLoc} 娌℃湁缁戝畾瀹瑰櫒锛屾棤鍙洖搴撶殑鐗╂枡");
+                }
+
+                // 缁堢偣浣嶇疆锛氳揣鏋讹紙娌℃湁璐х墿锛屾病鏈夐攣锛�+                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.endLoc && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y");
+                if (endLoc == null) {
+                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 {model.endLoc} 涓嶅叿澶囨斁璐ф潯浠�);
+                }
+
+                var cntID = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntID, taskName);
+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntID} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntID} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntID} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    tran.CommitTran();
+                    return BuildSimpleResult(0,
+                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntID} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鐩樼偣鐞嗚揣鍥炲簱(WMS)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResult CheckInbound(CheckInboundInfo model) {
+            var taskName = TaskName.鐩樼偣鐞嗚揣鍥炲簱;
+            var db = new SqlHelper<object>().GetInstance();
+
+            try {
+                // 璧风偣浣嶇疆锛氬彇鏀捐揣鍖猴紙鏈夎揣鐗┿�娌℃湁閿併�宸插惎鐢級
+                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y" && Settings.Areas[AreaIndex.X鍗歌揣鍖篯.Contains(a.S_AREA_CODE));
+                if (startLoc == null) {
+                    return BuildSimpleResult(2, $"璧风偣浣嶇疆 {model.startLoc} 涓嶇鍚堝洖搴撴潯浠�);
+                }
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc);
+                if (locCntrRel == null) {
+                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 {model.startLoc} 娌℃湁缁戝畾瀹瑰櫒锛屾棤鍙洖搴撶殑鐗╂枡");
+                }
+
+                // 缁堢偣浣嶇疆锛氳揣鏋讹紙娌℃湁璐х墿锛屾病鏈夐攣锛�+                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.endLoc && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y" && Settings.Areas[AreaIndex.H璐ф灦鍖篯.Contains(a.S_AREA_CODE));
+                if (endLoc == null) {
+                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 {model.endLoc} 涓嶅叿澶囨斁璐ф潯浠�);
+                }
+
+                var cntID = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntID, taskName);
+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntID} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntID} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntID} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    tran.CommitTran();
+                    return BuildSimpleResult(0,
+                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntID} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
+            }
+        }
+
+        //public static SimpleResult CreateCountPlan(CreateCountPlanInfo model) {
+        //    var db = new SqlHelper<object>().GetInstance();
+        //    try {
+
+        //        var countPlan = new TN_Count_Plan() {
+        //            S_CP_NO = GenerateNo("鐩樼偣璁″垝", "PDJH"), // CP =銆婸DJH
+        //            S_TYPE = model.countType,
+        //        };
+
+        //        if (model.countType == "璐т綅") {
+        //            countPlan.S_LOC_CODE = model.targetId;
+        //        }
+        //        else if (model.countType == "鐗╂枡") {
+        //            countPlan.S_ITEM_CODE = model.targetId;
+        //        }
+        //        else {
+        //            return BuildSimpleResult(2, $"鍒涘缓鐩樼偣璁″垝澶辫触锛氫笉鍚堟硶鐨勭洏鐐圭被鍨�'{model.countType}'");
+        //        }
+
+        //        if (db.Insertable<TN_Count_Plan>(countPlan).ExecuteCommand() <= 0) {
+        //            return BuildSimpleResult(2, "鍒涘缓鐩樼偣璁″垝澶辫触");
+        //        }
+
+        //        return BuildSimpleResult(0, "鍒涘缓鐩樼偣璁″垝鎴愬姛");
+
+        //    }
+        //    catch (Exception ex) {
+
+        //        return BuildSimpleResult(1, ex.Message);
+        //    }
+        //}
+
+        //public static SimpleResult CreateCountOrder(CreateCountOrderInfo model) {
+        //    var db = new SqlHelper<object>().GetInstance();
+        //    var info = "";
+        //    try {
+        //        var countPlan = db.Queryable<TN_Count_Plan>()
+        //            .Where(a => a.S_CP_NO == model.planId).First();
+
+        //        if (countPlan == null) {
+        //            return BuildSimpleResult(2, $"鐩樼偣璁″垝鍗曞彿 '{model.planId}' 涓嶅瓨鍦�);
+        //        }
+
+        //        var countOrder = new TN_Count_Order() {
+        //            S_CP_NO = model.planId,
+        //            S_COUNT_NO = GenerateNo("鐩樼偣鍗�, "PDD"), // CN =銆婸DD
+        //        };
+
+        //        var countDetailList = new List<TN_Count_CG_Detail>();
+        //        if (countPlan.S_TYPE == "璐т綅") {
+        //            var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
+        //                ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
+        //                .Where(l => l.S_CODE == countPlan.S_LOC_CODE)
+        //                .Select((l, c, d) => d).First();
+
+        //            if (cgDetail == null) {
+        //                return BuildSimpleResult(3, $"鏈壘鍒版寚瀹氳揣浣峽countPlan.S_LOC_CODE}涓婄殑鐗╂枡");
+        //            }
+
+        //            var countDetail = new TN_Count_CG_Detail {
+        //                S_COUNT_NO = countOrder.S_COUNT_NO,
+        //                S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+        //                S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+        //            };
+
+        //            countDetailList.Add(countDetail);
+        //        }
+        //        else if (countPlan.S_TYPE == "鐗╂枡") {
+        //            var cgDetail = db.Queryable<TN_CG_Detail>()
+        //                .Where(d => d.S_ITEM_CODE == countPlan.S_ITEM_CODE).First(); // ToList -> First
+
+        //            if (cgDetail == null) {
+        //                return BuildSimpleResult(3, $"鏈壘鍒版寚瀹氱殑鐗╂枡{countPlan.S_ITEM_CODE}");
+        //            }
+
+        //            //foreach (var cgDetail in cgDetailList) {
+        //            //    var countDetail = new TN_Count_CG_Detail {
+        //            //        S_COUNT_NO = countOrder.S_COUNT_NO,
+        //            //        S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+        //            //        S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+        //            //    };
+
+        //            //    countDetailList.Add(countDetail);
+        //            //}
+
+        //            var countDetail = new TN_Count_CG_Detail {
+        //                S_COUNT_NO = countOrder.S_COUNT_NO,
+        //                S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+        //                S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+        //            };
+
+        //            countDetailList.Add(countDetail);
+        //        }
+        //        else {
+        //            return BuildSimpleResult(3, $"璁″垝鍗�{model.planId}'鐨勭被鍨媨countPlan.S_TYPE}涓嶅悎娉�);
+        //        }
+
+        //        using (var tran = db.Ado.UseTran()) {
+        //            if (db.Insertable<TN_Count_Order>(countOrder).ExecuteCommand() <= 0) {
+        //                tran.RollbackTran();
+        //                info = "鍒涘缓鐩樼偣鍗曞け璐�;
+        //                return BuildSimpleResult(2, info);
+        //            }
+
+        //            if (db.Insertable<TN_Count_CG_Detail>(countDetailList).ExecuteCommand() <= 0) {
+        //                tran.RollbackTran();
+        //                info = "鍒涘缓鐩樼偣鍗曟槑缁嗗け璐�;
+        //                return BuildSimpleResult(3, info);
+        //            }
+
+        //            tran.CommitTran();
+        //        }
+
+        //        return BuildSimpleResult(0, "鍒涘缓鐩樼偣鍗曟垚鍔�);
+        //    }
+        //    catch (Exception ex) {
+
+        //        return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
+        //    }
+        //}
+
+        public static SimpleResult CountProduct(CountProductInfo model) {
+            var db = new SqlHelper<object>().GetInstance();
+            try {
+                //var cgDetail = db.Queryable<TN_CG_Detail>()
+                //    .Where(d => d.S_CNTR_CODE == model.cntrCode).First();
+
+                //if (cgDetail == null) {
+                //    return BuildSimpleResult(2, $"鎵句笉鍒板鍣ㄥ彿'{model.cntrCode}'瀵瑰簲鐨勭墿鏂�);
+                //}
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>()
+                    //.LeftJoin<TN_CG_Detail>((c, d) => c.S_CNTR_CODE == d.S_CNTR_CODE)
+                    .Where(c => c.S_LOC_CODE == model.locCode).First();
+                if (locCntrRel == null) {
+                    return BuildSimpleResult(2, $"褰撳墠璐т綅{model.locCode}娌℃湁瀹瑰櫒锛�);
+                }
+
+                var cgDetail = db.Queryable<TN_CG_Detail>()
+                    .Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).First();
+                if (cgDetail == null) {
+                    return BuildSimpleResult(3, $"褰撳墠璐т綅{model.locCode}涓婄殑瀹瑰櫒{locCntrRel.S_CNTR_CODE}娌℃湁鐗╁搧锛�);
+                }
+
+                //var countDiff = new TN_Count_Diff {
+                //    S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                //    F_QTY = cgDetail.F_QTY,
+                //    F_ACTUAL_QTY = model.qty
+                //};
+
+                var countDiff = db.Queryable<TN_AG_Count_Diff>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).First();
+                if (countDiff == null) {
+                    return BuildSimpleResult(4, $"褰撳墠鐗╂枡鎵�湪瀹瑰櫒{locCntrRel.S_CNTR_CODE}鐗╂枡淇℃伅娌℃湁鐢熸垚瀵瑰簲鐨勭洏鐐瑰樊寮傝〃锛�);
+                }
+
+                countDiff.F_QTY = cgDetail.F_QTY;
+                countDiff.F_ACTUAL_QTY = model.qty;
+                //countDiff.S_ITEM_CODE = cgDetail.S_ITEM_CODE;
+
+                //if (db.Insertable<TN_Count_Diff>(countDiff).ExecuteCommand() <= 0) {
+                //    return BuildSimpleResult(3, $"鎻掑叆鐩樼偣宸紓琛ㄥけ璐�);
+                //}
+
+                if (db.Updateable<TN_AG_Count_Diff>(countDiff).ExecuteCommand() <= 0) {
+                    return BuildSimpleResult(5, $"鎻掑叆鐩樼偣宸紓琛ㄥけ璐�);
+                }
+
+                return BuildSimpleResult(0, "鐩樼偣宸紓瀹屾垚");
+
+            }
+            catch (Exception ex) {
+                return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
+            }
+        }
+
+
     }
 }

--
Gitblit v1.9.1