From 38a8b2931abd72ee04285794aacbea7ed7c49228 Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期二, 13 五月 2025 17:06:43 +0800
Subject: [PATCH] 抽检合格回库/不合格移库开发完成

---
 Models/TN_Outbound_Order.cs                                                         |   11 
 Dtos/Response/MoboxResponse.cs                                                      |   15 +
 Program.cs                                                                          |    4 
 Dispatch/NDCHelper.cs                                                               |    0 
 Devices/ProductionLineDevice.cs                                                     |   12 
 Controllers/DebugController.cs                                                      |   10 
 config/config.json                                                                  |    8 
 Devices/OpcUaHelper.cs                                                              |    0 
 ServiceCore/OfflineCore.cs                                                          |    9 
 ServiceCore/OutboundCore.cs                                                         |   16 -
 HH.WCS.Mobox3.DSZSH.csproj                                                          |   33 +-
 Devices/S7Helper.cs                                                                 |    0 
 ServiceCore/TaskCore.cs                                                             |   13 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f2527103-d3d3-44d1-9a80-1e26bb5cf98f.vsidx |    0 
 Devices/ModbusHelper.cs                                                             |    0 
 Dispatch/NDC.cs                                                                     |    0 
 Helpers/SysHelper.cs                                                                |   13 +
 Devices/TcpClient.cs                                                                |    0 
 Devices/PlcHelper.cs                                                                |    0 
 Consts/TaskName.cs                                                                  |    4 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e9728df6-3b77-4640-883e-78a872e2fb53.vsidx |    0 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e39d6e75-9277-46f5-bff4-9390c52a26f9.vsidx |    0 
 Controllers/MoboxController.cs                                                      |   39 +++
 Dispatch/NDCApi.cs                                                                  |    3 
 Helpers/ResultHelper.cs                                                             |   11 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7725d916-1bef-44d2-8384-bfd94e8b6457.vsidx |    0 
 Models/TN_Outbound_Detail.cs                                                        |    8 
 /dev/null                                                                           |   20 -
 Helpers/LocationHelper.cs                                                           |    2 
 Dispatch/GZRobot.cs                                                                 |   24 +-
 Dispatch/HostToAGV.cs                                                               |    0 
 Dtos/Request/AgvRequest.cs                                                          |    7 
 Services/DebugService.cs                                                            |   63 +++-
 Models/TN_CNTR_ITEM.cs                                                              |   18 +
 Devices/TcpServer.cs                                                                |    0 
 Services/AgvService.cs                                                              |   24 -
 ServiceCore/CheckCore.cs                                                            |   11 
 Helpers/TaskHelper.cs                                                               |    2 
 Services/MoboxService.cs                                                            |  263 +++++++++++++++++++--
 Models/TN_CG_Detail.cs                                                              |   14 
 Dispatch/HanAo.cs                                                                   |    0 
 Dtos/Request/MoboxRequest.cs                                                        |   32 +
 Helpers/ContainerHelper.cs                                                          |   12 
 Dtos/Response/AgvResponse.cs                                                        |    2 
 44 files changed, 483 insertions(+), 220 deletions(-)

diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/142d45e0-bdbd-4ea2-8872-a4527bb762c2.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/142d45e0-bdbd-4ea2-8872-a4527bb762c2.vsidx
deleted file mode 100644
index 1b57b66..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/142d45e0-bdbd-4ea2-8872-a4527bb762c2.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7725d916-1bef-44d2-8384-bfd94e8b6457.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7725d916-1bef-44d2-8384-bfd94e8b6457.vsidx
new file mode 100644
index 0000000..5569d0b
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7725d916-1bef-44d2-8384-bfd94e8b6457.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/b9ecb874-f2d6-4f8b-b5d4-8934da36989f.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/b9ecb874-f2d6-4f8b-b5d4-8934da36989f.vsidx
deleted file mode 100644
index 02db22c..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/b9ecb874-f2d6-4f8b-b5d4-8934da36989f.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/dd1ab403-8a29-4f20-93da-995fa81d8fa6.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/dd1ab403-8a29-4f20-93da-995fa81d8fa6.vsidx
deleted file mode 100644
index 5963178..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/dd1ab403-8a29-4f20-93da-995fa81d8fa6.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e39d6e75-9277-46f5-bff4-9390c52a26f9.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e39d6e75-9277-46f5-bff4-9390c52a26f9.vsidx
new file mode 100644
index 0000000..6b872b4
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e39d6e75-9277-46f5-bff4-9390c52a26f9.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e9728df6-3b77-4640-883e-78a872e2fb53.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e9728df6-3b77-4640-883e-78a872e2fb53.vsidx
new file mode 100644
index 0000000..e14ea3e
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e9728df6-3b77-4640-883e-78a872e2fb53.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/ee67d919-8fb8-437c-9ad5-1a7b40e37bbd.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/ee67d919-8fb8-437c-9ad5-1a7b40e37bbd.vsidx
deleted file mode 100644
index 0808b3b..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/ee67d919-8fb8-437c-9ad5-1a7b40e37bbd.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f2527103-d3d3-44d1-9a80-1e26bb5cf98f.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f2527103-d3d3-44d1-9a80-1e26bb5cf98f.vsidx
new file mode 100644
index 0000000..2faa040
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f2527103-d3d3-44d1-9a80-1e26bb5cf98f.vsidx
Binary files differ
diff --git a/Consts/TaskName.cs b/Consts/TaskName.cs
index 90cda13..1b8f206 100644
--- a/Consts/TaskName.cs
+++ b/Consts/TaskName.cs
@@ -6,7 +6,6 @@
 
 namespace HH.WCS.Mobox3.DSZSH.Consts {
     public class TaskName {
-        public const string 鎶芥 = "鎶芥";
         public const string 濂借繍绠盻婊$涓嬬嚎鍏ュ簱 = "濂借繍绠�婊$涓嬬嚎鍏ュ簱";
         public const string 濂借繍绠盻绌虹涓婄嚎 = "濂借繍绠�绌虹涓婄嚎";
         public const string 濂借繍绠盻绌虹鍏ュ簱 = "濂借繍绠�绌虹鍏ュ簱";
@@ -16,5 +15,8 @@
         public const string 鎵樼洏_绌烘墭涓婄嚎 = "鎵樼洏-绌烘墭涓婄嚎";
         public const string 鎵樼洏_绌烘墭鍏ュ簱 = "鎵樼洏-绌烘墭鍏ュ簱";
         public const string 鎵樼洏_绌烘墭缁戝畾 = "鎵樼洏-绌烘墭缁戝畾";
+        public const string 鎶芥_涓嶅悎鏍肩Щ搴�= "鎶芥-涓嶅悎鏍肩Щ搴�;
+        public const string 鎶芥_鍑哄簱 = "鎶芥-鍑哄簱";
+        public const string 鎶芥_鍚堟牸鍥炲簱 = "鎶芥-鍚堟牸鍥炲簱";
     }
 }
diff --git a/Controllers/DebugController.cs b/Controllers/DebugController.cs
index 04585b2..90a1f58 100644
--- a/Controllers/DebugController.cs
+++ b/Controllers/DebugController.cs
@@ -29,7 +29,7 @@
         {
             return DebugService.AgvSeriesReports(model);
         }
-
+            
         /// <summary>
         /// 鍒濆鍖栨暟鎹簱
         /// </summary>
@@ -105,13 +105,13 @@
                         }
                     }
 
-                    var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == model.CntId && a.S_CG_ID == model.CgId);
+                    var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == model.CntId && a.S_ITEM_CODE == model.ItemCode);
                     if (cgDetail == null) {
                         var locList = new List<TN_CG_Detail>();
-                        locList.Add(new TN_CG_Detail { S_CNTR_CODE = model.CntId, S_CG_ID = model.CntId });
+                        locList.Add(new TN_CG_Detail { S_CNTR_CODE = model.CntId, S_ITEM_CODE = model.ItemCode });
                         if (db.Insertable<TN_CG_Detail>(locList).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
-                            return $"鎻掑叆鎵樼洏鐗╂枡鍏崇郴{model.CntId}-{model.CgId}澶辫触";
+                            return $"鎻掑叆鎵樼洏鐗╂枡鍏崇郴{model.CntId}-{model.ItemCode}澶辫触";
                         }
                     }
 
@@ -127,7 +127,7 @@
     }
 
     public class CgInfo {
-        public string CgId { get; set; }
+        public string ItemCode { get; set; }
         public string CntId { get; set; }
         public string LocId { get; set; }
     }
diff --git a/Controllers/MoboxController.cs b/Controllers/MoboxController.cs
index e563422..6b9b8fd 100644
--- a/Controllers/MoboxController.cs
+++ b/Controllers/MoboxController.cs
@@ -97,7 +97,7 @@
             var db = DbHelper.GetDbClient();
             var locCntrRel = db.Queryable<TN_Loc_Container>()
                 .LeftJoin<TN_CG_Detail>((lc, cd) => lc.S_CNTR_CODE == cd.S_CNTR_CODE)
-                .Where((lc, cd) => cd.S_CG_ID == model.CgId)
+                .Where((lc, cd) => cd.S_ITEM_CODE == model.ItemCode)
                 .First();
 
             if (locCntrRel.S_CNTR_TYPE == "鎵樼洏") {
@@ -125,9 +125,42 @@
         /// <param name="model"></param>
         /// <returns></returns>
         public SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
-            
             return MoboxService.CreateCheckOrder(model);
         }
+
+        /// <summary>
+        /// 鍚堟牸鍥炲簱/涓嶅悎鏍肩Щ搴�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("CheckShift")]
+        public SimpleResult CheckShift(CheckShiftInfo model) {
+            LogHelper.InfoApi("鍚堟牸鍥炲簱/涓嶅悎鏍肩Щ搴�, model);
+
+            if (model.Qualified) {
+                return MoboxService.QualifiedBack(model);
+            }
+            else {
+                return MoboxService.UnqualifiedShift(model);
+            }
+        }
+
+        ///// <summary>
+        ///// 鍚堟牸鍥炲簱
+        ///// </summary>
+        ///// <returns></returns>
+        //public SimpleResult QualifiedBack(QualifiedBackInfo model) {
+        //    return new SimpleResult();
+        //}
+
+        ///// <summary>   
+        ///// 涓嶅悎鏍肩Щ搴�+        ///// </summary>
+        ///// <returns></returns>
+        //public SimpleResult UnqualifiedShift() {
+        //    return new SimpleResult();
+        //}
 
         #endregion
 
@@ -139,7 +172,7 @@
         /// <returns></returns>
         public SimpleResult FinishedOutbound(FinishedOutboundInfo model) {
             LogHelper.InfoApi("鎴愬搧鑳跺嚭搴�WMS)", model);
-            if (model.Forced) {
+            if (model.ForcedOut) {
                 return MoboxService.FinishedOutboundForce(model);
             }
             return MoboxService.FinishedOutbound(model);
diff --git a/Devices/BaseModbusDevice.cs b/Devices/BaseModbusDevice.cs
deleted file mode 100644
index 831a19a..0000000
--- a/Devices/BaseModbusDevice.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Devices {
-    /// <summary>
-    /// 妯℃澘鎶借薄绫伙細Modbus 鍗忚璁惧
-    /// </summary>
-    public abstract class BaseModbusDevice {
-        public BaseModbusDevice(string ip, int port) {
-            Ip = ip;
-            Port = port;
-        }
-
-        public string Ip { get; set; }
-        public int Port { get; set; }
-    }
-}
diff --git a/Helpers/Device/ModbusHelper.cs b/Devices/ModbusHelper.cs
similarity index 100%
rename from Helpers/Device/ModbusHelper.cs
rename to Devices/ModbusHelper.cs
diff --git a/Helpers/Device/OpcUaHelper.cs b/Devices/OpcUaHelper.cs
similarity index 100%
rename from Helpers/Device/OpcUaHelper.cs
rename to Devices/OpcUaHelper.cs
diff --git a/Helpers/Device/PlcHelper.cs b/Devices/PlcHelper.cs
similarity index 100%
rename from Helpers/Device/PlcHelper.cs
rename to Devices/PlcHelper.cs
diff --git a/Devices/ProductionLineDevice.cs b/Devices/ProductionLineDevice.cs
index 19e3d74..29ffb03 100644
--- a/Devices/ProductionLineDevice.cs
+++ b/Devices/ProductionLineDevice.cs
@@ -8,13 +8,19 @@
     /// <summary>
     /// 杈撻�绾縋LC璁惧
     /// </summary>
-    public class ProductionLineDevice : BaseModbusDevice {
+    public class ProductionLineDevice {
 
+        public string Ip { get; set; }
+        public int Port { get; set; }
 
-        public ProductionLineDevice(string ip, int port) : base(ip, port) {
+        public ProductionLineDevice(string ip, int port) {
+            Ip = ip;
+            Port = port;
         }
 
-        public ProductionLineDevice(string id, string ip, int port) : base(ip, port) {
+        public ProductionLineDevice(string id, string ip, int port) {
+            Ip = ip;
+            Port = port;
             Id = id;
         }
 
diff --git a/Helpers/Device/S7Helper.cs b/Devices/S7Helper.cs
similarity index 100%
rename from Helpers/Device/S7Helper.cs
rename to Devices/S7Helper.cs
diff --git a/Helpers/Device/TcpClient.cs b/Devices/TcpClient.cs
similarity index 100%
rename from Helpers/Device/TcpClient.cs
rename to Devices/TcpClient.cs
diff --git a/Helpers/Device/TcpServer.cs b/Devices/TcpServer.cs
similarity index 100%
rename from Helpers/Device/TcpServer.cs
rename to Devices/TcpServer.cs
diff --git a/Helpers/Dispatch/GZRobot.cs b/Dispatch/GZRobot.cs
similarity index 96%
rename from Helpers/Dispatch/GZRobot.cs
rename to Dispatch/GZRobot.cs
index 570065f..44a5ef6 100644
--- a/Helpers/Dispatch/GZRobot.cs
+++ b/Dispatch/GZRobot.cs
@@ -122,38 +122,38 @@
 
             switch (model.orderStatus) {
                 case "active":
-                    agv.State = 1;
+                    agv.state = 1;
                     break;
                 case "waiting":
-                    agv.State = 1;
+                    agv.state = 1;
                     break;
                 case "source_finish":
                     //鍙栬揣瀹屾垚
-                    agv.State = 4;
+                    agv.state = 4;
                     break;
                 case "dest_finish":
                     //鍗歌揣瀹屾垚
-                    agv.State = 6;
+                    agv.state = 6;
                     break;
                 case "finish":
-                    agv.State = 2;
+                    agv.state = 2;
                     break;
                 case "manually_finish":
-                    agv.State = 2;
+                    agv.state = 2;
                     break;
                 case "cancel_finish":
-                    agv.State = 7;
+                    agv.state = 7;
                     break;
                 case "error":
-                    agv.State = 7;
+                    agv.state = 7;
                     break;
                 default:
-                    agv.State = 0;
+                    agv.state = 0;
                     break;
             }
-            if (agv.State != 0) {
-                agv.TaskNo = model.orderName;
-                agv.ForkliftNo = model.agvIDList;
+            if (agv.state != 0) {
+                agv.task_no = model.orderName;
+                agv.forklift_no = model.agvIDList;
                 AgvService.OperateAgvTaskStatus(agv);
             }
 
diff --git a/Helpers/Dispatch/HanAo.cs b/Dispatch/HanAo.cs
similarity index 100%
rename from Helpers/Dispatch/HanAo.cs
rename to Dispatch/HanAo.cs
diff --git a/Helpers/Dispatch/HostToAGV.cs b/Dispatch/HostToAGV.cs
similarity index 100%
rename from Helpers/Dispatch/HostToAGV.cs
rename to Dispatch/HostToAGV.cs
diff --git a/Helpers/Dispatch/NDC.cs b/Dispatch/NDC.cs
similarity index 100%
rename from Helpers/Dispatch/NDC.cs
rename to Dispatch/NDC.cs
diff --git a/Helpers/Dispatch/NDCApi.cs b/Dispatch/NDCApi.cs
similarity index 98%
rename from Helpers/Dispatch/NDCApi.cs
rename to Dispatch/NDCApi.cs
index 9ff9326..15c4395 100644
--- a/Helpers/Dispatch/NDCApi.cs
+++ b/Dispatch/NDCApi.cs
@@ -8,6 +8,9 @@
 
 namespace HH.WCS.Mobox3.DSZSH.Dispatch
 {
+    /// <summary>
+    /// NDC鐨凙PI鎺ュ彛锛岀敤浜庢浛浠e師NDC銆丯DCHelper鍜孒ostToAGV妯″潡
+    /// </summary>
     public class NDCApi
     {
         public static string NDCApiUrl { set; get; }
diff --git a/Helpers/Dispatch/NDCHelper.cs b/Dispatch/NDCHelper.cs
similarity index 100%
rename from Helpers/Dispatch/NDCHelper.cs
rename to Dispatch/NDCHelper.cs
diff --git a/Dtos/Request/AgvRequest.cs b/Dtos/Request/AgvRequest.cs
index f914a22..09db430 100644
--- a/Dtos/Request/AgvRequest.cs
+++ b/Dtos/Request/AgvRequest.cs
@@ -10,9 +10,9 @@
         /// HostToAGV 涓婃姤浠诲姟鐘舵�
         /// </summary>
         public class AgvTaskState {
-            public int State { get; set; }
-            public string TaskNo { get; set; }
-            public string ForkliftNo { get; set; }
+            public int state { get; set; }
+            public string task_no { get; set; }
+            public string forklift_no { get; set; }
 
             /// <summary>
             /// 瀹夊叏闂ㄧ紪鍙�@@ -22,6 +22,7 @@
         }
 
         public class SafetyInteractionInfo {
+            
             public int station_id { get; set; }
 
             /// <summary>
diff --git a/Dtos/Request/MoboxRequest.cs b/Dtos/Request/MoboxRequest.cs
index b1b570c..e20bcd6 100644
--- a/Dtos/Request/MoboxRequest.cs
+++ b/Dtos/Request/MoboxRequest.cs
@@ -76,7 +76,8 @@
         public class EmptyInboundDetailInfo : StartCntInfo { }
 
         public class EmptyOnlineInfo {
-            public string CgId { get; set; }
+            public string ItemCode { get; set; }
+            public string ItemName { get; set; }
             public string PatchNo { get; set; }
             public string EndLoc { get; set; }
         }
@@ -96,9 +97,23 @@
             /// <summary>
             /// 鎶芥鏁伴噺
             /// </summary>
-            public int Count { get; set; }
+            public int N_QTY { get; set; }
             public string EndArea { get; set; }
         }
+
+        public class QualifiedBackInfo {
+            public string ItemCode { get; set; }
+            public string CntrCode { get; set; }
+        }
+
+        public class UnqualifiedShiftInfo : QualifiedBackInfo {
+            public string EndArea { get; set; }
+        }
+
+        public class CheckShiftInfo : UnqualifiedShiftInfo {
+            public bool Qualified { get; set; }
+        }
+
         #endregion
 
         #region WMS 鏁版嵁
@@ -106,23 +121,20 @@
         /// 鎴愬搧鑳舵墭鐩樺嚭搴撲俊鎭�         /// </summary>
         public class FinishedOutboundInfo {
-            /// <summary>
-            /// 鍑哄簱鍗�-            /// </summary>
-            public string No { get; set; }
+            //public string No { get; set; }
 
-            public string CgId { get; set; }
-            public string CgName { get; set; }
+            public string ItemCode { get; set; }
+            public string ItemName { get; set; }
             public string BatchNo { get; set; }
             public string CntrType { get; set; }
-            public int Count { get; set; }
+            public float Qty { get; set; }
 
             public string EndArea { get; set; }
 
             /// <summary>
             /// 鏄惁寮哄埗鍑哄簱
             /// </summary>
-            public bool Forced { get; set; }
+            public bool ForcedOut { get; set; }
         }
 
         
diff --git a/Dtos/Response/AgvResponse.cs b/Dtos/Response/AgvResponse.cs
index 5401c4f..8da52dc 100644
--- a/Dtos/Response/AgvResponse.cs
+++ b/Dtos/Response/AgvResponse.cs
@@ -5,7 +5,7 @@
 using System.Threading.Tasks;
 
 namespace HH.WCS.Mobox3.DSZSH.Dtos.Response {
-    public class AgvResponse : BaseResponse {
+    public class AgvResponse {
         /// <summary>
         /// 杩斿洖缁�HostToAgv
         /// </summary>
diff --git a/Dtos/Response/BaseResponse.cs b/Dtos/Response/BaseResponse.cs
deleted file mode 100644
index 314a681..0000000
--- a/Dtos/Response/BaseResponse.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Dtos.Response {
-    /// <summary>
-    /// 妯℃澘鎶借薄绫伙細杩斿洖淇℃伅 DTO 鍩虹被
-    /// </summary>
-    public abstract class BaseResponse {
-        /// <summary>
-        /// 榛樿鐨�杩斿洖缁撴灉 鏁版嵁绫�{ int Code; string Message; }
-        /// </summary>
-        public class Result {
-            public int Code { get; set; }
-            public string Message { get; set; }
-        }
-    }
-}
diff --git a/Dtos/Response/MoboxResponse.cs b/Dtos/Response/MoboxResponse.cs
index 8ebf56f..94fc6e7 100644
--- a/Dtos/Response/MoboxResponse.cs
+++ b/Dtos/Response/MoboxResponse.cs
@@ -4,12 +4,21 @@
 using System.Text;
 using System.Threading.Tasks;
 
+using Newtonsoft.Json;
+
 namespace HH.WCS.Mobox3.DSZSH.Dtos.Response {
-    public class MoboxResponse : BaseResponse {
+    public class MoboxResponse {
         /// <summary>
         /// Mobox 鎺ュ彛杩斿洖
         /// </summary>
-        public class SimpleResult : Result {
+        public class SimpleResult {
+            [JsonProperty("resultCode")]
+            public int Code { get; set; }
+
+            [JsonProperty("resultMsg")]
+            public string Message { get; set; }
+
+            [JsonProperty("result")]
             public List<object> Results { get; set; } = new List<object>();
         }
 
@@ -17,6 +26,7 @@
         /// mobox 鍙栨秷浠诲姟銆佹爣璁板畬鎴愪换鍔�         /// </summary>
         public class MoboxTaskBase {
+            [JsonProperty("task_no")]
             public string TaskNo { get; set; }
         }
 
@@ -197,6 +207,7 @@
         /// 杩斿洖缁橤Z
         /// </summary>
         public class GzResult {
+            
             public int resultCode { get; set; }
             public string msg { get; set; }
             public int orderID { get; set; }
diff --git a/HH.WCS.Mobox3.DSZSH.csproj b/HH.WCS.Mobox3.DSZSH.csproj
index ec63747..0667fa1 100644
--- a/HH.WCS.Mobox3.DSZSH.csproj
+++ b/HH.WCS.Mobox3.DSZSH.csproj
@@ -231,13 +231,13 @@
     <Compile Include="AppStart\SwaggerControllerDescProvider.cs" />
     <Compile Include="Models\DebugModel.cs" />
     <Compile Include="Dtos\Request\DebugRequest.cs" />
-    <Compile Include="Dtos\Response\BaseResponse.cs" />
     <Compile Include="Dtos\Response\DebugResponse.cs" />
     <Compile Include="Helpers\AgvHelper.cs" />
     <Compile Include="Helpers\ExprHelper.cs" />
     <Compile Include="Helpers\PathHelper.cs" />
     <Compile Include="Helpers\ResultHelper.cs" />
     <Compile Include="Helpers\DbHelper.cs" />
+    <Compile Include="Models\TN_CNTR_ITEM.cs" />
     <Compile Include="Models\TN_Check_Detail.cs" />
     <Compile Include="Models\TN_Check_Order.cs" />
     <Compile Include="Models\TN_Inbound_Order.cs" />
@@ -247,19 +247,18 @@
     <Compile Include="ServiceCore\CheckCore.cs" />
     <Compile Include="ServiceCore\OutboundCore.cs" />
     <Compile Include="Services\DebugService.cs" />
-    <Compile Include="Devices\BaseModbusDevice.cs" />
     <Compile Include="Devices\ProductionLineDevice.cs" />
-    <Compile Include="Helpers\Device\ModbusHelper.cs" />
-    <Compile Include="Helpers\Device\OpcUaHelper.cs" />
-    <Compile Include="Helpers\Device\PlcHelper.cs" />
-    <Compile Include="Helpers\Device\S7Helper.cs" />
-    <Compile Include="Helpers\Device\TcpClient.cs" />
-    <Compile Include="Helpers\Device\TcpServer.cs" />
-    <Compile Include="Helpers\Dispatch\GZRobot.cs" />
-    <Compile Include="Helpers\Dispatch\HanAo.cs" />
-    <Compile Include="Helpers\Dispatch\NDC.cs" />
+    <Compile Include="Devices\ModbusHelper.cs" />
+    <Compile Include="Devices\OpcUaHelper.cs" />
+    <Compile Include="Devices\PlcHelper.cs" />
+    <Compile Include="Devices\S7Helper.cs" />
+    <Compile Include="Devices\TcpClient.cs" />
+    <Compile Include="Devices\TcpServer.cs" />
+    <Compile Include="Dispatch\GZRobot.cs" />
+    <Compile Include="Dispatch\HanAo.cs" />
+    <Compile Include="Dispatch\NDC.cs" />
     <Compile Include="ServiceCore\OfflineCore.cs" />
-    <Compile Include="Helpers\Dispatch\NDCApi.cs" />
+    <Compile Include="Dispatch\NDCApi.cs" />
     <Compile Include="Dtos\Request\AgvRequest.cs" />
     <Compile Include="Dtos\Request\MoboxRequest.cs" />
     <Compile Include="Dtos\Response\AgvResponse.cs" />
@@ -276,19 +275,19 @@
     <Compile Include="Helpers\DeviceProcess.cs" />
     <Compile Include="ServiceCore\TaskCore.cs" />
     <Compile Include="Controllers\WmsController.cs" />
-    <Compile Include="Helpers\Dispatch\HostToAGV.cs" />
-    <Compile Include="Helpers\Model\TaskHelper.cs" />
+    <Compile Include="Dispatch\HostToAGV.cs" />
+    <Compile Include="Helpers\TaskHelper.cs" />
     <Compile Include="Services\AgvService.cs" />
     <Compile Include="Services\MoboxService.cs" />
     <Compile Include="Helpers\LogHelper.cs" />
-    <Compile Include="Helpers\Model\ContainerHelper.cs" />
-    <Compile Include="Helpers\Model\LocationHelper.cs" />
+    <Compile Include="Helpers\ContainerHelper.cs" />
+    <Compile Include="Helpers\LocationHelper.cs" />
     <Compile Include="Helpers\SysHelper.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="AppStart\Settings.cs" />
     <Compile Include="AppStart\Startup.cs" />
-    <Compile Include="Helpers\Dispatch\NDCHelper.cs" />
+    <Compile Include="Dispatch\NDCHelper.cs" />
     <Compile Include="Helpers\HttpHelper.cs" />
   </ItemGroup>
   <ItemGroup>
diff --git a/Helpers/Model/ContainerHelper.cs b/Helpers/ContainerHelper.cs
similarity index 93%
rename from Helpers/Model/ContainerHelper.cs
rename to Helpers/ContainerHelper.cs
index d069b0a..013be47 100644
--- a/Helpers/Model/ContainerHelper.cs
+++ b/Helpers/ContainerHelper.cs
@@ -7,7 +7,7 @@
 
 using Newtonsoft.Json;
 
-namespace HH.WCS.Mobox3.DSZSH.Helpers.Model {
+namespace HH.WCS.Mobox3.DSZSH.Helpers {
     /// <summary>
     /// 瀹瑰櫒甯姪绫伙紙鍖呭惈瀹瑰櫒-璐у搧鍏崇郴鐨勫鐞嗭級
     /// </summary>
@@ -25,7 +25,7 @@
             var logs = $"瀹瑰櫒锛歿cnt}锛岃揣鍝侊細{JsonConvert.SerializeObject(cGs)}";
             try
             {
-                var cntCgList = db.Queryable<TN_CG_Detail>().Where(a => cGs.Contains(a.S_CG_ID) && a.S_CNTR_CODE == cnt).ToList();
+                var cntCgList = db.Queryable<TN_CG_Detail>().Where(a => cGs.Contains(a.S_ITEM_CODE) && a.S_CNTR_CODE == cnt).ToList();
 
                 if (cntCgList.Count > 0)
                 {
@@ -35,7 +35,7 @@
                 var bindCntCgList = new List<TN_CG_Detail>();
                 foreach (var item in cGs)
                 {
-                    bindCntCgList.Add(new TN_CG_Detail() { S_CNTR_CODE = cnt, S_CG_ID = item });
+                    bindCntCgList.Add(new TN_CG_Detail() { S_CNTR_CODE = cnt, S_ITEM_CODE = item });
                 }
 
                 var log = JsonConvert.SerializeObject(bindCntCgList);
@@ -90,16 +90,16 @@
             var logs = $"瀹瑰櫒锛歿cnt}锛岃揣鍝侊細{JsonConvert.SerializeObject(cGs)}";
             try
             {
-                var cntCgList = db.Queryable<TN_CG_Detail>().Where(a => cGs.Contains(a.S_CG_ID) && a.S_CNTR_CODE == cnt).ToList();
+                var cntCgList = db.Queryable<TN_CG_Detail>().Where(a => cGs.Contains(a.S_ITEM_CODE) && a.S_CNTR_CODE == cnt).ToList();
                 if (cntCgList.Count == 0)
                 {
                     LogHelper.Info($"瀹瑰櫒鏃犻渶瑙g粦璐у搧锛屽湪鏁版嵁搴撲腑鏈壘鍒皗JsonConvert.SerializeObject(cGs)}鐩稿叧鐨勫鍣ㄨ揣鍝佸叧绯昏〃淇℃伅");
                     return "瀹瑰櫒鏃犻渶瑙g粦璐у搧锛岃В缁戞垚鍔� + logs;
                 }
-                cGs = cntCgList.Select(a => a.S_CG_ID).ToList();
+                cGs = cntCgList.Select(a => a.S_ITEM_CODE).ToList();
 
                 var log = JsonConvert.SerializeObject(cGs);
-                if (db.Deleteable<TN_CG_Detail>().Where(it => cGs.Contains(it.S_CG_ID) && it.S_CNTR_CODE == cnt).ExecuteCommand() > 0)
+                if (db.Deleteable<TN_CG_Detail>().Where(it => cGs.Contains(it.S_ITEM_CODE) && it.S_CNTR_CODE == cnt).ExecuteCommand() > 0)
                 {
                     LogHelper.Info($"鍒犻櫎瀹瑰櫒璐у搧鍏崇郴琛ㄦ垚鍔燂紝{log}");
                 }
diff --git a/Helpers/Model/LocationHelper.cs b/Helpers/LocationHelper.cs
similarity index 99%
rename from Helpers/Model/LocationHelper.cs
rename to Helpers/LocationHelper.cs
index 88bcc10..d2d14df 100644
--- a/Helpers/Model/LocationHelper.cs
+++ b/Helpers/LocationHelper.cs
@@ -10,7 +10,7 @@
 
 using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
 
-namespace HH.WCS.Mobox3.DSZSH.Helpers.Model {
+namespace HH.WCS.Mobox3.DSZSH.Helpers {
     /// <summary>
     /// 璐т綅甯姪绫伙紙鍖呭惈璐т綅-瀹瑰櫒鍏崇郴鐨勫鐞嗭級
     /// </summary>
diff --git a/Helpers/ResultHelper.cs b/Helpers/ResultHelper.cs
index 524df8f..3eaab40 100644
--- a/Helpers/ResultHelper.cs
+++ b/Helpers/ResultHelper.cs
@@ -1,20 +1,9 @@
 锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.BaseResponse;
 using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
 
 namespace HH.WCS.Mobox3.DSZSH.Helpers {
     public class ResultHelper {
-        public static Result BuildResult(int code, string message, bool pringLog = true) {
-            if (pringLog) {
-                LogHelper.Info(message);
-            }
-            return new Result { Code = code, Message = message };
-        }
 
         /// <summary>
         /// 鏋勫缓 <see cref="SimpleResult"/> 杩斿洖鍊硷紝閫夋嫨鎵撳嵃鏃ュ織淇℃伅锛堥粯璁ゆ墦鍗帮級
diff --git a/Helpers/SysHelper.cs b/Helpers/SysHelper.cs
index 9d37ae7..b163c71 100644
--- a/Helpers/SysHelper.cs
+++ b/Helpers/SysHelper.cs
@@ -3,8 +3,12 @@
 using SqlSugar;
 
 namespace HH.WCS.Mobox3.DSZSH.Helper {
+    /// <summary>
+    /// 鐢ㄤ簬鐢熸垚搴忓垪鍙凤紝骞剁鐞嗗簭鍒楀彿鍓嶇紑鐨勫伐鍏风被
+    /// </summary>
     internal class SysHelper
     {
+        //浣跨敤闈欐� locker 瀵硅薄瀹炵幇绾跨▼鍚屾
         private static object locker = new object();
         internal static int GetSerialNumber(string snType, string prefix) {
             int result = 0;
@@ -13,9 +17,16 @@
                 var sId = db.Queryable<OI_SYS_MAXID>().Where(a => a.CN_S_TYPE.Trim() == snType && a.CN_S_PRE.Trim() == prefix).First();
                 if (sId != null) {
                     sId.CN_N_MAX++;
-                    if (db.Ado.ExecuteCommand($"update OI_SYS_MAXID set CN_N_MAX={sId.CN_N_MAX} where CN_S_TYPE='{snType}' and CN_S_PRE='{prefix}' ") > 0) {
+                    //if (db.Ado.ExecuteCommand($"update OI_SYS_MAXID set CN_N_MAX={sId.CN_N_MAX} where CN_S_TYPE='{snType}' and CN_S_PRE='{prefix}' ") > 0) {
+                    //    result = sId.CN_N_MAX;
+                    //}
+
+                    // 鍙傛暟鍖栨煡璇紝閬垮厤SQL娉ㄥ叆
+                    if (db.Updateable<OI_SYS_MAXID>().SetColumns(it => it.CN_N_MAX == sId.CN_N_MAX).Where(it => it.CN_S_TYPE == snType
+                        && it.CN_S_PRE == prefix).ExecuteCommand() > 0) {
                         result = sId.CN_N_MAX;
                     }
+
                 }
                 else {
                     //鎻掑叆琛�diff --git a/Helpers/Model/TaskHelper.cs b/Helpers/TaskHelper.cs
similarity index 99%
rename from Helpers/Model/TaskHelper.cs
rename to Helpers/TaskHelper.cs
index f9cdfad..3b78306 100644
--- a/Helpers/Model/TaskHelper.cs
+++ b/Helpers/TaskHelper.cs
@@ -14,7 +14,7 @@
 using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
 using static HH.WCS.Mobox3.DSZSH.Helpers.ResultHelper;
 
-namespace HH.WCS.Mobox3.DSZSH.Helpers.Model {
+namespace HH.WCS.Mobox3.DSZSH.Helpers {
     /// <summary>
     /// 浠诲姟甯姪绫�     /// </summary>
diff --git a/Models/TN_CG_Detail.cs b/Models/TN_CG_Detail.cs
index 5d4b332..31acaf0 100644
--- a/Models/TN_CG_Detail.cs
+++ b/Models/TN_CG_Detail.cs
@@ -9,12 +9,12 @@
         /// <summary>
         /// 鏂欑鍟嗗搧鏍囪瘑
         /// </summary>
-        public string S_CG_ID { get; set; }
+        public string S_CG_ID { get; set; } = "";
 
         /// <summary>
         /// 鐗╂枡缂栫爜
         /// </summary>
-        public string S_ITEM_CODE { get; set; } = "";
+        public string S_ITEM_CODE { get; set; }
 
         /// <summary>
         /// 瀹瑰櫒缂栫爜
@@ -35,10 +35,10 @@
         /// 鎵规鍙�         /// </summary>
         public string S_BATCH_NO { get; set; }
-        
-        ///// <summary>
-        ///// 璐у搧鏁伴噺
-        ///// </summary>
-        //public float F_QTY { get; set; }
+
+        /// <summary>
+        /// 璐у搧鏁伴噺
+        /// </summary>
+        public float F_QTY { get; set; }
     }
 }
diff --git a/Models/TN_CNTR_ITEM.cs b/Models/TN_CNTR_ITEM.cs
new file mode 100644
index 0000000..f1f2c66
--- /dev/null
+++ b/Models/TN_CNTR_ITEM.cs
@@ -0,0 +1,18 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using SqlSugar;
+
+namespace HH.WCS.Mobox3.DSZSH.Models {
+    /// <summary>
+    /// 瀹瑰櫒-鐗╂枡绫诲瀷 鍏崇郴琛�+    /// </summary>
+    [SugarTable("TN_CNTR_ITEM")]
+    public class TN_CNTR_ITEM : BaseModel {
+        public string S_CNTR_CODE { get; set; }
+        public string S_ITEM_CODE { get; set; }
+    }
+}
diff --git a/Models/TN_Outbound_Detail.cs b/Models/TN_Outbound_Detail.cs
index a1a2a2d..f219dca 100644
--- a/Models/TN_Outbound_Detail.cs
+++ b/Models/TN_Outbound_Detail.cs
@@ -19,7 +19,9 @@
         /// <summary>
         /// 鐗╂枡鍙�         /// </summary>
-        public string S_CG_ID { get; set; }
+        public string S_ITEM_CODE { get; set; }
+
+        public string S_CNTR_CODE { get; set; }
 
         /// <summary>
         /// 鎵规鍙�@@ -36,9 +38,5 @@
         /// </summary>
         public string S_END_AREA { get; set; }
 
-        /// <summary>
-        /// 鏄惁寮哄埗鍑哄簱锛�涓嶅己鍒�1寮哄埗
-        /// </summary>
-        public int N_FORCE { get; set; }
     }
 }
diff --git a/Models/TN_Outbound_Order.cs b/Models/TN_Outbound_Order.cs
index 8a956a4..99fb355 100644
--- a/Models/TN_Outbound_Order.cs
+++ b/Models/TN_Outbound_Order.cs
@@ -21,17 +21,16 @@
         /// <summary>
         /// 鐗╂枡鍙�         /// </summary>
-        public string S_CG_ID { get; set; }
+        public string S_ITEM_CODE { get; set; }
 
         /// <summary>
         /// 鎵规鍙�         /// </summary>
         public string S_BATCH_NO { get; set; }
 
-        /// <summary>
-        /// 鍑哄簱璐у搧鏁伴噺锛堟暣鏁帮紝鐢ㄤ簬鐢熸垚浠诲姟鏁帮級
-        /// </summary>
-        public int N_COUNT { get; set; }
+        public float F_QTY { get; set; }
+
+        public float F_OUT_QTY { get; set; }
 
         /// <summary>
         /// 缁堢偣搴撳尯锛堢敱WMS涓嬪彂浠诲姟鏃舵寚瀹氾級
@@ -41,7 +40,7 @@
         /// <summary>
         /// 鏄惁寮哄埗鍑哄簱锛�涓嶅己鍒�1寮哄埗
         /// </summary>
-        public int N_FORCE { get; set; }
+        public bool B_FORCE_OUT { get; set; }
 
 
         [Navigate(NavigateType.OneToMany, nameof(TN_Outbound_Detail.S_NO))]
diff --git a/Program.cs b/Program.cs
index 2aa5ce7..5f198b3 100644
--- a/Program.cs
+++ b/Program.cs
@@ -127,9 +127,9 @@
             {
                 List<Task> tasks = new List<Task>();
 
-                tasks.Add(GetTask(CheckCore.CheckOrderState));
+                //tasks.Add(GetTask(CheckCore.CheckOrderState));
 
-                tasks.Add(GetTask(OutboundCore.CheckOrderState));
+                //tasks.Add(GetTask(OutboundCore.CheckOrderState));
 
 
                 // 娣诲姞浠诲姟鎺ㄩ�绾跨▼
diff --git a/ServiceCore/CheckCore.cs b/ServiceCore/CheckCore.cs
index 4fdf160..fec6b9e 100644
--- a/ServiceCore/CheckCore.cs
+++ b/ServiceCore/CheckCore.cs
@@ -1,15 +1,8 @@
 锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 
 using HH.WCS.Mobox3.DSZSH.Consts;
 using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Helpers.Model;
 using HH.WCS.Mobox3.DSZSH.Models;
-
-using Org.BouncyCastle.Asn1.X509;
 
 namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
     public class CheckCore {
@@ -37,7 +30,7 @@
                 foreach (var detail in detailList) {
                     var startLocCntrRel = 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, c, d) => d.S_CG_ID == detail.S_CG_ID && d.S_BATCH_NO == detail.S_BATCH_NO)
+                        .Where((l, c, d) => d.S_ITEM_CODE == detail.S_CG_ID && d.S_BATCH_NO == detail.S_BATCH_NO)
                         .Select((l, c) => c) // 閫夋嫨 LocCntrRel
                         .First(); // 闅忔満鎶芥锛屼笉鎺掑簭
 
@@ -64,7 +57,7 @@
                         }
 
                         if (TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE,
-                            endLoc.S_CODE, TaskName.鎶芥)) {
+                            endLoc.S_CODE, TaskName.鎶芥_鍑哄簱)) {
                             tran.CommitTran();
                         }
                         else {
diff --git a/ServiceCore/OfflineCore.cs b/ServiceCore/OfflineCore.cs
index 1d053e6..9fda54e 100644
--- a/ServiceCore/OfflineCore.cs
+++ b/ServiceCore/OfflineCore.cs
@@ -1,12 +1,7 @@
 锘縰sing System;
 
-using HH.WCS.Mobox3.DSZSH.AppStart;
-using HH.WCS.Mobox3.DSZSH.Consts;
-using HH.WCS.Mobox3.DSZSH.Helpers.Model;
 using HH.WCS.Mobox3.DSZSH.Helpers;
 using HH.WCS.Mobox3.DSZSH.Models;
-using HH.WCS.Mobox3.DSZSH.Helper;
-using System.Collections.Generic;
 
 namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
     /// <summary>
@@ -40,12 +35,12 @@
                     var cntrId = ModbusHelper.ReadHoldingRegistersToString(40, 20, prodLineInfo.PlcIp, prodLineInfo.PlcPort);
 
                     var cgDetail = db.Queryable<TN_CG_Detail>()
-                        .Where(cd => cd.S_CG_ID == cgId && cd.S_CNTR_CODE == cntrId).First();
+                        .Where(cd => cd.S_ITEM_CODE == cgId && cd.S_CNTR_CODE == cntrId).First();
 
 
                     // 缁戝畾 鐗╂枡淇℃伅 鍜�瀹瑰櫒淇℃伅
                     cgDetail = new TN_CG_Detail {
-                        S_CG_ID = cgId,
+                        S_ITEM_CODE = cgId,
                         S_CNTR_CODE = cntrId,
                     };
 
diff --git a/ServiceCore/OutboundCore.cs b/ServiceCore/OutboundCore.cs
index 29e3cda..5f684c3 100644
--- a/ServiceCore/OutboundCore.cs
+++ b/ServiceCore/OutboundCore.cs
@@ -2,7 +2,6 @@
 
 using HH.WCS.Mobox3.DSZSH.Consts;
 using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Helpers.Model;
 using HH.WCS.Mobox3.DSZSH.Models;
 
 namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
@@ -36,18 +35,9 @@
                     return;
                 }
 
-                var startLocCntrRel = 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, c, d) => d.S_CG_ID == detail.S_CG_ID && d.S_BATCH_NO == detail.S_BATCH_NO)
-                    // 濡傛灉涓嶆槸寮哄埗鍑哄簱锛岀墿鏂欑姸鎬佸繀椤诲繀椤诲悎鏍�-                    // 鍚﹀垯锛屽彧瑕佷笉鏄�姝e湪妫�獙 鐨勭墿鏂欏嵆鍙�-                    .Where((l, c, d) => (detail.N_FORCE == 0 && d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸")
-                        || (detail.N_FORCE != 0 && d.N_ITEM_STATE != 3 && d.S_ITEM_STATE != "姝e湪妫�獙"))
-                    // 鎺掑簭锛氭暟瀛楄秺灏忚秺浼樺厛锛屽悎鏍硷紴寰呮锛炰笉鍚堟牸
-                    .OrderBy((l, c, d) => d.N_ITEM_STATE)
-                    .OrderBy(l => l.N_LAYER)
-                    .Select((l, c) => c).First();
+                var startLocCntrRel = db.Queryable<TN_Loc_Container>()
+                    .Where(c => c.S_CNTR_CODE == detail.S_CNTR_CODE)
+                    .First();
 
                 if (startLocCntrRel == null) {
                     LogHelper.Info("杞锛氬嚭搴擄細娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�);
diff --git a/ServiceCore/TaskCore.cs b/ServiceCore/TaskCore.cs
index ecfd717..d3d0f92 100644
--- a/ServiceCore/TaskCore.cs
+++ b/ServiceCore/TaskCore.cs
@@ -1,15 +1,10 @@
-锘縰sing System;
+锘縰sing System.Collections.Generic;
 
-using HH.WCS.Mobox3.DSZSH.Helpers.Model;
-using HH.WCS.Mobox3.DSZSH.Helper;
+using HH.WCS.Mobox3.DSZSH.Dispatch;
+using HH.WCS.Mobox3.DSZSH.Helpers;
+using HH.WCS.Mobox3.DSZSH.Models;
 
 using Newtonsoft.Json;
-
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse;
-using HH.WCS.Mobox3.DSZSH.Dispatch;
-using HH.WCS.Mobox3.DSZSH.Models;
-using System.Collections.Generic;
 
 namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
     internal class TaskCore {
diff --git a/Services/AgvService.cs b/Services/AgvService.cs
index 544a88d..8a98eaf 100644
--- a/Services/AgvService.cs
+++ b/Services/AgvService.cs
@@ -1,25 +1,23 @@
 锘縰sing System;
+using System.Threading.Tasks;
 
 using HH.WCS.Mobox3.DSZSH.Consts;
 using HH.WCS.Mobox3.DSZSH.Devices;
 using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Helpers.Model;
 using HH.WCS.Mobox3.DSZSH.Models;
-using HH.WCS.Mobox3.DSZSH.Helper;
+using HH.WCS.Mobox3.DSZSH.ServiceCore;
 
 using Newtonsoft.Json;
 
 using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest;
 using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse;
-using System.Threading.Tasks;
-using HH.WCS.Mobox3.DSZSH.ServiceCore;
 
 namespace HH.WCS.Mobox3.DSZSH.Services {
     public class AgvService {
         public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) {
             var result = new ReturnResult();
             try {
-                switch (model.State) {
+                switch (model.state) {
                     case 1023:
                     case 1025:
 
@@ -35,7 +33,7 @@
                         if (!AgvTaskProcessOk(model)) {
                             // 鎵ц涓峅K锛岃鏄庢病鏈夋壘鍒颁换鍔�                             result.ResultCode = 1;
-                            result.ResultMsg = $"鏍规嵁Model.No鏈壘鍒板搴旂殑浠诲姟锛寋model.TaskNo}";
+                            result.ResultMsg = $"鏍规嵁Model.No鏈壘鍒板搴旂殑浠诲姟锛寋model.task_no}";
                             LogHelper.Info(result.ResultMsg, "API");
                             return result;
                         }
@@ -62,19 +60,19 @@
         /// <param name="model"></param>
         /// <returns></returns>
         private static bool AgvTaskProcessOk(AgvTaskState model) {
-            var TN_Task = TaskHelper.GetTask(model.TaskNo); // 鏍规嵁褰撳墠model缂栧彿鏌ヨ浠诲姟
+            var TN_Task = TaskHelper.GetTask(model.task_no); // 鏍规嵁褰撳墠model缂栧彿鏌ヨ浠诲姟
             if (TN_Task == null) { return false; }
 
-            if (model.State > 7) {
+            if (model.state > 7) {
                 //瀹夊叏璇锋眰绛�-                TaskHelper.OperateReq(model.TaskNo, model.State, model.ForkliftNo, model.ext_data);
+                TaskHelper.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data);
                 return true;
             }
 
             // AGV 浠诲姟 134562(7) 鐘舵�澶勭悊
-            switch (model.State) {
+            switch (model.state) {
                 case AgvStateCode.鎵ц:
-                    TaskHelper.Begin(TN_Task, model.ForkliftNo); // 宸叉帹閫佺殑浠诲姟鐨勭姸鎬佹敼鎴愭墽琛�+                    TaskHelper.Begin(TN_Task, model.forklift_no); // 宸叉帹閫佺殑浠诲姟鐨勭姸鎬佹敼鎴愭墽琛�                     break;
                 case AgvStateCode.寮�鍙栬揣:
                     TaskHelper.UpdateStatus(TN_Task, "寮�鍙栬揣"); // 浠诲姟鐘舵�鏀规垚寮�鍙栬揣
@@ -100,7 +98,7 @@
                 case AgvStateCode.瀹屾垚:
                     TaskHelper.End(TN_Task); // 浠诲姟鐘舵�鏀规垚缁撴潫
 
-                    if (TN_Task.S_TYPE == TaskName.鎶芥) {
+                    if (TN_Task.S_TYPE == TaskName.鎶芥_鍑哄簱) {
                         var checkCompleteTask = Task.Run(() => {
                             CheckCore.UpdateTaskState(SpotStateCode.浠诲姟鎵ц瀹屾垚);
                         });
@@ -114,7 +112,7 @@
             }
 
             // 灏咥GV鎵ц鐘舵�锛屽姞鍏N_Task_Action琛ㄤ腑
-            TaskHelper.AddActionRecord(model.TaskNo, model.State, model.ForkliftNo, model.ext_data);
+            TaskHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data);
             //璋冪敤绗笁鏂规帴鍙o紙濡傛灉鏈夛級TaskProcess.ReportStatus锛屾坊鍔犱换鍔″姩浣滃叧绯昏〃
 
             return true;
diff --git a/Services/DebugService.cs b/Services/DebugService.cs
index 71d3d88..bc72257 100644
--- a/Services/DebugService.cs
+++ b/Services/DebugService.cs
@@ -7,6 +7,7 @@
 using CsvHelper;
 using CsvHelper.Configuration;
 
+using HH.WCS.Mobox3.DSZSH.Helper;
 using HH.WCS.Mobox3.DSZSH.Helpers;
 using HH.WCS.Mobox3.DSZSH.Models;
 
@@ -53,22 +54,22 @@
             }
 
             var agvTaskState = new AgvTaskState() {
-                TaskNo = model.TaskID,
-                ForkliftNo = model.ForkliftNo,
+                task_no = model.TaskID,
+                forklift_no = model.ForkliftNo,
             };
 
             var result = new ReturnResult();
 
             // 褰撳墠鐘舵�娌℃湁杈惧埌鏈�粓鐘舵�鏃讹紝寰幆鍔犲叆杩斿洖鍒楄〃
             while (agvCurrentState != model.NextState) {
-                agvTaskState.State = agvCurrentState;
+                agvTaskState.state = agvCurrentState;
                 result = AgvService.OperateAgvTaskStatus(agvTaskState);
                 returnResults.ResultList.Add(result);
                 agvCurrentState = AgvHelper.GetNextState(agvCurrentState);
             }
 
             // 灏嗗惊鐜病鏈夊埌杈剧殑鏈�粓鐘舵�锛屼篃鍔犲叆杩斿洖鍒楄〃
-            agvTaskState.State = model.NextState;
+            agvTaskState.state = model.NextState;
             result = AgvService.OperateAgvTaskStatus(agvTaskState);
             returnResults.ResultList.Add(result);
 
@@ -80,23 +81,47 @@
         /// 鍒濆鏁版嵁搴撳缓绔�         /// </summary>
         /// <returns></returns>
-        public static string CreateDatabase() {
+        public static string CreateDatabase(bool cover = true) {
             try {
                 var db = DbHelper.GetDbClient();
 
-                //db.CodeFirst.InitTables<TN_CG_Detail>();
-                //db.CodeFirst.InitTables<TN_WorkOrder>();
-                //db.CodeFirst.InitTables<TN_CAR_IN>();
-                ////db.CodeFirst.InitTables<SYSHelper.OI_SYS_MAXID>();
-                //db.CodeFirst.InitTables<TN_Task_Action>();
-                //db.CodeFirst.InitTables<TN_Task>();
-                //db.CodeFirst.InitTables<TN_Location>();
-                //db.CodeFirst.InitTables<TN_Loc_Container>();
+                var entityTypes = new Type[] { 
+                    typeof(TN_CAR_IN),
+                    typeof(TN_CG_Detail),
+                    typeof(TN_Container),
+                    typeof(TN_Loc_Container),
+                    typeof(TN_Location),
+                    typeof(TN_Task),
+                    typeof(TN_Task_Action),
+                    typeof(SysHelper.OI_SYS_MAXID),
 
-                //db.CodeFirst.InitTables<TN_Outbound_Order>();
-                //db.CodeFirst.InitTables<TN_Outbound_Detail>();
-                //db.CodeFirst.InitTables<TN_Check_Order>();
-                db.CodeFirst.InitTables<TN_Check_Detail>();
+                    typeof(TN_Inbound_Order),
+                    typeof(TN_Check_Detail),
+                    typeof(TN_Check_Order),
+                    typeof(TN_CNTR_ITEM),
+                    typeof(TN_Outbound_Detail),
+                    typeof(TN_Outbound_Order),
+                };
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (cover) {
+                        // 鍒犻櫎鎵�湁琛紙鎸変緷璧栧叧绯诲�搴忥級
+                        var tables = db.DbMaintenance.GetTableInfoList();
+                        foreach (var table in tables.OrderByDescending(t => t.Name)) {
+                            db.DbMaintenance.DropTable(table.Name);
+                        }
+
+                        // 鍒涘缓鏂拌〃
+                        db.CodeFirst.InitTables(entityTypes);
+
+                        //db.CodeFirst.BackupTable().InitTables(entityTypes);
+                    }
+                    else {
+                        db.CodeFirst.InitTables(entityTypes);
+                    }
+
+                    tran.CommitTran();
+                }
 
             }
             catch (Exception ex) {
@@ -191,10 +216,10 @@
                         }
 
                         var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == locCntrCg.CntrCode
-                            && a.S_CG_ID == locCntrCg.CgId);
+                            && a.S_ITEM_CODE == locCntrCg.CgId);
                         if (cgDetail == null) {
                             var locList = new List<TN_CG_Detail>();
-                            locList.Add(new TN_CG_Detail { S_CNTR_CODE = locCntrCg.CntrCode, S_CG_ID = locCntrCg.CgId, S_BATCH_NO = locCntrCg.BatchNo ?? "" });
+                            locList.Add(new TN_CG_Detail { S_CNTR_CODE = locCntrCg.CntrCode, S_ITEM_CODE = locCntrCg.CgId, S_BATCH_NO = locCntrCg.BatchNo ?? "" });
                             if (db.Insertable<TN_CG_Detail>(locList).ExecuteCommand() <= 0) {
                                 tran.RollbackTran();
                                 LogHelper.Info($"鎻掑叆鎵樼洏鐗╂枡鍏崇郴{locCntrCg.CntrCode}-{locCntrCg}澶辫触");
diff --git a/Services/MoboxService.cs b/Services/MoboxService.cs
index cdc9920..8ad85b5 100644
--- a/Services/MoboxService.cs
+++ b/Services/MoboxService.cs
@@ -1,11 +1,15 @@
 锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
 
 using HH.WCS.Mobox3.DSZSH.Consts;
+using HH.WCS.Mobox3.DSZSH.Helper;
 using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Helpers.Model;
 using HH.WCS.Mobox3.DSZSH.Models;
 
 using Newtonsoft.Json;
+
+using SqlSugar;
 
 using static HH.WCS.Mobox3.DSZSH.Dtos.Request.MoboxRequest;
 using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
@@ -399,7 +403,7 @@
                         S_CG_ID = model.CgId,
                         S_ITEM_NAME = model.ItemName,
                         S_BATCH_NO = model.BatchNo,
-                        N_COUNT = model.Count,
+                        N_COUNT = model.N_QTY,
                         S_END_AREA = model.EndArea,
                     };
 
@@ -408,7 +412,7 @@
                         return BuildSimpleResult(2, "鐢熸垚 鎶芥鍗�澶辫触锛� + JsonConvert.SerializeObject(order));
                     }
 
-                    for (int i = 0; i < model.Count; i++) {
+                    for (int i = 0; i < model.N_QTY; i++) {
                         var detail = new TN_Check_Detail {
                             S_NO = model.No,
                             S_CG_ID = model.CgId,
@@ -430,6 +434,121 @@
                 return BuildSimpleEx(ex);
             }
         }
+
+        public static SimpleResult QualifiedBack(QualifiedBackInfo model) {
+            var db = DbHelper.GetDbClient();
+            try {
+
+                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 BuildSimpleResult(2, "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡");
+                }
+
+                cgDetail.N_ITEM_STATE = 0;
+                cgDetail.S_ITEM_STATE = "鍚堟牸";
+
+                // TODO 涓嶉渶瑕佽仈绔嬩笁涓〃
+                var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container>
+                    ((l, c) => l.S_CODE == c.S_LOC_CODE)
+                    .Where(ExprHelper.LocIsFree)
+                    .Select((l, c) => c)
+                    .First();
+
+                if (startLocCntrRel == null) {
+                    return BuildSimpleResult(0, "娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�);
+                }
+
+                var endLoc = db.Queryable<TN_Location>()
+                    .Where(ExprHelper.LocBelongsToArea(startLocCntrRel.S_CNTR_TYPE == "鎵樼洏" ? AreaName.婊℃墭瀛樻斁鍖�:
+                        startLocCntrRel.S_CNTR_TYPE == "濂借繍绠� ? AreaName.婊$瀛樻斁鍖�: ""))
+                    .Where(ExprHelper.LocIsFree)
+                    .Where(ExprHelper.LocIsEmpty).First();
+
+                if (endLoc == null) {
+                    return BuildSimpleResult(3, "鏌ヨ锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅");
+                }
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => 
+                        new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(4, "淇敼鐗╂枡鐘舵�涓哄悎鏍�澶辫触");
+                    }
+                    
+                    if (!TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE, 
+                        endLoc.S_CODE, TaskName.鎶芥_鍚堟牸鍥炲簱)) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(5, "鍒涘缓浠诲姟澶辫触", false);
+                    }
+
+                    tran.CommitTran();
+                }
+                return BuildSimpleResult(0, "鐗╂枡鍚堟牸鍥炲簱浠诲姟鍒涘缓鎴愬姛");
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+        public static SimpleResult UnqualifiedShift(UnqualifiedShiftInfo model) {
+            var db = DbHelper.GetDbClient();
+            try {
+
+                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 BuildSimpleResult(2, "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡");
+                }
+
+                cgDetail.N_ITEM_STATE = 2;
+                cgDetail.S_ITEM_STATE = "涓嶅悎鏍�;
+
+                // TODO 涓嶉渶瑕佽仈绔嬩笁涓〃
+                var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container>
+                    ((l, c) => l.S_CODE == c.S_LOC_CODE)
+                    .Where(ExprHelper.LocIsFree)
+                    .Select((l, c) => c)
+                    .First();
+
+                if (startLocCntrRel == null) {
+                    return BuildSimpleResult(0, "娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�);
+                }
+
+                var endLoc = db.Queryable<TN_Location>()
+                    .Where(l => l.S_AREA_CODE == model.EndArea)
+                    .Where(ExprHelper.LocIsFree)
+                    .Where(ExprHelper.LocIsEmpty).First();
+
+                if (endLoc == null) {
+                    return BuildSimpleResult(3, "鏌ヨ锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅");
+                }
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it =>
+                        new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(4, "淇敼鐗╂枡鐘舵�涓哄悎鏍�澶辫触");
+                    }
+
+                    if (!TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE,
+                        endLoc.S_CODE, TaskName.鎶芥_涓嶅悎鏍肩Щ搴�) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(5, "鍒涘缓浠诲姟澶辫触", false);
+                    }
+
+                    tran.CommitTran();
+                }
+                return BuildSimpleResult(0, "鐗╂枡涓嶅悎鏍肩Щ搴撲换鍔″垱寤烘垚鍔�);
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+
         #endregion
 
         #region Mobox 鍔熻兘
@@ -443,32 +562,28 @@
         /// <returns></returns>
         public static SimpleResult FinishedOutbound(FinishedOutboundInfo model) {
             var db = DbHelper.GetDbClient();
+            var orderNo = GenerateOrderNo("鍑哄簱鍗曞彿", "ON");
 
             try {
-                if (string.IsNullOrEmpty(model.No)) {
+                if (string.IsNullOrEmpty(orderNo)) {
                     return BuildSimpleResult(2, "鍑哄簱鍗曞彿涓嶈兘涓虹┖");
                 }
 
                 using (var tran = db.Ado.UseTran()) {
-                    var order = new TN_Outbound_Order {
-                        S_NO = model.No,
-                        S_CG_ID = model.CgId,
-                        S_BATCH_NO = model.BatchNo,
-                        S_END_AREA = model.EndArea,
-                        N_FORCE = model.Forced ? 1 : 0
-                    };
 
-                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(3, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order));
+                    var cgDetailList = SelectCgByTotalQty(model);
+
+                    if (cgDetailList.Count == 0) {
+                        return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�);
                     }
 
-                    for (int i = 0; i < model.Count; i++) {
+                    // NOTE 濡傛灉鍒涘缓order鐨勬椂鍊欏氨鎸囧畾鍏蜂綋鍑哄簱鐗╂枡鐨刢ntr锛岄偅涔堝鏋滃湪鍒涘缓浠诲姟鍓嶏紝杩欎釜鐗╂枡琚敊璇娊妫�簡鎬庝箞鍔�+                    foreach (var cgDetail in cgDetailList) {
                         var detail = new TN_Outbound_Detail {
-                            S_NO = model.No,
-                            S_CG_ID = model.CgId,
-                            S_BATCH_NO = model.BatchNo,
-                            N_FORCE = model.Forced ? 1 : 0,
+                            S_NO = orderNo,
+                            S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+                            S_BATCH_NO = cgDetail.S_BATCH_NO,
+                            S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                             S_END_AREA = model.EndArea
                         };
 
@@ -476,6 +591,20 @@
                             tran.RollbackTran();
                             return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
                         }
+                    }
+
+                    var order = new TN_Outbound_Order {
+                        S_NO = orderNo,
+                        S_ITEM_CODE = model.ItemCode,
+                        S_BATCH_NO = model.BatchNo,
+                        F_QTY = model.Qty,
+                        F_OUT_QTY = cgDetailList.Sum(a => a.F_QTY),
+                        S_END_AREA = model.EndArea
+                    };
+
+                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(5, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order));
                     }
 
                     tran.CommitTran();
@@ -494,29 +623,28 @@
         /// <returns></returns>
         public static SimpleResult FinishedOutboundForce(FinishedOutboundInfo model) {
             var db = DbHelper.GetDbClient();
+            var orderNo = GenerateOrderNo("鍑哄簱鍗曞彿", "ON");
 
             try {
-                if (string.IsNullOrEmpty(model.No)) {
+                if (string.IsNullOrEmpty(orderNo)) {
                     return BuildSimpleResult(2, "鍑哄簱鍗曞彿涓嶈兘涓虹┖");
                 }
 
                 using (var tran = db.Ado.UseTran()) {
-                    var order = new TN_Outbound_Order {
-                        S_NO = model.No,
-                        N_FORCE = model.Forced ? 1 : 0
-                    };
 
-                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(3, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order));
+                    var cgDetailList = SelectCgByTotalQty(model);
+
+                    if (cgDetailList.Count == 0) {
+                        return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�);
                     }
 
-                    for (int i = 0; i < model.Count; i++) {
+                    // NOTE 濡傛灉鍒涘缓order鐨勬椂鍊欏氨鎸囧畾鍏蜂綋鍑哄簱鐗╂枡鐨刢ntr锛岄偅涔堝鏋滃湪鍒涘缓浠诲姟鍓嶏紝杩欎釜鐗╂枡琚敊璇娊妫�簡鎬庝箞鍔�+                    foreach (var cgDetail in cgDetailList) {
                         var detail = new TN_Outbound_Detail {
-                            S_NO = model.No,
-                            S_CG_ID = model.CgId,
-                            S_BATCH_NO = model.BatchNo,
-                            N_FORCE = model.Forced ? 1 : 0,
+                            S_NO = orderNo,
+                            S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+                            S_BATCH_NO = cgDetail.S_BATCH_NO,
+                            S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                             S_END_AREA = model.EndArea
                         };
 
@@ -524,6 +652,20 @@
                             tran.RollbackTran();
                             return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
                         }
+                    }
+
+                    var order = new TN_Outbound_Order {
+                        S_NO = orderNo,
+                        S_ITEM_CODE = model.ItemCode,
+                        S_BATCH_NO = model.BatchNo,
+                        F_QTY = model.Qty,
+                        F_OUT_QTY = cgDetailList.Sum(a => a.F_QTY),
+                        S_END_AREA = model.EndArea
+                    };
+
+                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(5, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order));
                     }
 
                     tran.CommitTran();
@@ -536,6 +678,63 @@
             }
         }
 
+        public static List<TN_CG_Detail> SelectCgByTotalQty(FinishedOutboundInfo model) {
+            var db = DbHelper.GetDbClient();
+            var result = new List<TN_CG_Detail>();
+            var targetNum = model.Qty;
+
+            try {
+                var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
+                && a.F_QTY > targetNum).
+                OrderBy(a => a.F_QTY, OrderByType.Asc).First();
+                if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�+                {
+                    result.Add(targetCg);
+                    return result;
+                }
+
+                // NOTE 鏍规嵁鎬婚噺閫塪etail鏃讹紝鏄惁闇�鑰冭檻璐т綅鐨勯珮浣庯紵
+                var sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.F_QTY > 0)
+                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
+                    .Where(d => (model.ForcedOut && d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸")
+                        || (!model.ForcedOut && (d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸"
+                        || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")))
+                    .OrderBy(d => d.F_QTY, OrderByType.Desc)
+                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+
+                if (sortedMaterials.Count == 0)//娌℃湁婊¤冻鏉′欢鐨�+                {
+                    return result;
+                }
+
+                float countNum = 0;
+                foreach (var mat in sortedMaterials) {
+                    countNum += mat.F_QTY;
+                    result.Add(mat);
+                    if (countNum >= targetNum) {
+                        break;
+                    }
+                }
+                if (result.Sum(a => a.F_QTY) >= targetNum) {
+                    return result;
+                }
+                else {
+                    result.Clear();
+                    return result;
+                }
+            }
+            catch (Exception ex) {
+                throw ex;
+            }
+        }
+
+        private static string GenerateOrderNo(string snType, string prefix) {
+            var id = SysHelper.GetSerialNumber(snType, prefix);
+            var date = DateTime.Now.ToString("yyMMdd");
+            return $"ON{date}{id.ToString().PadLeft(4, '0')}";
+        }
+
         #endregion
 
     }
diff --git a/config/config.json b/config/config.json
index 04cdfe5..4436b8f 100644
--- a/config/config.json
+++ b/config/config.json
@@ -98,7 +98,13 @@
             "EndAreas": [ "HJQ1" ]
         },
         {
-            "Name": "鎶芥"
+            "Name": "鎶芥-鍑哄簱"
+        },
+        {
+            "Name": "鎶芥-鍚堟牸鍥炲簱"
+        },
+        {
+            "Name": "鎶芥-涓嶅悎鏍肩Щ搴�
         },
         {
             "Name": "鎴愬搧鑳跺嚭搴�

--
Gitblit v1.9.1