From beca28ecb3a730ffb33c21e0c55c729774725faf Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期五, 25 四月 2025 16:51:28 +0800
Subject: [PATCH] 优化备料单发料逻辑

---
 Tiger.Api/Language.db                                               |    0 
 Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_HIS.cs                       |    2 
 Tiger.Model.Net/Entitys/WMS/V_ITEM_BIZ_ERP_RECEIPT_SN.cs            |    2 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs                     |    8 
 Tiger.Business.WMS/Extensions/Yada/OutExtension.cs                  |  282 ++++++++++++--
 Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_Y.cs                         |    2 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_BTH.cs                     |  213 +++++-----
 Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs             |   42 -
 Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM.cs                           |    2 
 Tiger.Model.Net/Entitys/WMS/Api/Input_Entitys.cs                    |   43 ++
 Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs                |    7 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs                      |   80 ++-
 Tiger.Model.Net/Entitys/WMS/WMS_ITEM.cs                             |    7 
 Tiger.Model.Net/Entitys/WMS/WMS_ITEM_POOL.cs                        |  180 ++++----
 Tiger.Model.Net/Entitys/WMS/WMS_ITEM_HIS.cs                         |    2 
 Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_X.cs                         |    2 
 Tiger.Business.WMS/Common/Preparation.cs                            |   29 -
 Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_D.cs                         |    2 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs                         |    2 
 Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_A.cs                         |    2 
 Tiger.Business.WMS/Common/WmsTask.cs                                |  137 ++----
 Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs |   46 ++
 22 files changed, 683 insertions(+), 409 deletions(-)

diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index 7b31385..0a86bb1 100644
--- a/Tiger.Api/Language.db
+++ b/Tiger.Api/Language.db
Binary files differ
diff --git a/Tiger.Business.WMS/Common/Preparation.cs b/Tiger.Business.WMS/Common/Preparation.cs
index 9862cc5..f942fbc 100644
--- a/Tiger.Business.WMS/Common/Preparation.cs
+++ b/Tiger.Business.WMS/Common/Preparation.cs
@@ -1,21 +1,18 @@
-锘縰sing MailKit.Search;
-using Rhea.Common;
+锘縰sing Rhea.Common;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
 using System.Text;
-using System.Threading.Tasks;
 using Tiger.Business.WMS.Extensions;
-using Tiger.Business.WMS.Transaction;
 using Tiger.IBusiness;
 using Tiger.Model;
-using Tiger.Model.Entitys.MES.Position;
 using Tiger.Model.Extensions;
 
 namespace Tiger.Business.WMS.Common
 {
+
     /// <summary>
     /// 澶囨枡浠诲姟鍗曟嵁
     /// </summary>
@@ -30,11 +27,13 @@
 
         #region Propertys & Variables
         private static object AddOrderLock { get; } = new object();
+        private static object AddBatchLock { get; } = new object();
         public DbClient MainDB { get; set; }
         public string UserCode { get; set; }
         public string OrgCode { get; set; }
         public BIZ_WMS_PREP Order { get; set; }
         public BIZ_WMS_PREP.BIZ_TYPEs BizType => Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>();
+        public SuggestOption Option { get; set; }
         #endregion Propertys & Variables
 
         #region Functions
@@ -120,7 +119,6 @@
                 Order.SourceOrders = Order.SourceOrders ?? new();
                 Order.SourceDetails = Order.SourceDetails ?? new();
                 Order.Details = Order.Details ?? new();
-                Order.Batchs = Order.Batchs ?? new();
                 Order.SnList = Order.SnList ?? new();
                 var srcOrder = new BIZ_WMS_PREP_SRC()
                 {
@@ -172,23 +170,7 @@
                 var srcInfo = Order.SourceOrders.Select(q => new { q.SOURCE_CODE, q.SOURCE_ORDER }).DistinctBy(q => q.SOURCE_ORDER).OrderBy(q => q.SOURCE_ORDER);
                 Order.SOURCE_CODE = string.Join(",", srcInfo.Select(q => q.SOURCE_CODE));
                 Order.SOURCE_ORDER = string.Join(",", srcInfo.Select(q => q.SOURCE_ORDER));
-                if (Order.CurBatch.IsNullOrEmpty())
-                {
-                    var bacth = new BIZ_WMS_PREP_BTH()
-                    {
-                        AUTH_ORG = OrgCode,
-                        ORDER_NO = Order.ORDER_NO,
-                        BATCH = Order.Batchs.Max(q => q.BATCH) + 1,
-                        PREP_MODE = BIZ_WMS_PREP_BTH.PREP_MODEs.Whole.GetValue(),
-                        DLVY_MODE = BIZ_WMS_PREP_BTH.DLVY_MODEs.Supply.GetValue(),
-                        STATUS = BIZ_WMS_PREP_BTH.STATUSs.WaitPick.GetValue(),
-                        CALL_TIME = DateTime.Now,
-                        PRIORITY = 4,
-                    };
-                    bacth.PLAN_TIME = bacth.CALL_TIME.AddHours(1);
-                    Order.Batchs.Add(bacth);
-                }
-
+    
                 //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
                 var db = Biz.Db;
                 var dbTran = db.UseTran(() =>
@@ -201,7 +183,6 @@
                     var d = db.Storageable(Order.Details, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage();
                     d.AsInsertable.ExecuteCommand();
                     d.AsUpdateable.IgnoreColumns(q => q.ID).UpdateColumns(q => new { q.QTY_REQ, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
-                    db.Storageable(Order.Batchs, UserCode).WhereColumns(t => new { t.ORDER_NO, t.BATCH, t.GHOST_ROW }).ToStorage().AsInsertable.ExecuteCommand();
                 });
                 if (dbTran.IsSuccess)
                 {
diff --git a/Tiger.Business.WMS/Common/WmsTask.cs b/Tiger.Business.WMS/Common/WmsTask.cs
index ea0da0c..518fb91 100644
--- a/Tiger.Business.WMS/Common/WmsTask.cs
+++ b/Tiger.Business.WMS/Common/WmsTask.cs
@@ -1,4 +1,5 @@
-锘縰sing Rhea.Common;
+锘縰sing Microsoft.Extensions.Options;
+using Rhea.Common;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
@@ -323,28 +324,25 @@
         /// </summary>
         /// <param name="order">棰嗘枡鍗曞彿</param>
         /// <param name="itemCode">鐗╂枡缂栫爜</param>
-        /// <param name="erpWH">鐗╂枡鐨凟RP搴撲綅</param>
-        /// <param name="whID">鐗╂枡鎵�鍦ㄧ殑浠撳簱缂栫爜</param>
-        /// <param name="regionID">鐗╂枡鎵�鍦ㄧ殑鍌ㄥ尯缂栫爜</param>
-        /// <param name="shelfID">鐗╂枡鎵�鍦ㄧ殑璐ф灦缂栫爜</param>
-        /// <param name="option">鎺堟潈鏌ヨ閫夐」</param>
+        /// <param name="option">澶囨枡鐗╂枡鎺ㄨ崘閫夐」</param>
+        /// <param name="auth">鎺堟潈鏌ヨ閫夐」</param>
         /// <param name="returnCount">杩斿洖鐨勬渶灏忓寘瑁呯墿鏂欎釜鏁帮紝榛樿杩斿洖1涓�</param>
         /// <returns></returns>
-        public Result<List<SuggestItem>> Suggest(string order, string itemCode, string erpWH, string whID, string regionID, string shelfID, AuthOption option, int returnCount = 1)
+        public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, int returnCount = 1)
         {
             var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") };
             try
             {
-                var items = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
+                var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                                                                 JoinType.Left, q.SN == p.SN,
                                                                 JoinType.Left, q.WH_ID == w.ID,
                                                                 JoinType.Left, q.REGION_ID == r.ID,
                                                                 JoinType.Left, q.SHELF_ID == s.ID,
                                                                 JoinType.Left, q.LOCATION_ID == l.ID))
                                              //妫�鏌ョ敤鎴锋潈闄�
-                                             .ByAuth(option)
-                                            //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓殑鐗╂枡
-                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order))
+                                             .ByAuth(auth)
+                                            //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓悓涓�涓崟鎹殑鐗╂枡
+                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N")
                                             //鍙厑璁告湭閿佸畾鐨�
                                             .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
                                             //鍙厑璁哥墿鏂欑姸鎬佹槸鍦ㄥ簱鐨�
@@ -352,30 +350,32 @@
                                             //濡傛灉鏈変紶鍏ユ枡鍙凤紝鍒欏彧鍏佽鏂欏彿鐨勭墿鏂�
                                             .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode)
                                             //濡傛灉鏈変紶鍏ュ簱浣嶏紝鍒欏彧鍏佽搴撲綅涓殑鐗╂枡
-                                            .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg)
+                                            .WhereIF(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg)
                                             //濡傛灉鏈変紶鍏ヤ粨搴擄紝鍒欏彧鍏佽浠撳簱鐨勭墿鏂�
-                                            .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg)
+                                            .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg)
                                             //濡傛灉鏈変紶鍏ュ偍鍖猴紝鍒欏彧鍏佽鍌ㄥ尯鐨勭墿鏂�
-                                            .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg)
+                                            .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg)
                                             //濡傛灉鏈変紶鍏ヨ揣鏋讹紝鍒欏彧鍏佽璐ф灦鐨勭墿鏂�
-                                            .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg)
+                                            .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg)
                                             //浼樺厛浣跨敤搴撳瓨姹犱腑鐨勭墿鏂�
                                             .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
                                             //浼樺厛浣跨敤灏炬暟鐗╂枡(鎴枡鎴栬�呴��鏂欎箣鍚庣殑鐗╂枡)
-                                            .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
-                                            //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛屾渶鍚庢寜鏉$爜鎺掑簭
-                                            .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN)
-                                            .Select((q, p, w, r, s, l) => new SuggestItem
-                                            {
-                                                Item = q,
-                                                poolItem = null,
-                                                Warehouse = w,
-                                                Region = r,
-                                                Shelf = s,
-                                                Location = l,
-                                            })
-                                            //妫�鏌ョ敤鎴锋潈闄�
-                                            .Take(returnCount).ToList();
+                                            //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
+                                            //澶囨枡绛栫暐锛氭寜鐢熶骇鏃ユ湡鍏堣繘鍏堝嚭
+                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE)
+                                            //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛�
+                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY)
+                                            //鏈�鍚庢寜鏉$爜鎺掑簭
+                                            .OrderBy(q => q.SN);
+                var items = query.Select((q, p, w, r, s, l) => new SuggestItem
+                                    {
+                                        Item = q,
+                                        poolItem = null,
+                                        Warehouse = w,
+                                        Region = r,
+                                        Shelf = s,
+                                        Location = l,
+                                    }).Take(returnCount).ToList();
                 //foreach (var item in items)
                 //{
                 //    var inv = Get(item.SN, option, false);
@@ -410,34 +410,25 @@
         /// </summary>
         /// <param name="order">棰嗘枡鍗曞彿</param>
         /// <param name="itemCode">鐗╂枡缂栫爜</param>
-        /// <param name="erpWH">鐗╂枡鐨凟RP搴撲綅</param>
-        /// <param name="whID">鐗╂枡鎵�鍦ㄧ殑浠撳簱缂栫爜</param>
-        /// <param name="regionID">鐗╂枡鎵�鍦ㄧ殑鍌ㄥ尯缂栫爜</param>
-        /// <param name="shelfID">鐗╂枡鎵�鍦ㄧ殑璐ф灦缂栫爜</param>
-        /// <param name="option">鎺堟潈鏌ヨ閫夐」</param>
+        /// <param name="option">澶囨枡鐗╂枡鎺ㄨ崘閫夐」</param>
+        /// <param name="auth">鎺堟潈鏌ヨ閫夐」</param>
         /// <param name="reqQty">闇�姹傛暟閲忥紝浼氳繑鍥炴弧瓒抽渶姹傜殑鐗╂枡涓暟</param>
         /// <returns></returns>
-        public Result<List<SuggestItem>> Suggest(string order, string itemCode, string erpWH, string whID, string regionID, string shelfID, AuthOption option, double reqQty)
+        public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, double reqQty)
         {
             var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") };
             try
             {
-                var takeCount = 0;
-                var checkSum = 0.0;
-                var checkCount = 0;
-                do
-                {
-                    takeCount += 50;
-                    var check = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
+                var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                                                                 JoinType.Left, q.SN == p.SN,
                                                                 JoinType.Left, q.WH_ID == w.ID,
                                                                 JoinType.Left, q.REGION_ID == r.ID,
                                                                 JoinType.Left, q.SHELF_ID == s.ID,
                                                                 JoinType.Left, q.LOCATION_ID == l.ID))
                                              //妫�鏌ョ敤鎴锋潈闄�
-                                             .ByAuth(option)
+                                             .ByAuth(auth)
                                             //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓殑鐗╂枡
-                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order))
+                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N")
                                             //鍙厑璁告湭閿佸畾鐨�
                                             .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
                                             //鍙厑璁哥墿鏂欑姸鎬佹槸鍦ㄥ簱鐨�
@@ -445,20 +436,30 @@
                                             //濡傛灉鏈変紶鍏ユ枡鍙凤紝鍒欏彧鍏佽鏂欏彿鐨勭墿鏂�
                                             .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode)
                                             //濡傛灉鏈変紶鍏ュ簱浣嶏紝鍒欏彧鍏佽搴撲綅涓殑鐗╂枡
-                                            .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg)
+                                            .WhereIF(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg)
                                             //濡傛灉鏈変紶鍏ヤ粨搴擄紝鍒欏彧鍏佽浠撳簱鐨勭墿鏂�
-                                            .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg)
+                                            .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg)
                                             //濡傛灉鏈変紶鍏ュ偍鍖猴紝鍒欏彧鍏佽鍌ㄥ尯鐨勭墿鏂�
-                                            .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg)
+                                            .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg)
                                             //濡傛灉鏈変紶鍏ヨ揣鏋讹紝鍒欏彧鍏佽璐ф灦鐨勭墿鏂�
-                                            .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg)
+                                            .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg)
                                             //浼樺厛浣跨敤搴撳瓨姹犱腑鐨勭墿鏂�
                                             .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
                                             //浼樺厛浣跨敤灏炬暟鐗╂枡(鎴枡鎴栬�呴��鏂欎箣鍚庣殑鐗╂枡)
-                                            .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
-                                            //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛屾渶鍚庢寜鏉$爜鎺掑簭
-                                            .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN)
-                                            .Select((q, p, w, r, s, l) => new
+                                            //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
+                                            //澶囨枡绛栫暐锛氭寜鐢熶骇鏃ユ湡鍏堣繘鍏堝嚭
+                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE)
+                                            //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛�
+                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY)
+                                            //鏈�鍚庢寜鏉$爜鎺掑簭
+                                            .OrderBy(q => q.SN);
+                var takeCount = 0;
+                var checkSum = 0.0;
+                var checkCount = 0;
+                do
+                {
+                    takeCount += 50;
+                    var check = query.Select((q, p, w, r, s, l) => new
                                             {
                                                 ItemCode = q.ITEM_CODE,
                                                 Sn = q.SN,
@@ -484,37 +485,7 @@
                     }
                 } while (checkSum < reqQty && checkCount >= takeCount);
 
-                var items = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
-                                                                JoinType.Left, q.SN == p.SN,
-                                                                JoinType.Left, q.WH_ID == w.ID,
-                                                                JoinType.Left, q.REGION_ID == r.ID,
-                                                                JoinType.Left, q.SHELF_ID == s.ID,
-                                                                JoinType.Left, q.LOCATION_ID == l.ID))
-                                             //妫�鏌ョ敤鎴锋潈闄�
-                                             .ByAuth(option)
-                                            //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓殑鐗╂枡
-                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order))
-                                            //鍙厑璁告湭閿佸畾鐨�
-                                            .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
-                                            //鍙厑璁哥墿鏂欑姸鎬佹槸鍦ㄥ簱鐨�
-                                            .Where((q, p, w, r, s, l) => q.STATUS == WMS_ITEM.STATUSs.InStore.GetValue())
-                                            //濡傛灉鏈変紶鍏ユ枡鍙凤紝鍒欏彧鍏佽鏂欏彿鐨勭墿鏂�
-                                            .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode)
-                                            //濡傛灉鏈変紶鍏ュ簱浣嶏紝鍒欏彧鍏佽搴撲綅涓殑鐗╂枡
-                                            .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg)
-                                            //濡傛灉鏈変紶鍏ヤ粨搴擄紝鍒欏彧鍏佽浠撳簱鐨勭墿鏂�
-                                            .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg)
-                                            //濡傛灉鏈変紶鍏ュ偍鍖猴紝鍒欏彧鍏佽鍌ㄥ尯鐨勭墿鏂�
-                                            .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg)
-                                            //濡傛灉鏈変紶鍏ヨ揣鏋讹紝鍒欏彧鍏佽璐ф灦鐨勭墿鏂�
-                                            .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg)
-                                            //浼樺厛浣跨敤搴撳瓨姹犱腑鐨勭墿鏂�
-                                            .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
-                                            //浼樺厛浣跨敤灏炬暟鐗╂枡(鎴枡鎴栬�呴��鏂欎箣鍚庣殑鐗╂枡)
-                                            .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
-                                            //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛屾渶鍚庢寜鏉$爜鎺掑簭
-                                            .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN)
-                                            .Select((q, p, w, r, s, l) => new SuggestItem
+                var items = query.Select((q, p, w, r, s, l) => new SuggestItem
                                             {
                                                 Item = q,
                                                 poolItem = null,
diff --git a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
index 425f56c..4b64fe3 100644
--- a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
+++ b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
@@ -1,4 +1,5 @@
 锘縰sing MailKit.Search;
+using Microsoft.Scripting.Utils;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using Org.BouncyCastle.Asn1.X509;
@@ -41,6 +42,48 @@
                 default:
                     return "";
             }
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍙戞枡绫诲瀷锛岃幏鍙栧彂鏂欏崟鎹殑閫夋嫨鍒楄〃锛堝甫鍒嗛〉锛�
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public static PageAble<BIZ_WMS_PREP_SRC> GetPickList(this BIZ_WMS_PREP.BIZ_TYPEs type, BaseInputWithPage input)
+        {
+            // 鏌ヨ鍗曟嵁鏄庣粏
+            var pickList = new PageAble<BIZ_WMS_PREP_SRC>();
+            switch (type)
+            {
+                //case BIZ_WMS_PREP.BIZ_TYPEs.Others:
+                //    {
+                //        var dtls = Biz.Db.Queryable<BIZ_U9_MISC_OUT_DTL>().Where(q => q.ORDER_NO == orderNo).ToList();
+                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
+                //    }
+                //    break;
+                //case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
+                //    {
+                //        var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_MOPickList>().Where(q => q.MoDocNo == orderNo).ToList();
+                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
+                //    }
+                //    break;
+                //case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
+                //    {
+                //        var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_SCMPickList>().Where(q => q.PoDocNo == orderNo).ToList();
+                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
+                //    }
+                //    break;
+                //case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
+                //    {
+                //        var dtls = Biz.Db.Queryable<BIZ_WMS_TRANSFER_DTL>().Where(q => q.ORDER_NO == orderNo).ToList();
+                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
+                //    }
+                //    break;
+                case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
+                default:
+                    break;
+            }
+            return pickList;
         }
 
         /// <summary>
@@ -113,17 +156,18 @@
         /// <param name="trans"></param>
         /// <param name="input"></param>
         /// <returns></returns>
-        public static async Task<ApiAction> CommitToERP(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BaseInput input)
+        public static async Task<ApiAction> GenerateDlvyBatch(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
         {
             switch (type)
             {
                 case BIZ_WMS_PREP.BIZ_TYPEs.Others:
-                    return await MiscShipApprove(trans, input);
+                    return await MiscShipApprove(trans, range);
                 case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
-                    return await CreateIssueDoc(trans, input);
+                    return await CreateIssueDoc(trans, range);
                 case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
-                    return await CreatePMIssueDoc(trans, input);
+                    return await CreatePMIssueDoc(trans, range);
                 case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
+                    return await TransferComplete(trans, range);
                 case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                 default:
                     throw new NotImplementedException($"鍙戞枡鍗曟嵁绫诲瀷[{type.GetDesc()}]鏈疄鐜癊RP鎺ュ彛璋冪敤");
@@ -134,9 +178,9 @@
         /// U9鏉傚彂鍗曞鏍�
         /// </summary>
         /// <param name="trans"></param>
-        /// <param name="input"></param>
+        /// <param name="range"></param>
         /// <returns></returns>
-        private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BaseInput input)
+        private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
         {
             var action = new ApiAction();
 
@@ -159,12 +203,19 @@
                 return action;
             }
 
-            var curBatch = trans.CurPREP.Order.CurBatch;
-            curBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
-            curBatch.PREP_PERSON = trans.UserCode;
-            curBatch.FINISH_TIME = DateTime.Now;
-            curBatch.REQ_PERSON = trans.UserCode;
-            curBatch.DLVY_TIME = DateTime.Now;
+            var batch = new BIZ_WMS_PREP_BTH()
+            {
+                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
+                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
+                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
+                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
+                PREP_PERSON = trans.UserCode,
+                FINISH_TIME = DateTime.Now,
+                REQ_PERSON = trans.UserCode,
+                DLVY_TIME = DateTime.Now,
+            };
+            trans.CurPREP.Order.Batchs.Add(batch);
+
             foreach (var item in trans.CurPREP.Order.SourceDetails)
             {
                 item.QTY_ACT_DLVY = item.QTY_ACT_REQ;
@@ -179,6 +230,13 @@
                 item.REQ_PERSON = trans.UserCode;
                 item.DLVY_TIME = DateTime.Now;
             }
+            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList();
+            var history = new List<WMS_ITEM_HIS>();
+            foreach (var item in items)
+            {
+                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡杩囪处鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+            }
 
             //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
             var db = trans.GetCommitDB();
@@ -186,7 +244,11 @@
             {
                 db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                 db.Updateable(trans.CurPREP.Order.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
-                db.Updateable(curBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
+                db.Insertable(batch, trans.UserCode).ExecuteCommand();
+                db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO)
+                    .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand();
+                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Insertable(history, trans.UserCode).ExecuteCommand();
                 db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
             });
             if (dbTran.IsSuccess)
@@ -207,18 +269,21 @@
         /// U9鍒涘缓鐢熶骇棰嗘枡鍗�
         /// </summary>
         /// <param name="trans"></param>
-        /// <param name="input"></param>
+        /// <param name="range"></param>
         /// <returns></returns>
-        private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input)
+        private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
         {
             var action = new ApiAction();
 
-            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.ORDER_BATCH == trans.CurPREP.Order.CurBatch.BATCH.ToString()).ToList();
+            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue())
+                                                .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID)
+                                                .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID)
+                                                .ToList();
             if (!sns.Any())
             {
                 action.IsSuccessed = false;
-                //action.LocaleMsg = Biz.L("鍒涘缓鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鎵规[{1}]鏈壘鍒板凡涓嬫灦鐨勭墿鏂欐暟鎹�");
-                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, trans.CurPREP.Order.CurBatch.BATCH);
+                //action.LocaleMsg = Biz.L("鍒涘缓鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鏈壘鍒皗1}宸蹭笅鏋剁殑鐗╂枡鏁版嵁");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc());
                 return action;
             }
             var wos = Biz.DataSource["YadaU9C"].Client.Queryable<mes_Mo>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.DocNo)).ToList();
@@ -280,14 +345,34 @@
                 return action;
             }
 
-            var curBatch = trans.CurPREP.Order.CurBatch;
-            curBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
-            curBatch.PREP_PERSON = trans.UserCode;
-            curBatch.FINISH_TIME = DateTime.Now;
-            curBatch.REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD));
-            curBatch.REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code));
-            curBatch.REQ_PERSON = trans.UserCode;
-            curBatch.DLVY_TIME   = DateTime.Now;
+
+            var batch = new BIZ_WMS_PREP_BTH()
+            {
+                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
+                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
+                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
+                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
+                PREP_PERSON = trans.UserCode,
+                FINISH_TIME = DateTime.Now,
+                REQ_PERSON = trans.UserCode,
+                REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)),
+                REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)),
+                DLVY_TIME = DateTime.Now,
+            };
+            trans.CurPREP.Order.Batchs.Add(batch);
+            foreach (var sn in sns)
+            {
+                sn.DLVY_BATCH = batch.DLVY_BATCH;
+                sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+            }
+
+            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList();
+            var history = new List<WMS_ITEM_HIS>();
+            foreach (var item in items)
+            {
+                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡杩囪处鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+            }
 
             var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList();
             var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q));
@@ -302,12 +387,15 @@
             {
                 db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                 db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
-                db.Updateable(curBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_ID, q.REQ_ORDER, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
+                db.Insertable(batch, trans.UserCode).ExecuteCommand();
+                db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH }).ExecuteCommand();
+                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Insertable(history, trans.UserCode).ExecuteCommand();
             });
             if (dbTran.IsSuccess)
             {
                 //action.LocaleMsg = Biz.L($"鍒涘缓鐢熶骇棰嗘枡鍗昜{0}]鎴愬姛锛屾潵婧愬崟鍙峰涓嬶細{1}");
-                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.Success", curBatch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.Success", batch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
             }
             else
             {
@@ -322,18 +410,21 @@
         /// U9鍒涘缓濮斿鐢熶骇棰嗘枡鍗�
         /// </summary>
         /// <param name="trans"></param>
-        /// <param name="input"></param>
+        /// <param name="range"></param>
         /// <returns></returns>
-        private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input)
+        private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
         {
             var action = new ApiAction();
 
-            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.ORDER_BATCH == trans.CurPREP.Order.CurBatch.BATCH.ToString()).ToList();
+            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue())
+                                    .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID)
+                                    .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID)
+                                    .ToList();
             if (!sns.Any())
             {
                 action.IsSuccessed = false;
-                //action.LocaleMsg = Biz.L("鍒涘缓濮斿鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鎵规[{1}]鏈壘鍒板凡涓嬫灦鐨勭墿鏂欐暟鎹�");
-                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, trans.CurPREP.Order.CurBatch.BATCH);
+                //action.LocaleMsg = Biz.L("鍒涘缓濮斿鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鏈壘鍒皗1}宸蹭笅鏋剁殑鐗╂枡鏁版嵁");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc());
                 return action;
             }
             var temp = sns.GroupBy(q => new { q.ITEM_CODE, q.UNIT, q.WH_CODE, q.LOCATION_CODE })
@@ -395,14 +486,33 @@
                 return action;
             }
 
-            var curBatch = trans.CurPREP.Order.CurBatch;
-            curBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
-            curBatch.PREP_PERSON = trans.UserCode;
-            curBatch.FINISH_TIME = DateTime.Now;
-            curBatch.REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD));
-            curBatch.REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code));
-            curBatch.REQ_PERSON = trans.UserCode;
-            curBatch.DLVY_TIME = DateTime.Now;
+            var batch = new BIZ_WMS_PREP_BTH()
+            {
+                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
+                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
+                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
+                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
+                PREP_PERSON = trans.UserCode,
+                FINISH_TIME = DateTime.Now,
+                REQ_PERSON = trans.UserCode,
+                REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)),
+                REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)),
+                DLVY_TIME = DateTime.Now,
+            };
+            trans.CurPREP.Order.Batchs.Add(batch);
+            foreach (var sn in sns)
+            {
+                sn.DLVY_BATCH = batch.DLVY_BATCH;
+                sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+            }
+
+            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList();
+            var history = new List<WMS_ITEM_HIS>();
+            foreach (var item in items)
+            {
+                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡杩囪处鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+            }
 
             var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList();
             var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q));
@@ -427,7 +537,10 @@
             {
                 db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                 db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
-                db.Updateable(curBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_ID, q.REQ_ORDER, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
+                db.Insertable(batch, trans.UserCode).ExecuteCommand();
+                db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH }).ExecuteCommand();
+                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Insertable(history, trans.UserCode).ExecuteCommand();
                 if (orders.Any())
                 {
 	                db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
@@ -436,7 +549,7 @@
             if (dbTran.IsSuccess)
             {
                 //action.LocaleMsg = Biz.L($"鍒涘缓濮斿鐢熶骇棰嗘枡鍗昜{0}]鎴愬姛锛屾潵婧愬崟鍙峰涓嬶細{1}");
-                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.Success", curBatch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.Success", batch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
             }
             else
             {
@@ -446,5 +559,88 @@
             }
             return action;
         }
+
+        /// <summary>
+        /// 璋冩嫧鍗曞畬鎴愬彂鏂�
+        /// </summary>
+        /// <param name="trans"></param>
+        /// <param name="range"></param>
+        /// <returns></returns>
+        private static async Task<ApiAction> TransferComplete(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
+        {
+            var action = new ApiAction();
+
+            var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList();
+            var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Transfer.GetActReqQty(q));
+            if (noFinish.Any())
+            {
+                action.IsSuccessed = false;
+                //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}]鏈兘鎻愪氦瀹℃牳锛屾湭澶囨枡瀹屾垚鐨勮濡備笅锛歿1}");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.TransferComplete.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join("锛�", noFinish.Select(q => q.ORDER_LINE)));
+                return action;
+            }
+
+            var batch = new BIZ_WMS_PREP_BTH()
+            {
+                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
+                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
+                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
+                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
+                PREP_PERSON = trans.UserCode,
+                FINISH_TIME = DateTime.Now,
+                REQ_PERSON = trans.UserCode,
+                DLVY_TIME = DateTime.Now,
+            };
+            trans.CurPREP.Order.Batchs.Add(batch);
+
+            foreach (var item in trans.CurPREP.Order.SourceDetails)
+            {
+                item.QTY_ACT_DLVY = item.QTY_ACT_REQ;
+            }
+            trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue();
+            //var orders = trans.MainDB.Queryable<BIZ_WMS_TRANSFER>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList();
+            //foreach (var item in orders)
+            //{
+            //    item.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue();
+            //    item.PREP_PERSON = trans.UserCode;
+            //    item.FINISH_TIME = DateTime.Now;
+            //    item.REQ_PERSON = trans.UserCode;
+            //    item.DLVY_TIME = DateTime.Now;
+            //}
+            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList();
+            var history = new List<WMS_ITEM_HIS>();
+            foreach(var item in items)
+            {
+                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+            }
+
+            //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
+            var db = trans.GetCommitDB();
+            var dbTran = db.UseTran(() =>
+            {
+                db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Updateable(trans.CurPREP.Order.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
+                db.Insertable(batch, trans.UserCode).ExecuteCommand();
+                db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO)
+                    .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand();
+                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Insertable(history, trans.UserCode).ExecuteCommand();
+                //db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
+            });
+            if (dbTran.IsSuccess)
+            {
+                //action.LocaleMsg = Biz.L($"璋冩嫧鍗曞彂鏂欏畬鎴愶紝鍗曞彿濡備笅锛歿0}");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.Success", string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
+            }
+            else
+            {
+                Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception");
+                //鎶涘嚭寮傚父
+                throw dbTran.ErrorException;
+            }
+            return action;
+        }
+
     }//endClass
 }
\ No newline at end of file
diff --git a/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs b/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
index 243c7dc..9abb932 100644
--- a/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
+++ b/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
@@ -14,6 +14,7 @@
 using Tiger.Model.Sharetronic.Shelf;
 using MailKit.Search;
 using Tiger.Business.WMS.Extensions;
+using static Tiger.Model.BIZ_WMS_PREP_BTH;
 
 namespace Tiger.Business.WMS.Transaction
 {
@@ -171,8 +172,8 @@
             var action = new ApiAction<ScanOutput>(new ScanOutput());
             try
             {
-                var inputDtl = input?.Data?.JsonToObject<BIZ_WMS_PREP_DTL>();
-                var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == inputDtl.ID).First();
+                var option = CurPREP.Option = new BaseInput<SuggestOption>(input).Data;
+                var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == option.LineID).First();
                 if (prepDtl.IsNullOrEmpty())
                 {
                     action.IsSuccessed = false;
@@ -202,10 +203,10 @@
                 }
 
                 //濡傛灉鏄濂楀彂鏂欙紝鍒欏彧鎺ㄨ崘褰撳墠鐗╂枡琛岀殑涓�鐩樼墿鏂�
-                if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.First.GetValue())
+                if (option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.First)
                 {
                     //鎺ㄨ崘鐗╂枡
-                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, 1);
+                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, option, input.AuthOption, 1);
                     action.LocaleMsg = result.LocaleMsg;
                     if (result.IsException)
                     {
@@ -232,11 +233,11 @@
                 }
 
                 //濡傛灉鏄甯稿彂鏂欙紝鍒欐寜瀹為檯闇�姹傛暟閲忔帹鑽愬綋鍓嶇墿鏂欒鐨勬墍鏈夌墿鏂�
-                if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.Supply.GetValue())
+                if (option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.Supply)
                 {
                     //鎺ㄨ崘鐗╂枡
                     var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
-                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, actQty);
+                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, option, input.AuthOption, actQty);
                     action.LocaleMsg = result.LocaleMsg;
                     if (result.IsException)
                     {
@@ -290,10 +291,6 @@
         {
             var action = new ApiAction<BIZ_WMS_PREP_DTL>();
             var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == CurPrepDtl.ID).First();
-            prepDtl.ERP_WH = CurPrepDtl.ERP_WH;
-            prepDtl.WH_ID = CurPrepDtl.WH_ID;
-            prepDtl.REGION_ID = CurPrepDtl.REGION_ID;
-            prepDtl.SHELF_ID = CurPrepDtl.SHELF_ID;
             prepDtl.Suggests = Suggests;
             CurPrepDtl = prepDtl;
             CurPREP.Order.Details.RemoveAll(q => q.ID == CurPrepDtl.ID);
@@ -467,7 +464,6 @@
                 CurSn = CurInvItem.Items.Select(q => new BIZ_WMS_PREP_SN() {
                     ORDER_NO = CurPREP.Order.ORDER_NO,
                     ORDER_LINE = CurPrepDtl.ORDER_LINE,
-                    ORDER_BATCH = CurPREP.Order.CurBatch.BATCH.ToString(),
                     SN = q.SN,
                     ITEM_CODE = q.ITEM_CODE,
                     UNIT = q.UNIT,
@@ -475,22 +471,21 @@
                     QTY_DLVY = q.QTY,
                     STATUS = q.STATUS,
                     LOTNO = q.LOTNO,
+                    WH_ID = CurInvItem.Warehouse.ID,
                     WH_CODE = CurInvItem.Warehouse.WH_CODE,
+                    REGION_ID = CurInvItem.Region.ID,
                     REGION_CODE = CurInvItem.Region.REGION_CODE,
+                    SHELF_ID = CurInvItem.Shelf.ID,
                     SHELF_CODE = CurInvItem.Shelf.SHELF_CODE,
+                    LOCATION_ID = CurInvItem.Location.ID,
                     LOCATION_CODE = CurInvItem.Location.LOCATION_CODE,
-                    FTY_CODE = CurPREP.Order.CurBatch.FTY_CODE,
-                    WS_CODE = CurPREP.Order.CurBatch.WS_CODE,
-                    LINE_CODE = CurPREP.Order.CurBatch.LINE_CODE,
-                    POST_CODE = CurPREP.Order.CurBatch.POST_CODE,
-                    OPER_CODE = CurPREP.Order.CurBatch.OPER_CODE,
-                    SEGMENT = CurPREP.Order.CurBatch.SEGMENT,
                     SMT_NO = CurPrepDtl.SMT_NO,
                     STATION_NO = CurPrepDtl.STATION_NO,
                     FEEDER_NO = CurPrepDtl.FEEDER_NO,
                     FEEDER_TYPE = CurPrepDtl.FEEDER_TYPE,
-                    IS_FIRST = CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.First.GetValue() ? "Y" : "N",
+                    IS_FIRST = CurPREP.Option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.First ? "Y" : "N",
                     NEED_CUTTING = "N",
+                    TRACE_ID = TransID,
                 }).ToList();
 
 
@@ -621,14 +616,11 @@
                     }
                     CurPrepDtl.QTY_PREP += CurSn.Sum(q => q.QTY_DLVY);
                     CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Picking.GetValue();
-                    CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Picking.GetValue();
-                    CurPREP.Order.CurBatch.PICK_TIME = CurPREP.Order.CurBatch.PICK_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : CurPREP.Order.CurBatch.PICK_TIME;
 
                     //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
                     var _CurSn = CurSn.Clone();
                     var _CurPrepDtl = CurPrepDtl.Clone();
                     var _CurPREPOrder = CurPREP.Order.Clone();
-                    var _CurPREPCurBatch = CurPREP.Order.CurBatch.Clone();
                     AddCommitAction("UpdatePrep", () =>
                     {
                         //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
@@ -638,7 +630,6 @@
                         _CurPrepDtl.QTY_PREP = db.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == _CurPrepDtl.ORDER_NO && q.ORDER_LINE == _CurPrepDtl.ORDER_LINE).Sum(q => q.QTY_DLVY);
                         db.Updateable(_CurPrepDtl, UserCode).UpdateColumns(q => new { q.QTY_PREP, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                         db.Updateable(_CurPREPOrder, UserCode).UpdateColumns(q => new { q.STATUS, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
-                        db.Updateable(_CurPREPCurBatch, UserCode).UpdateColumns(q => new { q.STATUS, q.PICK_TIME, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                     });
 
                     //鐏伅
@@ -790,13 +781,14 @@
         }
 
         /// <summary>
-        /// 璋冪敤鍙戞枡鍗曟嵁鐨凟RP鎺ュ彛
+        /// 鍒涘缓鍙戞枡鎵规浠ュ畬鎴愭湰娆″彂鏂欙紝璋冪敤鍙戞枡鍗曟嵁鐨凟RP鎺ュ彛
         /// </summary>
         /// <param name="input"></param>
         /// <returns></returns>
-        public async Task<ApiAction> CommitToERP(BaseInput input)
+        public async Task<ApiAction> GenerateDlvyBatch(BaseInput input)
         {
-            var action = await CurPREP.Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>() .CommitToERP(this, input);
+            var range = input.Data.ToInt32().GetEnum<BATCH_RANGEs>();
+            var action = await CurPREP.Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>() .GenerateDlvyBatch(this, range);
             return action;
         }
 
diff --git a/Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs b/Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs
index 4ffdf1e..dbed44a 100644
--- a/Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs
+++ b/Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs
@@ -215,5 +215,51 @@
             trans?.AddHistory(Request, action);
             return Ok(response);
         }
+
+        /// <summary>
+        /// GenerateDlvyBatch(ApiAction(BaseInput))
+        /// 鍒涘缓鍙戞枡鎵规浠ュ畬鎴愭湰娆″彂鏂欙紝璋冪敤鍙戞枡鍗曟嵁鐨凟RP鎺ュ彛
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("api/[controller]/Out_PREP/GenerateDlvyBatch")]
+        public async Task<IActionResult> Out_BIZ_WMS_PREP_GenerateDlvyBatchAsync([FromBody] ApiAction<BaseInput> action)
+        {
+            ApiAction response;
+            IOut_BIZ_WMS_PREP trans = null;
+            try
+            {
+                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
+                {
+                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IOut_BIZ_WMS_PREP;
+                    if (!trans.IsFinished)
+                    {
+                        if (action.IsAsync)
+                        {
+                            response = action.GetResponse(await trans.GenerateDlvyBatch(action.Data));
+                        }
+                        else
+                        {
+                            lock (trans.TransLock) { response = action.GetResponse(trans.GenerateDlvyBatch(action.Data).Result); }
+                        }
+                    }
+                    else
+                    {
+                        response = action.GetResponse($"Transaction Error: 澶囨枡浠诲姟涓嬫灦浜嬪姟[ID:{action.ID}]宸茬粡鍏抽棴锛岃閲嶆柊鎵撳紑澶囨枡浠诲姟涓嬫灦鍔熻兘", false);
+                    }
+                }
+                else
+                {
+                    response = action.GetResponse($"Transaction Error: 澶囨枡浠诲姟涓嬫灦浜嬪姟[ID:{action.ID}]鏁版嵁涓㈠け锛岃閲嶆柊鎵撳紑澶囨枡浠诲姟涓嬫灦鍔熻兘", false);
+                }
+            }
+            catch (System.Exception ex)
+            {
+                response = action.GetResponse().CatchExceptionWithLog(ex);
+            }
+            trans?.AddHistory(Request, action);
+            return Ok(response);
+        }
     }//endClass
 }
\ No newline at end of file
diff --git a/Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs b/Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs
index 55a42fc..a881564 100644
--- a/Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs
+++ b/Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs
@@ -32,6 +32,13 @@
         /// <returns></returns>
         public Task<ApiAction<BIZ_WMS_PREP_DTL>> GetCurPrepItem();
 
+        /// <summary>
+        /// 鍒涘缓鍙戞枡鎵规浠ュ畬鎴愭湰娆″彂鏂欙紝璋冪敤鍙戞枡鍗曟嵁鐨凟RP鎺ュ彛
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public Task<ApiAction> GenerateDlvyBatch(BaseInput input);
+
         public bool Close(bool needSaveHistoryLog = false);
     }
 }
diff --git a/Tiger.Model.Net/Entitys/WMS/Api/Input_Entitys.cs b/Tiger.Model.Net/Entitys/WMS/Api/Input_Entitys.cs
index 7295a07..a492ca3 100644
--- a/Tiger.Model.Net/Entitys/WMS/Api/Input_Entitys.cs
+++ b/Tiger.Model.Net/Entitys/WMS/Api/Input_Entitys.cs
@@ -100,6 +100,49 @@
         public string Code { get; set; }
     }
 
+    /// <summary>
+    /// 澶囨枡鐗╂枡鎺ㄨ崘閫夐」
+    /// </summary>
+    public class SuggestOption
+    {
+        /// <summary>
+        /// 褰撳墠澶囨枡琛岀殑琛孖D
+        /// </summary>
+        public string LineID { get; set; }
+        /// <summary>
+        /// ERP浠撳簱缂栫爜
+        /// </summary>
+        public string ErpWH { get; set; }
+        /// <summary>
+        /// 浠撳簱ID
+        /// </summary>
+        public string WHID { get; set; }
+        /// <summary>
+        /// 鍌ㄥ尯ID
+        /// </summary>
+        public string RegionID { get; set; }
+        /// <summary>
+        /// 璐ф灦ID
+        /// </summary>
+        public string ShelfID { get; set; }
+        /// <summary>
+        /// 鍌ㄤ綅ID
+        /// </summary>
+        public string LocationID { get; set; }
+        /// <summary>
+        /// 鍙戞枡绛栫暐
+        /// </summary>
+        public WMS_ITEM_POOL.STRATEGYs Strategy { get; set; } = WMS_ITEM_POOL.STRATEGYs.FIFO;
+        /// <summary>
+        /// 鍙戞枡鏂瑰紡
+        /// </summary>
+        public WMS_ITEM_POOL.DLVY_MODEs DlvyMode { get; set; } = WMS_ITEM_POOL.DLVY_MODEs.Supply;
+        /// <summary>
+        /// 鏄惁瑕侀攣瀹氱墿鏂�
+        /// </summary>
+        public bool NeedLock { get; set; } = false;
+    }
+
     public class OutOthDtlInput : BasePageInput
     {
         public bool IsItemCodeList { get; set; }
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
index 39e7999..51c6f40 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
@@ -91,8 +91,6 @@
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
-        [SugarColumn(IsIgnore = true)]
-        public BIZ_WMS_PREP_BTH CurBatch => Batchs?.OrderBy(q => q.CALL_TIME).FirstOrDefault(q => q.STATUS < STATUSs.Sended.GetValue());
         #endregion
 
         #region 澶栭敭灞炴��
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_BTH.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_BTH.cs
index 34ba08e..02c3736 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_BTH.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_BTH.cs
@@ -7,240 +7,253 @@
 namespace Tiger.Model
 {
 	/// <summary>
-	/// 实体:备料任务(WMS)发料批次
+	/// 瀹炰綋锛氬鏂欎换鍔�(WMS)鍙戞枡鎵规
 	/// </summary>
 	[Description("Primary:ID")]
-	[DisplayName("备料任务(WMS)发料批次")]
+	[DisplayName("澶囨枡浠诲姟(WMS)鍙戞枡鎵规")]
 	[Serializable]
 	[SugarTable("BIZ_WMS_PREP_BTH")]
 	public class BIZ_WMS_PREP_BTH : DbEntityWithAuth
 	{
-		#region 构造函数
+		#region 鏋勯�犲嚱鏁�
 		/// <summary>
-		/// 实体:备料任务(WMS)发料批次
+		/// 瀹炰綋锛氬鏂欎换鍔�(WMS)鍙戞枡鎵规
 		/// </summary>
 		public BIZ_WMS_PREP_BTH() {}
 		#endregion
 
-		#region 公共属性
+		#region 鍏叡灞炴��
 		/// <summary>
-		/// 备料任务号
+		/// 澶囨枡浠诲姟鍙�
 		/// </summary>
-		[DisplayName("备料任务号")]
+		[DisplayName("澶囨枡浠诲姟鍙�")]
 		public string ORDER_NO { get; set; }
 		/// <summary>
-		/// 发料批次
+		/// 鍙戞枡鎵规
 		/// </summary>
-		[DisplayName("发料批次")]
-		public int BATCH { get; set; }
+		[DisplayName("鍙戞枡鎵规")]
+		public string DLVY_BATCH { get; set; }
 		/// <summary>
-		/// 备料方式(0Whole整单备料|1SideA/A面备料|2SideB/B面备料)
+		/// 澶囨枡鏂瑰紡(0Whole鏁村崟澶囨枡|1SideA/A闈㈠鏂檤2SideB/B闈㈠鏂�)
 		/// </summary>
-		[DisplayName("备料方式(0Whole整单备料|1SideA/A面备料|2SideB/B面备料)")]
+		[DisplayName("澶囨枡鏂瑰紡(0Whole鏁村崟澶囨枡|1SideA/A闈㈠鏂檤2SideB/B闈㈠鏂�)")]
 		public int PREP_MODE { get; set; }
 		/// <summary>
-		/// 发料方式(0Supply正常发料|1First首套发料)
+		/// 鍙戞枡鏂瑰紡(0Supply姝e父鍙戞枡|1First棣栧鍙戞枡)
 		/// </summary>
-		[DisplayName("发料方式(0Supply正常发料|1First首套发料)")]
+		[DisplayName("鍙戞枡鏂瑰紡(0Supply姝e父鍙戞枡|1First棣栧鍙戞枡)")]
 		public int DLVY_MODE { get; set; }
 		/// <summary>
-		/// 状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)
+		/// 鐘舵��(0Init鍒濆鍖東1Called宸插彨鏂檤2WaitPick寰呮崱鏂檤3Picking鎹℃枡涓瓅4Picked宸叉崱瀹寍5Sended宸插彂鏂檤6Close宸插叧闂瓅7Cancel浣滃簾)
 		/// </summary>
-		[DisplayName("状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)")]
+		[DisplayName("鐘舵��(0Init鍒濆鍖東1Called宸插彨鏂檤2WaitPick寰呮崱鏂檤3Picking鎹℃枡涓瓅4Picked宸叉崱瀹寍5Sended宸插彂鏂檤6Close宸插叧闂瓅7Cancel浣滃簾)")]
 		public int STATUS { get; set; }
 		/// <summary>
-		/// 工厂编码
+		/// 宸ュ巶缂栫爜
 		/// </summary>
-		[DisplayName("工厂编码")]
+		[DisplayName("宸ュ巶缂栫爜")]
 		public string FTY_CODE { get; set; }
 		/// <summary>
-		/// 车间编码
+		/// 杞﹂棿缂栫爜
 		/// </summary>
-		[DisplayName("车间编码")]
+		[DisplayName("杞﹂棿缂栫爜")]
 		public string WS_CODE { get; set; }
 		/// <summary>
-		/// 产线编码
+		/// 浜х嚎缂栫爜
 		/// </summary>
-		[DisplayName("产线编码")]
+		[DisplayName("浜х嚎缂栫爜")]
 		public string LINE_CODE { get; set; }
 		/// <summary>
-		/// 岗位编码
+		/// 宀椾綅缂栫爜
 		/// </summary>
-		[DisplayName("岗位编码")]
+		[DisplayName("宀椾綅缂栫爜")]
 		public string POST_CODE { get; set; }
 		/// <summary>
-		/// 工序编码
+		/// 宸ュ簭缂栫爜
 		/// </summary>
-		[DisplayName("工序编码")]
+		[DisplayName("宸ュ簭缂栫爜")]
 		public string OPER_CODE { get; set; }
 		/// <summary>
-		/// 加工段
+		/// 鍔犲伐娈�
 		/// </summary>
-		[DisplayName("加工段")]
+		[DisplayName("鍔犲伐娈�")]
 		public string SEGMENT { get; set; }
 		/// <summary>
-		/// 叫料时间
+		/// 鍙枡鏃堕棿
 		/// </summary>
-		[DisplayName("叫料时间")]
+		[DisplayName("鍙枡鏃堕棿")]
 		public DateTime CALL_TIME { get; set; } = DateTime.MinValue;
 		/// <summary>
-		/// 计划完成时间
+		/// 璁″垝瀹屾垚鏃堕棿
 		/// </summary>
-		[DisplayName("计划完成时间")]
+		[DisplayName("璁″垝瀹屾垚鏃堕棿")]
 		public DateTime PLAN_TIME { get; set; } = DateTime.MinValue;
 		/// <summary>
-		/// 备料开始时间
+		/// 澶囨枡寮�濮嬫椂闂�
 		/// </summary>
-		[DisplayName("备料开始时间")]
+		[DisplayName("澶囨枡寮�濮嬫椂闂�")]
 		public DateTime PICK_TIME { get; set; } = DateTime.MinValue;
 		/// <summary>
-		/// 备料优先级(1-7)越小越优先
+		/// 澶囨枡浼樺厛绾�(1-7)瓒婂皬瓒婁紭鍏�
 		/// </summary>
-		[DisplayName("备料优先级(1-7)越小越优先")]
+		[DisplayName("澶囨枡浼樺厛绾�(1-7)瓒婂皬瓒婁紭鍏�")]
 		public int PRIORITY { get; set; }
 		/// <summary>
-		/// 备料人
+		/// 澶囨枡浜�
 		/// </summary>
-		[DisplayName("备料人")]
+		[DisplayName("澶囨枡浜�")]
 		public string PREP_PERSON { get; set; }
 		/// <summary>
-		/// 备料完成时间
+		/// 澶囨枡瀹屾垚鏃堕棿
 		/// </summary>
-		[DisplayName("备料完成时间")]
+		[DisplayName("澶囨枡瀹屾垚鏃堕棿")]
 		public DateTime FINISH_TIME { get; set; } = DateTime.MinValue;
 		/// <summary>
-		/// 关联领料单ID
+		/// 鍏宠仈棰嗘枡鍗旾D
 		/// </summary>
-		[DisplayName("关联领料单ID")]
+		[DisplayName("鍏宠仈棰嗘枡鍗旾D")]
 		public string REQ_ID { get; set; }
 		/// <summary>
-		/// 关联领料单号
+		/// 鍏宠仈棰嗘枡鍗曞彿
 		/// </summary>
-		[DisplayName("关联领料单号")]
+		[DisplayName("鍏宠仈棰嗘枡鍗曞彿")]
 		public string REQ_ORDER { get; set; }
 		/// <summary>
-		/// 领料人
+		/// 棰嗘枡浜�
 		/// </summary>
-		[DisplayName("领料人")]
+		[DisplayName("棰嗘枡浜�")]
 		public string REQ_PERSON { get; set; }
 		/// <summary>
-		/// 领料部门
+		/// 棰嗘枡閮ㄩ棬
 		/// </summary>
-		[DisplayName("领料部门")]
+		[DisplayName("棰嗘枡閮ㄩ棬")]
 		public string REQ_DEPT { get; set; }
 		/// <summary>
-		/// 领料出库时间
+		/// 棰嗘枡鍑哄簱鏃堕棿
 		/// </summary>
-		[DisplayName("领料出库时间")]
+		[DisplayName("棰嗘枡鍑哄簱鏃堕棿")]
 		public DateTime DLVY_TIME { get; set; } = DateTime.MinValue;
 		/// <summary>
-		/// 备注
+		/// 澶囨敞
 		/// </summary>
-		[DisplayName("备注")]
+		[DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
 		/// <summary>
-		/// -1:未处理,0:同步处理完,>0:同步处理失败次数
+		/// -1:鏈鐞嗭紝0:鍚屾澶勭悊瀹岋紝>0:鍚屾澶勭悊澶辫触娆℃暟
 		/// </summary>
-		[DisplayName("-1:未处理,0:同步处理完,>0:同步处理失败次数")]
+		[DisplayName("-1:鏈鐞嗭紝0:鍚屾澶勭悊瀹岋紝>0:鍚屾澶勭悊澶辫触娆℃暟")]
 		public int HANDLED { get; set; } = -1;
 		/// <summary>
-		/// 最后一次同步处理日期
+		/// 鏈�鍚庝竴娆″悓姝ュ鐞嗘棩鏈�
 		/// </summary>
-		[DisplayName("最后一次同步处理日期")]
+		[DisplayName("鏈�鍚庝竴娆″悓姝ュ鐞嗘棩鏈�")]
 		public DateTime HANDLED_DATE { get; set; } = DateTime.MinValue;
 		/// <summary>
-		/// 过账提交的JSON
+		/// 杩囪处鎻愪氦鐨凧SON
 		/// </summary>
-		[DisplayName("过账提交的JSON")]
+		[DisplayName("杩囪处鎻愪氦鐨凧SON")]
 		public string COMMIT_JSON { get; set; }
 		/// <summary>
-		/// 过账提交的返回信息
+		/// 杩囪处鎻愪氦鐨勮繑鍥炰俊鎭�
 		/// </summary>
-		[DisplayName("过账提交的返回信息")]
+		[DisplayName("杩囪处鎻愪氦鐨勮繑鍥炰俊鎭�")]
 		public string COMMIT_MSG { get; set; }
-		#endregion
+        #endregion
 
-		#region 虚拟属性
-		/*例子
+        #region 铏氭嫙灞炴��
+        /*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
-		#endregion
+        #endregion
 
-		#region 外键属性
-		/*例子
-		//一对一外键导航
-		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是BIZ_WMS_PREP_BTH类里面的外键ID字段
-		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
-		//一对多外键导航
-		[Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_WMS_PREP_BTHId))]//ClassA表中的BIZ_WMS_PREP_BTHId
-		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
-		//多对多外键导航
-		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_BTHId), nameof(MappingClass.ClassAId))]//注意顺序
-		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+        #region 澶栭敭灞炴��
+        /*渚嬪瓙
+		//涓�瀵逛竴澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疊IZ_WMS_PREP_BTH绫婚噷闈㈢殑澶栭敭ID瀛楁
+		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//涓�瀵瑰澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_WMS_PREP_BTHId))]//ClassA琛ㄤ腑鐨凚IZ_WMS_PREP_BTHId
+		public List<ClassA> ClassAList { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//澶氬澶氬閿鑸�
+		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_BTHId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
+		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
 		*/
-		#endregion
+        #endregion
 
-		#region 枚举变量
-		/*例子
+        #region 鏋氫妇鍙橀噺
+        /*渚嬪瓙
 		public enum FieldNames
 		{
-			[Description("枚举描述0")]
+			[Description("鏋氫妇鎻忚堪0")]
 			Enum0,
-			[Description("枚举描述1")]
+			[Description("鏋氫妇鎻忚堪1")]
 			Enum1,
 		}
 		*/
 
-		/// <summary>
-		/// 枚举:备料方式(0Whole整单备料|1SideA/A面备料|2SideB/B面备料)
-		/// </summary>
-		public enum PREP_MODEs
+        /// <summary>
+        /// 鏋氫妇锛氱敓鎴愯寖鍥�(0CurTrans鏈鎿嶄綔|1CurWH褰撳墠浠撳簱|2Whole褰撳墠鍗曟嵁)
+        /// </summary>
+        public enum BATCH_RANGEs
+        {
+            [Description("鏈鎿嶄綔")]
+            CurTrans = 0,
+            [Description("褰撳墠浠撳簱")]
+            CurWH = 1,
+            [Description("褰撳墠鍗曟嵁")]
+            Whole = 2,
+        }
+
+        /// <summary>
+        /// 鏋氫妇锛氬鏂欐柟寮�(0Whole鏁村崟澶囨枡|1SideA/A闈㈠鏂檤2SideB/B闈㈠鏂�)
+        /// </summary>
+        public enum PREP_MODEs
 		{
-			[Description("整单备料")]
+			[Description("鏁村崟澶囨枡")]
 			Whole = 0,
-			[Description("A面备料")]
+			[Description("A闈㈠鏂�")]
 			SideA = 1,
-			[Description("B面备料")]
+			[Description("B闈㈠鏂�")]
 			SideB = 2,
 		}
 
 		/// <summary>
-		/// 枚举:发料方式(0Supply正常发料|1First首套发料)
+		/// 鏋氫妇锛氬彂鏂欐柟寮�(0Supply姝e父鍙戞枡|1First棣栧鍙戞枡)
 		/// </summary>
 		public enum DLVY_MODEs
 		{
-			[Description("正常发料")]
+			[Description("姝e父鍙戞枡")]
 			Supply = 0,
-			[Description("首套发料")]
+			[Description("棣栧鍙戞枡")]
 			First = 1,
 		}
 
 		/// <summary>
-		/// 枚举:状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)
+		/// 鏋氫妇锛氱姸鎬�(0Init鍒濆鍖東1Called宸插彨鏂檤2WaitPick寰呮崱鏂檤3Picking鎹℃枡涓瓅4Picked宸叉崱瀹寍5Sended宸插彂鏂檤6Close宸插叧闂瓅7Cancel浣滃簾)
 		/// </summary>
 		public enum STATUSs
 		{
-			[Description("初始化")]
+			[Description("鍒濆鍖�")]
 			Init = 0,
-			[Description("已叫料")]
+			[Description("宸插彨鏂�")]
 			Called = 1,
-			[Description("待捡料")]
+			[Description("寰呮崱鏂�")]
 			WaitPick = 2,
-			[Description("捡料中")]
+			[Description("鎹℃枡涓�")]
 			Picking = 3,
-			[Description("已捡完")]
+			[Description("宸叉崱瀹�")]
 			Picked = 4,
-			[Description("已发料")]
+			[Description("宸插彂鏂�")]
 			Sended = 5,
-			[Description("已关闭")]
+			[Description("宸插叧闂�")]
 			Close = 6,
-			[Description("作废")]
+			[Description("浣滃簾")]
 			Cancel = 7,
 		}
 		#endregion
 
-		#region 公共方法
+		#region 鍏叡鏂规硶
 
 		#endregion
 
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs
index 20f7759..d0e0643 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs
@@ -176,14 +176,6 @@
 		public string FieldName { get; set; }
 		*/
         [SugarColumn(IsIgnore = true)]
-        public string ERP_WH { get; set; }
-        [SugarColumn(IsIgnore = true)]
-        public string WH_ID { get; set; }
-        [SugarColumn(IsIgnore = true)]
-        public string REGION_ID { get; set; }
-        [SugarColumn(IsIgnore = true)]
-        public string SHELF_ID { get; set; }
-        [SugarColumn(IsIgnore = true)]
         public List<SuggestItem> Suggests { get; set; }
         #endregion
 
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs
index a709798..cdb32ab 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs
@@ -37,7 +37,7 @@
 		/// 鍙戞枡鎵规
 		/// </summary>
 		[DisplayName("鍙戞枡鎵规")]
-		public string ORDER_BATCH { get; set; }
+		public string DLVY_BATCH { get; set; }
 		/// <summary>
 		/// 鐗╁搧鏍囩
 		/// </summary>
@@ -78,30 +78,50 @@
 		/// </summary>
 		[DisplayName("鐘舵��(鍚學MS_ITEM鐘舵��)")]
 		public int STATUS { get; set; }
-		/// <summary>
-		/// 鍙戞枡浠撳簱
-		/// </summary>
-		[DisplayName("鍙戞枡浠撳簱")]
-		public string WH_CODE { get; set; }
-		/// <summary>
-		/// 鍙戞枡鍌ㄥ尯
-		/// </summary>
-		[DisplayName("鍙戞枡鍌ㄥ尯")]
-		public string REGION_CODE { get; set; }
-		/// <summary>
-		/// 鍙戞枡璐ф灦/鏂欒溅
-		/// </summary>
-		[DisplayName("鍙戞枡璐ф灦/鏂欒溅")]
-		public string SHELF_CODE { get; set; }
-		/// <summary>
-		/// 鍙戞枡鍌ㄤ綅
-		/// </summary>
-		[DisplayName("鍙戞枡鍌ㄤ綅")]
-		public string LOCATION_CODE { get; set; }
-		/// <summary>
-		/// 涓嬫灦鏃堕棿
-		/// </summary>
-		[DisplayName("涓嬫灦鏃堕棿")]
+        /// <summary>
+        /// 鍙戞枡浠撳簱ID
+        /// </summary>
+        [DisplayName("鍙戞枡浠撳簱ID")]
+        public string WH_ID { get; set; }
+        /// <summary>
+        /// 鍙戞枡浠撳簱
+        /// </summary>
+        [DisplayName("鍙戞枡浠撳簱")]
+        public string WH_CODE { get; set; }
+        /// <summary>
+        /// 鍙戞枡鍌ㄥ尯ID
+        /// </summary>
+        [DisplayName("鍙戞枡鍌ㄥ尯ID")]
+        public string REGION_ID { get; set; }
+        /// <summary>
+        /// 鍙戞枡鍌ㄥ尯
+        /// </summary>
+        [DisplayName("鍙戞枡鍌ㄥ尯")]
+        public string REGION_CODE { get; set; }
+        /// <summary>
+        /// 鍙戞枡璐ф灦/鏂欒溅ID
+        /// </summary>
+        [DisplayName("鍙戞枡璐ф灦/鏂欒溅ID")]
+        public string SHELF_ID { get; set; }
+        /// <summary>
+        /// 鍙戞枡璐ф灦/鏂欒溅
+        /// </summary>
+        [DisplayName("鍙戞枡璐ф灦/鏂欒溅")]
+        public string SHELF_CODE { get; set; }
+        /// <summary>
+        /// 鍙戞枡鍌ㄤ綅ID
+        /// </summary>
+        [DisplayName("鍙戞枡鍌ㄤ綅ID")]
+        public string LOCATION_ID { get; set; }
+        /// <summary>
+        /// 鍙戞枡鍌ㄤ綅
+        /// </summary>
+        [DisplayName("鍙戞枡鍌ㄤ綅")]
+        public string LOCATION_CODE { get; set; }
+        /// <summary>
+        /// 涓嬫灦鏃堕棿
+        /// </summary>
+        [DisplayName("涓嬫灦鏃堕棿")]
 		public DateTime DOWN_TIME { get; set; } = DateTime.MinValue;
 		/// <summary>
 		/// 鍑哄簱鏃堕棿
@@ -193,6 +213,16 @@
 		/// </summary>
 		[DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
+        /// <summary>
+		/// 杩芥函ID
+		/// </summary>
+		[DisplayName("杩芥函ID")]
+        public string TRACE_ID { get; set; }
+        /// <summary>
+		/// 杩芥函淇℃伅
+		/// </summary>
+		[DisplayName("杩芥函淇℃伅")]
+        public string TRACE_INFO { get; set; }
         #endregion
 
         #region 铏氭嫙灞炴��
diff --git a/Tiger.Model.Net/Entitys/WMS/V_ITEM_BIZ_ERP_RECEIPT_SN.cs b/Tiger.Model.Net/Entitys/WMS/V_ITEM_BIZ_ERP_RECEIPT_SN.cs
index 0a47c86..aa72eb1 100644
--- a/Tiger.Model.Net/Entitys/WMS/V_ITEM_BIZ_ERP_RECEIPT_SN.cs
+++ b/Tiger.Model.Net/Entitys/WMS/V_ITEM_BIZ_ERP_RECEIPT_SN.cs
@@ -34,7 +34,7 @@
         /// </summary>
         public string ITEM_CODE { get; set; }
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public int STATUS { get; set; }
 		/// <summary>
diff --git a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM.cs b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM.cs
index 23506fe..361789f 100644
--- a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM.cs
+++ b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM.cs
@@ -46,7 +46,7 @@
         /// </summary>
         public string SN_TYPE { get; set; }
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public int STATUS { get; set; }
 		/// <summary>
diff --git a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_A.cs b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_A.cs
index d6c2f6e..8167edd 100644
--- a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_A.cs
+++ b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_A.cs
@@ -46,7 +46,7 @@
         /// </summary>
         public string SN_TYPE { get; set; }
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public int STATUS { get; set; }
 		/// <summary>
diff --git a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_D.cs b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_D.cs
index 6da8ce1..ff80ca7 100644
--- a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_D.cs
+++ b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_D.cs
@@ -46,7 +46,7 @@
         /// </summary>
         public string SN_TYPE { get; set; }
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public int STATUS { get; set; }
 		/// <summary>
diff --git a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_HIS.cs b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_HIS.cs
index 13c1583..e46e7e4 100644
--- a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_HIS.cs
+++ b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_HIS.cs
@@ -48,7 +48,7 @@
         /// </summary>
         public string SN_TYPE { get; set; }
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public int STATUS { get; set; }
 		/// <summary>
diff --git a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_X.cs b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_X.cs
index b2763cb..d495d80 100644
--- a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_X.cs
+++ b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_X.cs
@@ -46,7 +46,7 @@
         /// </summary>
         public string SN_TYPE { get; set; }
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public int STATUS { get; set; }
 		/// <summary>
diff --git a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_Y.cs b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_Y.cs
index 7f24072..66397d3 100644
--- a/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_Y.cs
+++ b/Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_Y.cs
@@ -46,7 +46,7 @@
         /// </summary>
         public string SN_TYPE { get; set; }
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public int STATUS { get; set; }
 		/// <summary>
diff --git a/Tiger.Model.Net/Entitys/WMS/WMS_ITEM.cs b/Tiger.Model.Net/Entitys/WMS/WMS_ITEM.cs
index c398bd2..9732beb 100644
--- a/Tiger.Model.Net/Entitys/WMS/WMS_ITEM.cs
+++ b/Tiger.Model.Net/Entitys/WMS/WMS_ITEM.cs
@@ -45,7 +45,7 @@
         public string SN_TYPE { get; set; }
 
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public int STATUS { get; set; }
 
@@ -204,7 +204,7 @@
         #region 鏋氫妇鍙橀噺
 
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public enum STATUSs
         {
@@ -235,6 +235,9 @@
             [Description("宸插彂鏂�")]
             Sended = 60,
 
+            [Description("琚帴鏀�")]
+            Received = 65,
+
             [Description("宸蹭笂鏂�")]
             Loaded = 70,
 
diff --git a/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_HIS.cs b/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_HIS.cs
index 68019d2..7a6b4f0 100644
--- a/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_HIS.cs
+++ b/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_HIS.cs
@@ -74,7 +74,7 @@
         /// </summary>
         public string SN_TYPE { get; set; }
         /// <summary>
-        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
+        /// 鍌ㄥ瓨鐘舵��(0NotExists涓嶅瓨鍦▅10Incoming閫佽揣涓瓅20WaitTest寰呮楠寍21Rejected闇�閫�璐30WaitIn寰呭叆搴搢40InStore鍦ㄥ簱|50OffShelf宸蹭笅鏋秥60Sended宸插彂鏂檤65Received琚帴鏀秥70Loaded宸蹭笂鏂檤80UseUp宸茶�楀敖|90Returned宸查��鏂檤100Shipped宸插嚭璐�)
         /// </summary>
         public int STATUS { get; set; }
 		/// <summary>
diff --git a/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_POOL.cs b/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_POOL.cs
index 57d9b87..72c1180 100644
--- a/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_POOL.cs
+++ b/Tiger.Model.Net/Entitys/WMS/WMS_ITEM_POOL.cs
@@ -7,235 +7,237 @@
 namespace Tiger.Model
 {
 	/// <summary>
-	/// 实体:备料库存池
+	/// 瀹炰綋锛氬鏂欏簱瀛樻睜
 	/// </summary>
 	[Description("Primary:ID")]
-	[DisplayName("备料库存池")]
+	[DisplayName("澶囨枡搴撳瓨姹�")]
 	[Serializable]
 	[SugarTable("WMS_ITEM_POOL")]
 	public class WMS_ITEM_POOL : DbEntityNoGhostWithAuth
 	{
-		#region 构造函数
+		#region 鏋勯�犲嚱鏁�
 		/// <summary>
-		/// 实体:备料库存池
+		/// 瀹炰綋锛氬鏂欏簱瀛樻睜
 		/// </summary>
 		public WMS_ITEM_POOL() {}
 		#endregion
 
-		#region 公共属性
+		#region 鍏叡灞炴��
 		/// <summary>
-		/// 事务ID
+		/// 浜嬪姟ID
 		/// </summary>
-		[DisplayName("事务ID")]
+		[DisplayName("浜嬪姟ID")]
 		public string TRANS_ID { get; set; }
 		/// <summary>
-		/// 业务单据编码
+		/// 涓氬姟鍗曟嵁缂栫爜
 		/// </summary>
-		[DisplayName("业务单据编码")]
+		[DisplayName("涓氬姟鍗曟嵁缂栫爜")]
 		public string TRANS_CODE { get; set; }
 		/// <summary>
-		/// 业务单据号码
+		/// 涓氬姟鍗曟嵁鍙风爜
 		/// </summary>
-		[DisplayName("业务单据号码")]
+		[DisplayName("涓氬姟鍗曟嵁鍙风爜")]
 		public string TRANS_NO { get; set; }
 		/// <summary>
-		/// 业务单据行号
+		/// 涓氬姟鍗曟嵁琛屽彿
 		/// </summary>
-		[DisplayName("业务单据行号")]
+		[DisplayName("涓氬姟鍗曟嵁琛屽彿")]
 		public string TRANS_LINE { get; set; }
 		/// <summary>
-		/// 来源单据编码
+		/// 鏉ユ簮鍗曟嵁缂栫爜
 		/// </summary>
-		[DisplayName("来源单据编码")]
+		[DisplayName("鏉ユ簮鍗曟嵁缂栫爜")]
 		public string SOURCE_CODE { get; set; }
 		/// <summary>
-		/// 来源单据号码
+		/// 鏉ユ簮鍗曟嵁鍙风爜
 		/// </summary>
-		[DisplayName("来源单据号码")]
+		[DisplayName("鏉ユ簮鍗曟嵁鍙风爜")]
 		public string SOURCE_ORDER { get; set; }
 		/// <summary>
-		/// 来源单据行号
+		/// 鏉ユ簮鍗曟嵁琛屽彿
 		/// </summary>
-		[DisplayName("来源单据行号")]
+		[DisplayName("鏉ユ簮鍗曟嵁琛屽彿")]
 		public string SOURCE_LINE { get; set; }
 		/// <summary>
-		/// 备料策略(位标志枚举)(1FIFO先进先出|2FSFO/尾数优先)
+		/// 澶囨枡绛栫暐锛堜綅鏍囧織鏋氫妇锛�(0None涓嶅惎鐢▅1FIFO鍏堣繘鍏堝嚭|2FSFO/灏炬暟浼樺厛)
 		/// </summary>
-		[DisplayName("备料策略(位标志枚举)(1FIFO先进先出|2FSFO/尾数优先)")]
+		[DisplayName("澶囨枡绛栫暐锛堜綅鏍囧織鏋氫妇锛�(0None涓嶅惎鐢▅1FIFO鍏堣繘鍏堝嚭|2FSFO/灏炬暟浼樺厛)")]
 		public int STRATEGY { get; set; }
 		/// <summary>
-		/// 发料方式(0Supply正常发料|1First首套发料)
+		/// 鍙戞枡鏂瑰紡(0Supply姝e父鍙戞枡|1First棣栧鍙戞枡)
 		/// </summary>
-		[DisplayName("发料方式(0Supply正常发料|1First首套发料)")]
+		[DisplayName("鍙戞枡鏂瑰紡(0Supply姝e父鍙戞枡|1First棣栧鍙戞枡)")]
 		public int DLVY_MODE { get; set; }
 		/// <summary>
-		/// 是否被锁定(Y/N),锁定则不允许其他事务分配当前物料
+		/// 鏄惁琚攣瀹�(Y/N)锛岄攣瀹氬垯涓嶅厑璁稿叾浠栦簨鍔″垎閰嶅綋鍓嶇墿鏂�
 		/// </summary>
-		[DisplayName("是否被锁定(Y/N),锁定则不允许其他事务分配当前物料")]
+		[DisplayName("鏄惁琚攣瀹�(Y/N)锛岄攣瀹氬垯涓嶅厑璁稿叾浠栦簨鍔″垎閰嶅綋鍓嶇墿鏂�")]
 		public string IS_LOCKED { get; set; }
 		/// <summary>
-		/// 物料编码
+		/// 鐗╂枡缂栫爜
 		/// </summary>
-		[DisplayName("物料编码")]
+		[DisplayName("鐗╂枡缂栫爜")]
 		public string ITEM_CODE { get; set; }
 		/// <summary>
-		/// 物料条码
+		/// 鐗╂枡鏉$爜
 		/// </summary>
-		[DisplayName("物料条码")]
+		[DisplayName("鐗╂枡鏉$爜")]
 		public string SN { get; set; }
 		/// <summary>
-		/// 物料数量
+		/// 鐗╂枡鏁伴噺
 		/// </summary>
-		[DisplayName("物料数量")]
+		[DisplayName("鐗╂枡鏁伴噺")]
 		public double QTY { get; set; }
 		/// <summary>
-		/// 已分配数量
+		/// 宸插垎閰嶆暟閲�
 		/// </summary>
-		[DisplayName("已分配数量")]
+		[DisplayName("宸插垎閰嶆暟閲�")]
 		public double ALLOC_QTY { get; set; }
 		/// <summary>
-		/// 生产日期
+		/// 鐢熶骇鏃ユ湡
 		/// </summary>
-		[DisplayName("生产日期")]
+		[DisplayName("鐢熶骇鏃ユ湡")]
 		public DateTime PROD_DATE { get; set; } = DateTime.MinValue;
 		/// <summary>
-		/// 仓库ID
+		/// 浠撳簱ID
 		/// </summary>
-		[DisplayName("仓库ID")]
+		[DisplayName("浠撳簱ID")]
 		public string WH_ID { get; set; }
 		/// <summary>
-		/// 储区ID
+		/// 鍌ㄥ尯ID
 		/// </summary>
-		[DisplayName("储区ID")]
+		[DisplayName("鍌ㄥ尯ID")]
 		public string REGION_ID { get; set; }
 		/// <summary>
-		/// 货架/料车ID
+		/// 璐ф灦/鏂欒溅ID
 		/// </summary>
-		[DisplayName("货架/料车ID")]
+		[DisplayName("璐ф灦/鏂欒溅ID")]
 		public string SHELF_ID { get; set; }
 		/// <summary>
-		/// 储位ID
+		/// 鍌ㄤ綅ID
 		/// </summary>
-		[DisplayName("储位ID")]
+		[DisplayName("鍌ㄤ綅ID")]
 		public string LOCATION_ID { get; set; }
 		/// <summary>
-		/// 是否首套料(Y/N)
+		/// 鏄惁棣栧鏂�(Y/N)
 		/// </summary>
-		[DisplayName("是否首套料(Y/N)")]
+		[DisplayName("鏄惁棣栧鏂�(Y/N)")]
 		public string IS_FIRST { get; set; }
 		/// <summary>
-		/// 分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
+		/// 鍒嗛厤鐘舵��(0AllAllocated鍏ㄩ儴鍒嗛厤|1PartialAllocate閮ㄥ垎鍒嗛厤)
 		/// </summary>
-		[DisplayName("分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)")]
+		[DisplayName("鍒嗛厤鐘舵��(0AllAllocated鍏ㄩ儴鍒嗛厤|1PartialAllocate閮ㄥ垎鍒嗛厤)")]
 		public int ALLOC_MODE { get; set; }
 		/// <summary>
-		/// 状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)
+		/// 鐘舵��(0WaitPick寰呮崱鏂檤1Picking鎹℃枡涓瓅2WaitSend寰呭彂鏂檤3Sended宸插彂鏂檤4Close宸插叧闂瓅5Cancel浣滃簾)
 		/// </summary>
-		[DisplayName("状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)")]
+		[DisplayName("鐘舵��(0WaitPick寰呮崱鏂檤1Picking鎹℃枡涓瓅2WaitSend寰呭彂鏂檤3Sended宸插彂鏂檤4Close宸插叧闂瓅5Cancel浣滃簾)")]
 		public int STATUS { get; set; }
 		/// <summary>
-		/// 加工段
+		/// 鍔犲伐娈�
 		/// </summary>
-		[DisplayName("加工段")]
+		[DisplayName("鍔犲伐娈�")]
 		public string SEGMENT { get; set; }
 		/// <summary>
-		/// 目标产线编码
+		/// 鐩爣浜х嚎缂栫爜
 		/// </summary>
-		[DisplayName("目标产线编码")]
+		[DisplayName("鐩爣浜х嚎缂栫爜")]
 		public string LINE_CODE { get; set; }
 		/// <summary>
-		/// 备注
+		/// 澶囨敞
 		/// </summary>
-		[DisplayName("备注")]
+		[DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
 		#endregion
 
-		#region 虚拟属性
-		/*例子
+		#region 铏氭嫙灞炴��
+		/*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
 		#endregion
 
-		#region 外键属性
-		/*例子
-		//一对一外键导航
-		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是WMS_ITEM_POOL类里面的外键ID字段
-		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
-		//一对多外键导航
-		[Navigate(NavigateType.OneToMany, nameof(ClassA.WMS_ITEM_POOLId))]//ClassA表中的WMS_ITEM_POOLId
-		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
-		//多对多外键导航
-		[Navigate(typeof(MappingClass), nameof(MappingClass.WMS_ITEM_POOLId), nameof(MappingClass.ClassAId))]//注意顺序
-		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+		#region 澶栭敭灞炴��
+		/*渚嬪瓙
+		//涓�瀵逛竴澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疻MS_ITEM_POOL绫婚噷闈㈢殑澶栭敭ID瀛楁
+		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//涓�瀵瑰澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.WMS_ITEM_POOLId))]//ClassA琛ㄤ腑鐨刉MS_ITEM_POOLId
+		public List<ClassA> ClassAList { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//澶氬澶氬閿鑸�
+		[Navigate(typeof(MappingClass), nameof(MappingClass.WMS_ITEM_POOLId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
+		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
 		*/
 		#endregion
 
-		#region 枚举变量
-		/*例子
+		#region 鏋氫妇鍙橀噺
+		/*渚嬪瓙
 		public enum FieldNames
 		{
-			[Description("枚举描述0")]
+			[Description("鏋氫妇鎻忚堪0")]
 			Enum0,
-			[Description("枚举描述1")]
+			[Description("鏋氫妇鎻忚堪1")]
 			Enum1,
 		}
 		*/
 
 		/// <summary>
-		/// 枚举:备料策略(位标志枚举)(1FIFO先进先出|2FSFO/尾数优先)
+		/// 鏋氫妇锛氬鏂欑瓥鐣ワ紙浣嶆爣蹇楁灇涓撅級(0None涓嶅惎鐢▅1FIFO鍏堣繘鍏堝嚭|2FSFO/灏炬暟浼樺厛)
 		/// </summary>
 		public enum STRATEGYs
 		{
-			[Description("先进先出")]
+            [Description("涓嶅惎鐢�")]
+            None = 0,
+			[Description("鍏堣繘鍏堝嚭")]
 			FIFO = 1,
-			[Description("尾数优先")]
+			[Description("灏炬暟浼樺厛")]
 			FSFO = 2,
 		}
 
 		/// <summary>
-		/// 枚举:发料方式(0Supply正常发料|1First首套发料)
+		/// 鏋氫妇锛氬彂鏂欐柟寮�(0Supply姝e父鍙戞枡|1First棣栧鍙戞枡)
 		/// </summary>
 		public enum DLVY_MODEs
 		{
-			[Description("正常发料")]
+			[Description("姝e父鍙戞枡")]
 			Supply = 0,
-			[Description("首套发料")]
+			[Description("棣栧鍙戞枡")]
 			First = 1,
 		}
 
 		/// <summary>
-		/// 枚举:分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
+		/// 鏋氫妇锛氬垎閰嶇姸鎬�(0AllAllocated鍏ㄩ儴鍒嗛厤|1PartialAllocate閮ㄥ垎鍒嗛厤)
 		/// </summary>
 		public enum ALLOC_MODEs
 		{
-			[Description("全部分配")]
+			[Description("鍏ㄩ儴鍒嗛厤")]
 			AllAllocated = 0,
-			[Description("部分分配")]
+			[Description("閮ㄥ垎鍒嗛厤")]
 			PartialAllocate = 1,
 		}
 
 		/// <summary>
-		/// 枚举:状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)
+		/// 鏋氫妇锛氱姸鎬�(0WaitPick寰呮崱鏂檤1Picking鎹℃枡涓瓅2WaitSend寰呭彂鏂檤3Sended宸插彂鏂檤4Close宸插叧闂瓅5Cancel浣滃簾)
 		/// </summary>
 		public enum STATUSs
 		{
-			[Description("待捡料")]
+			[Description("寰呮崱鏂�")]
 			WaitPick = 0,
-			[Description("捡料中")]
+			[Description("鎹℃枡涓�")]
 			Picking = 1,
-			[Description("待发料")]
+			[Description("寰呭彂鏂�")]
 			WaitSend = 2,
-			[Description("已发料")]
+			[Description("宸插彂鏂�")]
 			Sended = 3,
-			[Description("已关闭")]
+			[Description("宸插叧闂�")]
 			Close = 4,
-			[Description("作废")]
+			[Description("浣滃簾")]
 			Cancel = 5,
 		}
 		#endregion
 
-		#region 公共方法
+		#region 鍏叡鏂规硶
 
 		#endregion
 

--
Gitblit v1.9.3