From b079910e5de15863c26e479ffab15cc45d706f1a Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期一, 19 五月 2025 16:25:22 +0800
Subject: [PATCH] 测试修复轮询出库、抽检流程的问题

---
 Services/MoboxService.cs |  786 ++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 589 insertions(+), 197 deletions(-)

diff --git a/Services/MoboxService.cs b/Services/MoboxService.cs
index 0fe26c0..1e82ed8 100644
--- a/Services/MoboxService.cs
+++ b/Services/MoboxService.cs
@@ -1,57 +1,22 @@
 锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
 
 using HH.WCS.Mobox3.DSZSH.Consts;
+using HH.WCS.Mobox3.DSZSH.Dispatch;
+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;
-using static HH.WCS.Mobox3.DSZSH.Helpers.ResultHelper;
 
 namespace HH.WCS.Mobox3.DSZSH.Services {
     public class MoboxService {
-
-        #region 妯℃澘鍔熻兘
-        public static SimpleResult BaseBound(StartCntEndInfo model) {
-            var taskName = ""; // 鐢ㄤ簬鐢熸垚浠诲姟绫诲瀷銆佹墦鍗版棩蹇椾俊鎭�-            var db = DbHelper.GetDbClient();
-
-            try {
-                var startLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.StartLoc))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty.Negate()).First();
-
-                if (startLoc == null) {
-                    return BuildSimpleResult(2, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
-                }
-
-                var locCntrRel = db.Queryable<TN_Loc_Container>()
-                    .Where(ExprHelper.LocCntrIsBind(startLoc.S_CODE, model.CntId)).First();
-
-                if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{startLoc.S_CODE}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}'");
-                }
-
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.EndLoc))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 '{model.EndLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
-                }
-
-                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-        #endregion
 
         #region PDA 鍔熻兘
         /// <summary>
@@ -65,170 +30,185 @@
             var db = DbHelper.GetDbClient();
 
             try {
-                // TODO 灏哖DA鎻愪緵鐨勭墿鏂欑紪鐮佷笌璐存爣鏈虹殑淇℃伅姣斿
+                // 灏哖DA鎻愪緵鐨勭墿鏂欑紪鐮佷笌璐存爣鏈虹殑淇℃伅姣斿
+                var cgDetail = db.Queryable<TN_CG_Detail>()
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo) // 鎸囧畾锛氱墿鏂欑紪鐮併�鎵规鍙�+                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮") // NOTE 鍐椾綑妫�煡锛氱墿鏂欑姸鎬佸簲璇ヤ负 1寰呮
+                    .First();
 
-                var startLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.StartLoc))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty.Negate()).First();
-
-                if (startLoc == null) {
-                    return BuildSimpleResult(2, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
+                if (cgDetail == null) {
+                    return BuildSimpleResult(2, $"PDA鎵爜鐗╂枡淇℃伅涓庤创鏍囨満浼犻�鐨勪俊鎭笉涓�嚧锛� + JsonConvert.SerializeObject(model));
                 }
 
-                // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�-                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
-                    a => a.S_LOC_CODE == model.StartLoc
-                    && a.S_CNTR_CODE == model.CntId);
-                if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}' 锛屾棤鍙嚭搴撶殑鐗╂枡");
+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(ExprHelper.LocCode(model.StartLoc)) // 鎸囧畾锛氳捣鐐硅揣浣�+                    .Where(ExprHelper.LocIsFree)
+                    //.Where(ExprHelper.LocIsEmpty)
+                    .First();
+
+                if (startLoc == null) {
+                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
+                }
+
+                // 缁戝畾璐т綅鍜屽鍣ㄥ彿
+                var locCntrRel = new TN_Loc_Container {
+                    S_LOC_CODE = model.StartLoc,
+                    S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                    S_CNTR_TYPE = "濂借繍绠�,
+                };
+
+                if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
+                    return BuildSimpleResult(4, $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴澶辫触锛� + JsonConvert.SerializeObject(locCntrRel));
                 }
 
                 // TODO 婊$鍏ュ簱绠楁硶寰呬紭鍖�                 var endLoc = db.Queryable<TN_Location>()
                     .Where(ExprHelper.LocBelongsToArea(AreaName.婊$瀛樻斁鍖�)
                     .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsFree)
+                    .Where(ExprHelper.LocIsEmpty)
                     .OrderBy(l => l.N_LAYER)
                     .OrderBy(l => l.S_AREA_CODE).First();
 
                 if (endLoc == null) {
-                    return BuildSimpleResult(4, "婊$鍏ュ簱鏆傛椂娌℃湁鍚堥�鐨勮揣浣嶅彲浠ュ叆搴�);
+                    return BuildSimpleResult(5, "婊$鍏ュ簱鏆傛椂娌℃湁鍚堥�鐨勮揣浣嶅彲浠ュ叆搴�);
                 }
 
-                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
+                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName, failCode: 6);
             }
             catch (Exception ex) {
                 return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
             }
         }
 
-        /// <summary>
-        /// 绌烘墭鐩樼粦瀹�PDA)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult EmptyBindPallet(EmptyBindInfo model) {
-            var db = DbHelper.GetDbClient();
+        ///// <summary>
+        ///// 绌烘墭鐩樼粦瀹�PDA)
+        ///// </summary>
+        ///// <param name="model"></param>
+        ///// <returns></returns>
+        //public static SimpleResult EmptyBindPallet(EmptyBindInfo model) {
+        //    var db = DbHelper.GetDbClient();
 
-            try {
-                var loc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.LocCode))
-                    .Where(ExprHelper.LocBelongsToArea(AreaName.绌烘墭鐩樻帴椹冲尯))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
+        //    try {
+        //        var loc = db.Queryable<TN_Location>()
+        //            .Where(ExprHelper.LocCode(model.LocCode))
+        //            .Where(ExprHelper.LocBelongsToArea(AreaName.绌烘墭鐩樻帴椹冲尯))
+        //            .Where(ExprHelper.LocIsFree)
+        //            .Where(ExprHelper.LocIsEmpty).First();
 
-                if (loc == null) {
-                    return BuildSimpleResult(2, $"褰撳墠璐т綅 '{model.LocCode}' 鏃犳硶鍐嶇粦瀹氬鍣�);
-                }
+        //        if (loc == null) {
+        //            return BuildSimpleResult(2, $"褰撳墠璐т綅 '{model.LocCode}' 鏃犳硶鍐嶇粦瀹氬鍣�);
+        //        }
 
-                var locCntrRel = db.Queryable<TN_Loc_Container>()
-                    .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
+        //        var locCntrRel = db.Queryable<TN_Loc_Container>()
+        //            .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
 
-                if (locCntrRel != null) {
-                    return BuildSimpleResult(3, $"褰撳墠瀹瑰櫒 '{model.CntrCode}' 宸茬粡涓�'{locCntrRel.S_LOC_CODE}' 缁戝畾");
-                }
+        //        if (locCntrRel != null) {
+        //            return BuildSimpleResult(3, $"褰撳墠瀹瑰櫒 '{model.CntrCode}' 宸茬粡涓�'{locCntrRel.S_LOC_CODE}' 缁戝畾");
+        //        }
 
-                loc.N_CURRENT_NUM = model.PalletCount;
+        //        //loc.N_CURRENT_NUM = model.PalletCount;
 
-                locCntrRel = new TN_Loc_Container {
-                    S_LOC_CODE = model.LocCode,
-                    S_CNTR_CODE = model.CntrCode
-                };
+        //        locCntrRel = new TN_Loc_Container {
+        //            S_LOC_CODE = model.LocCode,
+        //            S_CNTR_CODE = model.CntrCode
+        //        };
 
-                using (var tran = db.Ado.UseTran()) {
-                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
-                        && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
-                        tran.CommitTran();
-                        return BuildSimpleResult(0, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 鎴愬姛");
-                    }
-                    else {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(4, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 澶辫触");
-                    }
-                }
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
+        //        using (var tran = db.Ado.UseTran()) {
+        //            if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
+        //                && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
+        //                tran.CommitTran();
+        //                return BuildSimpleResult(0, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 鎴愬姛");
+        //            }
+        //            else {
+        //                tran.RollbackTran();
+        //                return BuildSimpleResult(4, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 澶辫触");
+        //            }
+        //        }
+        //    }
+        //    catch (Exception ex) {
+        //        return BuildSimpleEx(ex);
+        //    }
+        //}
 
-        /// <summary>
-        /// 绌虹缁戝畾(PDA)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult EmptyBindGoodpack(EmptyBindInfo model) {
-            var db = DbHelper.GetDbClient();
+        ///// <summary>
+        ///// 绌虹缁戝畾(PDA)
+        ///// </summary>
+        ///// <param name="model"></param>
+        ///// <returns></returns>
+        //public static SimpleResult EmptyBindGoodpack(EmptyBindInfo model) {
+        //    var db = DbHelper.GetDbClient();
 
-            try {
-                var loc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.LocCode))
-                    .Where(ExprHelper.LocBelongsToArea(AreaName.绌虹鎺ラ┏鍖�)
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
+        //    try {
+        //        var loc = db.Queryable<TN_Location>()
+        //            .Where(ExprHelper.LocCode(model.LocCode))
+        //            .Where(ExprHelper.LocBelongsToArea(AreaName.绌虹鎺ラ┏鍖�)
+        //            .Where(ExprHelper.LocIsFree)
+        //            .Where(ExprHelper.LocIsEmpty).First();
 
-                if (loc == null) {
-                    return BuildSimpleResult(2, $"褰撳墠璐т綅 '{model.LocCode}' 鏃犳硶鍐嶇粦瀹氬鍣�);
-                }
+        //        if (loc == null) {
+        //            return BuildSimpleResult(2, $"褰撳墠璐т綅 '{model.LocCode}' 鏃犳硶鍐嶇粦瀹氬鍣�);
+        //        }
 
-                var locCntrRel = db.Queryable<TN_Loc_Container>()
-                    .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
+        //        var locCntrRel = db.Queryable<TN_Loc_Container>()
+        //            .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
 
-                if (locCntrRel != null) {
-                    return BuildSimpleResult(3, $"褰撳墠瀹瑰櫒 '{model.CntrCode}' 宸茬粡涓�'{locCntrRel.S_LOC_CODE}' 缁戝畾");
-                }
+        //        if (locCntrRel != null) {
+        //            return BuildSimpleResult(3, $"褰撳墠瀹瑰櫒 '{model.CntrCode}' 宸茬粡涓�'{locCntrRel.S_LOC_CODE}' 缁戝畾");
+        //        }
 
-                loc.N_CURRENT_NUM = 1; // 绌虹缁戝畾鏃跺鍣ㄦ暟蹇呯劧涓�1
+        //        loc.N_CURRENT_NUM = 1; // 绌虹缁戝畾鏃跺鍣ㄦ暟蹇呯劧涓�1
 
-                locCntrRel = new TN_Loc_Container {
-                    S_LOC_CODE = model.LocCode,
-                    S_CNTR_CODE = model.CntrCode
-                };
+        //        locCntrRel = new TN_Loc_Container {
+        //            S_LOC_CODE = model.LocCode,
+        //            S_CNTR_CODE = model.CntrCode
+        //        };
 
-                using (var tran = db.Ado.UseTran()) {
-                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
-                        && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
-                        tran.CommitTran();
-                        return BuildSimpleResult(0, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 鎴愬姛");
-                    }
-                    else {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(4, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 澶辫触");
-                    }
-                }
-
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
+        //        using (var tran = db.Ado.UseTran()) {
+        //            if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
+        //                && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
+        //                tran.CommitTran();
+        //                return BuildSimpleResult(0, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 鎴愬姛");
+        //            }
+        //            else {
+        //                tran.RollbackTran();
+        //                return BuildSimpleResult(4, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 澶辫触");
+        //            }
+        //        }
+        //    }
+        //    catch (Exception ex) {
+        //        return BuildSimpleEx(ex);
+        //    }
+        //}
 
         /// <summary>
         /// 鎵樼洏-绌烘墭鍏ュ簱(PDA)
         /// </summary>
         /// <param name="model"></param>
         /// <returns></returns>
-        public static SimpleResult EmptyInboundPallet(EmptyInboundDetailInfo model) {
+        public static SimpleResult EmptyInboundPallet(EmptyInboundInfo model) {
             var taskName = TaskName.鎵樼洏_绌烘墭鍏ュ簱;
             var db = DbHelper.GetDbClient();
 
             try {
+
+
                 var startLoc = db.Queryable<TN_Location>()
                     .Where(ExprHelper.LocCode(model.StartLoc))
                     .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty.Negate()).First();
+                    .Where(ExprHelper.LocIsEmpty.Negate())
+                    .First();
 
                 if (startLoc == null) {
                     return BuildSimpleResult(2, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
                 }
 
                 // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�-                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
-                    a => a.S_LOC_CODE == model.StartLoc
-                    && a.S_CNTR_CODE == model.CntId);
+                var locCntrRel = db.Queryable<TN_Loc_Container>()
+                    .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode)
+                    .First();
+
                 if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}'");
+                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntrCode}'");
                 }
 
                 // TODO 鏆傚畾閫夋嫨鏈�綆灞傛寜鍖轰綅椤哄簭鍏ュ簱锛屽悗闈㈠緟淇敼
@@ -252,7 +232,7 @@
         /// 濂借繍绠�绌虹鍏ュ簱(PDA)
         /// </summary>
         /// <returns></returns>
-        public static SimpleResult EmptyInboundGoodpack(EmptyInboundDetailInfo model) {
+        public static SimpleResult EmptyInboundGoodpack(EmptyInboundInfo model) {
             var taskName = TaskName.濂借繍绠盻绌虹鍏ュ簱;
             var db = DbHelper.GetDbClient();
 
@@ -267,11 +247,12 @@
                 }
 
                 // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�-                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
-                    a => a.S_LOC_CODE == model.StartLoc
-                    && a.S_CNTR_CODE == model.CntId);
+                var locCntrRel = db.Queryable<TN_Loc_Container>()
+                    .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode)
+                    .First();
+
                 if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}'");
+                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntrCode}'");
                 }
 
                 // TODO 鏆傚畾閫夋嫨鏈�綆灞傛寜鍖轰綅椤哄簭鍏ュ簱锛屽悗闈㈠緟淇敼
@@ -321,13 +302,13 @@
                 }
 
                 var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.EndLoc))
+                    .Where(ExprHelper.LocBelongsToArea(AreaName.鍖呰鍖�)
                     .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE))
                     .Where(ExprHelper.LocIsFree)
                     .Where(ExprHelper.LocIsEmpty).First();
 
                 if (endLoc == null) {
-                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 '{model.EndLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
+                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
                 }
 
                 return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
@@ -367,13 +348,13 @@
                 }
 
                 var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.EndLoc))
+                    .Where(ExprHelper.LocBelongsToArea(AreaName.鍖呰鍖�)
                     .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE))
                     .Where(ExprHelper.LocIsFree)
                     .Where(ExprHelper.LocIsEmpty).First();
 
                 if (endLoc == null) {
-                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 '{model.EndLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
+                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
                 }
 
                 return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
@@ -382,6 +363,265 @@
                 return BuildSimpleEx(ex);
             }
         }
+
+        /// <summary>
+        /// 鍒涘缓鎶芥鍗�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
+            var db = DbHelper.GetDbClient();
+            try {
+                var orderNo = GenerateOrderNo("鎶芥鍗曞彿", "CN");
+
+                // 缁戝畾鎿嶄綔锛氭彃鍏ュ嚭搴撳崟銆佹墍鏈夌殑鍑哄簱鍗曟槑缁�+                using (var tran = db.Ado.UseTran()) {
+
+                    var order = new TN_Check_Order {
+                        S_NO = orderNo,
+                        S_ITEM_CODE = model.ItemCode,
+                        //S_ITEM_NAME = model.ItemName,
+                        S_BATCH_NO = model.BatchNo,
+                        N_COUNT = model.Qty,
+                        S_END_AREA = model.EndArea,
+                    };
+
+                    if (db.Insertable<TN_Check_Order>(order).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(2, "鐢熸垚 鎶芥鍗�澶辫触锛� + JsonConvert.SerializeObject(order));
+                    }
+
+                    var cgDetailList = SelectCgByTotalQty(model);
+
+                    if (cgDetailList.Count == 0) {
+                        return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ユ娊妫�);
+                    }
+
+                    foreach (var cgDetail in cgDetailList) {
+                        var detail = new TN_Outbound_Detail {
+                            S_OO_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,
+                        };
+
+                        cgDetail.N_ITEM_STATE = 3;
+                        cgDetail.S_ITEM_STATE = "姝e湪妫�獙";
+
+                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0
+                            && db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
+                        }
+                        
+                        LogHelper.Debug("鍒涘缓鍑哄簱鍗曟槑缁嗘垚鍔燂細" + JsonConvert.SerializeObject(detail));
+                    }
+                    
+                    tran.CommitTran();
+                }
+                return BuildSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛");
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+        /// <summary>
+        /// 鎶芥-鍚堟牸鍥炲簱(PDA)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        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, "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡锛� + JsonConvert.SerializeObject(model));
+                }
+
+                cgDetail.N_ITEM_STATE = 0;
+                cgDetail.S_ITEM_STATE = "鍚堟牸";
+
+                var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container>
+                    ((l, c) => l.S_CODE == c.S_LOC_CODE)
+                    .Where((l, c) => c.S_CNTR_CODE == cgDetail.S_CNTR_CODE) // 鎸囧畾瀹瑰櫒鍙�+                    .Where(ExprHelper.LocIsFree) // NOTE 妫�煡
+                    .Select((l, c) => c) // 绛涢� Loc_Container
+                    .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 = "涓嶅悎鏍�;
+
+                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);
+            }
+        }
+
+        public static SimpleResult RestBack(RestBackInfo model) {
+            var db = DbHelper.GetDbClient();
+
+            try {
+                var locCntrRel = db.Queryable<TN_Loc_Container>()
+                    .Where(c => c.S_LOC_CODE == model.StartLoc)
+                    .First();
+
+                if (locCntrRel == null) {
+                    return BuildSimpleResult(2, $"璧风偣璐т綅 {model.StartLoc}");
+                }
+
+                var endLoc = db.Queryable<TN_Location, TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
+                    .Where((l, c) => c.S_CNTR_TYPE == locCntrRel.S_CNTR_TYPE)
+                    .First();
+
+                if (endLoc == null) {
+                    return BuildSimpleResult(3, $"涓嶅瓨鍦ㄥ悎閫傜殑缁堢偣璐т綅鍙互鍥炲簱");
+                }
+
+                return TaskHelper.SimpleCreateTask(locCntrRel.S_LOC_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, TaskName.灏剧鍥炲簱);
+            }
+            catch (Exception ex) {
+
+                return BuildSimpleEx(ex);
+            }
+        }
+
+        public static List<TN_CG_Detail> SelectCgByTotalQty(CreateCheckOrderInfo 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.N_ITEM_NUM > targetNum).
+                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
+                if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�+                {
+                    result.Add(targetCg);
+                    return result;
+                }
+
+                var sortedMaterials = new List<TN_CG_Detail>();
+
+                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.N_ITEM_NUM > 0)
+                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
+                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")
+                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
+                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+
+                if (sortedMaterials.Count == 0) //娌℃湁婊¤冻鏉′欢鐨�+                {
+                    return result;
+                }
+
+                int countNum = 0;
+                foreach (var mat in sortedMaterials) {
+                    countNum += mat.N_ITEM_NUM;
+                    result.Add(mat);
+                    if (countNum >= targetNum) {
+                        break;
+                    }
+                }
+                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
+                    return result;
+                }
+                else {
+                    result.Clear();
+                    return result;
+                }
+            }
+            catch (Exception ex) {
+                throw ex;
+            }
+        }
+
         #endregion
 
         #region Mobox 鍔熻兘
@@ -395,40 +635,49 @@
         /// <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, "鍑哄簱鍗曞彿涓嶈兘涓虹┖");
                 }
 
-                if (model.OutboundDetails.Count == 0) {
-                    return BuildSimpleResult(2, "鍑哄簱鍗曟槑缁嗘病鏈夐」鐩�);
-                }
-
                 using (var tran = db.Ado.UseTran()) {
+
+                    var cgDetailList = SelectCgByTotalQty(model);
+
+                    if (cgDetailList.Count == 0) {
+                        return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�);
+                    }
+
+                    foreach (var cgDetail in cgDetailList) {
+                        var detail = new TN_Outbound_Detail {
+                            S_OO_NO = orderNo,
+                            S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+                            S_BATCH_NO = cgDetail.S_BATCH_NO,
+                            S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                            N_COUNT = cgDetail.N_ITEM_NUM,
+                            S_END_AREA = model.EndArea
+                        };
+
+                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
+                        }
+                    }
+
                     var order = new TN_Outbound_Order {
-                        S_NO = model.No,
-                        N_FORCE = model.Forced ? 1 : 0
+                        S_NO = orderNo,
+                        S_ITEM_CODE = model.ItemCode,
+                        S_BATCH = model.BatchNo,
+                        N_END_NUM = model.Qty,                        
+                        //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
+                        S_END_AREA = model.EndArea
                     };
 
                     if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return BuildSimpleResult(3, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order));
-                    }
-
-                    foreach (var detail in model.OutboundDetails) {
-                        var newDetail = new TN_Outbound_Detail {
-                            S_NO = order.S_NO,
-                            S_CG_ID = detail.CgCode,
-                            S_BATCH_NO = detail.PatchNo,
-                            N_QTY = detail.Qty,
-                            N_FORCE = order.N_FORCE,
-                            S_END_AREA = detail.EndArea
-                        };
-                        if (db.Insertable<TN_Outbound_Detail>(newDetail).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
-                        }
+                        return BuildSimpleResult(5, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order));
                     }
 
                     tran.CommitTran();
@@ -447,36 +696,51 @@
         /// <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, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�);
                     }
 
-                    foreach (var detail in model.OutboundDetails) {
-                        var newDetail = new TN_Outbound_Detail {
-                            S_NO = order.S_NO,
-                            S_CG_ID = detail.CgCode,
-                            S_BATCH_NO = detail.PatchNo,
-                            N_QTY = detail.Qty,
-                            N_FORCE = order.N_FORCE
+                    foreach (var cgDetail in cgDetailList) {
+                        var detail = new TN_Outbound_Detail {
+                            S_OO_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
                         };
-                        if (db.Insertable<TN_Inbound_Order>(order).ExecuteCommand() <= 0) {
+
+                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
                             return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
                         }
                     }
+
+                    var order = new TN_Outbound_Order {
+                        S_NO = orderNo,
+                        S_ITEM_CODE = model.ItemCode,
+                        S_BATCH = model.BatchNo,
+                        N_END_NUM = model.Qty,
+                        //F_OUT_QTY = cgDetailList.Sum(a => a.N_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();
                 }
 
                 return BuildSimpleResult(0, "鐢熸垚鍑哄簱鍗曟垚鍔�);
@@ -486,6 +750,134 @@
             }
         }
 
+        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.N_ITEM_NUM > targetNum).
+                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
+                if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�+                {
+                    result.Add(targetCg);
+                    return result;
+                }
+
+                // NOTE 鏍规嵁鎬婚噺閫塪etail鏃讹紝鏄惁闇�鑰冭檻璐т綅鐨勯珮浣庯紵
+
+                var sortedMaterials = new List<TN_CG_Detail>();
+
+                if (model.ForcedOut) {
+                    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.N_ITEM_NUM > 0)
+                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
+                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸"
+                             || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")
+                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
+                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+                }
+                else {
+                    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.N_ITEM_NUM > 0)
+                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
+                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸")
+                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
+                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+                }
+                
+
+                if (sortedMaterials.Count == 0) //娌℃湁婊¤冻鏉′欢鐨�+                {
+                    return result;
+                }
+
+                int countNum = 0;
+                foreach (var mat in sortedMaterials) {
+                    countNum += mat.N_ITEM_NUM;
+                    result.Add(mat);
+                    if (countNum >= targetNum) {
+                        break;
+                    }
+                }
+                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
+                    return result;
+                }
+                else {
+                    result.Clear();
+                    return result;
+                }
+            }
+            catch (Exception ex) {
+                throw ex;
+            }
+        }
+
+        /// <summary>
+        /// 绉诲簱-鍒涘缓绉诲簱浠诲姟(WMS)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult CreateShiftOrder(CreateShiftOrderInfo model) {
+            var db = DbHelper.GetDbClient();
+            try {
+                var locCntrRelList = db.Queryable<TN_Loc_Container, TN_CG_Detail>((c, d) => c.S_CNTR_CODE == d.S_CNTR_CODE)
+                    .Where((c, d) => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.ItemCode)
+                    .ToList();
+
+                if (locCntrRelList.Count == 0) {
+                    return BuildSimpleResult(2, "娌℃湁鎵惧埌寰呯Щ搴撶殑鐗╂枡");
+                }
+
+                // 缁戝畾鎿嶄綔锛氭彃鍏ュ嚭搴撳崟銆佹墍鏈夌殑鍑哄簱鍗曟槑缁�+                using (var tran = db.Ado.UseTran()) {
+
+                    var order = new TN_Shift_Order {
+                        S_NO = GenerateOrderNo("绉诲簱鍗曞彿", "SN"),
+                        S_ITEM_CODE = model.ItemCode,
+                        //S_ITEM_NAME = model.ItemName,
+                        S_BATCH_NO = model.BatchNo,
+                        N_COUNT = locCntrRelList.Count,
+                        S_END_AREA = model.EndArea,
+                    };
+
+                    if (db.Insertable<TN_Shift_Order>(order).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return BuildSimpleResult(2, "鐢熸垚 绉诲簱鍗�澶辫触锛� + JsonConvert.SerializeObject(order));
+                    }
+
+                    foreach (var locCntrRel in locCntrRelList) {
+                        var detail = new TN_Shift_Detail {
+                            S_NO = order.S_NO,
+                            S_ITEM_CODE = model.ItemCode,
+                            S_LOC_CODE = locCntrRel.S_LOC_CODE,
+                            S_CNTR_CODE = locCntrRel.S_CNTR_CODE,
+                            S_BATCH_NO = model.BatchNo,
+                            S_END_AREA = model.EndArea
+                        };
+
+                        if (db.Insertable<TN_Shift_Detail>(detail).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            return BuildSimpleResult(3, "鐢熸垚 绉诲簱鍗曟槑缁�澶辫触锛� + JsonConvert.SerializeObject(detail));
+                        }
+                    }
+
+                    tran.CommitTran();
+                }
+                return BuildSimpleResult(0, $"鍒涘缓 绉诲簱鍗�鎴愬姛");
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(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
 
     }

--
Gitblit v1.9.1