From 63e94e068622d4ef843cee0d19d4f2d231316304 Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期五, 25 七月 2025 17:20:38 +0800
Subject: [PATCH] 完善查询语句, 日志记录的封装

---
 wms/DbExpr.cs              |  152 +--------
 /dev/null                  |  139 ---------
 wms/LocationHelper.cs      |  177 -----------
 wms/WMSHelper.cs           |    2 
 api/ApiHelper.cs           |  104 +++---
 wms/LogMsg.cs              |  118 +++++++
 process/TaskProcess.cs     |  168 ++++++++++
 HH.WCS.Mobox3.DSZSH.csproj |    2 
 8 files changed, 358 insertions(+), 504 deletions(-)

diff --git a/HH.WCS.Mobox3.DSZSH.csproj b/HH.WCS.Mobox3.DSZSH.csproj
index 11e8adb..adf462c 100644
--- a/HH.WCS.Mobox3.DSZSH.csproj
+++ b/HH.WCS.Mobox3.DSZSH.csproj
@@ -273,7 +273,7 @@
     <Compile Include="util\WebHelper.cs" />
     <Compile Include="wms\DbTran.cs" />
     <Compile Include="wms\LocationHelper.cs" />
-    <Compile Include="wms\LogBox.cs" />
+    <Compile Include="wms\LogMsg.cs" />
     <Compile Include="wms\DbExpr.cs" />
     <Compile Include="wms\SYSHelper.cs" />
     <Compile Include="Program.cs" />
diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
index 05a8a79..7328525 100644
--- a/api/ApiHelper.cs
+++ b/api/ApiHelper.cs
@@ -39,16 +39,17 @@
 
                 // 妫�煡璐у搧瀹瑰櫒琛�鏄惁宸茬粡瀛樺湪璐存爣鏈轰紶閫掔殑寰呭叆搴撶墿鏂欎俊鎭�                 // TODO:鏁伴噺,瑙勬牸鏄惁涔熷弬涓庢瘮瀵癸紵
-                var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo 
-                    && d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮").First();
+                var cgDetail = db.Queryable<TN_CG_Detail>()
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo 
+                             && d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮").First();
                 if (cgDetail == null) {
-                    return NewSimpleResult(1, preLog + $"娌℃湁鍦╗璐у搧鏄庣粏琛╙涓壘鍒癧鐗╂枡缂栫爜='{model.ItemCode}',鎵规鍙�'{model.BatchNo}']鐨勭墿鏂�璇锋鏌�PDA鎵爜鐗╂枡淇℃伅涓庤创鏍囨満浼犻�鐨勪俊鎭槸鍚︿竴鑷�瑕佹眰:鐗╂枡鐘舵�='寰呮'");
+                    return NewSimpleResult(1, preLog + LogMsg.CgDetailNotFound(item: model.ItemCode) + $"鐗╂枡鐘舵�='寰呮';" +
+                        $"璇锋鏌�PDA鎵爜鐗╂枡淇℃伅涓庤创鏍囨満浼犻�鐨勪俊鎭槸鍚︿竴鑷�!");
                 }
 
-                // 鏌ヨ璧风偣璐т綅:鏁伴噺=0
                 var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(model.StartLoc, taskInfo.StartAreas)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(2, preLog + LogBox.StartLocUnbindNotFound(model.StartLoc, taskInfo.StartAreas));
+                    return NewSimpleResult(2, preLog + LogMsg.StartLocUnbindNotFound(model.StartLoc, taskInfo.StartAreas));
                 }
 
                 // 鍜屾弧鎵樹笅绾垮叆搴撶殑閫昏緫涓�嚧,鐢变簬瀹瑰櫒绉诲姩涓嶄細鏇存敼缁戝畾淇℃伅,鎵�互蹇呴』鍒犻櫎鏃ф暟鎹�@@ -57,11 +58,10 @@
                 var locCntrRel = WCSHelper.BindLocCntr(startLoc, cgDetail.S_CNTR_CODE);
                 locCntrRel.S_CNTR_TYPE = cntrType;
 
-                // 鏌ヨ缁堢偣璐т綅
-                // Order:鎸夎揣浣嶅眰鏁�浠庡皬鍒板ぇ鎺掑垪
-                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: taskInfo.EndAreas)).OrderBy(l => new { l.N_LAYER }).First();
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: taskInfo.EndAreas))
+                    .OrderBy(l => new { l.N_LAYER }).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + LogBox.EndLocNotFound(null, taskInfo.EndAreas));
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
                 }
 
                 var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
@@ -98,7 +98,7 @@
                 // 鏌ヨ璧风偣璐т綅:鏁伴噺=0
                 var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(model.StartLoc, taskInfo.StartAreas)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(2, preLog + LogBox.StartLocUnbindNotFound(model.StartLoc, taskInfo.StartAreas));
+                    return NewSimpleResult(2, preLog + LogMsg.StartLocUnbindNotFound(model.StartLoc, taskInfo.StartAreas));
                 }
 
                 // 鏌ヨ瀹瑰櫒琛�瀹瑰櫒绫诲瀷瀛楁
@@ -119,7 +119,7 @@
                 var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: taskInfo.EndAreas))
                     .OrderBy(l => new { l.N_LAYER, l.N_ROW, l.N_COL }).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + LogBox.EndLocNotFound(null, taskInfo.EndAreas));
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
                 }
 
                 // 璧风偣缁堢偣涓婇攣,鍒涘缓浠诲姟
@@ -152,10 +152,9 @@
             const string cntrType = "濂借繍绠�;
 
             try {
-                // 鏌ヨ璧风偣璐т綅:鏁伴噺=0
                 var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(model.StartLoc, taskInfo.StartAreas)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(2, preLog + LogBox.StartLocUnbindNotFound(model.StartLoc, taskInfo.StartAreas));
+                    return NewSimpleResult(2, preLog + LogMsg.StartLocUnbindNotFound(model.StartLoc, taskInfo.StartAreas));
                 }
 
                 // 鏌ヨ瀹瑰櫒琛�瀹瑰櫒绫诲瀷瀛楁
@@ -167,16 +166,13 @@
                 // 绌虹鍏ュ簱鏃�濡傛灉瀛樺湪鏃х殑缁戝畾鏁版嵁,鍒犻櫎
                 var old = WCSHelper.GetLocCntrCg(model.CntrCode);
 
-                // 缁戝畾璐т綅瀹瑰櫒,璧风偣璐т綅褰撳墠鏁伴噺=1
                 var locCntrRel = WCSHelper.BindLocCntr(startLoc, model.CntrCode);
                 locCntrRel.S_CNTR_TYPE = cntrType;
 
-                // 鏌ヨ缁堢偣璐т綅
-                // Order:灞傛暟浠庝綆鍒伴珮,琛�鍒�                 var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: taskInfo.EndAreas))
                     .OrderBy(l => new { l.N_LAYER, l.N_ROW, l.N_COL }).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + $"娌℃湁鎵惧埌鍚堥�鐨勭粓鐐硅揣浣�瑕佹眰:閿佺姸鎬�'鏃�;褰撳墠瀹瑰櫒鏁伴噺=0;鎵�湪搴撳尯={LogObject(taskInfo.EndAreas)}");
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
                 }
 
                 var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
@@ -228,15 +224,17 @@
                     return NewSimpleResult(3, $"瀹瑰櫒'{model.CntId}'宸茬粡涓庣墿鏂欑被鍨�{cntr.S_SPEC}'缁戝畾,鏃犳硶鐢ㄤ簬瑁呰浇鐗╂枡'{model.ItemCode}'!");
                 }
 
-                var startLoc = db.Queryable<TN_Location>().LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE).Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y").Where((l, c) => taskInfo.StartAreas.Contains(l.S_AREA_CODE) && l.N_CURRENT_NUM == 1 && c.S_CNTR_CODE == model.CntId && c.S_CNTR_TYPE == cntrType).First();
+                var startLoc = db.Queryable<TN_Location>().LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
+                    .Where(DbExpr.StartLoc(areas: taskInfo.StartAreas))
+                    .Where((l, c) => c.S_CNTR_CODE == model.CntId && c.S_CNTR_TYPE == cntrType).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(3, preLog + $"娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�瑕佹眰:閿佺姸鎬�'鏃�;褰撳墠瀹瑰櫒鏁伴噺=1;鎵�湪搴撳尯={LogObject(taskInfo.StartAreas)},缁戝畾瀹瑰櫒缂栫爜='{model.CntId}',缁戝畾瀹瑰櫒绫诲瀷='{cntrType}'");
+                    return NewSimpleResult(3, preLog + LogMsg.StartLocNotFound(areas: taskInfo.StartAreas) +
+                        $"缁戝畾瀹瑰櫒缂栫爜='{model.CntId}';缁戝畾瀹瑰櫒绫诲瀷='{cntrType}';");
                 }
 
-                // 鏌ヨ缁堢偣璐т綅
-                var endLoc = db.Queryable<TN_Location>().Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y").Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE) && l.N_CURRENT_NUM == 0).First();
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: taskInfo.EndAreas)).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(5, preLog + $"娌℃湁鎵惧埌鍚堥�鐨勭粓鐐硅揣浣�瑕佹眰:閿佺姸鎬�'鏃�;褰撳墠瀹瑰櫒鏁伴噺=0;鎵�湪搴撳尯={LogObject(taskInfo.EndAreas)}");
+                    return NewSimpleResult(5, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
                 }
 
                 var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, model.CntId, taskInfo.TaskName);
@@ -282,15 +280,18 @@
                     return NewSimpleResult(3, preLog + msg);
                 }
 
-                var startLoc = db.Queryable<TN_Location>().LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE).Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y").Where((l, c) => taskInfo.StartAreas.Contains(l.S_AREA_CODE) && l.N_CURRENT_NUM == 1 && c.S_CNTR_CODE == model.CntId && c.S_CNTR_TYPE == cntrType).First();
+                var startLoc = db.Queryable<TN_Location>().LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
+                    .Where(DbExpr.StartLoc(areas: taskInfo.StartAreas))
+                    .Where((l, c) => c.S_CNTR_CODE == model.CntId && c.S_CNTR_TYPE == cntrType).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(2, preLog + $"娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�瑕佹眰:閿佺姸鎬�'鏃�,褰撳墠瀹瑰櫒鏁伴噺=1,鎵�湪搴撳尯={LogObject(taskInfo.StartAreas)},缁戝畾瀹瑰櫒缂栫爜='{model.CntId}',缁戝畾瀹瑰櫒绫诲瀷='{cntrType}'");
+                    return NewSimpleResult(2, preLog + preLog + LogMsg.StartLocNotFound(areas: taskInfo.StartAreas) +
+                        $"缁戝畾瀹瑰櫒缂栫爜='{model.CntId}';缁戝畾瀹瑰櫒绫诲瀷='{cntrType}';");
                 }
 
                 var endLoc = db.Queryable<TN_Location>().Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y")
                     .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE) && l.N_CURRENT_NUM == 0).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + $"娌℃湁鎵惧埌鍚堥�鐨勭粓鐐硅揣浣�瑕佹眰:閿佺姸鎬�'鏃�,褰撳墠瀹瑰櫒鏁伴噺=0,鎵�湪搴撳尯={LogObject(taskInfo.EndAreas)}");
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
                 }
 
                 var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, model.CntId, taskInfo.TaskName);
@@ -323,31 +324,30 @@
                 var cgDetail = db.Queryable<TN_CG_Detail>()
                     .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_CNTR_CODE == model.CntrCode).First();
                 if (cgDetail == null) {
-                    return NewSimpleResult(2, preLog + "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡:" + LogObject(model));
+                    return NewSimpleResult(2, preLog + LogMsg.CgDetailNotFound(item: model.ItemCode, cntr: model.CntrCode));
                 }
 
                 var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_CNTR_CODE == cgDetail.S_CNTR_CODE).First();
                 if (locCntrRel == null) {
-                    return NewSimpleResult(3, preLog + $"瀹瑰櫒{model.CntrCode}鍦ㄨ揣浣嶅鍣ㄥ叧绯昏〃涓笉瀛樺湪");
+                    return NewSimpleResult(3, preLog + LogMsg.LocCntrRelNotFound(cntr: cgDetail.S_CNTR_CODE));
                 }
 
-                var startLoc = db.Queryable<TN_Location>().Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y" && l.S_CODE == locCntrRel.S_LOC_CODE && taskInfo.StartAreas.Contains(l.S_AREA_CODE) && l.N_CURRENT_NUM == 1).First();
+                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLoc(locCntrRel.S_LOC_CODE, taskInfo.StartAreas)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(4, preLog + $"娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�瑕佹眰:閿佺姸鎬�'鏃�,褰撳墠瀹瑰櫒鏁伴噺=1,鎵�湪搴撳尯={LogObject(taskInfo.StartAreas)}");
+                    return NewSimpleResult(4, preLog + LogMsg.StartLocNotFound(locCntrRel.S_LOC_CODE, taskInfo.StartAreas));
                 }
 
                 var endAreas = locCntrRel.S_CNTR_CODE == "鎵樼洏" ? taskInfo.EndAreas_Pallet : taskInfo.EndAreas_Goodpack;
-                var endLoc = db.Queryable<TN_Location>().Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y" && endAreas.Contains(l.S_AREA_CODE) && l.N_CURRENT_NUM == 0).First();
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: endAreas)).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + $"娌℃湁鎵惧埌鍚堥�鐨勭粓鐐硅揣浣�瑕佹眰:閿佺姸鎬�'鏃�,褰撳墠瀹瑰櫒鏁伴噺=0,鎵�湪搴撳尯={LogObject(endAreas)}");
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: endAreas));
                 }
 
                 cgDetail.N_ITEM_STATE = 0;
                 cgDetail.S_ITEM_STATE = "鍚堟牸";
                 cgDetail.T_MODIFY = DateTime.Now;
 
-                var cntId = locCntrRel.S_CNTR_CODE;
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, cntId, taskInfo.TaskName);
+                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
 
                 (ok, msg) = DbTran.CreateTask(new CreateTaskObj {
                     CgDetailToUpdate = cgDetail,
@@ -382,23 +382,22 @@
                 var cgDetail = db.Queryable<TN_CG_Detail>()
                     .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_CNTR_CODE == model.CntrCode).First();
                 if (cgDetail == null) {
-                    return NewSimpleResult(2, preLog + $"娌℃湁鍦╗鐗╂枡鏄庣粏琛╙涓壘鍒扮墿鏂�瑕佹眰:鐗╂枡缂栫爜='{model.ItemCode}',瀹瑰櫒缂栫爜='{model.CntrCode}'");
+                    return NewSimpleResult(2, preLog + LogMsg.CgDetailNotFound(item: model.ItemCode, cntr: model.CntrCode));
                 }
 
                 var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_CNTR_CODE == cgDetail.S_CNTR_CODE).First();
                 if (locCntrRel == null) {
-                    return NewSimpleResult(3, preLog + $"鍦╗璐т綅瀹瑰櫒鍏崇郴琛╙涓病鏈夋壘鍒板鍣�{model.CntrCode}'!");
+                    return NewSimpleResult(3, preLog + LogMsg.LocCntrRelNotFound(cntr: cgDetail.S_CNTR_CODE));
                 }
 
-                // 鏌ヨ璧风偣璐т綅:鏁伴噺=1
-                var startLoc = db.Queryable<TN_Location>().Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y" && l.S_CODE == locCntrRel.S_LOC_CODE && taskInfo.StartAreas.Contains(l.S_AREA_CODE) && l.N_CURRENT_NUM == 1).First();
+                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLoc(locCntrRel.S_LOC_CODE, taskInfo.StartAreas)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(1, preLog + $"娌℃湁鎵惧埌璧风偣璐т綅'{locCntrRel.S_LOC_CODE}'!瑕佹眰:閿佺姸鎬�'鏃�;褰撳墠瀹瑰櫒鏁伴噺=1;鎵�湪搴撳尯={LogObject(taskInfo.StartAreas)}");
+                    return NewSimpleResult(1, preLog + LogMsg.StartLocNotFound(locCntrRel.S_LOC_CODE, taskInfo.StartAreas));
                 }
 
-                var endLoc = db.Queryable<TN_Location>().Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y" && l.S_AREA_CODE == model.EndArea && l.N_CURRENT_NUM == 0).First();
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: new List<string> { model.EndArea })).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + $"娌℃湁鎵惧埌鍚堥�鐨勭粓鐐硅揣浣�瑕佹眰:閿佺姸鎬�'鏃�,褰撳墠瀹瑰櫒鏁伴噺=0,鎵�湪搴撳尯='{model.EndArea}'");
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: new List<string> { model.EndArea }));
                 }
 
                 cgDetail.N_ITEM_STATE = 2;
@@ -432,20 +431,20 @@
             const string preLog = "API:灏炬枡鍥炲簱:";
             
             try {
-                var startLoc = db.Queryable<TN_Location>().Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y" && l.S_CODE == model.StartLoc && l.N_CURRENT_NUM == 1).First();
+                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLoc(model.StartLoc)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(2, $"娌℃湁鎵惧埌璧风偣璐т綅'{model.StartLoc}'!瑕佹眰:閿佺姸鎬�'鏃�;褰撳墠瀹瑰櫒鏁伴噺=1");
+                    return NewSimpleResult(2, LogMsg.StartLocNotFound(model.StartLoc));
                 }
 
                 var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_LOC_CODE == model.StartLoc).First();
                 if (locCntrRel == null) {
-                    return NewSimpleResult(3, preLog + $"娌℃湁鎵惧埌璧风偣璐т綅{model.StartLoc}鎵�粦瀹氱殑瀹瑰櫒");
+                    return NewSimpleResult(3, preLog + LogMsg.LocCntrRelNotFound(loc: model.StartLoc));
                 }
 
                 var endAreas = locCntrRel.S_CNTR_CODE == "鎵樼洏" ? taskInfo.EndAreas_Pallet : taskInfo.EndAreas_Goodpack;
-                var endLoc = db.Queryable<TN_Location>().Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y" && endAreas.Contains(l.S_AREA_CODE) && l.N_CURRENT_NUM == 0).First();
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: endAreas)).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + $"娌℃湁鎵惧埌鍚堥�鐨勭粓鐐硅揣浣�瑕佹眰:閿佺姸鎬�'鏃�,褰撳墠瀹瑰櫒鏁伴噺=0,鎵�湪搴撳尯={LogObject(endAreas)}");
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: endAreas));
                 }
 
                 var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
@@ -672,6 +671,8 @@
         /// <returns></returns>
         public static MesResult CgInfoSync(CgInfoSyncInfo model) {
             var db = new SqlHelper<object>().GetInstance();
+            var (ok, msg) = (false, string.Empty);
+
             const string preLog = "API:鍗氬疄涓嬪彂鐗╂枡淇℃伅:";
             const string cntrType = "濂借繍绠�;
 
@@ -689,16 +690,9 @@
                     return NewMesResult(400, preLog + $"鐗╂枡鏁伴噺'{model.ItemNum}'涓嶅悎娉�瑕佹眰:鐗╂枡鏁伴噺锛�");
                 }
 
-                // TEMP 鐩墠娴佺▼:瀵瑰崥瀹炰笅鍙戠殑淇℃伅涔熻繘琛屾鏌�鏈壘鍒板氨鎶ラ敊,鍚庨潰鏈夐渶姹傚啀鏇存敼
-                var cntr = db.Queryable<TN_Container>()
-                    .Where(c => c.S_CODE == model.CntrCode) // 瀵逛簬鍓嶅彴绋嬪簭鑰岃█,S_CODE灏辨槸涓婚敭,缁存姢鏃跺繀瀹氬敮涓�-                    .First();
-
-                if (cntr == null) {
-                    return NewMesResult(1, preLog + $"瀹瑰櫒'{model.CntrCode}'鍦╗瀹瑰櫒琛╙涓笉瀛樺湪,璇峰湪鍓嶅彴椤甸潰涓淮鎶�");
-                }
-                if (cntr.S_TYPE != cntrType) {
-                    return NewMesResult(2, preLog + $"瀹瑰櫒'{model.CntrCode}'鍦╗瀹瑰櫒琛╙涓殑绫诲瀷涓�{cntr.S_TYPE}',涓庡綋鍓嶅鍣ㄧ被鍨�{cntrType}'涓嶅悓!");
+                (ok, msg) = WMSHelper.CheckCntrType(model.CntrCode, cntrType, out var cntr);
+                if (!ok) {
+                    return NewMesResult(1, preLog + msg);
                 }
 
                 // 灏嗕笅鍙戠殑淇℃伅鍏堝瓨鍌ㄥ埌CG琛ㄤ腑 (姝ゆ椂鎵樼洏娌℃湁涓庝骇绾垮鐨勮揣浣嶇粦瀹� 
diff --git a/process/TaskProcess.cs b/process/TaskProcess.cs
index 4151c3f..314d728 100644
--- a/process/TaskProcess.cs
+++ b/process/TaskProcess.cs
@@ -23,12 +23,12 @@
             if (load) {
                 Console.WriteLine($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚,璧风偣瑙g粦瀹瑰櫒{mst.S_CNTR_CODE}");
                 LogHelper.Info($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚,璧风偣瑙g粦瀹瑰櫒{mst.S_CNTR_CODE}");
-                LocationHelper.UnbindLocCntr(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList());
+                UnbindLocCntr(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList());
             }
             else {
                 Console.WriteLine($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚,缁堢偣缁戝畾瀹瑰櫒{mst.S_CNTR_CODE}");
                 LogHelper.Info($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚,缁堢偣缁戝畾瀹瑰櫒{mst.S_CNTR_CODE}");
-                LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList());
+                BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList());
             }
         }
 
@@ -42,13 +42,13 @@
                 //鏍规嵁瀹㈡埛鐜板満瑕佹眰,濡傛灉鍙栬揣瀹屾垚浠诲姟澶辫触浜哄伐鎷夊埌缁堢偣,鎴戜滑灏卞綋鍗歌揣瀹屾垚澶勭悊;濡傛灉鏄汉宸ユ媺璧板埌鍏跺畠鍖哄煙,鎴戜滑灏辫В閿佺粓鐐�鍒犻櫎鎵樼洏銆�                 //缁堢偣缁戝畾
                 BufferLocUpdate(mst, false);
-                LocationHelper.UnLockLoc(mst.S_END_LOC);
+                UnLockLoc(mst.S_END_LOC);
             }
             else {
 
                 //璧风偣缁堢偣瑙i攣
-                LocationHelper.UnLockLoc(mst.S_START_LOC);
-                LocationHelper.UnLockLoc(mst.S_END_LOC);
+                UnLockLoc(mst.S_START_LOC);
+                UnLockLoc(mst.S_END_LOC);
 
             }
 
@@ -99,6 +99,164 @@
             }
         }
 
+        /// <summary>
+        /// 鍙栬揣瀹岃В閿佽捣鐐�鍗歌揣瀹岃В閿佺粓鐐�鍙楠岄攣鐨勬潵婧�涔熷彲浠ヤ笉鏍¢獙
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        public static bool UnLockLoc(string loc) {
+            LogHelper.Info("UnLockLoc:" + loc);
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<TN_Location>().Where(a => a.S_CODE == loc).First();
+            if (model != null) {
+                model.S_LOCK_STATE = "鏃�;
+                model.N_LOCK_STATE = 0;
+                model.S_LOCK_OP = "";
+                model.T_MODIFY = System.DateTime.Now;
+                res = db.Updateable(model).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY }).ExecuteCommand() > 0;
+                LogHelper.Info("UnLockLoc:瑙i攣缁撴灉" + res);
+            }
+            else {
+                LogHelper.Info("UnLockLoc 澶辫触" + loc);
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 璐т綅瑙g粦瀹瑰櫒
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntrs"></param>
+        /// <returns></returns>
+        public static string UnbindLocCntr(string loc, List<string> cntrs) {
+            var db = new SqlHelper<object>().GetInstance();
+            var logs = $"璐т綅:{loc},瀹瑰櫒:{JsonConvert.SerializeObject(cntrs)}";
+            try {
+                var lcrList = db.Queryable<TN_Loc_Container>().Where(a => cntrs.Contains(a.S_CNTR_CODE) && a.S_LOC_CODE == loc).ToList();
+                if (lcrList.Count == 0) {
+                    LogHelper.Info($"璐т綅鏃犻渶瑙g粦瀹瑰櫒,鍦ㄦ暟鎹簱涓湭鎵惧埌{JsonConvert.SerializeObject(cntrs)}鐩稿叧鐨勮揣浣嶅鍣ㄥ叧绯昏〃淇℃伅");
+                }
+                cntrs = lcrList.Select(a => a.S_CNTR_CODE).ToList();
+
+                var log = JsonConvert.SerializeObject(cntrs);
+                var location = db.Queryable<TN_Location>().First(a => a.S_CODE == loc);
+                if (location != null) {
+                    location.N_CURRENT_NUM = 0;
+                    location.S_LOCK_STATE = "鏃�;
+                    location.N_LOCK_STATE = 0;
+
+                    using (var tran = db.Ado.UseTran()) {
+                        if (db.Deleteable<TN_Loc_Container>().Where(it => cntrs.Contains(it.S_CNTR_CODE) && it.S_LOC_CODE == loc).ExecuteCommand() > 0) {
+                            LogHelper.Info($"鍒犻櫎璐т綅瀹瑰櫒鍏崇郴琛ㄦ垚鍔�{log}");
+                        }
+                        else {
+                            tran.RollbackTran();
+
+                            LogHelper.Info($"鍒犻櫎璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐�{log}");
+
+                            return "璐т綅瑙g粦瀹瑰櫒澶辫触," + logs;
+                        }
+
+                        log = JsonConvert.SerializeObject(location);
+                        if (db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand() > 0) {
+                            tran.CommitTran();
+
+                            LogHelper.Info($"鏇存柊璐т綅琛ㄦ垚鍔�{log}");
+                        }
+                        else {
+                            tran.RollbackTran();
+
+                            LogHelper.Info($"鏇存柊璐т綅琛ㄥけ璐�{log}");
+
+                            return "璐т綅瑙g粦瀹瑰櫒澶辫触," + logs;
+                        }
+                    }
+                }
+                else {
+                    LogHelper.Info($"鍦ㄦ暟鎹簱涓湭鎵惧埌璇ヨ揣浣�鏃犻渶鏇存柊,璐т綅:{loc}");
+                }
+                return "璐т綅瑙g粦瀹瑰櫒鎴愬姛," + logs;
+            }
+            catch (Exception ex) {
+                LogHelper.Info($"鍙戠敓浜嗗紓甯�璐т綅瑙g粦瀹瑰櫒澶辫触,{ex.Message}");
+                return "璐т綅缁戝畾瀹瑰櫒澶辫触," + logs;
+            }
+        }
+
+        /// <summary>
+        /// 璐т綅缁戝畾瀹瑰櫒
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntrs"></param>
+        /// <returns></returns>
+        public static string BindingLoc(string loc, List<string> cntrs) {
+            var db = new SqlHelper<object>().GetInstance();
+            var logs = $"璐т綅:{loc},瀹瑰櫒:{JsonConvert.SerializeObject(cntrs)}";
+            try {
+                // 鍒犻櫎宸茬粡缁戝畾杩囩殑瀹瑰櫒璁板綍
+                var lcrList = db.Queryable<TN_Loc_Container>().Where(a => cntrs.Contains(a.S_CNTR_CODE) && a.S_LOC_CODE == loc).ToList();
+                if (lcrList.Count > 0) {
+                    cntrs = cntrs.Except(lcrList.Select(a => a.S_CNTR_CODE).ToList()).ToList();
+                }
+
+                var bindLocCntList = new List<TN_Loc_Container>();
+                foreach (var item in cntrs) {
+                    // 閽堝瀹瑰櫒绫诲瀷娣诲姞鐨勬柊閫昏緫
+                    var cntr = db.Queryable<TN_Container>().Where(c => c.S_CODE == item).First();
+
+                    if (cntr == null) {
+                        LogHelper.Info($"璐т綅瑙g粦鏃�瀹瑰櫒{item}娌℃湁鍦ㄥ鍣ㄤ俊鎭〃涓煡鍒�涓嶈褰曞鍣ㄧ被鍨�);
+                        bindLocCntList.Add(new TN_Loc_Container() { S_LOC_CODE = loc, S_CNTR_CODE = item });
+                    }
+                    else {
+                        bindLocCntList.Add(new TN_Loc_Container() { S_LOC_CODE = loc, S_CNTR_CODE = item, S_CNTR_TYPE = cntr.S_TYPE });
+                    }
+                }
+
+                var log = JsonConvert.SerializeObject(bindLocCntList);
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Insertable(bindLocCntList).ExecuteCommand() <= 0) {
+                        db.RollbackTran();
+                        LogHelper.Info($"鎻掑叆璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐�{log}");
+                        return "璐т綅缁戝畾瀹瑰櫒澶辫触," + logs;
+                    }
+                    LogHelper.Info($"鎻掑叆璐т綅瀹瑰櫒鍏崇郴琛ㄦ垚鍔�{log}");
+
+                    var location = db.Queryable<TN_Location>().First(a => a.S_CODE == loc);
+                    if (location != null) {
+                        location.N_CURRENT_NUM += cntrs.Count;
+                        location.S_LOCK_STATE = "鏃�;
+                        location.N_LOCK_STATE = 0;
+                        log = JsonConvert.SerializeObject(location);
+
+                        if (db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand() > 0) {
+                            db.CommitTran();
+
+                            LogHelper.Info($"鏇存柊璐т綅琛ㄦ垚鍔�{log}");
+                        }
+                        else {
+                            db.RollbackTran();
+
+                            LogHelper.Info($"鏇存柊璐т綅琛ㄥけ璐�{log}");
+
+                            return "璐т綅缁戝畾瀹瑰櫒澶辫触," + logs;
+                        }
+                    }
+                    else {
+                        db.RollbackTran();
+                        LogHelper.Info($"鏈壘鍒拌璐т綅{loc},鎴栬�宸查攣瀹�{log}");
+                    }
+                }
+                return "璐т綅缁戝畾瀹瑰櫒鎴愬姛," + logs;
+            }
+            catch (Exception ex) {
+                LogHelper.Info($"鍙戠敓浜嗗紓甯�璐т綅缁戝畾瀹瑰櫒澶辫触,");
+                return "璐т綅缁戝畾瀹瑰櫒澶辫触," + ex.Message;
+            }
+        }
+
         private static object locLocker = new object();
 
 
diff --git a/wms/DbExpr.cs b/wms/DbExpr.cs
index 096401d..2d1a631 100644
--- a/wms/DbExpr.cs
+++ b/wms/DbExpr.cs
@@ -15,7 +15,7 @@
     /// </summary>
     public class DbExpr {
         /// <summary>
-        /// 閫氱敤璐т綅绛涢�琛ㄨ揪寮�+        /// 閫氱敤 [ 璐т綅 ] 绛涢�
         /// </summary>
         /// <remarks><code><![CDATA[
         /// l => l.C_ENABLE == "Y" 
@@ -29,18 +29,19 @@
         /// <param name="areas"></param>
         /// <param name="curNum"></param>
         /// <returns></returns>
-        public static Expression<Func<TN_Location, bool>> LocFilter(int @lock = 0, string name = "", List<string> areas = null, int curNum = 0) {
+        public static Expression<Func<TN_Location, bool>> LocFilter(int @lock, string name, List<string> areas, int curNum) {
             Expression<Func<TN_Location, bool>> expr = l => l.C_ENABLE == "Y"; // 宸插惎鐢� 
             if (@lock >= 0) {
-                Expression<Func<TN_Location, bool>> newExpr = l => l.N_LOCK_STATE == @lock && l.S_LOCK_STATE == TN_Location.GetLockStateStr(@lock);
+                Expression<Func<TN_Location, bool>> newExpr = 
+                    l => l.N_LOCK_STATE == @lock && l.S_LOCK_STATE == TN_Location.GetLockStateStr(@lock);
                 expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
             }
             if (!string.IsNullOrEmpty(name)) {
                 Expression<Func<TN_Location, bool>> newExpr = l => l.S_CODE == name;
                 expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
             }
-            if (areas != null && areas.Count == 0) {
+            if (areas != null && areas.Count > 0) {
                 Expression<Func<TN_Location, bool>> newExpr = l => areas.Contains(l.S_AREA_CODE);
                 expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
             }
@@ -66,23 +67,28 @@
         /// <param name="areas"></param>
         /// <returns></returns>
         public static Expression<Func<TN_Location, bool>> StartLocUnbind(string name = "", List<string> areas = null) {
-            Expression<Func<TN_Location, bool>> expr =
-                l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.N_CURRENT_NUM == 0;
-
-            if (!string.IsNullOrEmpty(name)) {
-                Expression<Func<TN_Location, bool>> newExpr = l => l.S_CODE == name;
-                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
-            }
-            if (areas != null && areas.Count > 0) {
-                Expression<Func<TN_Location, bool>> newExpr = l => areas.Contains(l.S_AREA_CODE);
-                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
-            }
-
-            return expr;
+            return LocFilter(0, name, areas, 0);
         }
 
         /// <summary>
-        /// 
+        /// 璧风偣璐т綅 ( 宸茬粦瀹�)
+        /// </summary>
+        /// <remarks><code><![CDATA[
+        /// l => l.C_ENABLE == "Y" 
+        ///   && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃�
+        ///   && l.S_CODE == name
+        ///   && areas.Contains(l.S_AREA_CODE)
+        ///   && l.N_CURRENT_NUM == 1
+        /// ]]></code></remarks>
+        /// <param name="name"></param>
+        /// <param name="areas"></param>
+        /// <returns></returns>
+        public static Expression<Func<TN_Location, bool>> StartLoc(string name = "", List<string> areas = null) {
+            return LocFilter(0, name, areas, 1);
+        }
+
+        /// <summary>
+        /// 缁堢偣璐т綅
         /// </summary>
         /// <remarks><code><![CDATA[
         /// l => l.C_ENABLE == "Y" 
@@ -95,115 +101,7 @@
         /// <param name="areas"></param>
         /// <returns></returns>
         public static Expression<Func<TN_Location, bool>> EndLoc(string name = "", List<string> areas = null) {
-            Expression<Func<TN_Location, bool>> expr = 
-                l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.N_CURRENT_NUM == 0;
-
-            if (!string.IsNullOrEmpty(name)) {
-                Expression<Func<TN_Location, bool>> newExpr = l => l.S_CODE == name;
-                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
-            }
-            if (areas != null && areas.Count > 0) {
-                Expression<Func<TN_Location, bool>> newExpr = l => areas.Contains(l.S_AREA_CODE);
-                expr = Expression.Lambda<Func<TN_Location, bool>>(Expression.AndAlso(expr.Body, newExpr.Body), expr.Parameters[0]);
-            }
-
-            return expr;
+            return LocFilter(0, name, areas, 0);
         }
     }
-
-    #region 鏃ф煡璇㈢被 ( 鎼佺疆 )
-    /// <summary>
-    /// [ 鏁版嵁搴撴煡璇�] 甯姪绫�-    /// </summary>
-    /// <remarks><b>[ 鎼佺疆 ]</b> 绫讳笌鏂规硶鏆傛椂璁句负绉佹湁<br/><b>[ 鐞嗙敱 ]</b> 寮曠敤澶栭儴 db 瀛樺湪椋庨櫓 ; 涓嶉�鐢ㄤ簬鑱旇〃鏌ヨ鍦烘櫙 , 涓嶅鐏垫椿</remarks>
-    class DbQuery {
-        /// <summary>
-        /// 鏋勫缓 [ 璐т綅 ] 鏌ヨ琛ㄨ揪寮�: 绛涢�鏉′欢 : 閿佺姸鎬�/ 鍚嶇О / 璐у尯 / 褰撳墠瀹瑰櫒鏁伴噺 ( 榛樿绛涢�宸插惎鐢ㄨ揣浣�)
-        /// </summary>
-        /// <param name="db">璋冪敤鍖哄煙鐨�SqlSugarClient</param>
-        /// <param name="lock">閿佺姸鎬�( 灏忎簬 0 鏃跺拷鐣�)</param>
-        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
-        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
-        /// <param name="curNum">褰撳墠鏁伴噺 ( 灏忎簬 0 鏃跺拷鐣�)</param>
-        /// <returns></returns>
-        static ISugarQueryable<TN_Location> Loc(SqlSugarClient db, int @lock, string name, List<string> areas, int curNum) {
-            var query = db.Queryable<TN_Location>().Where(l => l.C_ENABLE == "Y"); // 宸插惎鐢�-
-            if (@lock >= 0) {
-                query = query.Where(l => l.N_LOCK_STATE == @lock && l.S_LOCK_STATE == TN_Location.GetLockStateStr(@lock));
-            }
-            if (!string.IsNullOrEmpty(name)) {
-                query = query.Where(l => l.S_CODE == name);
-            }
-            if (areas != null && areas.Count != 0) {
-                query = query.Where(l => areas.Contains(l.S_AREA_CODE));
-            }
-            if (curNum >= 0) {
-                query = query.Where(l => l.N_CURRENT_NUM == curNum);
-            }
-
-            return query;
-        }
-
-        /// <summary>
-        /// 鏋勫缓 [ 璧风偣璐т綅 ( 缁戝畾鍓�) ] 鏌ヨ琛ㄨ揪寮�: 绛涢�鏉′欢 : 鍚嶇О / 璐у尯 ( 榛樿绛涢� : 宸插惎鐢�/ 鏈笂閿�/ 褰撳墠瀹瑰櫒鏁伴噺 = 0 )
-        /// </summary>
-        /// <param name="db">璋冪敤鍖哄煙鐨�SqlSugarClient</param>
-        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
-        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
-        /// <returns></returns>
-        static ISugarQueryable<TN_Location> StartLocUnbind(SqlSugarClient db, string name, List<string> areas) {
-            var query = db.Queryable<TN_Location>().Where(l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == TN_Location.GetLockStateStr(0) && l.N_CURRENT_NUM == 0); // 宸插惎鐢�鏈笂閿�褰撳墠瀹瑰櫒鏁伴噺=0(鍒濆鏈粦瀹氬鍣�
-
-            if (!string.IsNullOrEmpty(name)) {
-                query = query.Where(l => l.S_CODE == name);
-            }
-            if (areas != null && areas.Count != 0) {
-                query = query.Where(l => areas.Contains(l.S_AREA_CODE));
-            }
-
-            return query;
-        }
-
-        /// <summary>
-        /// 鏋勫缓 [ 璧风偣璐т綅 ( 缁戝畾鍚�) ] 鏌ヨ琛ㄨ揪寮�: 绛涢�鏉′欢 : 鍚嶇О / 璐у尯 ( 榛樿绛涢� : 宸插惎鐢�/ 鏈笂閿�/ 褰撳墠瀹瑰櫒鏁伴噺 = 1 )
-        /// </summary>
-        /// <param name="db">璋冪敤鍖哄煙鐨�SqlSugarClient</param>
-        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
-        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
-        /// <returns></returns>
-        static ISugarQueryable<TN_Location> StartLoc(SqlSugarClient db, string name, List<string> areas) {
-            var query = db.Queryable<TN_Location>().Where(l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == TN_Location.GetLockStateStr(0) && l.N_CURRENT_NUM == 1); // 宸插惎鐢�鏈笂閿�褰撳墠瀹瑰櫒鏁伴噺=1(宸茬粦瀹氬鍣�
-
-            if (!string.IsNullOrEmpty(name)) {
-                query = query.Where(l => l.S_CODE == name);
-            }
-            if (areas != null && areas.Count != 0) {
-                query = query.Where(l => areas.Contains(l.S_AREA_CODE));
-            }
-
-            return query;
-        }
-
-        /// <summary>
-        /// 鏋勫缓 [ 缁堢偣璐т綅 ] 鏌ヨ琛ㄨ揪寮�: 绛涢�鏉′欢 : 鍚嶇О / 璐у尯 ( 榛樿绛涢� : 宸插惎鐢�/ 鏈笂閿�/ 褰撳墠瀹瑰櫒鏁伴噺 = 0 )
-        /// </summary>
-        /// <param name="db">璋冪敤鍖哄煙鐨�SqlSugarClient</param>
-        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
-        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
-        /// <returns></returns>
-        static ISugarQueryable<TN_Location> EndLoc(SqlSugarClient db, string name, List<string> areas) {
-            var query = db.Queryable<TN_Location>().Where(l => l.C_ENABLE == "Y" && l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == TN_Location.GetLockStateStr(0) && l.N_CURRENT_NUM == 0); // 宸插惎鐢�鏈笂閿�褰撳墠瀹瑰櫒鏁伴噺=0(鏈粦瀹氬鍣�
-
-            if (!string.IsNullOrEmpty(name)) {
-                query = query.Where(l => l.S_CODE == name);
-            }
-            if (areas != null && areas.Count != 0) {
-                query = query.Where(l => areas.Contains(l.S_AREA_CODE));
-            }
-
-            return query;
-        }
-    } 
-    #endregion
 }
diff --git a/wms/LocationHelper.cs b/wms/LocationHelper.cs
index 78d0a21..e8d318e 100644
--- a/wms/LocationHelper.cs
+++ b/wms/LocationHelper.cs
@@ -103,181 +103,6 @@
             return db.Queryable<TN_Location>().Where(a => a.S_CODE.Trim() == code).First();
         }
 
-        /// <summary>
-        /// 鍙栬揣瀹岃В閿佽捣鐐�鍗歌揣瀹岃В閿佺粓鐐�鍙楠岄攣鐨勬潵婧�涔熷彲浠ヤ笉鏍¢獙
-        /// </summary>
-        /// <param name="loc"></param>
-        /// <returns></returns>
-        public static bool UnLockLoc(string loc)
-        {
-            LogHelper.Info("UnLockLoc:" + loc);
-            var res = false;
-            var db = new SqlHelper<object>().GetInstance();
-            var model = db.Queryable<TN_Location>().Where(a => a.S_CODE == loc).First();
-            if (model != null)
-            {
-                model.S_LOCK_STATE = "鏃�;
-                model.N_LOCK_STATE = 0;
-                model.S_LOCK_OP = "";
-                model.T_MODIFY = System.DateTime.Now;
-                res = db.Updateable(model).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY }).ExecuteCommand() > 0;
-                LogHelper.Info("UnLockLoc:瑙i攣缁撴灉" + res);
-            }
-            else
-            {
-                LogHelper.Info("UnLockLoc 澶辫触" + loc);
-            }
-            return res;
-        }
-
-        /// <summary>
-        /// 璐т綅瑙g粦瀹瑰櫒
-        /// </summary>
-        /// <param name="loc"></param>
-        /// <param name="cntrs"></param>
-        /// <returns></returns>
-        public static string UnbindLocCntr(string loc, List<string> cntrs)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            var logs = $"璐т綅:{loc},瀹瑰櫒:{JsonConvert.SerializeObject(cntrs)}";
-            try
-            {
-                var lcrList = db.Queryable<TN_Loc_Container>().Where(a => cntrs.Contains(a.S_CNTR_CODE) && a.S_LOC_CODE == loc).ToList();
-                if (lcrList.Count == 0) {
-                    LogHelper.Info($"璐т綅鏃犻渶瑙g粦瀹瑰櫒,鍦ㄦ暟鎹簱涓湭鎵惧埌{JsonConvert.SerializeObject(cntrs)}鐩稿叧鐨勮揣浣嶅鍣ㄥ叧绯昏〃淇℃伅");
-                }
-                cntrs = lcrList.Select(a => a.S_CNTR_CODE).ToList();
-
-                var log = JsonConvert.SerializeObject(cntrs);
-                var location = db.Queryable<TN_Location>().First(a => a.S_CODE == loc);
-                if (location != null)
-                {
-                    location.N_CURRENT_NUM = 0;
-                    location.S_LOCK_STATE = "鏃�;
-                    location.N_LOCK_STATE = 0;
-
-                    using (var tran = db.Ado.UseTran())
-                    {
-                        if (db.Deleteable<TN_Loc_Container>().Where(it => cntrs.Contains(it.S_CNTR_CODE) && it.S_LOC_CODE == loc).ExecuteCommand() > 0)
-                        {
-                            LogHelper.Info($"鍒犻櫎璐т綅瀹瑰櫒鍏崇郴琛ㄦ垚鍔�{log}");
-                        }
-                        else
-                        {
-                            tran.RollbackTran();
-
-                            LogHelper.Info($"鍒犻櫎璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐�{log}");
-
-                            return "璐т綅瑙g粦瀹瑰櫒澶辫触," + logs;
-                        }
-
-                        log = JsonConvert.SerializeObject(location);
-                        if (db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand() > 0) {
-                            tran.CommitTran();
-
-                            LogHelper.Info($"鏇存柊璐т綅琛ㄦ垚鍔�{log}");
-                        }
-                        else {
-                            tran.RollbackTran();
-
-                            LogHelper.Info($"鏇存柊璐т綅琛ㄥけ璐�{log}");
-
-                            return "璐т綅瑙g粦瀹瑰櫒澶辫触," + logs;
-                        }
-                    }
-                }
-                else
-                {
-                    LogHelper.Info($"鍦ㄦ暟鎹簱涓湭鎵惧埌璇ヨ揣浣�鏃犻渶鏇存柊,璐т綅:{loc}");
-                }
-                return "璐т綅瑙g粦瀹瑰櫒鎴愬姛," + logs;
-            }
-            catch (Exception ex)
-            {
-                LogHelper.Info($"鍙戠敓浜嗗紓甯�璐т綅瑙g粦瀹瑰櫒澶辫触,{ex.Message}");
-                return "璐т綅缁戝畾瀹瑰櫒澶辫触," + logs;
-            }
-        }
-
-        /// <summary>
-        /// 璐т綅缁戝畾瀹瑰櫒
-        /// </summary>
-        /// <param name="loc"></param>
-        /// <param name="cntrs"></param>
-        /// <returns></returns>
-        public static string BindingLoc(string loc, List<string> cntrs)
-        {
-            var db = new SqlHelper<object>().GetInstance();
-            var logs = $"璐т綅:{loc},瀹瑰櫒:{JsonConvert.SerializeObject(cntrs)}";
-            try
-            {
-                // 鍒犻櫎宸茬粡缁戝畾杩囩殑瀹瑰櫒璁板綍
-                var lcrList = db.Queryable<TN_Loc_Container>().Where(a => cntrs.Contains(a.S_CNTR_CODE) && a.S_LOC_CODE == loc).ToList();
-                if (lcrList.Count > 0) {
-                    cntrs = cntrs.Except(lcrList.Select(a => a.S_CNTR_CODE).ToList()).ToList();
-                }
-
-                var bindLocCntList = new List<TN_Loc_Container>();
-                foreach (var item in cntrs) {
-                    // 閽堝瀹瑰櫒绫诲瀷娣诲姞鐨勬柊閫昏緫
-                    var cntr = db.Queryable<TN_Container>().Where(c => c.S_CODE == item).First();
-
-                    if (cntr == null) {
-                        LogHelper.Info($"璐т綅瑙g粦鏃�瀹瑰櫒{item}娌℃湁鍦ㄥ鍣ㄤ俊鎭〃涓煡鍒�涓嶈褰曞鍣ㄧ被鍨�);
-                        bindLocCntList.Add(new TN_Loc_Container() { S_LOC_CODE = loc, S_CNTR_CODE = item });
-                    }
-                    else {
-                        bindLocCntList.Add(new TN_Loc_Container() { S_LOC_CODE = loc, S_CNTR_CODE = item, S_CNTR_TYPE = cntr.S_TYPE });
-                    }
-                }
-
-                var log = JsonConvert.SerializeObject(bindLocCntList);
-
-                using (var tran = db.Ado.UseTran())
-                {
-                    if (db.Insertable(bindLocCntList).ExecuteCommand() <= 0) {
-                        db.RollbackTran();
-                        LogHelper.Info($"鎻掑叆璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐�{log}");
-                        return "璐т綅缁戝畾瀹瑰櫒澶辫触," + logs;
-                    }
-                    LogHelper.Info($"鎻掑叆璐т綅瀹瑰櫒鍏崇郴琛ㄦ垚鍔�{log}");
-
-                    var location = db.Queryable<TN_Location>().First(a => a.S_CODE == loc);
-                    if (location != null)
-                    {
-                        location.N_CURRENT_NUM += cntrs.Count;
-                        location.S_LOCK_STATE = "鏃�;
-                        location.N_LOCK_STATE = 0;
-                        log = JsonConvert.SerializeObject(location);
-
-                        if (db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand() > 0)
-                        {
-                            db.CommitTran();
-
-                            LogHelper.Info($"鏇存柊璐т綅琛ㄦ垚鍔�{log}");
-                        }
-                        else
-                        {
-                            db.RollbackTran();
-
-                            LogHelper.Info($"鏇存柊璐т綅琛ㄥけ璐�{log}");
-
-                            return "璐т綅缁戝畾瀹瑰櫒澶辫触," + logs;
-                        }
-                    }
-                    else
-                    {
-                        db.RollbackTran();
-                        LogHelper.Info($"鏈壘鍒拌璐т綅{loc},鎴栬�宸查攣瀹�{log}");
-                    }
-                }
-                return "璐т綅缁戝畾瀹瑰櫒鎴愬姛," + logs;
-            }
-            catch (Exception ex)
-            {
-                LogHelper.Info($"鍙戠敓浜嗗紓甯�璐т綅缁戝畾瀹瑰櫒澶辫触,");
-                return "璐т綅缁戝畾瀹瑰櫒澶辫触," + ex.Message;
-            }
-        }
+        
     }
 }
diff --git a/wms/LogBox.cs b/wms/LogBox.cs
deleted file mode 100644
index b92fd69..0000000
--- a/wms/LogBox.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-using HH.WCS.Mobox3.DSZSH.models;
-
-using Newtonsoft.Json;
-
-namespace HH.WCS.Mobox3.DSZSH.util {
-    /// <summary>
-    /// [ 鏃ュ織淇℃伅 ] 鏋勯�绫�-    /// </summary>
-    public static class LogBox {
-        /// <summary>
-        /// <c>"娌℃湁鎵惧埌璧风偣璐т綅!!瑕佹眰:閿佺姸鎬�'@lock';璐т綅鍚嶇О='name';鎵�湪搴撳尯=[areas];褰撳墠瀹瑰櫒鏁伴噺=curNum;"</c>
-        /// </summary>
-        /// <remarks><b>[ 娉ㄦ剰 ]</b> 鍘熷垯涓婅嚦灏戞湁 1 涓檺鍒舵潯浠�/remarks>
-        /// <param name="lock">閿佺姸鎬�( 灏忎簬 0 鏃跺拷鐣�)</param>
-        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
-        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
-        /// <param name="curNum">褰撳墠鏁伴噺 ( 灏忎簬 0 鏃跺拷鐣�)</param>
-        /// <returns></returns>
-        public static string StartLocNotFound(int @lock, string name, List<string> areas, int curNum) {
-            var res = "娌℃湁鎵惧埌璧风偣璐т綅!!瑕佹眰:";
-
-            if (@lock >= 0) {
-                res += $"閿佺姸鎬�'{TN_Location.GetLockStateStr(@lock)}';";
-            }
-            if (!string.IsNullOrEmpty(name)) {
-                res += $"璐т綅鍚嶇О='{name}';";
-            }
-            if (areas != null && areas.Count != 0) {
-                res += $"鎵�湪搴撳尯={JsonConvert.SerializeObject(areas)};";
-            }
-            if (curNum >= 0) {
-                res += $"褰撳墠瀹瑰櫒鏁伴噺={curNum};";
-            }
-
-            return res;
-        }
-
-        /// <summary>
-        /// <c>"娌℃湁鎵惧埌璧风偣璐т綅!!瑕佹眰:閿佺姸鎬�'鏃�;璐т綅鍚嶇О='name';鎵�湪搴撳尯=[areas];褰撳墠瀹瑰櫒鏁伴噺={bind?1:0};"</c>
-        /// </summary>
-        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
-        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
-        /// <param name="bind">璐т綅鏄惁宸茬粦瀹�, 榛樿涓�true , 姝ゆ椂璁剧疆 [ 褰撳墠瀹瑰櫒鏁伴噺 ] = 1 , 鍚﹀垯璁剧疆涓�0</param>
-        /// <returns></returns>
-        public static string StartLocNotFound(string name, List<string> areas, bool bind = true) {
-            var res = "娌℃湁鎵惧埌璧风偣璐т綅!!瑕佹眰:閿佺姸鎬�'鏃�";
-
-            if (!string.IsNullOrEmpty(name)) {
-                res += $"璐т綅鍚嶇О='{name}';";
-            }
-            if (areas != null && areas.Count != 0) {
-                res += $"鎵�湪搴撳尯={JsonConvert.SerializeObject(areas)};";
-            }
-            
-            res += $"褰撳墠瀹瑰櫒鏁伴噺={(bind ? 1 : 0)};";
-
-            return res;
-        }
-
-        /// <summary>
-        /// <c>"娌℃湁鎵惧埌璧风偣璐т綅!!瑕佹眰:閿佺姸鎬�'鏃�;璐т綅鍚嶇О='name';鎵�湪搴撳尯=[areas];褰撳墠瀹瑰櫒鏁伴噺=0;"</c>
-        /// </summary>
-        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
-        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
-        /// <returns></returns>
-        public static string StartLocUnbindNotFound(string name, List<string> areas) {
-            var res = "娌℃湁鎵惧埌璧风偣璐т綅!!瑕佹眰:閿佺姸鎬�'鏃�";
-
-            if (!string.IsNullOrEmpty(name)) {
-                res += $"璐т綅鍚嶇О='{name}';";
-            }
-            if (areas != null && areas.Count != 0) {
-                res += $"鎵�湪搴撳尯={JsonConvert.SerializeObject(areas)};";
-            }
-
-            res += $"褰撳墠瀹瑰櫒鏁伴噺=0;";
-
-            return res;
-        }
-
-        /// <summary>
-        /// <c>"娌℃湁鎵惧埌缁堢偣璐т綅!!瑕佹眰:閿佺姸鎬�'@lock';璐т綅鍚嶇О='name';鎵�湪搴撳尯=[areas];褰撳墠瀹瑰櫒鏁伴噺=curNum;"</c>
-        /// </summary>
-        /// <remarks><b>[ 娉ㄦ剰 ]</b> 鍘熷垯涓婅嚦灏戞湁 1 涓檺鍒舵潯浠�/remarks>
-        /// <param name="lock">閿佺姸鎬�( 灏忎簬 0 鏃跺拷鐣�)</param>
-        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
-        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
-        /// <param name="curNum">褰撳墠鏁伴噺 ( 灏忎簬 0 鏃跺拷鐣�)</param>
-        /// <returns></returns>
-        public static string EndLocNotFound(int @lock, string name, List<string> areas, int curNum) {
-            var res = "娌℃湁鎵惧埌缁堢偣璐т綅!!瑕佹眰:";
-
-            if (@lock >= 0) {
-                res += $"閿佺姸鎬�'{TN_Location.GetLockStateStr(@lock)}';";
-            }
-            if (!string.IsNullOrEmpty(name)) {
-                res += $"璐т綅鍚嶇О='{name}';";
-            }
-            if (areas != null && areas.Count != 0) {
-                res += $"鎵�湪搴撳尯={JsonConvert.SerializeObject(areas)};";
-            }
-            if (curNum >= 0) {
-                res += $"褰撳墠瀹瑰櫒鏁伴噺={curNum};";
-            }
-
-            return res;
-        }
-
-        /// <summary>
-        /// <c>"娌℃湁鎵惧埌缁堢偣璐т綅!!瑕佹眰:閿佺姸鎬�'鏃�;璐т綅鍚嶇О='name';鎵�湪搴撳尯=[areas];褰撳墠瀹瑰櫒鏁伴噺=curNum;"</c>
-        /// </summary>
-        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
-        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
-        /// <param name="curNum">褰撳墠鏁伴噺 ( 灏忎簬 0 鏃跺拷鐣�)</param>
-        /// <returns></returns>
-        public static string EndLocNotFound(string name = "", List<string> areas = null, int curNum = 0) {
-            var res = "娌℃湁鎵惧埌缁堢偣璐т綅!!瑕佹眰:閿佺姸鎬�'鏃�;";
-
-            if (!string.IsNullOrEmpty(name)) {
-                res += $"璐т綅鍚嶇О='{name}';";
-            }
-            if (areas != null && areas.Count != 0) {
-                res += $"鎵�湪搴撳尯={JsonConvert.SerializeObject(areas)};";
-            }
-            if (curNum >= 0) {
-                res += $"褰撳墠瀹瑰櫒鏁伴噺={curNum};";
-            }
-
-            return res;
-        }
-    }
-}
\ No newline at end of file
diff --git a/wms/LogMsg.cs b/wms/LogMsg.cs
new file mode 100644
index 0000000..11848f4
--- /dev/null
+++ b/wms/LogMsg.cs
@@ -0,0 +1,118 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading.Tasks;
+
+using HH.WCS.Mobox3.DSZSH.models;
+
+using Newtonsoft.Json;
+
+namespace HH.WCS.Mobox3.DSZSH.util {
+    /// <summary>
+    /// [ 鏃ュ織淇℃伅 ] 鏋勯�绫�+    /// </summary>
+    public static class LogMsg {
+        /// <summary>
+        /// <c>"娌℃湁鎵惧埌{desc}璐т綅!!瑕佹眰:閿佺姸鎬�'@lock';璐т綅鍚嶇О='name';鎵�湪搴撳尯=[areas];褰撳墠瀹瑰櫒鏁伴噺=curNum;"</c>
+        /// </summary>
+        /// <remarks><b>[ 娉ㄦ剰 ]</b> 鍘熷垯涓婅嚦灏戞湁 1 涓檺鍒舵潯浠�/remarks>
+        /// <param name="desc">璐т綅鎻忚堪 ( 璧风偣 / 缁堢偣 )</param>
+        /// <param name="lock">閿佺姸鎬�( 灏忎簬 0 鏃跺拷鐣�)</param>
+        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
+        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
+        /// <param name="curNum">褰撳墠鏁伴噺 ( 灏忎簬 0 鏃跺拷鐣�)</param>
+        /// <returns></returns>
+        public static string LocNotFound(string desc, int @lock, string name, List<string> areas, int curNum) {
+            var res = $"娌℃湁鎵惧埌{desc}璐т綅!!瑕佹眰:";
+
+            if (@lock >= 0) {
+                res += $"閿佺姸鎬�'{TN_Location.GetLockStateStr(@lock)}';";
+            }
+            if (!string.IsNullOrEmpty(name)) {
+                res += $"璐т綅鍚嶇О='{name}';";
+            }
+            if (areas != null && areas.Count != 0) {
+                res += $"鎵�湪搴撳尯={JsonConvert.SerializeObject(areas)};";
+            }
+            if (curNum >= 0) {
+                res += $"褰撳墠瀹瑰櫒鏁伴噺={curNum};";
+            }
+
+            return res;
+        }
+
+        /// <summary>
+        /// <c>"娌℃湁鎵惧埌璧风偣璐т綅!!瑕佹眰:閿佺姸鎬�'鏃�;璐т綅鍚嶇О='name';鎵�湪搴撳尯=[areas];褰撳墠瀹瑰櫒鏁伴噺=curNum;"</c>
+        /// </summary>
+        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
+        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
+        /// <param name="curNum">褰撳墠鏁伴噺 ( 灏忎簬 0 鏃跺拷鐣�)</param>
+        /// <returns></returns>
+        public static string StartLocNotFound(string name = "", List<string> areas = null, int curNum = 1) {
+            return LocNotFound("璧风偣", 0, name, areas, curNum);
+        }
+
+        /// <summary>
+        /// <c>"娌℃湁鎵惧埌璧风偣璐т綅!!瑕佹眰:閿佺姸鎬�'鏃�;璐т綅鍚嶇О='name';鎵�湪搴撳尯=[areas];褰撳墠瀹瑰櫒鏁伴噺=0;"</c>
+        /// </summary>
+        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
+        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
+        /// <returns></returns>
+        public static string StartLocUnbindNotFound(string name = "", List<string> areas = null) {
+            return LocNotFound("璧风偣", 0, name, areas, 0);
+        }
+
+        /// <summary>
+        /// <c>"娌℃湁鎵惧埌缁堢偣璐т綅!!瑕佹眰:閿佺姸鎬�'鏃�;璐т綅鍚嶇О='name';鎵�湪搴撳尯=[areas];褰撳墠瀹瑰櫒鏁伴噺=curNum;"</c>
+        /// </summary>
+        /// <param name="name">璐т綅鍚嶇О ( 涓�null 鎴�"" 鏃跺拷鐣�)</param>
+        /// <param name="areas">鎵�湪搴撳尯鍒楄〃 ( 涓�null 鎴�[] 鏃跺拷鐣�)</param>
+        /// <param name="curNum">褰撳墠鏁伴噺 ( 灏忎簬 0 鏃跺拷鐣�)</param>
+        /// <returns></returns>
+        public static string EndLocNotFound(string name = "", List<string> areas = null, int curNum = 0) {
+            return LocNotFound("缁堢偣", 0, name, areas, curNum);
+        }
+
+        /// <summary>
+        /// <c>"娌℃湁鎵惧埌[璐т綅瀹瑰櫒缁戝畾]淇℃伅!!瑕佹眰:璐т綅='loc';瀹瑰櫒='cntr';"</c>
+        /// </summary>
+        /// <remarks><b>[ 娉ㄦ剰 ]</b> 鍘熷垯涓婅嚦灏戞湁 1 涓檺鍒舵潯浠�/remarks>
+        /// <param name="loc"></param>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        public static string LocCntrRelNotFound(string loc = "", string cntr = "") {
+            var res = $"娌℃湁鎵惧埌[璐т綅瀹瑰櫒缁戝畾]淇℃伅!!瑕佹眰:";
+
+            if (!string.IsNullOrEmpty(loc)) {
+                res += $"璐т綅='{loc}';";
+            }
+            if (!string.IsNullOrEmpty(cntr)) {
+                res += $"瀹瑰櫒='{cntr}';";
+            }
+
+            return res;
+        }
+
+        /// <summary>
+        /// <c>"娌℃湁鎵惧埌[瀹瑰櫒璐у搧鏄庣粏]淇℃伅!!瑕佹眰:瀹瑰櫒='cntr';鐗╂枡='item';"</c>
+        /// </summary>
+        /// <remarks><b>[ 娉ㄦ剰 ]</b> 鍘熷垯涓婅嚦灏戞湁 1 涓檺鍒舵潯浠�/remarks>
+        /// <param name="cntr"></param>
+        /// <param name="item"></param>
+        /// <returns></returns>
+        public static string CgDetailNotFound(string cntr = "", string item = "") {
+            var res = $"娌℃湁鎵惧埌[瀹瑰櫒璐у搧鏄庣粏]淇℃伅!!瑕佹眰:";
+
+            if (!string.IsNullOrEmpty(cntr)) {
+                res += $"瀹瑰櫒='{cntr}';";
+            }
+            if (!string.IsNullOrEmpty(item)) {
+                res += $"鐗╂枡='{item}';";
+            }
+
+            return res;
+        }
+    }
+}
\ No newline at end of file
diff --git a/wms/WMSHelper.cs b/wms/WMSHelper.cs
index 471fb10..7f9bb6e 100644
--- a/wms/WMSHelper.cs
+++ b/wms/WMSHelper.cs
@@ -32,7 +32,7 @@
                 return (false, $"瀹瑰櫒'{cntrCode}'鍦╗瀹瑰櫒琛╙涓笉瀛樺湪,璇峰湪鍓嶅彴椤甸潰涓淮鎶�!");
             }
             if (cntr.S_TYPE != cntrType) {
-                return (false, $"瀹瑰櫒'{cntrCode}'鍦╗瀹瑰櫒琛╙涓殑绫诲瀷涓�{cntr.S_TYPE}',涓庤緭鍏ョ殑瀹瑰櫒绫诲瀷'{cntrType}'涓嶅悓!!");
+                return (false, $"瀹瑰櫒'{cntrCode}'鍦╗瀹瑰櫒琛╙涓殑绫诲瀷涓�{cntr.S_TYPE}',涓庡綋鍓嶆祦绋嬫墍闇�鍣ㄧ被鍨�{cntrType}'涓嶅悓!!");
             }
             return (true, "妫�煡瀹瑰櫒绫诲瀷鎴愬姛!!");
         }

--
Gitblit v1.9.1