From 6373a5ee748898cb5db477035dca66c6e4194dfc Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期三, 23 七月 2025 17:34:46 +0800
Subject: [PATCH] 产品入库添加物料名称描述数量输入框和货位解绑功能, 手动添加物料信息功能

---
 api/ApiHelper.cs |  874 ++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 546 insertions(+), 328 deletions(-)

diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
index dd1f197..ee439de 100644
--- a/api/ApiHelper.cs
+++ b/api/ApiHelper.cs
@@ -18,129 +18,6 @@
 
 namespace HH.WCS.Mobox3.AnGang.api {
     public class ApiHelper {
-        /// <summary>
-        /// 浜у搧鍏ュ簱(PDA)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        internal static SimpleResult Inbound(InboundInfo 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 locCntrRel = new TN_Loc_Container() {
-                    S_LOC_CODE = startLoc.S_CODE,
-                    S_CNTR_CODE = cntId,
-                };
-
-                var cgDetail = new TN_CG_Detail() {
-                    S_ITEM_CODE = cgId,
-                    S_CNTR_CODE = cntId,
-                };
-
-                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}");
-                    }
-
-                    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();
@@ -160,22 +37,7 @@
                     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 ;
 
                 // 棣栨鍏ュ簱锛氱粦瀹氫俊鎭紝鍏堝皢璧风偣浣嶇疆涓庡鍣ㄧ粦瀹氾紝瀹瑰櫒涓庣墿鏂欑粦瀹�@@ -188,7 +50,11 @@
                 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鍒嗘嫞
+                    N_LOCK_STATE = locCntrRel.N_LOCK_STATE,
+                    S_ITEM_SHORT_DESC = string.IsNullOrEmpty(model.ItemShortDesc) ? "" : model.ItemShortDesc,
+                    S_ITEM_NAME = string.IsNullOrEmpty(model.ItemName) ? "" : model.ItemName,
+                    F_QTY = model.ItemCount, // 0f by default
                 };
 
                 startLoc.N_CURRENT_NUM = 1;
@@ -212,20 +78,6 @@
 
                 // 鏃犺鏄惁閫夋嫨缁堢偣璐ф灦锛岄兘绛夊埌绉伴噸涔嬪悗鍐嶈绠楃粓鐐硅揣浣�                 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();
@@ -273,88 +125,51 @@
             return $"{prefix}{date}-{id.ToString().PadLeft(5, '0')}"; // 褰㈠锛欳N250525-00011
         }
 
-        /// <summary>
-        /// 鍏煎Inbound鍜孭artInbound鐨勫姛鑳斤紝澶囩敤锛堥棶棰橈細鍑哄簱鍚庢棤娉曡嚜鍔ㄦ竻鏁版嵁锛屽鑷村叆搴撳悗鍥炲簱锛�-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult InboundTwoWays(InboundInfo model) {
-            var taskName = TaskName.浜у搧鍏ュ簱;
+        public static SimpleResult AddCgDetail(AddCgDetailInfo model) {
             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.S_CODE == model.LocCode)
                     .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)灞炰簬鍙栨斁璐у尯");
+                    return BuildSimpleResult(1, $"璐т綅娌℃湁鎵惧埌!");
                 }
-
-                // 瀹瑰櫒 ID 鍜�鐗╂枡 ID 鏈寚瀹氾紝鐢辩郴缁熺洿鎺ョ敓鎴�-                //var cntId = Guid.NewGuid().ToString("D");
-                //var CgId = Guid.NewGuid().ToString("D");
-                var cntId = GenerateNo("瀹瑰櫒鍙�, "CN");
-                var cgId = GenerateNo("鐗╂枡鍙�, "CG");
-
-                var locCntrRel = db.Queryable<TN_Loc_Container>()
-                    .Where(c => c.S_LOC_CODE == model.StartLoc).First();
-
-                // 鍙湁棣栨鍏ュ簱锛堝綋鍓嶆墭鐩樻湭缁戝畾鍦ㄨ捣鐐硅揣浣嶏級鏃禼gDetail璁剧疆鍊硷紝骞舵彃鍏�-                // 鍚﹀垯锛宑gDetail涓虹┖锛屼唬琛ㄦ槸鍥炲簱浣滀笟锛堟鍓嶆湁缁戝畾杩囪捣鐐癸級
-                TN_CG_Detail cgDetail = null;
-                if (locCntrRel == null) {
-                    // 棣栨鍏ュ簱锛氭病鏈夌粦瀹氫俊鎭紝鍏堝皢璧风偣浣嶇疆涓庡鍣ㄧ粦瀹氾紝瀹瑰櫒涓庣墿鏂欑粦瀹�-                    locCntrRel = new TN_Loc_Container() {
-                        S_LOC_CODE = startLoc.S_CODE,
-                        S_CNTR_CODE = cntId,
-                    };
-
-                    cgDetail = new TN_CG_Detail() {
-                        S_ITEM_CODE = cgId,
-                        S_CNTR_CODE = cntId,
-                    };
+                if (startLoc.N_CURRENT_NUM != 0) {
+                    return BuildSimpleResult(2, $"褰撳墠璐т綅宸茬粡鏈夊鍣�");
                 }
 
                 startLoc.N_CURRENT_NUM = 1;
 
-                var endLocCode = "0"; // 鍋囩殑榛樿缁堢偣鍦板潃
+                var locCntrRel = new TN_Loc_Container() {
+                    S_LOC_CODE = model.LocCode,
+                    S_CNTR_CODE = model.CntrCode,
+                    N_LOCK_STATE = string.IsNullOrEmpty(model.ItemCode) ? 0 : 1,
+                };
 
-                // 鎸囧畾璐т綅鎺掑彿锛堜笉鑳戒负绌恒�绌哄瓧绗︿覆鎴栫┖鏍硷級
-                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 cgDetail = new TN_CG_Detail() {
+                    S_ITEM_CODE = model.ItemCode,
+                    S_CNTR_CODE = model.CntrCode,
+                    S_LOC_CODE = model.LocCode, // ADD锛氳ˉ鍏呴拡瀵筆DA鍒嗘嫞
+                    N_LOCK_STATE = locCntrRel.N_LOCK_STATE,
+                    S_ITEM_SHORT_DESC = string.IsNullOrEmpty(model.ItemShortDesc) ? "" : model.ItemShortDesc,
+                    S_ITEM_NAME = string.IsNullOrEmpty(model.ItemName) ? "" : model.ItemName,
+                    F_QTY = model.ItemCount, // 0f by default
+                };
 
-                var task = WCSHelper.BuildInboundTask(startLoc, endLocCode, cntId);
-                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�-
-                // 鏃犺鏄惁閫夋嫨缁堢偣璐ф灦锛岄兘绛夊埌绉伴噸涔嬪悗鍐嶈绠楃粓鐐硅揣浣�                 using (var tran = db.Ado.UseTran()) {
-                    if (cgDetail != null) {
-                        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.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 {
@@ -368,23 +183,15 @@
                         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} 锛岀粓鐐硅揣浣嶆湭鎸囧畾");
+                    return BuildSimpleResult(0, $"鎴愬姛!");
                 }
             }
             catch (Exception ex) {
-                return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
+                return BuildSimpleResult(-1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
             }
         }
-
 
         /// <summary>
         /// PDA閫夋嫨缁堢偣璐т綅
@@ -420,22 +227,30 @@
                 }
 
                 var endLoc = new TN_Location();
-                if (cgDetail.F_QTY > 2000) {
+                if (cgDetail.F_WEIGHT > 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");
+
+                    return BuildSimpleResult(8, $"鐗╂枡閲嶉噺{cgDetail.F_WEIGHT}瓒呰繃2t");
                 }
-                else if (cgDetail.F_QTY > 1500) {
+                else if (cgDetail.F_WEIGHT > 1500) {
                     // 閲嶉噺瓒呰繃1.5t锛岄渶瑕侀�鎷�-2灞傝揣鏋�                     endLoc = db.Queryable<TN_Location>()
                         .Where(a => a.S_CODE == model.EndLoc)
@@ -445,7 +260,7 @@
                         .Where(a => a.N_LAYER <= 2)
                         .First();
                 }
-                else if (cgDetail.F_QTY > 0) {
+                else if (cgDetail.F_WEIGHT > 0) {
                     endLoc = db.Queryable<TN_Location>()
                         .Where(a => a.S_CODE == model.EndLoc)
                         .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y")
@@ -456,7 +271,7 @@
                         .First();
                 }
                 else {
-                    return BuildSimpleResult(5, $"鐗╂枡閲嶉噺淇℃伅涓嶅悎娉曪細{cgDetail.F_QTY}");
+                    return BuildSimpleResult(5, $"鐗╂枡閲嶉噺淇℃伅涓嶅悎娉曪細{cgDetail.F_WEIGHT}");
                 }
 
                 // 娌℃湁绗﹀悎鏉′欢鐨勮揣浣�@@ -468,16 +283,23 @@
                 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()) {
@@ -594,7 +416,7 @@
 
             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));
+                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc && a.N_CURRENT_NUM == 0 && 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} 涓嶇鍚堝洖搴撴潯浠�);
                 }
@@ -639,6 +461,169 @@
                     tran.CommitTran();
                     return BuildSimpleResult(0,
                         $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鎸囧畾璐т綅鍏ュ簱
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResult InboundLoc(InboundLocInfo model) {
+            var taskName = TaskName.鎸囧畾璐т綅鍏ュ簱;
+            var db = new SqlHelper<object>().GetInstance();
+
+            var startAreas = Settings.Areas[AreaIndex.Q鍙栬揣鍖篯;
+            var endAreas = Settings.Areas[AreaIndex.H璐ф灦鍖篯;
+
+            try {
+                // 璧风偣浣嶇疆锛氬彇鏀捐揣鍖猴紙鏈夎揣鐗┿�娌℃湁閿併�宸插惎鐢級
+                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y" && startAreas.Contains(a.S_AREA_CODE));
+                if (startLoc == null) {
+                    return BuildSimpleResult(1, $"璧风偣浣嶇疆{model.startLoc}涓嶅瓨鍦ㄦ垨涓嶆弧瓒宠姹傦細(1)娌℃湁閿佺姸鎬�(2)灞炰簬鍙栨斁璐у尯");
+                }
+
+                //var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc);
+                //if (locCntrRel == null) {
+                //    return BuildSimpleResult(3, $"璧风偣浣嶇疆 {model.startLoc} 娌℃湁缁戝畾瀹瑰櫒锛屾棤鍙洖搴撶殑鐗╂枡");
+                //}
+
+                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鍒嗘嫞
+                    N_LOCK_STATE = locCntrRel.N_LOCK_STATE,
+                    S_ITEM_SHORT_DESC = string.IsNullOrEmpty(model.ItemShortDesc) ? "" : model.ItemShortDesc,
+                    S_ITEM_NAME = string.IsNullOrEmpty(model.ItemName) ? "" : model.ItemName,
+                    F_QTY = model.ItemCount, // 0f by default
+                };
+
+                startLoc.N_CURRENT_NUM = 1;
+
+                // 缁堢偣浣嶇疆锛氳揣鏋讹紙娌℃湁璐х墿锛屾病鏈夐攣锛�+                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));
+                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.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
+                    }).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>
+        /// 璐т綅瀹瑰櫒瑙g粦
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResult UnbindLoc(UnbindLocInfo model) {
+            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(1, $"璧风偣浣嶇疆{model.startLoc}涓嶅瓨鍦ㄦ垨涓嶆弧瓒宠姹傦細(1)娌℃湁閿佺姸鎬�(2)灞炰簬鍙栬揣鍖�);
+                }
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc);
+                if (locCntrRel == null) {
+                    return BuildSimpleResult(2, $"褰撳墠璐т綅{model.startLoc}娌℃湁璐т綅瀹瑰櫒缁戝畾鍏崇郴锛屾棤闇�В缁戯紒");
+                }
+
+                var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == locCntrRel.S_CNTR_CODE);
+                if (cgDetail != null) {
+                    return BuildSimpleResult(3, $"褰撳墠璐т綅{model.startLoc}瀹瑰櫒瀛樻斁鐨勭墿鏂欐暟閲忎笉涓�锛屾棤娉曡В缁戯紒");
+                }
+
+                startLoc.N_CURRENT_NUM = 0;
+                startLoc.T_MODIFY = DateTime.Now;
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Deleteable(locCntrRel).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鍒犻櫎璐т綅瀹瑰櫒缁戝畾鍏崇郴澶辫触!" + JsonConvert.SerializeObject(locCntrRel));
+                    }
+
+                    if (db.Updateable(startLoc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.T_MODIFY }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鍒犻櫎璐т綅瀹瑰櫒缁戝畾鍏崇郴澶辫触!" + JsonConvert.SerializeObject(locCntrRel));
+                    }
+
+                    tran.CommitTran();
+                    return BuildSimpleResult(0, "瑙g粦瀹瑰櫒璐у搧鍏崇郴鎴愬姛");
                 }
             }
             catch (Exception ex) {
@@ -819,7 +804,6 @@
         }
 
         public static ErpResult InboundDataSync(InboundDataSyncInfo model) {
-            //return BuildErpResult(1, "娴嬭瘯");
 
             var db = new SqlHelper<object>().GetInstance();
             try {
@@ -827,24 +811,24 @@
                     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();
+                        .Where(r => r.S_LOCATION_CODE == transaction.locationCode.Trim()).First();
                     if (recordOld != null) {
                         deleteRecordOldList.Add(recordOld);
-                        //errList.Add(recordOld);
-                        //continue;
+
+                    }
+
+                    if (!float.TryParse(transaction.inQuantity, out var _) || !float.TryParse(transaction.stockQuantity, out var _)) {
+                        return BuildErpResult(400, $"鍏ュ簱鏁伴噺鎴栧簱瀛樻暟閲忎笉鍚堟硶! 璇风‘淇濆瓧绗︿覆鐨勫�鍙互瑙f瀽涓烘暟鍊� 搴撳瓨浜ゆ槗鏄庣粏鍙�'{transaction.stockTransactionId}', 鍏ュ簱鏁伴噺='{transaction.inQuantity}', 搴撳瓨鏁伴噺='{transaction.stockQuantity}'");
                     }
 
                     // 鍐欏叆璁板綍琛�                     var record = new TN_Inbound_DataRecord {
-                        S_LOCATION_CODE = "HJQ-" + transaction.locationCode.Trim(),
+                        S_LOCATION_CODE = transaction.locationCode.Trim(),
                         S_STOCK_TRANS = transaction.stockTransactionId,
                         S_ITEM_CODE = transaction.itemCode,
                         S_ITEM_NAME = transaction.itemName,
@@ -861,21 +845,6 @@
                     };
                     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();
-
-                    //if (cgDetail == null) {
-                    //    err += $"鍌ㄤ綅鐮亄transaction.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
-                    //    continue;
-                    //}
-                    //cgDetail.S_ITEM_CODE = transaction.itemCode;
-                    //cgDetail.S_ITEM_NAME = transaction.itemName;
-
-                    //cgDetailList.Add(cgDetail);
                 }
                 
                 using (var tran = db.Ado.UseTran()) {
@@ -889,28 +858,9 @@
                         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, $"鏇存敼鐗╂枡淇℃伅鎴愬姛");
-
-                // NOTE锛氭殏鏃朵笉妫�煡锛屼竾涓�RP鍙戦敊浜嗭紝鍙互閫夋嫨閲嶅彂
-
-                //if (errList.Count > 0) {
-                //    info = "鏇存敼鐗╂枡淇℃伅閮ㄥ垎鎴愬姛锛岄儴鍒嗗け璐ワ紝鍘熷洜锛氬綋鍓嶈揣浣嶅凡缁忕粰杩囩墿鏂欎俊鎭�;
-                //}
-                //else {
-                //    info = "鏇存敼鐗╂枡淇℃伅鎴愬姛!";
-                //}
             }
             catch (Exception ex) {
                 return BuildErpResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
@@ -926,23 +876,22 @@
                     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();
+                        .Where(r => r.S_LOCATION_CODE == issue.locationCode.Trim()).First();
                     if (recordOld != null) {
                         deleteRecordOldList.Add(recordOld);
-                        //errList.Add(recordOld);
-                        //continue;
+                    }
+
+                    if (!float.TryParse(issue.actualIssuedQty, out var _)) {
+                        return BuildErpResult(400, $"瀹炲彂鏁伴噺涓嶅悎娉� 璇风‘淇濆瓧绗︿覆鐨勫�鍙互瑙f瀽涓烘暟鍊� 棰嗙敤鍗曞彿='{issue.withdrawalOrderNo}', 瀹炲彂鏁伴噺='{issue.actualIssuedQty}'");
                     }
 
                     // 鍐欏叆璁板綍琛�                     var record = new TN_Outbound_DataRecord {
-                        S_LOCATION_CODE = "HJQ-" + issue.locationCode.Trim(),
+                        S_LOCATION_CODE = issue.locationCode.Trim(),
                         S_ORDER_NO = issue.withdrawalOrderNo,
                         S_ITEM_CODE = issue.itemCode,
                         S_ITEM_NAME = issue.itemName,
@@ -957,23 +906,6 @@
                         S_BATCH_NO = issue.batchNo
                     };
                     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();
-
-                    //if (cgDetail == null) {
-                    //    err += $"鍌ㄤ綅鐮亄issue.locationCode}瀵瑰簲鐨勮揣浣嶇墿鏂欎笉瀛樺湪锛�;
-                    //    continue;
-                    //}
-
-                    //cgDetail.S_ITEM_CODE = issue.itemCode;
-                    //cgDetail.S_ITEM_NAME = issue.itemName;
-
-                    //cgDetailList.Add(cgDetail);
                 }
 
                 using (var tran = db.Ado.UseTran()) {
@@ -987,24 +919,310 @@
                         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, $"鏇存敼鐗╂枡淇℃伅鎴愬姛");
 
             }
             catch (Exception ex) {
                 return BuildErpResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
             }
         }
+
+        // 鐩樼偣鍔熻兘锛堟柊锛�-----------------------------------
+
+        internal static SimpleResult CheckOutboundOnce(CheckOutboundOnceInfo model) {
+            var taskName = TaskName.鐩樼偣鐞嗚揣鍑哄簱;
+            var db = new SqlHelper<object>().GetInstance();
+
+            try {
+                var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == model.cntrCode);
+                if (locCntrRel == null) {
+                    return BuildSimpleResult(3, $"瀹瑰櫒 {model.cntrCode} 娌℃湁鎵惧埌瀵瑰簲鐨勮揣浣�);
+                }
+
+                // 璧风偣浣嶇疆锛氬彇鏀捐揣鍖猴紙鏈夎揣鐗┿�娌℃湁閿併�宸插惎鐢級
+                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == locCntrRel.S_LOC_CODE && 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, $"璧风偣浣嶇疆 {locCntrRel.S_LOC_CODE} 涓嶇鍚堝嚭搴撴潯浠�);
+                }
+
+                // 缁堢偣浣嶇疆锛氳揣鏋讹紙娌℃湁璐х墿锛屾病鏈夐攣锛�+                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 countOrder = db.Queryable<TN_AG_Count_Order>().Where(o => o.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).First();
+                if (countOrder == null) {
+                    return BuildSimpleResult(6, $"娌℃湁鎵惧埌瀵瑰簲瀹瑰櫒{model.cntrCode}鐨勭洏鐐瑰崟鍙�");
+                }
+                countOrder.N_B_STATE = 1;
+
+                var unFinishedCount = db.Queryable<TN_AG_Count_Order>().Where(a => a.S_CP_NO == countOrder.S_CP_NO && a.S_COUNT_NO != countOrder.S_COUNT_NO && a.N_B_STATE == 0).Count();
+
+                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 (unFinishedCount == 0 && db.Updateable<TN_AG_Count_Plan>().SetColumns(a =>a.N_B_STATE == 1).Where(a => a.S_CP_NO == countOrder.S_CP_NO).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鏇存柊鐩樼偣璁″垝鍗曠姸鎬佷负1澶辫触锛佸崟鍙凤細{countOrder.S_CP_NO}");
+                    }
+
+                    if (db.Updateable<TN_AG_Count_Order>(countOrder).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(500,
+                            $"鏇存柊鐩樼偣鍗曠姸鎬佷负1澶辫触锛�+ JsonConvert.SerializeObject(countOrder));
+                    }
+
+                    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 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 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;
+                cgDetail.F_QTY = model.qty;
+                //if (db.Insertable<TN_Count_Diff>(countDiff).ExecuteCommand() <= 0) {
+                //    return BuildSimpleResult(3, $"鎻掑叆鐩樼偣宸紓琛ㄥけ璐�);
+                //}
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_AG_Count_Diff>(countDiff).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(5, $"鎻掑叆鐩樼偣宸紓琛ㄥけ璐�);
+                    }
+
+                    if (db.Updateable<TN_CG_Detail>(cgDetail).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(5, $"鏇存柊鐗╂枡淇℃伅澶辫触");
+                    }
+
+                    tran.CommitTran();
+                }
+
+                return BuildSimpleResult(0, "鐩樼偣宸紓瀹屾垚");
+
+            }
+            catch (Exception ex) {
+                return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
+            }
+        }
+
+
     }
 }

--
Gitblit v1.9.1