From cd195e83605f60ac51db6e0b4f0fcaeeb200768d Mon Sep 17 00:00:00 2001
From: Tjiny <Tjinyu23@163.com>
Date: 星期五, 23 五月 2025 17:21:31 +0800
Subject: [PATCH] 海成入库货位分配逻辑开发

---
 HH.WCS.Mobox3.HaiCheng/Entity/LocCntrRel.cs              |   29 ++
 HH.WCS.Mobox3.HaiCheng/Controller/Service/TaskService.cs |  104 +++++++
 HH.WCS.Mobox3.HaiCheng/config/config.json                |    2 
 HH.WCS.Mobox3.HaiCheng/Entity/Container.cs               |  133 +++++++++
 HH.WCS.Mobox3.HaiCheng/HH.WCS.Mobox3.HaiCheng.csproj     |    5 
 HH.WCS.Mobox3.HaiCheng/Util/Helper/HelperMethod.cs       |   59 ++++
 HH.WCS.Mobox3.HaiCheng/Util/Helper/LogHelper.cs          |    2 
 HH.WCS.Mobox3.HaiCheng/Entity/CntrItemDetail.cs          |  187 +++++++++++++
 HH.WCS.Mobox3.HaiCheng/Program.cs                        |    7 
 HH.WCS.Mobox3.HaiCheng/Util/Helper/AdoSqlHelper.cs       |  288 +++++++++++++++++--
 10 files changed, 775 insertions(+), 41 deletions(-)

diff --git a/HH.WCS.Mobox3.HaiCheng/Controller/Service/TaskService.cs b/HH.WCS.Mobox3.HaiCheng/Controller/Service/TaskService.cs
new file mode 100644
index 0000000..54705e5
--- /dev/null
+++ b/HH.WCS.Mobox3.HaiCheng/Controller/Service/TaskService.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HH.WCS.Mobox3.Template.Entity;
+using HH.WCS.Mobox3.Template.Util.Helper;
+
+namespace HH.WCS.Mobox3.Template.Controller.Service;
+
+/// <summary>
+/// 浠诲姟
+/// </summary>
+public static class TaskService
+{
+    /// <summary>
+    /// 鍒涘缓浣滀笟 
+    /// </summary>
+    /// <returns></returns>
+    public static void CreateTask()
+    {
+        // 1. 鏌ヨ浠诲姟鏄惁宸插垱寤�+        var operation = AdoSqlHelper<Operation>.QueryFirstByDecs(p => p.N_B_STATE == 0, p => p.T_CREATE);
+
+        if (operation == null)
+        {
+            return;
+        }
+        
+        // 浠诲姟瀛樺湪锛屾牴鎹换鍔$被鍨嬪仛涓嶅悓鐨勬搷浣�+        if (operation.N_TYPE == 1)
+        {
+            var inputLocation = InputLocation(operation.S_CNTR_CODE);
+
+            if (inputLocation == null)
+            {
+                LogHelper.Info($"褰撳墠瀹瑰櫒鏈粦瀹氱墿鏂欙紝璇锋鏌�, "鍑哄叆搴撴祦绋嬫棩蹇�);
+                return;
+            }
+
+            // 浠诲姟
+            var task = new Task()
+            {
+                // 浣滀笟缂栫爜
+                S_OP_CODE = operation.S_CODE,
+                // 浠诲姟鍙�+                S_CODE = HelperMethod.GenerateTaskNo("浠诲姟鍙�, "TA"),
+                // 浠诲姟绫诲瀷
+                N_TYPE = operation.N_TYPE,
+                // 浠诲姟绫诲瀷
+                S_TYPE = Task.GetStateType(operation.N_TYPE),
+                // 璧风偣璐т綅
+                S_START_LOC = operation.S_START_LOC,
+                // 缁堢偣璐т綅
+                S_END_LOC = inputLocation.S_CODE,
+                // 瀹瑰櫒缂栫爜
+                S_CNTR_CODE = operation.S_CNTR_CODE,
+            };
+
+            // 淇敼浣滀笟鐘舵�涓烘墽琛屼腑
+            operation.N_B_STATE = 1;
+            operation.S_B_STATE = "鎵ц";
+            operation.T_START_TIME = DateTime.Now;
+
+            var querySqlSugarClient = AdoSqlHelper<object>.QuerySqlSugarClient();
+
+            try
+            {
+                querySqlSugarClient.BeginTran();
+                AdoSqlHelper<Task>.AddFirstTran(querySqlSugarClient, task);
+                AdoSqlHelper<Operation>.UpdateFirstTran(querySqlSugarClient, operation,
+                    p => new { p.N_B_STATE, p.S_B_STATE, p.T_START_TIME });
+
+                querySqlSugarClient.CommitTran();
+            }
+            catch (Exception e)
+            {
+                if (operation.N_TYPE == 1)
+                {
+                    LogHelper.Info($"浣滀笟鍙蜂负锛歿operation.S_CODE}鐨勪换鍔″垱寤哄け璐�, "鍑哄叆搴撴祦绋嬫棩蹇�);
+                }
+                else
+                {
+                    LogHelper.Info($"浣滀笟鍙蜂负锛歿operation.S_CODE}鐨勪换鍔″垱寤哄け璐�, "鍑哄叆搴撴祦绋嬫棩蹇�);
+                }
+                querySqlSugarClient.RollbackTran();
+            }
+        }
+    }
+
+    /// <summary>
+    /// 鍏ュ簱璐т綅鍒嗛厤
+    /// </summary>
+    /// <returns></returns>
+    private static Location InputLocation(string container)
+    {
+        var cntrItemDetail = AdoSqlHelper<CntrItemDetail>.QueryFirst(p => p.S_CNTR_CODE == container);
+
+        if (cntrItemDetail == null)
+        {
+            return null;
+        }
+        
+        return AdoSqlHelper<Location>.QueryInputLocation(cntrItemDetail.S_ITEM_CODE);
+    }
+}
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HaiCheng/Entity/CntrItemDetail.cs b/HH.WCS.Mobox3.HaiCheng/Entity/CntrItemDetail.cs
new file mode 100644
index 0000000..6f2ccd1
--- /dev/null
+++ b/HH.WCS.Mobox3.HaiCheng/Entity/CntrItemDetail.cs
@@ -0,0 +1,187 @@
+using System;
+using System.ComponentModel;
+using SqlSugar;
+
+namespace HH.WCS.Mobox3.Template.Entity;
+
+/// <summary>
+/// 瀹瑰櫒璐у搧鏄庣粏
+/// </summary>
+[SugarTable("TN_CG_Detail")]
+public class CntrItemDetail : BaseModel
+{
+    /// <summary>
+    /// 瀹瑰櫒璐у搧ID
+    /// </summary>
+    public string S_CG_ID { get; set; }
+        
+    /// <summary>
+    /// 瀹瑰櫒缂栫爜
+    /// </summary>
+    public string S_CNTR_CODE { get; set; }
+
+    /// <summary>
+    ///鐩稿悓 ITEM 鍚堝苟
+    /// </summary>
+    public string C_ITEM_MERGE { get; set; } = "绌�;
+        
+    /// <summary>
+    /// 绠辨牸鍙�+    /// </summary>
+    public char S_CELL_NO { get; set; }
+        
+    /// <summary>
+    /// 璐у搧绯诲垪鍙�+    /// </summary>
+    public string S_SERIAL_NO { get; set; }
+        
+    /// <summary>
+    /// 璐у搧缂栫爜
+    /// </summary>
+    public string S_ITEM_CODE { get; set; }
+        
+    /// <summary>
+    /// 璐у搧鍚嶇О
+    /// </summary>
+    public string S_ITEM_NAME { get; set; }
+
+    /// <summary>
+    /// 璐у搧瑙勬牸
+    /// </summary>
+    public string S_ITEM_SPEC { get; set; }
+
+    /// <summary>
+    /// 璐у搧鐘舵�
+    /// </summary>
+    public string S_ITEM_STATE { get; set; } = "鍚堟牸";
+
+    /// <summary>
+    /// 璐у搧鐘舵�
+    /// </summary>
+    public int N_ITEM_STATE { get; set; }
+
+    /// <summary>
+    /// 鎵规鍙�+    /// </summary>
+    public string S_BATCH_NO { get; set; }
+
+    /// <summary>
+    /// 浣跨敤鑰�+    /// </summary>
+    public string S_END_USER { get; set; }
+
+    /// <summary>
+    /// 璐т富缂栫爜
+    /// </summary>
+    public string S_OWNER { get; set; }
+
+    /// <summary>
+    /// 渚涘簲鍟嗙紪鐮�+    /// </summary>
+    public string S_SUPPLIER_NO { get; set; }
+        
+    /// <summary>
+    /// 渚涘簲鍟嗗悕绉�+    /// </summary>
+    public string S_SUPPLIER_NAME { get; set; }
+
+    /// <summary>
+    /// 鏁伴噺
+    /// </summary>
+    public float F_QTY { get; set; }
+
+    /// <summary>
+    /// 璁¢噺鍗曚綅
+    /// </summary>
+    public string S_UOM { get; set; } = "kg";
+
+    /// <summary>
+    /// 鍒嗛厤閲�+    /// </summary>
+    public float F_ALLOC_QTY { get; set; }
+        
+    /// <summary>
+    /// 鏉ユ簮绫诲瀷
+    /// </summary>
+    public string S_BS_TYPE { get; set; }
+
+    /// <summary>
+    /// 鏉ユ簮鍗曞彿
+    /// </summary>
+    public string S_BS_NO { get; set; }
+
+    /// <summary>
+    /// 鏉ユ簮鍗曡鍙�+    /// </summary>
+    public int N_BS_ROW_NO { get; set; }
+
+    /// <summary>
+    /// 鐢熶骇鏃ユ湡
+    /// </summary>
+    public string D_PRD_DATE { get; set; }
+        
+    /// <summary>
+    /// 杩囨湡鏃ユ湡
+    /// </summary>
+    public string D_EXP_DATE { get; set; }
+        
+    /// <summary>
+    /// 浣撶Н
+    /// </summary>
+    public float F_VOLUME { get; set; }
+
+    /// <summary>
+    /// 閲嶉噺
+    /// </summary>
+    public float F_WEIGHT { get; set; }
+
+    /// <summary>
+    /// 鍏ュ簱鏃堕棿
+    /// </summary>
+    public DateTime T_INBOUND_TIME { get; set; }
+
+    /// <summary>
+    /// ERP浠撳簱
+    /// </summary>
+    public string S_ERP_WH_CODE { get; set; }
+
+    /// <summary>
+    /// 鎵╁睍灞炴�1
+    /// </summary>
+    public string S_EXT_ATTR1 { get; set; }
+        
+    /// <summary>
+    /// 鎵╁睍灞炴�2
+    /// </summary>
+    public string S_EXT_ATTR2 { get; set; }
+        
+    /// <summary>
+    /// 鎵╁睍灞炴�3
+    /// </summary>
+    public string S_EXT_ATTR3 { get; set; }
+        
+    /// <summary>
+    /// 鎵╁睍灞炴�4
+    /// </summary>
+    public string S_EXT_ATTR4 { get; set; }
+        
+    /// <summary>
+    /// 鎵╁睍灞炴�5
+    /// </summary>
+    public string S_EXT_ATTR5 { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍏ュ簱锛�锛氶粯璁ゆ湭鍏ュ簱锛�锛氬叆搴擄級
+    /// </summary>
+    public int N_ALR_ENTR { get; set; } = 1;
+
+    /// <summary>
+    /// 鍦板潃鐮�+    /// </summary>
+    public string S_ADDRESS_CODE { get; set; }
+
+    /// <summary>
+    /// 浠撳簱缂栫爜
+    /// </summary>
+    public string S_WH_CODE { get; set; }
+}
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HaiCheng/Entity/Container.cs b/HH.WCS.Mobox3.HaiCheng/Entity/Container.cs
new file mode 100644
index 0000000..4bdcbfa
--- /dev/null
+++ b/HH.WCS.Mobox3.HaiCheng/Entity/Container.cs
@@ -0,0 +1,133 @@
+using System.Collections.Generic;
+using SqlSugar;
+
+namespace HH.WCS.Mobox3.Template.Entity;
+
+/// <summary>
+/// 瀹瑰櫒妯″瀷
+/// </summary>
+[SugarTable("TN_Container")]
+public class Container : BaseModel 
+{
+    /// <summary>
+    /// 瀹瑰櫒缂栫爜
+    /// </summary>
+    public string S_CODE { get; set; }
+
+    /// <summary>
+    /// 瀹瑰櫒绫诲瀷
+    /// </summary>
+    public string S_TYPE { get; set; }
+
+    /// <summary>
+    /// 瀹瑰櫒绫诲瀷
+    /// </summary>
+    public int N_TYPE { get; set; }
+        
+    /// <summary>
+    /// 瀹瑰櫒瑙勬牸
+    /// </summary>
+    public string S_SPEC { get; set; }
+
+    /// <summary>
+    /// 鑷噸
+    /// </summary>
+    public float F_WEIGHT { get; set; }
+
+    /// <summary>
+    /// 璐у搧閲嶉噺
+    /// </summary>
+    public float F_GOOD_WEIGHT { get; set; }
+
+    /// <summary>
+    /// 鎵块噸
+    /// </summary>
+    public float F_MAX_WEIGHT { get; set; }
+
+    /// <summary>
+    /// 闀�+    /// </summary>
+    //public float F_LENGTH { get; set; }
+        
+    /// <summary>
+    /// 瀹�+    /// </summary>
+    //public float F_WIDTH { get; set; }
+        
+    /// <summary>
+    /// 楂�+    /// </summary>
+    //public float F_HEIGHT { get; set; }
+
+    /// <summary>
+    /// 鏄惁涓鸿櫄鎷熷鍣�+    /// </summary>
+    public char C_IS_VIRTUAL { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍙敤
+    /// </summary>
+    public char C_ENABLE { get; set; } = 'Y';
+
+    /// <summary>
+    /// 瀹瑰櫒鏄庣粏鏉℃暟
+    /// </summary>
+    public int N_DETAIL_COUNT { get; set; }
+        
+    /// <summary>
+    /// 瀹瑰櫒涓氬姟鐘舵�锛�锛氱┖闂诧紝1锛氬叆搴撲腑锛�锛氬嚭搴撲腑锛�+    /// </summary>
+    public int N_B_STATE { get; set; }
+
+    /// <summary>
+    /// 閿佸畾涓氬姟鍙�+    /// </summary>
+    public string S_LOCK_OP_CODE { get; set; }
+
+    /// <summary>
+    /// 鏈�ぇ浣撶Н
+    /// </summary>
+    public float F_MAX_VOLUME { get; set; }
+
+    /// <summary>
+    /// 璐у搧浣撶Н
+    /// </summary>
+    public float F_GOOD_VOLUME { get; set; }
+
+    /// <summary>
+    /// 绌烘弧鐘舵�
+    /// </summary>
+    //public int N_EMPTY_FULL { get; set; }
+
+    /// <summary>
+    /// 鏈�ぇ鏂欐牸鏁伴噺
+    /// </summary>
+    //public int N_MAX_CELL_NUM { get; set; }
+        
+    /// <summary>
+    /// 绌烘枡鏍兼暟閲�+    /// </summary>
+    //public int N_EMPTY_CELL_NUM { get; set; }
+
+    /// <summary>
+    /// 寮哄埗缃弧
+    /// </summary>
+    //public char C_FORCED_FILL { get; set; }
+
+    /// <summary>
+    /// 閿佺姸鎬侊紙0锛氭棤锛�锛氬叆搴撻攣锛�锛氬嚭搴撻攣锛�+    /// </summary>
+    public string S_LOCK_STATE { get; set; }
+
+    /// <summary>
+    /// 閿佺姸鎬侊紙0锛氭棤锛�锛氬叆搴撻攣锛�锛氬嚭搴撻攣锛�+    /// </summary>
+    public int N_LOCK_STATE { get; set; }
+        
+    /// <summary>
+    /// 瀹瑰櫒璐у搧鏄庣粏鍏宠仈
+    /// </summary>
+    [SugarColumn(IsIgnore = true)]
+    [Navigate(NavigateType.OneToMany, nameof(CntrItemDetail.S_CNTR_CODE), nameof(S_CODE))]
+    public List<CntrItemDetail> CntrItemRels { get; set; }
+}
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HaiCheng/Entity/LocCntrRel.cs b/HH.WCS.Mobox3.HaiCheng/Entity/LocCntrRel.cs
new file mode 100644
index 0000000..69bead6
--- /dev/null
+++ b/HH.WCS.Mobox3.HaiCheng/Entity/LocCntrRel.cs
@@ -0,0 +1,29 @@
+using System.Collections.Generic;
+using SqlSugar;
+
+namespace HH.WCS.Mobox3.Template.Entity;
+
+/// <summary>
+/// 锟斤拷位锟斤拷锟斤拷
+/// </summary>
+[SugarTable("TN_Loc_Container")]
+public class LocCntrRel : BaseModel
+{
+    /// <summary>
+    /// 锟斤拷位锟斤拷锟斤拷
+    /// </summary>
+    [SugarColumn(IsPrimaryKey = true)]
+    public string S_LOC_CODE { get; set; }
+        
+    /// <summary>
+    /// 锟斤拷锟斤拷锟斤拷锟斤拷
+    /// </summary>
+    public string S_CNTR_CODE { get; set; }
+        
+    /// <summary>
+    /// 锟斤拷锟斤拷锟斤拷位锟斤拷细锟斤拷锟斤拷
+    /// </summary>
+    [SugarColumn(IsIgnore = true)]
+    [Navigate(NavigateType.OneToMany, nameof(S_CNTR_CODE))]
+    public List<CntrItemDetail> CntrItemRels { get; set; }
+}
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HaiCheng/HH.WCS.Mobox3.HaiCheng.csproj b/HH.WCS.Mobox3.HaiCheng/HH.WCS.Mobox3.HaiCheng.csproj
index 14e5943..32805a5 100644
--- a/HH.WCS.Mobox3.HaiCheng/HH.WCS.Mobox3.HaiCheng.csproj
+++ b/HH.WCS.Mobox3.HaiCheng/HH.WCS.Mobox3.HaiCheng.csproj
@@ -142,8 +142,11 @@
     <Compile Include="Controller\FourWayCarController.cs" />
     <Compile Include="Controller\Service\FourWayCarService.cs" />
     <Compile Include="Controller\Service\OperationService.cs" />
+    <Compile Include="Controller\Service\TaskService.cs" />
     <Compile Include="Controller\Service\ThirdPartyService.cs" />
     <Compile Include="Entity\BaseModel.cs" />
+    <Compile Include="Entity\CntrItemDetail.cs" />
+    <Compile Include="Entity\Container.cs" />
     <Compile Include="Entity\Dto\ContainerDto.cs" />
     <Compile Include="Entity\Dto\ConveyorlinesInfoDto.cs" />
     <Compile Include="Entity\Dto\FourWayCarCommanDto.cs" />
@@ -152,6 +155,7 @@
     <Compile Include="Entity\Dto\LineTaskDto.cs" />
     <Compile Include="Entity\Dto\ResultDto.cs" />
     <Compile Include="Entity\Location.cs" />
+    <Compile Include="Entity\LocCntrRel.cs" />
     <Compile Include="Entity\Operation.cs" />
     <Compile Include="Entity\Task.cs" />
     <Compile Include="Procss\ThreadTask.cs" />
@@ -166,6 +170,7 @@
     <Compile Include="Util\EquipmentCommunication\TcpClient.cs" />
     <Compile Include="Util\EquipmentCommunication\TcpServer.cs" />
     <Compile Include="Util\Helper\AdoSqlHelper.cs" />
+    <Compile Include="Util\Helper\HelperMethod.cs" />
     <Compile Include="Util\Helper\HttpHelper.cs" />
     <Compile Include="Util\Helper\LogHelper.cs" />
     <Compile Include="Util\Helper\NdcHelper.cs" />
diff --git a/HH.WCS.Mobox3.HaiCheng/Program.cs b/HH.WCS.Mobox3.HaiCheng/Program.cs
index 94e0a47..6f14a08 100644
--- a/HH.WCS.Mobox3.HaiCheng/Program.cs
+++ b/HH.WCS.Mobox3.HaiCheng/Program.cs
@@ -30,8 +30,10 @@
             StartTcp();
 
             //3.0 寮�惎绾跨▼
-            var rc = HostFactory.Run(x => {
-                x.Service<WorkThread>(s => {
+            var rc = HostFactory.Run(x => 
+            {
+                x.Service<WorkThread>(s => 
+                {
                     s.ConstructUsing(name => new WorkThread());
                     s.WhenStarted(tc => tc.Start());
                     s.WhenStopped(tc => tc.Stop());
@@ -131,6 +133,7 @@
                         Thread.Sleep(4000);
                     }
                 });
+                
                 return task;
             }
         }
diff --git a/HH.WCS.Mobox3.HaiCheng/Util/Helper/AdoSqlHelper.cs b/HH.WCS.Mobox3.HaiCheng/Util/Helper/AdoSqlHelper.cs
index c58034c..7d91874 100644
--- a/HH.WCS.Mobox3.HaiCheng/Util/Helper/AdoSqlHelper.cs
+++ b/HH.WCS.Mobox3.HaiCheng/Util/Helper/AdoSqlHelper.cs
@@ -1,6 +1,9 @@
 锘縰sing System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Linq.Expressions;
+using HH.WCS.Mobox3.Template.Entity;
+using SqlSugar;
 
 namespace HH.WCS.Mobox3.Template.Util.Helper
 {
@@ -14,14 +17,14 @@
         /// </summary>
         /// <param name="condition">鏉′欢</param>
         /// <returns></returns>
-        public static T QueryFirst(Expression<Func<T,bool>> condition)
+        public static T QueryFirst(Expression<Func<T, bool>> condition)
         {
             var db = new SqlHelper<object>().GetInstance();
-            
+
             // 杩斿洖鏁版嵁
             return db.Queryable<T>().First(condition);
         }
-        
+
         /// <summary>
         /// 鏍规嵁鏉′欢鏌ヨ澶氭潯鏁版嵁
         /// </summary>
@@ -29,7 +32,7 @@
         public static List<T> QueryList(Expression<Func<T, bool>> condition)
         {
             var db = new SqlHelper<object>().GetInstance();
-            
+
             // 杩斿洖鏁版嵁
             return db.Queryable<T>().Where(condition).ToList();
         }
@@ -39,11 +42,34 @@
         /// </summary>
         /// <param name="condition">鏉′欢</param>
         /// <returns></returns>
-        public static int QueryCount(Expression<Func<T,bool>> condition)
+        public static int QueryCount(Expression<Func<T, bool>> condition)
         {
             var db = new SqlHelper<object>().GetInstance();
+
             // 杩斿洖鏁版嵁
             return db.Queryable<T>().Count(condition);
+        }
+
+        /// <summary>
+        /// 鏍规嵁鏉′欢淇敼涓�潯鏁版嵁锛堜簨鍔★級
+        /// </summary>
+        /// <param name="sqlSugarClient">鏁版嵁搴撲笂涓嬫枃杩炴帴</param>
+        /// <param name="model">闇�杩涜淇敼鐨勫璞�/param>
+        /// <param name="condition">淇敼鏉′欢</param>
+        /// <returns></returns>
+        public static bool UpdateFirstTran(SqlSugarClient sqlSugarClient, T model, Expression<Func<T, object>> condition)
+        {
+            // 淇敼鏁版嵁
+            var executeCommand = sqlSugarClient.Updateable(model).UpdateColumns(condition).ExecuteCommand();
+
+            if (executeCommand > 0)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
         }
 
         /// <summary>
@@ -54,17 +80,56 @@
         /// <returns></returns>
         public static bool UpdateFirst(T model, Expression<Func<T, object>> condition)
         {
-            var db = new SqlHelper<object>().GetInstance();
-            
+            var sqlSugarClient = new SqlHelper<object>().GetInstance();
+
             // 淇敼鏁版嵁
-            var executeCommand = db.Updateable(model).UpdateColumns(condition).ExecuteCommand();
+            var executeCommand = sqlSugarClient.Updateable(model).UpdateColumns(condition).ExecuteCommand();
 
             if (executeCommand > 0)
             {
                 return true;
             }
             else
+            {
                 return false;
+            }
+        }
+    
+        /// <summary>
+        /// 鏍规嵁鏉′欢淇敼涓�潯鏁版嵁鐨勭姸鎬�sql璇彞)
+        /// </summary>
+        /// <param name="model">闇�杩涜淇敼鐨勫璞�/param>
+        /// <param name="sql">淇敼鏉′欢</param>
+        /// <returns></returns>
+        public static bool UpdateFirstOutBoundStart(T model, string sql)
+        {
+            var sqlSugarClient = new SqlHelper<object>().GetInstance();
+
+            // 淇敼鏁版嵁
+            var executeCommand = sqlSugarClient.Ado.ExecuteCommand(sql, model);
+
+            if (executeCommand > 0)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁鏉′欢淇敼澶氭潯鏁版嵁锛堜簨鍔★級
+        /// </summary>
+        /// <param name="sqlSugarClient">鏁版嵁搴撲笂涓嬫枃杩炴帴</param>
+        /// <param name="models"></param>
+        /// <param name="condition"></param>
+        /// <returns></returns>
+        public static int UpdateListTran(SqlSugarClient sqlSugarClient, List<T> models,
+            Expression<Func<T, object>> condition)
+        {
+            // 淇敼鏁版嵁
+            return sqlSugarClient.Updateable(models).UpdateColumns(condition).ExecuteCommand();
         }
 
         /// <summary>
@@ -75,84 +140,168 @@
         /// <returns></returns>
         public static int UpdateList(List<T> models, Expression<Func<T, object>> condition)
         {
-            var db = new SqlHelper<object>().GetInstance();
-            
+            var sqlSugarClient = new SqlHelper<object>().GetInstance();
             // 淇敼鏁版嵁
-            return db.Updateable(models).UpdateColumns(condition).ExecuteCommand();
+            return sqlSugarClient.Updateable(models).UpdateColumns(condition).ExecuteCommand();
         }
 
         /// <summary>
-        /// 鏂板涓�潯鏁版嵁
+        /// 鏂板涓�潯鏁版嵁锛堜簨鍔★級
         /// </summary>
-        /// <param name="model"></param>
+        /// <param name="sqlSugarClient">鏁版嵁搴撲笂涓嬫枃杩炴帴</param>
+        /// <param name="model">闇�鏂板鐨勬暟鎹�/param>
+        /// <returns></returns>
+        public static bool AddFirstTran(SqlSugarClient sqlSugarClient, T model)
+        {
+            var executeCommand = sqlSugarClient.Insertable(model).ExecuteCommand();
+
+            if (executeCommand > 0)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 鏂板涓�潯鏁版嵁锛堜簨鍔★級
+        /// </summary>
+        /// <param name="model">闇�鏂板鐨勬暟鎹�/param>
         /// <returns></returns>
         public static bool AddFirst(T model)
         {
-            var db = new SqlHelper<object>().GetInstance();
+            var sqlSugarClient = new SqlHelper<object>().GetInstance();
 
-            var executeCommand = db.Insertable(model).ExecuteCommand();
-            
+            var executeCommand = sqlSugarClient.Insertable(model).ExecuteCommand();
+
             if (executeCommand > 0)
+            {
                 return true;
+            }
             else
+            {
                 return false;
+            }
         }
-        
+
+
+        /// <summary>
+        /// 鏂板澶氭潯鏁版嵁锛堜簨鍔★級
+        /// </summary>
+        /// <param name="sqlSugarClient">鏁版嵁搴撲笂涓嬫枃杩炴帴</param>
+        /// <param name="models">闇�鏂板鐨勬暟鎹泦鍚�/param>
+        /// <returns></returns>
+        public static int AddListTran(SqlSugarClient sqlSugarClient, List<T> models)
+        {
+            return sqlSugarClient.Insertable(models).ExecuteCommand();
+        }
+
         /// <summary>
         /// 鏂板澶氭潯鏁版嵁
         /// </summary>
-        /// <param name="models"></param>
+        /// <param name="models">闇�鏂板鐨勬暟鎹泦鍚�/param>
         /// <returns></returns>
         public static int AddList(List<T> models)
         {
-            var db = new SqlHelper<object>().GetInstance();
-
-            var executeCommand = db.Insertable(models).ExecuteCommand();
-        
-            return executeCommand;
+            var sqlSugarClient = new SqlHelper<object>().GetInstance();
+            return sqlSugarClient.Insertable(models).ExecuteCommand();
         }
-        
+
         /// <summary>
-        /// 鍒犻櫎涓�潯鏁版嵁
+        /// 鍒犻櫎涓�潯鏁版嵁锛堜簨鍔★級
+        /// </summary>
+        /// <param name="sqlSugarClient">鏁版嵁搴撲笂涓嬫枃杩炴帴</param>
+        /// <param name="model">闇�鍒犻櫎鐨勫璞�/param>
+        /// <returns></returns>
+        public static bool DeleteFirstTran(SqlSugarClient sqlSugarClient, T model)
+        {
+            var executeCommand = sqlSugarClient.Deleteable(model).ExecuteCommand();
+
+            if (executeCommand > 0)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 鍒犻櫎涓�潯鏁版嵁锛堜簨鍔★級
         /// </summary>
         /// <param name="model">闇�鍒犻櫎鐨勫璞�/param>
         /// <returns></returns>
         public static bool DeleteFirst(T model)
         {
-            var db = new SqlHelper<object>().GetInstance();
+            var sqlSugarClient = new SqlHelper<object>().GetInstance();
 
-            var executeCommand = db.Deleteable(model).ExecuteCommand();
+            var executeCommand = sqlSugarClient.Deleteable(model).ExecuteCommand();
 
             if (executeCommand > 0)
+            {
                 return true;
+            }
             else
+            {
                 return false;
+            }
         }
-        
+
         /// <summary>
-        /// 鍒犻櫎澶氭潯鏁版嵁
+        /// 鍒犻櫎澶氭潯鏁版嵁锛堜簨鍔★級
+        /// </summary>
+        /// <param name="sqlSugarClient">鏁版嵁搴撲笂涓嬫枃杩炴帴</param>
+        /// <param name="models">闇�鍒犻櫎鐨勫璞¢泦鍚�/param>
+        /// <returns></returns>
+        public static int DeleteListTran(SqlSugarClient sqlSugarClient, List<T> models)
+        {
+            return sqlSugarClient.Deleteable(models).ExecuteCommand();
+        }
+
+        /// <summary>
+        /// 鍒犻櫎澶氭潯鏁版嵁锛堜簨鍔★級
         /// </summary>
         /// <param name="models">闇�鍒犻櫎鐨勫璞¢泦鍚�/param>
         /// <returns></returns>
         public static int DeleteList(List<T> models)
         {
-            var db = new SqlHelper<object>().GetInstance();
-
-            return db.Deleteable(models).ExecuteCommand();
+            var sqlSugarClient = new SqlHelper<object>().GetInstance();
+            return sqlSugarClient.Deleteable(models).ExecuteCommand();
         }
-        
+
         /// <summary>
-        /// 鏍规嵁鏉′欢鍒犻櫎鏁版嵁
+        /// 鏍规嵁鏉′欢鍒犻櫎鏁版嵁锛堜簨鍔★級
+        /// </summary>
+        /// <param name="sqlSugarClient">鏁版嵁搴撲笂涓嬫枃杩炴帴</param>
+        /// <param name="condition">鏉′欢</param>
+        /// <returns></returns>
+        public static int DeleteListTran(SqlSugarClient sqlSugarClient, Expression<Func<T, bool>> condition)
+        {
+            return sqlSugarClient.Deleteable<T>().Where(condition).ExecuteCommand();
+        }
+
+        /// <summary>
+        /// 鏍规嵁鏉′欢鍒犻櫎鏁版嵁锛堜簨鍔★級
         /// </summary>
         /// <param name="condition">鏉′欢</param>
         /// <returns></returns>
         public static int DeleteList(Expression<Func<T, bool>> condition)
         {
-            var db = new SqlHelper<object>().GetInstance();
-
-            return db.Deleteable<T>().Where(condition).ExecuteCommand();
+            var sqlSugarClient = new SqlHelper<object>().GetInstance();
+            return sqlSugarClient.Deleteable<T>().Where(condition).ExecuteCommand();
         }
 
+        /// <summary>
+        /// 鑾峰彇鏁版嵁搴撲笂涓嬫枃杩炴帴
+        /// </summary>
+        /// <returns></returns>
+        public static SqlSugarClient QuerySqlSugarClient()
+        {
+            return new SqlHelper<object>().GetInstance();
+        }
 
         /// <summary>
         /// 鎸夌収鏃堕棿鍊掑簭鏌ヨ
@@ -167,5 +316,70 @@
             // 杩斿洖鏁版嵁
             return db.Queryable<T>().OrderByDescending(orderBy).First(condition);
         }
+
+
+        #region 鐗瑰畾鏌ヨ
+
+        /// <summary>
+        /// 鍒嗛厤鍏ュ簱璐т綅
+        /// </summary>
+        /// <returns></returns>
+        public static Location QueryInputLocation(string itemCode)
+        {
+            var areaCodeList = new List<string>
+            {
+                "1","2","3","4"
+            };   
+            
+            var db = new SqlHelper<object>().GetInstance();
+
+            var listMaxCol = db.Queryable<Location>()
+                .LeftJoin<LocCntrRel>((l, lc) => l.S_CODE == lc.S_LOC_CODE)
+                .LeftJoin<CntrItemDetail>((l, lc, ci) => lc.S_CNTR_CODE == ci.S_CNTR_CODE)
+                .Where((l, lc, ci) => l.N_CURRENT_NUM > 0
+                                      && areaCodeList.Contains(l.S_GROUP)
+                                      && ci.S_ITEM_CODE == itemCode)
+                .OrderByDescending((l, lc, ci) => l.N_COL)
+                .Take(1)
+                .PartitionBy((l, lc, ci) => new { l.S_GROUP, l.N_ROW })
+                .ToList();
+
+            
+            // 鏈夊悓绉嶇墿鏂欐墍鍗犳嵁鐨勬帓
+            if (listMaxCol.Count > 0)
+            {
+                foreach (var item in listMaxCol)
+                {
+                    //鎺掓湁閿佷篃鎺掗櫎锛堥攣琛ㄧず鍚庨潰鍙兘瑕佹敼锛�+                    if (db.Queryable<Location>().Count(a =>
+                            a.S_GROUP == item.S_GROUP && a.N_ROW == item.N_ROW && a.N_LOCK_STATE != 0) > 0)
+                    {
+                        continue;
+                    }
+                    
+                    // 娌¢攣
+                    var end = db.Queryable<Location>().OrderBy(a => a.N_COL).Where(a =>
+                        a.S_GROUP == item.S_GROUP && a.N_ROW == item.N_ROW &&
+                        a.N_CURRENT_NUM == 0 &&
+                        a.N_COL >= item.N_COL).First();
+                    
+                    if (end != null)
+                    {
+                        return end;
+                    }
+                }
+            }
+            
+            Location location = db.Queryable<Location>().OrderBy(a => a.S_GROUP).First(p => p.N_COL == 1 && p.N_LOCK_STATE == 0);
+
+            if (location != null)
+            {
+                return location;
+            }
+
+            return null;
+        }
+
+        #endregion
     }
 }
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HaiCheng/Util/Helper/HelperMethod.cs b/HH.WCS.Mobox3.HaiCheng/Util/Helper/HelperMethod.cs
new file mode 100644
index 0000000..88b181b
--- /dev/null
+++ b/HH.WCS.Mobox3.HaiCheng/Util/Helper/HelperMethod.cs
@@ -0,0 +1,59 @@
+锘縰sing System;
+using HH.WCS.Mobox3.Template.Entity.Dto;
+using Newtonsoft.Json;
+
+namespace HH.WCS.Mobox3.Template.Util.Helper;
+
+/// <summary>
+/// 鏂规硶甯姪绫�+/// </summary>
+public static class HelperMethod
+{
+    /// <summary>
+    /// Http甯姪绫�+    /// </summary>
+    private static readonly HttpHelper apiHelper = new HttpHelper();
+
+    /// <summary>
+    /// 鍒涘缓搴忓垪鍙�+    /// </summary>
+    /// <param name="snType">搴忓垪鍙风被鍨�/param>
+    /// <param name="prefix">搴忓垪鍙峰墠缂�/param>
+    /// <returns></returns>
+    internal static string GenerateTaskNo(string snType, string prefix)
+    {
+        var date = DateTime.Now.ToString("yyMMdd");
+        var id = SYSHelper.GetSerialNumber(snType, prefix + date);
+        return $"{prefix}{date}{id.ToString().PadLeft(4, '0')}";
+    }
+
+    /// <summary>
+    /// 鏍规嵁鑾峰彇鍒扮殑浠诲姟鍙疯浆鎹负浠诲姟琛ㄤ腑鐨勬暟鎹�+    /// </summary>
+    /// <param name="TaskNo"></param>
+    /// <returns></returns>
+    public static string GetTask(string TaskNo)
+    {
+        string taskNo = "";
+
+        taskNo = "TN" + DateTime.Now.Year.ToString().Substring(2, 2) + TaskNo.PadLeft(8, '0');
+
+        return taskNo;
+    }
+
+    /// <summary>
+    /// 鎸夌収鍥哄畾鏍煎紡鏂板浠诲姟鍙�+    /// </summary>
+    /// <returns></returns>
+    public static string GetTaskNo()
+    {
+        string dateString = "";
+        // 鑾峰彇褰撳墠鏃堕棿
+        DateTime currentTime = DateTime.Now;
+
+        // 灏嗘棩鏈熸牸寮忓寲涓哄瓧绗︿覆
+        dateString = currentTime.ToString("yyyy-MM-dd").Replace("-", "").Substring(2);
+
+        return dateString;
+    }
+}
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HaiCheng/Util/Helper/LogHelper.cs b/HH.WCS.Mobox3.HaiCheng/Util/Helper/LogHelper.cs
index 6b6176d..3a40243 100644
--- a/HH.WCS.Mobox3.HaiCheng/Util/Helper/LogHelper.cs
+++ b/HH.WCS.Mobox3.HaiCheng/Util/Helper/LogHelper.cs
@@ -82,7 +82,7 @@
         /// 閫氳繃閰嶇疆鏂囦欢閰嶇疆鏃ュ織
         /// </summary>
         static LogFactory() {
-            var loggerNames = new List<string>() { "鍥涘悜杞﹀拰WCS鎺ュ彛浜や簰" };
+            var loggerNames = new List<string>() { "鍥涘悜杞﹀拰WCS鎺ュ彛浜や簰", "鍑哄叆搴撴祦绋嬫棩蹇� };
             LogManager.Configuration = DefaultConfig(loggerNames);
         }
         
diff --git a/HH.WCS.Mobox3.HaiCheng/config/config.json b/HH.WCS.Mobox3.HaiCheng/config/config.json
index 8dbbd69..d237ecf 100644
--- a/HH.WCS.Mobox3.HaiCheng/config/config.json
+++ b/HH.WCS.Mobox3.HaiCheng/config/config.json
@@ -1,7 +1,7 @@
 {
   "HostToAgvServerUrl": "http://172.16.10.41:9988/HostToAGV.cgi",
   "HASeverUrl": "http://172.16.10.41",
-  "SqlServer": "Data Source=172.16.10.41;Initial Catalog=OIMobox;User ID=sa;Password=X07pLI2Z",
+  "SqlServer": "Data Source=TJY\\SQLEXPRESS;Initial Catalog=OIMobox;User ID=sa;Password=1234",
   "ApiPort": 8901,
   "WMSBaseUrl": "http://172.16.10.41",
   "FourWayCarBaseUrl": "http://172.16.10.41:3000",

--
Gitblit v1.9.1