From 08343d90d3aa73dd5ec89aaf7b3815e22eba0eb1 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期二, 01 四月 2025 14:58:23 +0800
Subject: [PATCH] 备料任务第二版

---
 Tiger.Api/Language.db                                               |    0 
 Tiger.Business.WMS/Transaction/In_Default.cs                        |   26 
 Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs            |   11 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs                     |  200 +++--
 Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs             |  673 +++++++++++++++-----
 Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs                |   12 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs                      |  202 +++--
 Tiger.Business.WMS/Transaction/Out_Default.cs                       |    9 
 Tiger.Business.WMS/Common/Preparation.cs                            |  271 +++++++
 Tiger.IBusiness.WMS/Transaction/IPreparation.cs                     |    2 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs                         |    3 
 Tiger.Business.WMS/Common/WmsTask.cs                                |  455 +++++++++++++
 Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs |   80 ++
 Tiger.Business.WMS/Transaction/WMSTransactionBase.cs                |    4 
 14 files changed, 1,529 insertions(+), 419 deletions(-)

diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index fc37d91..be164f4 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 139088e..9ebfbb0 100644
--- a/Tiger.Business.WMS/Common/Preparation.cs
+++ b/Tiger.Business.WMS/Common/Preparation.cs
@@ -32,7 +32,7 @@
         public DbClient MainDB { get; set; }
         public string UserCode { get; set; }
         public string OrgCode { get; set; }
-        public BIZ_WMS_PREP PrepOrder { get; set; }
+        public BIZ_WMS_PREP Order { get; set; }
         #endregion Propertys & Variables
 
         #region Functions
@@ -51,18 +51,18 @@
 	            // 鏌ヨ鏄惁宸插瓨鍦ㄥ鏂欎换鍔�
 	            var src = MainDB.Queryable<BIZ_WMS_PREP_SRC>().Where(q => q.SOURCE_ORDER == orderNo && 
 	                                    SqlFunc.Subqueryable<BIZ_WMS_PREP>().Where(p => p.STATUS < BIZ_WMS_PREP.STATUSs.Sended.GetValue()).Any()).First();
-	            if (PrepOrder.IsNullOrEmpty())
+	            if (Order.IsNullOrEmpty())
 	            {
 	                if (!src.IsNullOrEmpty())
 	                {
-	                    PrepOrder = MainDB.Queryable<BIZ_WMS_PREP>().Where(q => q.ORDER_NO == src.ORDER_NO).IncludesAllFirstLayer().First();
-	                    //action.LocaleMsg = Biz.L("鍗曟嵁[{0}]鐨勫鏂欎换鍔{1}]鍔犺浇鎴愬姛锛屽彲浠ュ紑濮嬪鏂欎笅鏋�");
-	                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.LoadSuccess", orderNo, PrepOrder.ORDER_NO);
-	                    return action;
+	                    Order = MainDB.Queryable<BIZ_WMS_PREP>().Where(q => q.ORDER_NO == src.ORDER_NO).IncludesAllFirstLayer().First();
+                        //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}娣诲姞]鍗曟嵁[{1}]鎴愬姛锛岃閫夋嫨澶囨枡鐨勭墿鏂欒");
+                        action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.LoadSuccess", Order?.ORDER_NO, orderNo);
+                        return action;
 	                }
 	                else
 	                {
-	                    PrepOrder = new BIZ_WMS_PREP()
+	                    Order = new BIZ_WMS_PREP()
 	                    {
                             AUTH_ORG = OrgCode,
                             ORDER_NO = $"MP{DateTime.Now:yyMMdd}{(DateTime.Now - DateTime.Today).TotalSeconds:00000}",
@@ -71,11 +71,11 @@
 	                    };
 	                }
 	            }
-	            if (!src.IsNullOrEmpty() && src.ORDER_NO != PrepOrder.ORDER_NO)
+	            if (!src.IsNullOrEmpty() && src.ORDER_NO != Order.ORDER_NO)
 	            {
 	                action.IsSuccessed = false;
 	                //action.LocaleMsg = Biz.L("鍗曟嵁[{0}]宸插睘浜庡鏂欎换鍔{1}]锛屾棤娉曟坊鍔犲埌褰撳墠澶囨枡浠诲姟[{2}]涓紝濡傞渶鍒囨崲澶囨枡涓氬姟锛岃閫�鍑哄悗閲嶆柊閫夋嫨");
-	                action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.NoFound", orderNo, src.ORDER_NO, PrepOrder.ORDER_NO);
+	                action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.NoFound", orderNo, src.ORDER_NO, Order.ORDER_NO);
 	                return action;
 	            }
 	
@@ -89,31 +89,31 @@
 	                return action;
 	            }
 
-                PrepOrder.SourceOrders = PrepOrder.SourceOrders ?? new();
-                PrepOrder.SourceDetails = PrepOrder.SourceDetails ?? new();
-                PrepOrder.Details = PrepOrder.Details ?? new();
-                PrepOrder.Batchs = PrepOrder.Batchs ?? new();
-                PrepOrder.SnList = PrepOrder.SnList ?? new();
+                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()
                 {
                     AUTH_ORG = OrgCode,
-                    ORDER_NO = PrepOrder.ORDER_NO,
+                    ORDER_NO = Order.ORDER_NO,
                     SOURCE_CODE = bizType.GetSourceCode(),
                     SOURCE_ORDER = orderNo,
                     ADD_TIME = DateTime.Now,
                 };
-                PrepOrder.SourceOrders.Add(srcOrder);
+                Order.SourceOrders.Add(srcOrder);
                 foreach (var dtl in dtls)
                 {
                     dtl.AUTH_ORG = OrgCode;
-                    var pdtl = PrepOrder.Details.Where(q => q.ITEM_CODE == dtl.ITEM_CODE).FirstOrDefault();
+                    var pdtl = Order.Details.Where(q => q.ITEM_CODE == dtl.ITEM_CODE).FirstOrDefault();
                     if (pdtl.IsNullOrEmpty())
                     {
                         pdtl = new ()
                         {
                             AUTH_ORG = OrgCode,
-                            ORDER_NO = PrepOrder.ORDER_NO,
-                            ORDER_LINE = (PrepOrder.Details.Max(q => q.LINE_CODE.ToInt32()) + 1).ToString(),
+                            ORDER_NO = Order.ORDER_NO,
+                            ORDER_LINE = (Order.Details.Max(q => q.LINE_CODE.ToInt32()) + 1).ToString(),
                             ITEM_CODE = dtl.ITEM_CODE,
                             SUBITEM_CODE = dtl.SUBITEM_CODE,
                             UNIT = dtl.UNIT,
@@ -136,34 +136,49 @@
                             FEEDER_NO = dtl.FEEDER_NO,
                             FEEDER_TYPE = dtl.FEEDER_TYPE,
                         };
-                        PrepOrder.Details.Add(pdtl);
+                        Order.Details.Add(pdtl);
                     }
                     pdtl.QTY_REQ += dtl.QTY_ACT_REQ;
-                    PrepOrder.SourceDetails.Add(dtl);
+                    Order.SourceDetails.Add(dtl);
                 }
-                var srcInfo = PrepOrder.SourceOrders.Select(q => new { q.SOURCE_CODE, q.SOURCE_ORDER }).DistinctBy(q => q.SOURCE_ORDER).OrderBy(q => q.SOURCE_ORDER);
-                PrepOrder.SOURCE_CODE = string.Join(",", srcInfo.Select(q => q.SOURCE_CODE));
-                PrepOrder.SOURCE_ORDER = string.Join(",", srcInfo.Select(q => q.SOURCE_ORDER));
+                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(() =>
                 {
-                    var o = db.Storageable(PrepOrder, UserCode).WhereColumns(t => new { t.ORDER_NO, t.GHOST_ROW }).ToStorage();
+                    var o = db.Storageable(Order, UserCode).WhereColumns(t => new { t.ORDER_NO, t.GHOST_ROW }).ToStorage();
                     o.AsInsertable.ExecuteCommand();
                     o.AsUpdateable.IgnoreColumns(q => q.ID).UpdateColumns(q => new { q.SOURCE_CODE, q.SOURCE_ORDER, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
-                    var so = db.Storageable(PrepOrder.SourceOrders, UserCode).WhereColumns(t => new { t.ORDER_NO, t.SOURCE_ORDER, t.GHOST_ROW }).ToStorage();
-                    so.AsInsertable.ExecuteCommand();
-                    var sd = db.Storageable(PrepOrder.SourceDetails, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage();
-                    sd.AsInsertable.ExecuteCommand();
-                    var d = db.Storageable(PrepOrder.Details, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage();
+                    db.Storageable(Order.SourceOrders, UserCode).WhereColumns(t => new { t.ORDER_NO, t.SOURCE_ORDER, t.GHOST_ROW }).ToStorage().AsInsertable.ExecuteCommand();
+                    db.Storageable(Order.SourceDetails, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage().AsInsertable.ExecuteCommand();
+                    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)
                 {
-                    //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}娣诲姞]鍗曟嵁[{1}]鎴愬姛锛屽彲浠ュ紑濮嬪鏂欎笅鏋�");
-                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.LoadSuccess", PrepOrder?.ORDER_NO, orderNo);
+                    //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}娣诲姞]鍗曟嵁[{1}]鎴愬姛锛岃閫夋嫨澶囨枡鐨勭墿鏂欒");
+                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.LoadSuccess", Order?.ORDER_NO, orderNo);
                 }
                 else
                 {
@@ -175,6 +190,198 @@
             }
         }
 
+        /// <summary>
+        /// 鐢熸垚棰嗘枡鍗曪細璋冪敤棰嗘枡鍗曟帴鍙�
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        //public async Task<ApiAction> GenerateRequisition(BaseInput input)
+        //{
+        //    var action = new ApiAction();
+        //    var orderNo = input.Data;
+        //    try
+        //    {
+        //        var order = await MainDB.Queryable<BIZ_U9_ASN>().Where(q => q.ORDER_NO == orderNo).Includes(q => q.Details, d => d._ItemInfos).IncludesAllFirstLayer().FirstAsync();
+        //        if (order.IsNullOrEmpty())
+        //        {
+        //            action.IsSuccessed = false;
+        //            //action.LocaleMsg = Biz.L($"鎵句笉鍒伴�佽揣鍗昜{0}]鐨勫崟鎹俊鎭紝璇锋彁浜ゆ纭殑鍗曞彿");
+        //            action.LocaleMsg = Biz.L("WMS.Count_BIZ_U9_ASN.GenerateReceipt.ASNNotExists", orderNo);
+        //            return action;
+        //        }
+        //        //楠岃瘉鏉$爜鏄惁姝g‘
+        //        if (order.STATUS != BIZ_U9_ASN.STATUSs.Counting.GetValue())
+        //        {
+        //            action.IsSuccessed = false;
+        //            //action.LocaleMsg = Biz.L("鐢熸垚鏀惰揣鍗曪細閫佽揣鍗曠姸鎬乕{0}]寮傚父");
+        //            action.LocaleMsg = Biz.L("WMS.Count_BIZ_U9_ASN.GenerateReceipt.StatusException", order.STATUS.GetEnumDesc<BIZ_U9_ASN.STATUSs>());
+        //            return action;
+        //        }
+
+        //        //鏌ヨ鏄惁娓呯偣瀹屾垚
+        //        var noFinish = order.Details.Where(q => q.QTY != order.SnList.Where(s => s.LINE_NO == q.LINE_NO && (s.STATUS == WMS_ITEM.STATUSs.Counted.GetValue() || q.STATUS == WMS_ITEM.STATUSs.Rejected.GetValue())).Sum(s => s.QTY));
+        //        if (noFinish.Any())
+        //        {
+        //            action.IsSuccessed = false;
+        //            //action.LocaleMsg = Biz.L("閫佽揣鍗昜{0}]鏈竻鐐瑰畬鎴愶紝璇峰厛娓呯偣瀹屾垚锛屾湭瀹屾垚娓呯偣鐨勮鍙峰涓嬶細{1}");
+        //            action.LocaleMsg = Biz.L("WMS.Count_BIZ_U9_ASN.GenerateReceipt.NoFinishCounting", orderNo, string.Join("锛�", noFinish.Select(q => q.LINE_NO)));
+        //            return action;
+        //        }
+
+        //        var iInput = new CreateRcvBySrcASNInput
+        //        {
+        //            userId = UserCode,
+        //            IsLogin = true,
+        //            CreateRcvBySrcASNParam = new()
+        //            {
+        //                aSNToRcvTransDTOs = order.Details.Select(q => new ASNToRcvTransDTO
+        //                {
+        //                    ASNLineKey = q.ID,
+        //                    TransQty = new() { m_amount1 = q.QTY },
+        //                    BinInfoList = new() { new() { Bin = new() { m_code = q.ItemInfo.DEFAULT_LOCATION }, LocationQtySU = q.QTY, LocationQtyTU = q.QTY } },
+        //                }).ToList(),
+        //            }
+        //        };
+        //        var result = await DI.Resolve<IWMS_U9C>().CreateRcvBySrcASN(iInput);
+        //        if (!result.IsSuccessed)
+        //        {
+        //            action.IsSuccessed = false;
+        //            action.LocaleMsg = result.LocaleMsg;
+        //            return action;
+        //        }
+
+        //        //鏍规嵁鎺ュ彛杩斿洖鏀惰揣鍗曞崟鍙锋煡璇㈠崟鎹槑缁嗭紝骞跺垱寤烘潯鐮佹槑缁�
+        //        var receipt = new BIZ_U9_RECEIPT();
+        //        receipt.Details = new();
+        //        receipt.SnList = new();
+        //        DbClient U9Cdb = Biz.DataSource["YadaU9C"].Client;
+        //        var list = U9Cdb.Queryable<mes_ReturnedDocInfo>().Where(x => x.RcvId == result.Data[0].ID.ToDouble() && x.DocNo == result.Data[0].Code && x.SplitFlag != 1).ToList();
+
+        //        if (list != null && list.Count > 0)
+        //        {
+        //            receipt.ID = list.First().RcvId.ToString();
+        //            receipt.AUTH_ORG = order.AUTH_ORG;
+        //            receipt.STATUS = BIZ_U9_RECEIPT.STATUSs.InQC.GetValue();
+        //            receipt.ORDER_NO = list.First().DocNo;
+        //            receipt.SUPP_CODE = list.First().SupplierCode;
+        //            receipt.SUPP_NAME = list.First().SupplierName;
+        //            receipt.RECEIVER = UserCode;
+        //            receipt.RECEIVE_DATE = DateTime.Now;
+        //            receipt.ASN_ID = order.ID;
+        //            receipt.ASN_NO = order.ORDER_NO;
+        //            receipt.ORDER_DATE = list.First().ModifiedOn;
+        //            receipt.HANDLED = 0;
+        //            receipt.HANDLED_DATE = DateTime.Now;
+
+        //            foreach (var item in list)
+        //            {
+        //                var asnDtl = order.Details.First(q => q.ID == item.SrcASNDocLineId.ToString());
+        //                BIZ_U9_RECEIPT_DTL receiptDt = new()
+        //                {
+        //                    ID = item.RcvLineId.ToString(),
+        //                    AUTH_ORG = receipt.AUTH_ORG,
+        //                    STATUS = BIZ_U9_RECEIPT.STATUSs.InQC.GetValue(),
+        //                    ORDER_NO = item.DocNo,
+        //                    LINE_NO = item.DocLineNo.ToString(),
+        //                    ITEM_CODE = item.ItemCode,
+        //                    QTY = item.EyeballingQtyTU.ToDouble(), // mes鍗曟嵁鏁伴噺 --U9閫�琛ユ暟閲�
+        //                    QTY_GIFT = asnDtl.QTY_GIFT,
+        //                    ASN_ID = item.SrcASNDocId.ToString(),
+        //                    ASN_NO = asnDtl.ORDER_NO,
+        //                    ASN_LINE_ID = item.SrcASNDocLineId.ToString(),
+        //                    ASN_LINE = asnDtl.LINE_NO,
+        //                    ERP_CODE = item.ItemCode1,
+        //                };
+        //                receipt.Details.Add(receiptDt);
+        //            }
+
+        //            foreach (var sn in order.SnList)
+        //            {
+        //                var dtl = receipt.Details.First(q => q.ASN_LINE == sn.LINE_NO);
+        //                BIZ_U9_RECEIPT_SN receiptSn = new()
+        //                {
+        //                    AUTH_ORG = dtl.AUTH_ORG,
+        //                    ORDER_NO = dtl.ORDER_NO,
+        //                    LINE_NO = dtl.LINE_NO,
+        //                    SN = sn.SN,
+        //                    META_SN = sn.META_SN,
+        //                    ITEM_CODE = sn.ITEM_CODE,
+        //                    STATUS = WMS_ITEM.STATUSs.WaitIn.GetValue(),
+        //                    QTY = sn.QTY,
+        //                    UNIT = sn.UNIT,
+        //                    IS_OK = sn.IS_OK,
+        //                    IS_IN = sn.IS_IN,
+        //                    LOTNO = sn.LOTNO,
+        //                    CARTON_NO = sn.CARTON_NO,
+        //                    PALLET_NO = sn.PALLET_NO,
+        //                };
+        //                receipt.SnList.Add(receiptSn);
+        //            }
+        //        }
+
+        //        //鏇存柊搴撳瓨琛ㄤ俊鎭�
+        //        var items = MainDB.Queryable<WMS_ITEM>().Where(q => SqlFunc.Subqueryable<BIZ_U9_ASN_SN>().Where(s => s.SN == q.SN && s.ORDER_NO == order.ORDER_NO).Any()).ToList();
+        //        var historys = new List<WMS_ITEM_HIS>();
+        //        foreach (var item in items)
+        //        {
+        //            item.AUTH_ORG = receipt.AUTH_ORG;
+        //            item.STATUS = WMS_ITEM.STATUSs.WaitIn.GetValue();
+        //            item.SOURCE_CODE = item.TRANS_CODE;
+        //            item.SOURCE_ORDER = item.TRANS_NO;
+        //            item.SOURCE_LINE = item.TRANS_LINE;
+        //            item.TRANS_CODE = nameof(BIZ_U9_RECEIPT);
+        //            item.TRANS_NO = receipt.ORDER_NO;
+        //            item.TRANS_LINE = receipt.SnList.First(q => q.SN == item.SN).LINE_NO;
+        //            historys.Add(new WMS_ITEM_HIS(item, $"閫佽揣鍗昜{order.ORDER_NO}]鐨勬潯鐮乕{item.SN}]鐢熸垚鏀惰揣鍗昜{receipt.ORDER_NO}]锛屽緟妫�楠屽畬鎴愬悗鍙叆搴�"));
+        //        }
+        //        var pkgs = MainDB.Queryable<WMS_ITEM_PKG>().Where(q => SqlFunc.Subqueryable<BIZ_U9_ASN_SN>().Where(s => s.SN == q.SN && s.ORDER_NO == order.ORDER_NO).Any()).ToList();
+        //        foreach (var item in pkgs)
+        //        {
+        //            item.AUTH_ORG = receipt.AUTH_ORG;
+        //            item.SOURCE_CODE = item.TRANS_CODE;
+        //            item.SOURCE_ORDER = item.TRANS_NO;
+        //            item.SOURCE_LINE = item.TRANS_LINE;
+        //            item.TRANS_CODE = nameof(BIZ_U9_RECEIPT);
+        //            item.TRANS_NO = receipt.ORDER_NO;
+        //            item.TRANS_LINE = receipt.SnList.First(q => q.SN == item.SN).LINE_NO;
+        //        }
+        //        order.STATUS = BIZ_U9_ASN.STATUSs.Finished.GetValue();
+        //        order.RECEIVER_ID = receipt.ID;
+        //        order.RECEIVER_NO = receipt.ORDER_NO;
+        //        order.RECEIVER = UserCode;
+        //        order.RECEIVE_DATE = DateTime.Now;
+
+        //        //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
+        //        var db = GetCommitDB();
+        //        var dbTran = db.UseTran(() =>
+        //        {
+        //            db.Updateable(items, UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.AUTH_ORG, q.STATUS, q.TRANS_CODE, q.TRANS_NO, q.TRANS_LINE, q.SOURCE_CODE, q.SOURCE_ORDER, q.SOURCE_LINE }).ExecuteCommand();
+        //            db.Updateable(pkgs, UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.AUTH_ORG, q.TRANS_CODE, q.TRANS_NO, q.TRANS_LINE, q.SOURCE_CODE, q.SOURCE_ORDER, q.SOURCE_LINE }).ExecuteCommand();
+        //            db.Insertable(historys, UserCode).ExecuteCommand();
+        //            db.Updateable(order, UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.RECEIVER, q.RECEIVE_DATE, q.RECEIVER_ID, q.RECEIVER_NO }).ExecuteCommand();
+        //            db.Insertable(receipt, UserCode).ExecuteCommand();
+        //            db.Insertable(receipt.Details, UserCode).ExecuteCommand();
+        //            db.Insertable(receipt.SnList, UserCode).ExecuteCommand();
+        //        });
+        //        if (dbTran.IsSuccess)
+        //        {
+        //            //action.LocaleMsg = Biz.L($"閫佽揣鍗昜{0}]鐢熸垚鏀惰揣鍗昜{1}]鎴愬姛");
+        //            action.LocaleMsg = Biz.L("WMS.Count_BIZ_U9_ASN.GenerateReceipt.Success", order.ORDER_NO, receipt.ORDER_NO);
+        //        }
+        //        else
+        //        {
+        //            Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception");
+        //            //鎶涘嚭寮傚父
+        //            throw dbTran.ErrorException;
+        //        }
+        //    }
+        //    catch (System.Exception ex)
+        //    {
+        //        //return action.CatchExceptionWithLog(ex, Biz.L("閫佽揣鍗昜{0}]鐢熸垚鏀惰揣鍗曞紓甯�"));
+        //        return action.CatchExceptionWithLog(ex, Biz.L("WMS.Count_BIZ_U9_ASN.GenerateReceiptException", orderNo));
+        //    }
+        //    return action;
+        //}        
         #endregion Functions
     }
 }
diff --git a/Tiger.Business.WMS/Common/WmsTask.cs b/Tiger.Business.WMS/Common/WmsTask.cs
index 6a0045c..6ae26b6 100644
--- a/Tiger.Business.WMS/Common/WmsTask.cs
+++ b/Tiger.Business.WMS/Common/WmsTask.cs
@@ -1,4 +1,5 @@
 锘縰sing Rhea.Common;
+using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -7,6 +8,7 @@
 using Tiger.IBusiness;
 using Tiger.Model;
 using Tiger.Model.Entitys.MES.Position;
+using static IronPython.Modules._ast;
 
 namespace Tiger.Business.WMS.Transaction
 {
@@ -127,6 +129,116 @@
         }
 
         /// <summary>
+        /// 鑾峰彇鏉$爜搴撳瓨淇℃伅锛屽寘鎷粨搴擄紝鍌ㄥ尯锛岃揣鏋讹紝鍌ㄤ綅锛岀埗鏉$爜锛屽寘瑁呮槑缁嗙瓑
+        /// </summary>
+        /// <param name="sn">鏌ヨ鐨勬潯鐮�</param>
+        /// <param name="option">鎺堟潈鏌ヨ閫夐」</param>
+        /// <param name="doUnPack">鏄惁鍚屾椂鎵ц鎷嗗寘鎿嶄綔锛岃В闄や笌鐖舵潯鐮佷箣闂寸殑鍖呰鍏崇郴</param>
+        /// <returns></returns>
+        public Result<IInventory> GetInventory(string sn, AuthOption option, bool doUnPack)
+        {
+            var result = new Result<IInventory>(Result.Flags.Success);
+            try
+            {
+                var inv = new Inventory();
+                Barcode barcode = new Barcode(sn);
+                if (sn.IsNullOrEmpty())
+                {
+                    result.Flag = Result.Flags.Failed;
+                    result.LocaleMsg = new("WMS.WmsItem.Barcode.EmptyFailure");
+                }
+                else if (barcode.IsException)
+                {
+                    throw barcode.AnalyseException;
+                }
+                //闈炴硶鏉$爜
+                else if (!barcode.IsRegular)
+                {
+                    result.Flag = Result.Flags.Failed;
+                    result.LocaleMsg = new("WMS.WmsItem.Barcode.IllegalFailure");
+                }
+                //else if (barcode.Qty <= 0)
+                //{
+                //    result.Flag = Result.Flags.Failed;
+                //    result.LocaleMsg = new("鏁伴噺涓嶈兘灏忎簬绛変簬闆讹紝璇锋鏌ヤ簩缁寸爜锛�");
+                //}
+                else
+                {
+                    var query = Biz.Db.Queryable<WMS_ITEM_PKG>().ByAuth(option).Where(q => q.SN == barcode.SN).IncludesAllFirstLayer().First();
+                    //var query = Biz.Db.Queryable<WMS_ITEM_PKG>().Where(q => q.SN == barcode.SN).IncludesAllFirstLayer().First();//.ByAuth(option)
+
+                    //鍖呰琛ㄤ腑鎵惧埌鏉$爜
+                    if (!query.IsNullOrEmpty())// && query.QTY > 0)
+                    {
+                        inv.SN = barcode.SN;
+                        inv.Barcode = barcode;
+                        inv.ExtInfo = query.ExtInfo;
+                        inv.ItemInfo = query.ItemInfo;
+                        inv.Warehouse = query.Warehouse;
+                        inv.Region = query.Region;
+                        inv.Shelf = query.Shelf;
+                        inv.Location = query.Location;
+                        inv.Packages = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM_PKG>("sp_wms_get_item_pkg", new SugarParameter("root", barcode.SN));
+                        inv.Items = Biz.Db.Ado.UseStoredProcedure().SqlQuery<WMS_ITEM>("sp_wms_get_items", new SugarParameter("root", barcode.SN));
+                        inv.ItemsExt = Biz.Db.Queryable<WMS_ITEM_EXT>().Where(q => inv.Items.Any(s => s.SN == q.SN)).ToList();
+                        //var data = inv.Items.Select(i => i.SN).ToList().Except(inv.ItemsExt.Select(i => i.SN).ToList());
+                        var data = inv.Items.Where(q => !inv.ItemsExt.Any(s => s.SN == q.SN)).ToList();
+                        if (data.Count > 0)
+                        {
+                            foreach (var item in data)
+                            {
+                                inv.ItemsExt.Add(new()
+                                {
+                                    SN = item.SN,
+                                    META_SN = barcode.MetaSn,
+                                    QR_CODE = barcode.MetaSn
+                                });
+                            }
+                        }
+                        result.LocaleMsg = new($"WMS.WmsItem.Barcode.Get{(doUnPack ? "UnPack" : "")}Success", barcode.SN, query.Parent?.SN);
+                        if (!query.Parent.IsNullOrEmpty() && doUnPack && query.Parent.SN != query.SN)
+                        {
+                            inv.ParentPkg = null;
+                            //淇濆瓨鏁版嵁鍒版暟鎹簱
+                            var db = Biz.Db;
+                            var dbTran = db.UseTran(() =>
+                            {
+                                var unPackQty = inv.Items.Sum(q => q.QTY);
+                                db.Updateable<WMS_ITEM_PKG>().SetColumns(q => q.PARENT_SN == null).Where(q => q.ID == query.ID).ExecuteCommand();
+                                db.Updateable<WMS_ITEM_PKG>().SetColumns(q => q.QTY == q.QTY - unPackQty).Where(q => q.ID == query.Parent.ID).ExecuteCommand();
+                                if (!Biz.Db.Queryable<WMS_ITEM_PKG>().Any(q => q.PARENT_SN == query.PARENT_SN && q.SN != query.SN))
+                                {
+                                    db.Deleteable(query.Parent);
+                                }
+                            });
+                            if (!dbTran.IsSuccess)
+                            {
+                                throw dbTran.ErrorException;
+                            }
+                        }
+                        else
+                        {
+                            inv.ParentPkg = query.Parent;
+                        }
+                    }
+                    else
+                    {
+                        inv.SN = barcode.SN;
+                        inv.Barcode = barcode;
+                        inv.ItemInfo = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == barcode.ItemCode).First();
+                        result.LocaleMsg = new($"WMS.WmsItem.Barcode.NotFound", barcode.SN);
+                    }
+                }
+                result.Data = inv;
+            }
+            catch (Exception ex)
+            {
+                result.CatchExceptionWithLog(ex, Biz.L("WMS.WmsItem.Barcode.GetException", sn));
+            }
+            return result;
+        }
+
+        /// <summary>
         /// 涓婃灦
         /// </summary>
         /// <param name="inventory">瑕佷笂鏋剁殑搴撳瓨瀵硅薄</param>
@@ -205,6 +317,243 @@
         }
 
         /// <summary>
+        /// 涓嬫灦鐗╂枡鎺ㄨ崘锛岃繑鍥炲浐瀹氫釜鏁扮殑鏈�灏忓寘瑁呯墿鏂欏簱瀛樺垪琛�
+        /// </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="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)
+        {
+            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(
+                                                                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
+                                            {
+                                                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);
+                //    if (inv.IsSuccessed)
+                //    {
+                //        result.Data.Add(inv.Data);
+                //    }
+                //}
+                result.Data = items;
+                var totalQty = result.Data.Sum(q => q.Item.QTY);
+                var total = result.Data.Count;
+                if (0 <= total && total < returnCount)
+                {
+                    result.Flag = Result.Flags.Warning;
+                    result.LocaleMsg = new("WMS.WmsItem.Suggest.Warning", total);
+                }
+                //if (total == 0)
+                //{
+                //    result.Flag = Result.Flags.Failed;
+                //    result.LocaleMsg = new("WMS.WmsItem.Suggest.Failed");
+                //}
+            }
+            catch (Exception ex)
+            {
+                result.CatchExceptionWithLog(ex, Biz.L("WMS.WmsItem.Suggest.Exception"));
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 涓嬫灦鐗╂枡鎺ㄨ崘锛屾寜闇�姹傛暟閲忚繑鍥炴弧瓒抽渶姹傜殑鐗╂枡搴撳瓨鍒楄〃
+        /// </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="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)
+        {
+            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(
+                                                                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
+                                            {
+                                                ItemCode = q.ITEM_CODE,
+                                                Sn = q.SN,
+                                                Qty = q.QTY
+                                            })
+                                            .Take(takeCount)
+                                            .MergeTable()
+                                            .GroupBy(t => t.ItemCode)
+                                            .Select(t => new
+                                            {
+                                                Count = SqlFunc.AggregateCount(t.Sn),
+                                                Sum = SqlFunc.AggregateSum(t.Qty),
+                                            }).First();
+                    if (!check.IsNullOrEmpty())
+                    {
+                        checkSum = check.Sum;
+                        checkCount = check.Count;
+                    }
+                    else
+                    {
+                        checkSum = 0;
+                        checkCount = 0;
+                    }
+                } 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
+                                            {
+                                                Item = q,
+                                                poolItem = null,
+                                                Warehouse = w,
+                                                Region = r,
+                                                Shelf = s,
+                                                Location = l,
+                                            })
+                                            .Take(takeCount).ToList();
+                var curQty = 0.0;
+                foreach (var item in items)
+                {
+                    result.Data.Add(item);
+                    curQty += item.Item.QTY;
+                    if (curQty >= reqQty)
+                    {
+                        break;
+                    }
+                }
+
+                var totalQty = result.Data.Sum(q => q.Item.QTY);
+                var total = result.Data.Count;
+                if (0 <= totalQty && totalQty < reqQty)
+                {
+                    result.Flag = Result.Flags.Warning;
+                    result.LocaleMsg = new("WMS.WmsItem.Suggest.Warning", totalQty);
+                }
+                //if (totalQty == 0)
+                //{
+                //    result.Flag = Result.Flags.Failed;
+                //    result.LocaleMsg = new("WMS.WmsItem.Suggest.Failed");
+                //}
+            }
+            catch (Exception ex)
+            {
+                result.CatchExceptionWithLog(ex, Biz.L("WMS.WmsItem.Suggest.Exception"));
+            }
+            return result;
+        }
+
+        /// <summary>
         /// 涓嬫灦
         /// </summary>
         /// <param name="option">鎺堟潈鏌ヨ閫夐」</param>
@@ -219,11 +568,9 @@
         /// <summary>
         /// 涓嬫灦
         /// </summary>
-        /// <param name="inventory">瑕佷笅鏋剁殑搴撳瓨瀵硅薄</param>
         /// <param name="qtyList">瑕佷笅鏋剁殑鏈�灏忓寘瑁呮暟閲忓瓧鍏革紝key锛歴n锛寁alue锛歲ty</param>
         /// <param name="option">鎺堟潈鏌ヨ閫夐」</param>
         /// <param name="status">涓嬫灦鍚庣姸鎬�</param>
-        /// <param name="clearLocation">鏄惁娓呯悊鍌ㄥ尯璐ф灦鍌ㄤ綅淇℃伅</param>
         /// <returns></returns>
         public Result TakeDown(Dictionary<string, double> qtyList, AuthOption option, WMS_ITEM.STATUSs status)
         {
@@ -247,6 +594,8 @@
                         else
                         {
                             item.STATUS = status.GetValue();
+                            item.CARTON_NO = null;
+                            item.PALLET_NO = null;
                             var pkg = CurInvItem.Packages.First(q => q.SN == item.SN);
                             pkg.PARENT_SN = null;
                             pkg.Parent = null;
@@ -287,6 +636,108 @@
         }
 
         /// <summary>
+        /// 澶囨枡涓嬫灦
+        /// </summary>
+        /// <param name="qtyList">瑕佷笅鏋剁殑鏈�灏忓寘瑁呮暟閲忓瓧鍏革紝key锛歴n锛寁alue锛歲ty</param>
+        /// <param name="option">鎺堟潈鏌ヨ閫夐」</param>
+        /// <param name="status">涓嬫灦鍚庣姸鎬�</param>
+        /// <returns></returns>
+        public Result TakeDown(List<BIZ_WMS_PREP_SN> snList, AuthOption option, WMS_ITEM.STATUSs status)
+        {
+            var result = new Result(Result.Flags.Success);
+            try
+            {
+                foreach (var item in CurInvItem.Items)
+                {
+                    var sn = snList.First(q => q.SN == item.SN);
+                    var pkg = CurInvItem.Packages.First(q => q.SN == item.SN);
+                    //鍓嶇杩斿洖Y璁や负鏄埅鏂欏彂鏂欙紝N璁や负鏄暣鐩樺彂鏂�
+                    if (sn.QTY > sn.QTY_DLVY && sn.NEED_CUTTING == "Y")
+                    {
+                        CurInvItem.History.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鎴枡鍙戞枡锛屾埅鏂欏彂鍑烘潯鐮乕{sn.DeliverySN}]鏁伴噺[{sn.QTY_DLVY}]锛屼繚鐣欏湪搴撴潯鐮乕{sn.ReserveSN}]鏁伴噺[{sn.QTY - sn.QTY_DLVY}]锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+
+                        item.SN = sn.ReserveSN;
+                        item.QTY = sn.QTY - sn.QTY_DLVY;
+                        pkg.SN = sn.ReserveSN;
+                        pkg.QTY = sn.QTY - sn.QTY_DLVY;
+                        CurInvItem.History.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鎴枡鍙戞枡鍚庝繚鐣欏湪搴擄紝鍘熸潯鐮乕{sn.SN}]鏁伴噺[{sn.QTY}]锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+
+                        //鍒涘缓鎴枡鍙戝嚭鐨勭墿鏂欎俊鎭�
+                        var newItem = item.Clone();
+                        newItem.ID = Guid.NewGuid().ToString();
+                        newItem.SN = sn.DeliverySN;
+                        newItem.STATUS = status.GetValue();
+                        newItem.QTY = sn.QTY_DLVY;
+                        newItem.CARTON_NO = null;
+                        newItem.PALLET_NO = null;
+                        newItem.REGION_ID = null;
+                        newItem.SHELF_ID = null;
+                        newItem.LOCATION_ID = null;
+                        WMS_ITEM_HIS his = new(newItem, $"鏉$爜[{newItem.SN}]浠庡偍浣峓{CurInvItem?.Location?.LOCATION_CODE}]鎴枡鍙戞枡鎴愬姛锛屽彂鍑烘暟閲廩{newItem.QTY}]锛岀姸鎬乕{newItem.STATUS.GetEnumDesc<WMS_ITEM.STATUSs>()}]锛屽師鏉$爜[{sn.SN}]鏁伴噺[{sn.QTY}]锛屾搷浣滃崟鎹甗{item.TRANS_NO}]");
+
+                        var newPkg = pkg.Clone();
+                        newPkg.ID = Guid.NewGuid().ToString();
+                        newPkg.PARENT_SN = null;
+                        newPkg.Parent = null;
+                        newPkg.REGION_ID = null;
+                        newPkg.SHELF_ID = null;
+                        newPkg.LOCATION_ID = null;
+
+                        CurInvItem.ItemsExt.Add(new()
+                        {
+                            SN = newItem.SN,
+                            META_SN = newItem.SN,
+                        });
+
+                        CurInvItem.Items.Add(newItem);
+                        CurInvItem.History.Add(his);
+                        CurInvItem.Packages.Add(newPkg);
+                    }
+                    else
+                    {
+                        item.STATUS = status.GetValue();
+                        item.CARTON_NO = null;
+                        item.PALLET_NO = null;
+                        pkg.PARENT_SN = null;
+                        pkg.Parent = null;
+                        //濡傛灉涓嬫灦鏁伴噺绛変簬搴撳瓨鏁伴噺鍒欐竻鐞嗗偍鍖鸿揣鏋跺偍浣嶄俊鎭紝鍚﹀垯淇濈暀浠撳簱淇℃伅
+                        //item.WH_ID = null;
+                        item.REGION_ID = null;
+                        item.SHELF_ID = null;
+                        item.LOCATION_ID = null;
+                        //pkg.WH_ID = null;
+                        pkg.REGION_ID = null;
+                        pkg.SHELF_ID = null;
+                        pkg.LOCATION_ID = null;
+                        CurInvItem.History.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{CurInvItem.SN}]浠庡偍浣峓{CurInvItem?.Location?.LOCATION_CODE}]鍙戞枡涓嬫灦鎴愬姛锛岀姸鎬乕{item.STATUS.GetEnumDesc<WMS_ITEM.STATUSs>()}]锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+                    }
+                }
+                CurInvItem.Packages = WMS_ITEM_PKG.UpdateQty(CurInvItem.Packages);
+
+                //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
+                var _Items = CurInvItem.Items.Clone();
+                var _Packages = CurInvItem.Packages.Clone();
+                var _History = CurInvItem.History.Clone();
+                var _ItemsExt = CurInvItem.ItemsExt.Clone();
+                AddCommitAction("TakeDown", () =>
+                {
+                    //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
+                    var db = GetCommitDB();
+                    //鏁版嵁淇濆瓨閫昏緫
+                    db.Storageable(_Items, UserCode).ExecuteCommand();
+                    db.Insertable(_History, UserCode).ExecuteCommand();
+                    db.Storageable(_Packages, UserCode).ExecuteCommand();
+                    db.Storageable(_ItemsExt, UserCode).ToStorage().AsInsertable.ExecuteCommand();
+                });
+            }
+            catch (Exception ex)
+            {
+                result.CatchExceptionWithLog(ex, Biz.L("WMS.WmsItem.TakeDown.Exception", CurInvItem.SN, CurInvItem?.Location?.LOCATION_CODE));
+            }
+            return result;
+        }
+
+        /// <summary>
         /// 璁剧疆褰撳墠鏉$爜鐨勫伐搴忎俊鎭�
         /// </summary>
         public ApiAction<ScanOutput> SetOutPutMqttMsg(ApiAction<ScanOutput> action, string locale = null)
diff --git a/Tiger.Business.WMS/Transaction/In_Default.cs b/Tiger.Business.WMS/Transaction/In_Default.cs
index e741ab1..44d7d50 100644
--- a/Tiger.Business.WMS/Transaction/In_Default.cs
+++ b/Tiger.Business.WMS/Transaction/In_Default.cs
@@ -83,7 +83,7 @@
                 if (CurInvItem.IsNullOrEmpty())
                 {
                     //瑙f瀽鏉$爜
-                    Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
+                    Result<IInventory> result = GetInventory(input.SN, input.AuthOption, true);
 	                if (!result.IsSuccessed)
 	                {
 	                    action.IsSuccessed = false;
@@ -111,11 +111,7 @@
 
                     if (inv.Items.Count == 0)
                     {
-                        List<WMS_ITEM_HIS> ItemHistorys = new List<WMS_ITEM_HIS>();
-                        WMS_ITEM Item;
-                        WMS_ITEM_PKG ItemPkgs;
-
-                        Item = new()
+                        var newItem = new WMS_ITEM()
                         {
                             SN = inv.Barcode.SN,
                             ITEM_CODE = inv.Barcode.ItemCode,
@@ -127,9 +123,8 @@
                             UNIT = inv.Barcode.Unit,
                         };
 
-                        WMS_ITEM_HIS his = new(Item, $"鏍囧噯涓婃灦鍏ュ簱");
-                        ItemHistorys.Add(his);
-                        ItemPkgs = new()
+                        WMS_ITEM_HIS his = new(newItem, $"鏍囧噯涓婃灦鍏ュ簱");
+                        var newPkg = new WMS_ITEM_PKG()
                         {
                             SN = inv.Barcode.SN,
                             AUTH_ORG = input.AuthOption.CurOrg,
@@ -141,19 +136,19 @@
 
                         var noExt = inv.Items.Where(q => !inv.ItemsExt.Any(s => s.SN == q.SN)).ToList();
                         //鎵╁睍琛ㄤ笉瀛樺湪鏃舵柊寤�
-                        foreach (var item in noExt)
+                        foreach (var ext in noExt)
                         {
                             inv.ItemsExt.Add(new()
                             {
-                                SN = item.SN,
+                                SN = ext.SN,
                                 META_SN = inv.Barcode.MetaSn,
                                 QR_CODE = inv.Barcode.MetaSn
                             });
                         }
 
-                        inv.Items.Add(Item);
+                        inv.Items.Add(newItem);
                         inv.History.Add(his);
-                        inv.Packages.Add(ItemPkgs);
+                        inv.Packages.Add(newPkg);
                     }
                     //闆呰揪涓嶄粠鏉$爜涓婃洿鏂版暟閲�
                     //else if (inv.Items.Count == 1)
@@ -288,6 +283,11 @@
                     item.TRANS_CODE = "In_Default";
                     item.TRANS_NO = $"In_Default_{DateTime.Now:yyyyMMdd}";
                 }
+                foreach (var item in CurInvItem.Packages)
+                {
+                    item.TRANS_CODE = "In_Default";
+                    item.TRANS_NO = $"In_Default_{DateTime.Now:yyyyMMdd}";
+                }
                 Result putonResult = PutOn(input.AuthOption, nLocation.LOCATION_CODE);
                 if (!putonResult.IsSuccessed)
                 {
diff --git a/Tiger.Business.WMS/Transaction/Out_Default.cs b/Tiger.Business.WMS/Transaction/Out_Default.cs
index df92899..3b2a261 100644
--- a/Tiger.Business.WMS/Transaction/Out_Default.cs
+++ b/Tiger.Business.WMS/Transaction/Out_Default.cs
@@ -71,7 +71,7 @@
                 if (CurInvItem.IsNullOrEmpty())
                 {
                     //瑙f瀽鏉$爜
-                    Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
+                    Result<IInventory> result = GetInventory(input.SN, input.AuthOption, true);
                     if (!result.IsSuccessed)
                     {
                         action.IsSuccessed = false;
@@ -153,6 +153,11 @@
                     item.TRANS_CODE = "Out_Default";
                     item.TRANS_NO = $"Out_Default_{DateTime.Now:yyyyMMdd}";
                 }
+                foreach (var item in CurInvItem.Packages)
+                {
+                    item.TRANS_CODE = "Out_Default";
+                    item.TRANS_NO = $"Out_Default_{DateTime.Now:yyyyMMdd}";
+                }
                 Result downResult = TakeDown(downDic, input.AuthOption, WMS_ITEM.STATUSs.OffShelf);
                 if (!downResult.IsSuccessed)
                 {
@@ -177,7 +182,7 @@
                 //action.CatchExceptionWithLog(ex, $"鎵弿鏉$爜[{input.SN}]澶嶆牳寮傚父");
                 action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", input.SN));
             }
-               return SetOutPutMqttMsg(action, input.Locale);
+            return SetOutPutMqttMsg(action, input.Locale);
         }
 
         /// <summary>
diff --git a/Tiger.Business.WMS/Transaction/WMSTransactionBase.cs b/Tiger.Business.WMS/Transaction/WMSTransactionBase.cs
index f2c6c0b..67ea525 100644
--- a/Tiger.Business.WMS/Transaction/WMSTransactionBase.cs
+++ b/Tiger.Business.WMS/Transaction/WMSTransactionBase.cs
@@ -64,6 +64,10 @@
         /// </summary>
         public string ProcessingSn {  get; set; }
         /// <summary>
+        /// 鎵ц涓崟鎹槑缁�
+        /// </summary>
+        public string ProcessingOrderDetail { get; set; }
+        /// <summary>
         /// 閲嶇疆浜嬪姟鎿嶄綔
         /// </summary>
         /// <returns></returns>
diff --git a/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs b/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
index e27b735..ba35d1e 100644
--- a/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
+++ b/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
@@ -81,7 +81,7 @@
                 if (CurInvItem.IsNullOrEmpty())
                 {
                     //瑙f瀽鏉$爜
-                    Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
+                    Result<IInventory> result = GetInventory(input.SN, input.AuthOption, true);
                     if (!result.IsSuccessed)
                     {
                         action.IsSuccessed = false;
@@ -209,6 +209,15 @@
                     item.PROD_DATE = item.PROD_DATE < new DateTime(2000, 1, 1) ? DateTime.Now : item.PROD_DATE;
                     item.FIRST_IN_DATE = item.FIRST_IN_DATE < new DateTime(2000, 1, 1) ? DateTime.Now : item.FIRST_IN_DATE;
                 }
+                foreach (var item in CurInvItem.Packages)
+                {
+                    item.SOURCE_CODE = item.TRANS_CODE;
+                    item.SOURCE_ORDER = item.TRANS_NO;
+                    item.SOURCE_LINE = item.TRANS_LINE;
+                    item.TRANS_CODE = nameof(BIZ_U9_RECEIPT);
+                    item.TRANS_NO = receipt.ORDER_NO;
+                    item.TRANS_LINE = receiptDtl.LINE_NO;
+                }
                 Result putonResult = PutOn(input.AuthOption, nLocation.LOCATION_CODE);
                 if (!putonResult.IsSuccessed)
                 {
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 75a0eb3..4847c35 100644
--- a/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
+++ b/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
@@ -9,11 +9,9 @@
 using System.Threading.Tasks;
 using Tiger.Model;
 using Tiger.IBusiness;
-using Tiger.Model.Sharetronic.Shelf;
-using Tiger.Business.WMS.Sharetronic.Shelf;
-using Tiger.Model.Entitys.MES.U9C;
 using Tiger.Business.WMS.Common;
-using Tiger.Model.Base;
+using Org.BouncyCastle.Ocsp;
+using Tiger.Model.Sharetronic.Shelf;
 
 namespace Tiger.Business.WMS.Transaction
 {
@@ -32,6 +30,13 @@
 
         #region Propertys & Variables
         private Preparation CurPREP;
+        private List<BIZ_WMS_PREP_SN> CurSn = new();
+        private BIZ_WMS_PREP_DTL CurPrepDtl = new();
+        public List<SuggestItem> Suggests { get; set; } = new();
+        public List<WMS_ITEM_POOL> CurPoolList => Suggests.Where(q => !q.poolItem.IsNullOrEmpty()).Select(q => q.poolItem).ToList();
+        public List<WMS_LOCATION> LocationHis { get; set; } = new();
+        private bool isExceed = false;
+        private bool isNeedCut = false;
         #endregion
 
         #region Functions
@@ -48,8 +53,32 @@
                 {
                     action = await ScanOrder(input);
                 }
+                else if (input.Command == "SelectItem")
+                {
+                    action = await SelectItem(input);
+                }
+                else if (input.Command == "ConfirmExceed")
+                {
+                    action = await ConfirmExceed(input);
+                }
                 else
                 {
+                    if (CurPREP.IsNullOrEmpty())
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("澶囨枡鍓嶈鍏堥�夋嫨闇�瑕佸鏂欑殑鍗曟嵁");
+                        action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NotScanOrder");
+                        action.Data.Command = "ScanOrder";
+                        return SetOutPutMqttMsg(action, input.Locale);
+                    }
+                    if (CurPrepDtl.IsNullOrEmpty())
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("澶囨枡鍓嶈鍏堥�夋嫨闇�瑕佸鏂欑殑鐗╂枡琛�");
+                        action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NotSelectItem");
+                        action.Data.Command = "SelectItem";
+                        return SetOutPutMqttMsg(action, input.Locale);
+                    }
                     if (input.SN.IsNullOrEmpty())
                     {
                         action.IsSuccessed = false;
@@ -57,14 +86,7 @@
                         action.LocaleMsg = Biz.L("WMS.Default.ScanItem.SnEmptyFailure");
                         return SetOutPutMqttMsg(action, input.Locale);
                     }
-                    //鍒ゆ柇鎵弿鐨勬槸鍚﹁揣鏋�
-                    var whUnit = await MainDB.Queryable<V_WH_UNIT>().Where(t => (t.SHELF_CODE.ToUpper() == input.SN || t.LOCATION_CODE.ToUpper() == input.SN) && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync();
-                    //if (string.IsNullOrEmpty(CurScanShelf?.ShelfCode))
-                    if (!whUnit.IsNullOrEmpty() || string.IsNullOrEmpty(CurScanShelf?.ShelfCode))
-                    {
-                        action = await ScanShelf(input.SN, whUnit);
-                    }
-                    else//鎵弿鐗╂枡骞跺鏍�
+                    //鎵弿鐗╂枡骞跺鏍�
                     {
                         action = await ScanItem(input);
                     }
@@ -96,23 +118,25 @@
                     action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanOrder.InputOrderIsNull");
                     return action;
                 }
-                if (!CurPREP.PrepOrder.IsNullOrEmpty() && inputOrder.BIZ_TYPE != CurPREP.PrepOrder.BIZ_TYPE)
+                if (!CurPREP.Order.IsNullOrEmpty() && inputOrder.BIZ_TYPE != CurPREP.Order.BIZ_TYPE)
                 {
                     action.IsSuccessed = false;
                     //action.LocaleMsg = Biz.L($"褰撳墠澶囨枡浠诲姟[{0}]鐨勪笟鍔$被鍨嬩负{1}锛屽闇�鍒囨崲澶囨枡涓氬姟锛岃閫�鍑哄悗閲嶆柊閫夋嫨");
-                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanOrder.BizTypeError", CurPREP.PrepOrder.ORDER_NO, CurPREP.PrepOrder.BIZ_TYPE.GetEnumDesc<BIZ_WMS_PREP.BIZ_TYPEs>());
+                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanOrder.BizTypeError", CurPREP.Order.ORDER_NO, CurPREP.Order.BIZ_TYPE.GetEnumDesc<BIZ_WMS_PREP.BIZ_TYPEs>());
                     return action;
                 }
 
-                if (CurPREP.PrepOrder.IsNullOrEmpty() || !CurPREP.PrepOrder.SourceOrders.Any(q => q.SOURCE_ORDER == inputOrder.SOURCE_ORDER))
+                if (CurPREP.Order.IsNullOrEmpty() || !CurPREP.Order.SourceOrders.Any(q => q.SOURCE_ORDER == inputOrder.SOURCE_ORDER))
                 {
                     action = CurPREP.AddOrder(inputOrder.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>(), inputOrder.SOURCE_CODE);
                 }
                 else
                 {
                     //action.LocaleMsg = Biz.L($"褰撳墠澶囨枡浠诲姟[{0}]宸插寘鍚崟鎹甗{1}]锛屾棤闇�閲嶅鎿嶄綔");
-                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanOrder.Repeat", CurPREP.PrepOrder.ORDER_NO, inputOrder.SOURCE_ORDER);
+                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanOrder.Repeat", CurPREP.Order.ORDER_NO, inputOrder.SOURCE_ORDER);
                 }
+                action.Data.Command = "SelectItem";
+                action.Data.Data = CurPREP.Order;
             }
             catch (Exception ex)
             {
@@ -125,6 +149,236 @@
         }
 
         /// <summary>
+        ///  鑾峰彇褰撳墠澶囨枡鐨勫鏂欎换鍔′俊鎭�
+        /// </summary>
+        /// <returns></returns>
+        public async Task<ApiAction<BIZ_WMS_PREP>> GetPrepInfo()
+        {
+            var action = new ApiAction<BIZ_WMS_PREP>();
+            CurPREP.Order = MainDB.Queryable<BIZ_WMS_PREP>().Where(q => q.ID == CurPREP.Order.ID).IncludesAllFirstLayer().First();
+            action.Data = CurPREP.Order;
+            return action;
+        }
+
+        /// <summary>
+        /// 閫夋嫨澶囨枡浠诲姟涓涓嬫灦鐗╂枡琛�
+        /// </summary>
+        public async Task<ApiAction<ScanOutput>> SelectItem(BaseInput input)
+        {
+            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();
+                if (prepDtl.IsNullOrEmpty())
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L("澶囨枡鍓嶈鍏堥�夋嫨闇�瑕佸鏂欑殑鐗╂枡琛�");
+                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NotSelectItem");
+                    return action;
+                }
+                if (prepDtl.QTY_PREP > GetActReqQty(prepDtl))
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L("褰撳墠閫夋嫨鐗╂枡琛孾{0}]宸插鏂欐暟閲廩{1}]锛屼互婊¤冻瀹為檯闇�姹傛暟閲廩{2}]锛屾棤闇�缁х画澶囨枡");
+                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.SelectItem.PrepFinish", prepDtl.ITEM_CODE, prepDtl.QTY_PREP, GetActReqQty(prepDtl));
+                    return action;
+                }
+                //鍒犻櫎鐗╂枡姹犱腑涓婁竴娆″垎閰嶇殑鐗╂枡
+                MainDB.Deleteable<WMS_ITEM_POOL>().Where(q => q.TRANS_NO == prepDtl.ORDER_NO && q.TRANS_LINE == prepDtl.ORDER_LINE).ExecuteCommand();
+                if (!CurPrepDtl.IsNullOrEmpty())
+                {
+                    MainDB.Deleteable<WMS_ITEM_POOL>().Where(q => q.TRANS_NO == CurPrepDtl.ORDER_NO && q.TRANS_LINE == CurPrepDtl.ORDER_LINE).ExecuteCommand();
+                }
+                CurPrepDtl = prepDtl;
+
+                //濡傛灉涓婁竴娆℃帹鑽愭湁鏁版嵁锛屽垯鍏堢伃鎺変寒鐨勭伅
+                if (Suggests.Any())
+                {
+                    //await CloseLight(LocationHis);
+                }
+
+                //濡傛灉鏄濂楀彂鏂欙紝鍒欏彧鎺ㄨ崘褰撳墠鐗╂枡琛岀殑涓�鐩樼墿鏂�
+                if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.First.GetValue())
+                {
+                    //鎺ㄨ崘鐗╂枡
+                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, 1);
+                    action.LocaleMsg = result.LocaleMsg;
+                    if (result.IsException)
+                    {
+                        action.IsSuccessed = false;
+                        return action;
+                    }
+
+                    Suggests.Clear();
+                    Suggests = result.Data;
+                    if (Suggests.Count > 0)
+                    {
+                        var inv = Suggests.First();
+                        var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
+                        if (inv != null && actQty > 0)
+                        {
+                            inv.poolItem = inv.Item.GetPoolItem(OrgCode, nameof(CurPREP.Order), CurPrepDtl.ORDER_NO, CurPrepDtl.ORDER_LINE, actQty, true);
+                        }
+                        else
+                        {
+                            inv.poolItem = null;
+                        }
+                    }
+                    Suggests.RemoveAll(q => q.poolItem.IsNullOrEmpty());
+                }
+
+                //濡傛灉鏄甯稿彂鏂欙紝鍒欐寜瀹為檯闇�姹傛暟閲忔帹鑽愬綋鍓嶇墿鏂欒鐨勬墍鏈夌墿鏂�
+                if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.Supply.GetValue())
+                {
+                    //鎺ㄨ崘鐗╂枡
+                    var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (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);
+                    action.LocaleMsg = result.LocaleMsg;
+                    if (result.IsException)
+                    {
+                        action.IsSuccessed = false;
+                        return action;
+                    }
+
+                    Suggests.Clear();
+                    var remain = actQty;
+                    Suggests.ForEach((inv) =>
+                    {
+                        if (remain > 0)
+                        {
+                            inv.poolItem = inv.Item.GetPoolItem(input.AuthOption.OrgCode, nameof(CurPREP.Order), CurPrepDtl.ORDER_NO, CurPrepDtl.ORDER_LINE, remain, false);
+                            remain -= inv.poolItem.ALLOC_QTY;
+                        }
+                        else
+                        {
+                            inv.poolItem = null;
+                        }
+                    });
+                    Suggests.RemoveAll(q => q.poolItem.IsNullOrEmpty());
+                }
+
+                //淇濆瓨鐗╂枡姹犲埌鏁版嵁搴�
+                MainDB.Insertable(CurPoolList).ExecuteCommand();
+                CurPrepDtl.Suggests = Suggests;
+
+                //action = await LightAll(new() { AuthOption = input.AuthOption, Color = LedColor.Blue });
+
+                action.Data.Command = "Normal";
+                action.Data.Data = CurPrepDtl;
+                //action.LocaleMsg = Biz.L($"宸查�夋嫨瑕佸鏂欑墿鏂欒[{0}锛屽彲浠ュ紑濮嬪鏂欎笅鏋�");
+                action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.SelectItem.Success", CurPrepDtl.ITEM_CODE);
+            }
+            catch (Exception ex)
+            {
+                //鍙栨秷褰撳墠鎿嶄綔
+                ResetScan();
+                //action.CatchExceptionWithLog(ex, $"澶囨枡浠诲姟閫夋嫨瑕佺墿鏂欒寮傚父(Data: {0})");
+                action.CatchExceptionWithLog(ex, Biz.L("WMS.Out_BIZ_WMS_PREP.SelectItemException", input?.Data));
+            }
+            return action;
+        }
+
+        /// <summary>
+        ///  鑾峰彇褰撳墠澶囨枡鐨勭墿鏂欒淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        public async Task<ApiAction<BIZ_WMS_PREP_DTL>> GetCurPrepItem()
+        {
+            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);
+            CurPREP.Order.Details.Add(CurPrepDtl);
+            action.Data = CurPrepDtl;
+            return action;
+        }
+
+        /// <summary>
+        /// 棰嗘枡鍗曟帹鑽愭墍鏈夌墿鏂欎寒鐏�
+        /// </summary>
+        /// <param name="light"></param>
+        /// <returns></returns>
+        public async Task<ApiAction<ScanOutput>> LightAll(LightEntityInput light)
+        {
+            var action = new ApiAction<ScanOutput>();
+            try
+            {
+                var list = Suggests.WhereIF(!light.ItemCode.IsNullOrEmpty(), q => q.Item.ITEM_CODE == light.ItemCode);
+                if (list.Any())
+                {
+                    list = list.Where(q => q.Shelf.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.Smart.GetValue() || q.Shelf.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.QRCode.GetValue());
+                    if (list.Any())
+                    {
+                        list = list.Where(q => q.poolItem.STATUS < WMS_ITEM_POOL.STATUSs.WaitSend.GetValue());
+                        if (list.Any())
+                        {
+                            var locs = list.Select(x => x.Location.AddShelf(x.Shelf)).ToList();
+                            LocationHis.AddRange(locs);
+                            //浜伅鍓嶅厛鐏竴閬�
+                            foreach (var shelf in list.Select(q => q.Shelf))
+                            {
+                                await Share.Shelf.DownAll(shelf);
+                            }
+                            await Share.Shelf.LightMulti(TransID, light.Color, locs);
+                            action.LocaleMsg = Biz.L("浜伅鎴愬姛锛屼寒鐏鑹瞇{0}]", light.Color.GetDesc());
+                        }
+                        else
+                        {
+                            action.LocaleMsg = Biz.L($"鏃犻渶浜伅锛屾帹鑽愮殑鐗╂枡宸插叏閮ㄤ笅鏋�");
+                        }
+                    }
+                    else
+                    {
+                        action.LocaleMsg = Biz.L($"鏃犻渶浜伅锛屾帹鑽愮殑鐗╂枡涓嶅湪鏅鸿兘璐ф灦涓�");
+                    }
+                }
+                else
+                {
+                    action.IsSuccessed = false;
+                    action.LocaleMsg = Biz.L($"浜伅澶辫触锛屾湭鎵惧埌鎺ㄨ崘涓嬫灦鐨勭墿鏂�");
+                }
+            }
+            catch (Exception ex)
+            {
+                action.CatchExceptionWithLog(ex, $"浜伅寮傚父");
+            }
+            return action;
+        }
+
+        /// <summary>
+        /// 鐏伅
+        /// </summary>
+        /// <returns></returns>
+        public async Task<ApiAction> CloseLight(List<WMS_LOCATION> locations = null)
+        {
+            var action = new ApiAction();
+            try
+            {
+                if (locations != null)
+                {
+                    foreach (var shelf in locations.Select(q => q.Shelf))
+                    {
+                        await Share.Shelf.DownAll(shelf);
+                    }
+                }
+                //鐏伅
+                await Share.Shelf.DownMulti(TransID, locations.IsNullOrEmpty(Suggests.Where(q => q.Shelf.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.Smart.GetValue() || q.Shelf.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.QRCode.GetValue())
+                    .Select(x => x.Location).ToList()));
+            }
+            catch (Exception ex)
+            {
+                action.CatchExceptionWithLog(ex, $"鐏伅寮傚父");
+            }
+            return action;
+        }
+
+        /// <summary>
         /// 鎵弿鐗╂枡骞跺鏍革紝濡傛灉鐗╂枡宸茬粡瀹屾垚绉诲簱鍒欒揣鏋朵笂浜伅鎻愰啋鍌ㄤ綅
         /// </summary>
         public async Task<ApiAction<ScanOutput>> ScanItem(BaseInput input)
@@ -132,195 +386,245 @@
             var action = new ApiAction<ScanOutput>(new ScanOutput() { Command = Command });
             try
             {
-                if (CurInvItem.IsNullOrEmpty())
-                {
-                    //瑙f瀽鏉$爜
-                    Result<IInventory> result = WMS_ITEM_Biz.WmsItem.Get(input.SN, input.AuthOption, true);
-	                if (!result.IsSuccessed)
-	                {
-	                    action.IsSuccessed = false;
-	                    action.LocaleMsg = result.LocaleMsg;
-	                    return SetOutPutMqttMsg(action, input.Locale); 
-	                }
-	                var inv = result.Data as Inventory;
-
-                    //楠岃瘉鏉$爜鏄惁姝g‘
-                    if (!inv.isNormalStatus || inv.Status != WMS_ITEM.STATUSs.WaitIn)
-                    {
-                        action.IsSuccessed = false;
-                        //action.LocaleMsg = Biz.L("鐘舵�乕{0}]寮傚父锛岃閲嶆柊鎵弿");
-                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.StatusException", string.Join(',', inv.StatusList.Select(q => q.GetDesc())));
-                        return SetOutPutMqttMsg(action, input.Locale);
-                    }
-                    //鐗╂枡楠岃瘉
-                    if (inv.ItemInfo.IsNullOrEmpty() || inv.ItemInfo.IS_ACTIVE == "N")
-                    {
-                        action.IsSuccessed = false;
-                        //action.LocaleMsg = Biz.L("鐗╂枡缂栫爜[{0}]涓嶅瓨鍦ㄦ垨鑰呰鐗╂枡鏈惎鐢�");
-                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemCodeNotExistsOrNotActive", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
-                        return SetOutPutMqttMsg(action, input.Locale);
-                    }
-                    CurInvItem = inv;
-                }
-
-                var receipt = await Biz.Db.Queryable<BIZ_U9_RECEIPT>().Where(q => q.ORDER_NO == CurInvItem.Items.First().TRANS_NO).IncludesAllFirstLayer().FirstAsync();
-                if (receipt.IsNullOrEmpty())
+                //瑙f瀽鏉$爜
+                Result<IInventory> result = GetInventory(input.SN, input.AuthOption, true);
+                if (!result.IsSuccessed)
                 {
                     action.IsSuccessed = false;
-                    //action.LocaleMsg = Biz.L("鏀惰揣鍗曚腑鎵句笉鍒版潯鐮佹墍灞炵殑鍗曟嵁[{0}]淇℃伅锛岃閲嶆柊鎵弿鏀惰揣鍗曠殑鏉$爜鎴栭�夋嫨姝g‘鐨勫姛鑳戒笂鏋�");
-                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.ReceiptNotExists", CurInvItem.Items.First().TRANS_NO);
+                    action.LocaleMsg = result.LocaleMsg;
                     return SetOutPutMqttMsg(action, input.Locale);
                 }
-                var receiptDtl = receipt.Details.First(q => q.LINE_NO == CurInvItem.Items.First().TRANS_LINE);
-                if (receiptDtl.STATUS > BIZ_U9_RECEIPT.STATUSs.Storing.GetValue())
+                var inv = result.Data as Inventory;
+
+                //楠岃瘉鏉$爜鏄惁姝g‘
+                if (!inv.isNormalStatus || inv.Status != WMS_ITEM.STATUSs.InStore)
                 {
                     action.IsSuccessed = false;
-                    //action.LocaleMsg = Biz.L("鏀惰揣鍗曚腑琛孾{0}]鐘舵�乕{1}]寮傚父锛岃鎵弿姝g‘鐨勬潯鐮�");
-                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.ReceiptDtlStatusException", receiptDtl.LINE_NO, receiptDtl.STATUS.GetEnumDesc<BIZ_U9_RECEIPT.STATUSs>());
+                    //action.LocaleMsg = Biz.L("鐘舵�乕{0}]寮傚父锛岃閲嶆柊鎵弿");
+                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.StatusException", string.Join(',', inv.StatusList.Select(q => q.GetDesc())));
                     return SetOutPutMqttMsg(action, input.Locale);
                 }
-                var receiptSn = receipt.SnList.Where(q => CurInvItem.Items.Any(i => i.SN == q.SN)).ToList();
-                if (receiptSn.Any(q => q.STATUS != WMS_ITEM.STATUSs.WaitIn.GetValue()))
+                //楠岃瘉鏉$爜鏄惁琚攣瀹�
+                if (inv.Items.Any(q => q.IS_LOCKED == "Y"))
                 {
                     action.IsSuccessed = false;
-                    //action.LocaleMsg = Biz.L("鏀惰揣鍗曚腑鏉$爜[{0}]鐘舵�乕{1}]寮傚父锛岃鎵弿姝g‘鐨勬潯鐮�");
-                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.ReceiptSnStatusException", CurInvItem.SN, receiptSn.First(q => q.STATUS != WMS_ITEM.STATUSs.WaitIn.GetValue()).STATUS.GetEnumDesc<WMS_ITEM.STATUSs>());
+                    //action.LocaleMsg = Biz.L("鏉$爜[{0}]宸茶閿佸畾锛岃閲嶆柊鎵弿");
+                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemIsLock", inv.CurPkg.SN);
                     return SetOutPutMqttMsg(action, input.Locale);
                 }
-
-                var nLocation = new WMS_LOCATION();
-                // 鍒ゆ柇鏄惁鏅鸿兘璐ф灦
-                if (CurScanShelf.Shelf.IsLightShelf)
+                //鍌ㄤ綅楠岃瘉
+                if (inv.Location.IsNullOrEmpty())
                 {
-                    ShelfApiResult shelfApiResult = await Share.Shelf.PutOn(TransID, CurScanShelf.Shelf, CurInvItem.Items[0]);
-                    if (!shelfApiResult.IsSuccess)
-                    {
-                        action.IsSuccessed = false;
-                        action.LocaleMsg = Biz.L(shelfApiResult.GetData<string>());
-                        return SetOutPutMqttMsg(action, input.Locale);
-                    }
-                    var reaultShelf = shelfApiResult.GetData<ShelfChangeModel>();
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L($"鏉$爜[{0}]搴撳瓨淇℃伅寮傚父: 娌℃湁鍌ㄤ綅淇℃伅锛岃鍏堜笂鏋跺悗鍐嶆壂鎻�(鍌ㄤ綅Id: {1})");
+                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationIsNull", inv.CurPkg.SN, inv.CurPkg.LOCATION_ID);
+                    return SetOutPutMqttMsg(action, input.Locale);
+                }
+                //鐗╂枡楠岃瘉
+                if (inv.ItemInfo.IsNullOrEmpty() || inv.ItemInfo.IS_ACTIVE == "N")
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L($"鐗╂枡缂栫爜[{0}]涓嶅瓨鍦ㄦ垨鑰呰鐗╂枡鏈惎鐢�");
+                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemCodeNotExistsOrNotActive", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
+                    return SetOutPutMqttMsg(action, input.Locale);
+                }
+                //鍒ゆ柇鏄惁鍦ㄥ鏂欎腑鐨勭墿鏂�
+                if (!CurPREP.Order.Details.Any(q => q.ITEM_CODE == inv.ItemInfo.ITEM_CODE))
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L($"褰撳墠澶囨枡浠诲姟[{0}]涓嶅寘鍚潯鐮乕{1}]鐨勭墿鏂欑紪鐮乕{2}]锛岃鏀惧洖鍘熷偍浣�");
+                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
+                    return action;
+                }
+                //ProcessingOrderDetail = input.SN;
+                //if (WMSContext.TransactionDic.Where(q => !string.IsNullOrWhiteSpace(q.Value.ProcessingSn)).Any(q => q.Value.ProcessingSn == ProcessingSn && q.Value.TransID != this.TransID))
+                //{
+                //    action.IsSuccessed = false;
+                //    action.LocaleMsg = Biz.L("褰撳墠鏉$爜姝e湪鎵ц涓紝鏃犳硶鎵弿");
+                //    return action;
+                //}
+                CurInvItem = inv;
+                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,
+                    QTY = q.QTY,
+                    QTY_DLVY = q.QTY,
+                    STATUS = q.STATUS,
+                    WH_CODE = CurInvItem.Warehouse.WH_CODE,
+                    REGION_CODE = CurInvItem.Region.REGION_CODE,
+                    SHELF_CODE = CurInvItem.Shelf.SHELF_CODE,
+                    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",
+                    NEED_CUTTING = "N",
+                }).ToList();
 
-                    nLocation = reaultShelf.GetLocation();
-                    if (nLocation == null)
+
+                //鍒ゆ柇鏄惁瓒呭彂
+                isExceed = false;
+                //璁$畻鍓╀綑闇�姹傛暟閲忓拰鏉$爜涓殑鍙戝嚭鏁伴噺
+                var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
+                if (actQty < CurInvItem.CurPkg.QTY)
+                {
+                    isExceed = true;
+                    var remain = actQty;
+                    foreach (var sn in CurSn.OrderByDescending(q => q.QTY))
                     {
-                        action.IsSuccessed = false;
-                        //action.LocaleMsg = Biz.L($"璐ф灦[{0}]涓笉瀛樺湪id涓篬{1}]鐨勫偍浣嶏紝璇峰厛缁存姢璐ф灦淇℃伅");
-                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationNotExistsInShelf", CurScanShelf.Shelf.SHELF_CODE, reaultShelf.ledAddr);
-                        return SetOutPutMqttMsg(action, input.Locale);
+                        sn.QTY_DLVY = remain >= sn.QTY ? sn.QTY : remain;
+                        sn.NEED_CUTTING = remain >= sn.QTY ? "N" : "Y";
+                        remain -= sn.QTY_DLVY;
                     }
-                    var locationData = MainDB.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == nLocation.ID).First();
-                    if (!locationData.IsNullOrEmpty())
+                }
+
+                //鍒ゆ柇鐗╂枡鏄惁鍏佽瓒呭彂锛屽鏋滀笉鍏佽鍒欏繀椤绘埅鏂欙紝鍚﹀垯鐢辩敤鎴峰湪PDA閫夋嫨鏄惁鎴枡
+                isNeedCut = CurInvItem.ItemInfo.DLVY_TYPE == BAS_ITEM.DLVY_TYPEs.ByDemand.GetValue();
+
+                //濡傛灉瓒呭彂鍒欒繑鍥炲墠绔鐞嗭紝鍚﹀垯鐩存帴鍙戝嚭
+                if (isExceed)
+                {
+                    //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛屾潯鐮侀渶瑕佹埅鏂欙紝鍙戝嚭鏁伴噺[{4}]");
+                    //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛岃閫夋嫨瑕佽秴鍙戣繕鏄埅鏂欙紵");
+                    action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, GetActReqQty(CurPrepDtl), actQty);
+                    action.Data.Command = "ConfirmExceed";
+                    action.Data.Data = new  
                     {
-                        action.IsSuccessed = false;
-                        //action.LocaleMsg = Biz.L("鍌ㄤ綅[{0}]宸插瓨鏈夌墿鏂橻{1}]锛岃妫�鏌ョ郴缁熷簱瀛樹俊鎭�");
-                        action.LocaleMsg = Biz.L($"WMS.Default.ScanShelf.ItemAlreadyExistsInLocation", nLocation.LOCATION_CODE, locationData.SN);
-                        return SetOutPutMqttMsg(action, input.Locale);
-                    }
-                    CurScanShelf.LocationCode = nLocation.LOCATION_CODE;
+                        isExceed,
+                        isNeedCut,
+                        CurSn,
+                    };
+                } 
+                else
+                {
+                    input.Data = CurSn.ToJson();
+                    action = await ConfirmExceed(input);
+                }
+            }
+            catch (Exception ex)
+            {
+                action.CatchExceptionWithLog(ex, $"鎵弿鐗╂枡[{input.SN}]澶嶆牳寮傚父");
+            }
+            return SetOutPutMqttMsg(action, input.Locale);
+        }
+
+        /// <summary>
+        /// 鍓嶇纭瓒呭彂鎴栬�呰繑鍥炴埅鏂欏悗鐨勪俊鎭�
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public async Task<ApiAction<ScanOutput>> ConfirmExceed(BaseInput input)
+        {
+            var action = new ApiAction<ScanOutput>(new ScanOutput() { Command = "Normal" });
+            try
+            {
+                var sns = (input.Data ?? "").JsonToObject<List<BIZ_WMS_PREP_SN>>() ?? new List<BIZ_WMS_PREP_SN>();
+                if (!sns.Any())
+                {
+                    var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛屾潯鐮侀渶瑕佹埅鏂欙紝鍙戝嚭鏁伴噺[{4}]");
+                    //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛岃閫夋嫨瑕佽秴鍙戣繕鏄埅鏂欙紵");
+                    action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, GetActReqQty(CurPrepDtl), actQty);
+                    action.Data.Command = "ConfirmExceed";
+                    action.Data.Data = new
+                    {
+                        isExceed,
+                        isNeedCut,
+                        CurSn,
+                    };
+                    return SetOutPutMqttMsg(action, input.Locale);
                 }
                 else
                 {
-                    if (CurScanShelf.LocationCode.IsNullOrEmpty() || CurScanShelf.WarehouseCode.IsNullOrEmpty())
+                    foreach (var item in sns)
                     {
-                        action.IsSuccessed = false;
-                        //action.LocaleMsg = Biz.L("璇疯緭鍏ユ垨鎵弿鏈夋晥鐨勮揣鏋�/鍌ㄤ綅鐮�");
-                        action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty");
-                        return SetOutPutMqttMsg(action, input.Locale);
+                        var sn = CurSn.First(q => q.ID == item.ID);
+                        sn.NEED_CUTTING = item.NEED_CUTTING;//鍓嶇杩斿洖Y璁や负鏄埅鏂欏彂鏂欙紝N璁や负鏄暣鐩樺彂鏂�
+                        sn.DeliverySN = item.DeliverySN;
+                        sn.ReserveSN = item.ReserveSN;
                     }
-
-                    nLocation = await MainDB.Queryable<WMS_LOCATION>().Where(t => t.LOCATION_CODE == CurScanShelf.LocationCode && t.AUTH_ORG == OrgCode).FirstAsync();
+                    Command = "Normal";
                 }
 
-                //鍒ゆ柇鍌ㄤ綅鏄惁鍗曟斁
-                if (nLocation.IS_SINGLE == "Y" && CurInvItem.Items.Count > 1)
-                {
-                    action.IsSuccessed = false;
-                    //action.LocaleMsg = Biz.L("鍌ㄤ綅[{0}]鍙兘瀛樻斁涓�涓墿鏂�");
-                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.LocationSingleFailure", nLocation.LOCATION_CODE);
-                    ResetScan();
-                    return SetOutPutMqttMsg(action, input.Locale);
-                }
-
-                //鎵ц涓婃灦鏁版嵁澶勭悊
+                //鍑哄簱涓嬫灦
                 foreach (var item in CurInvItem.Items)
                 {
-                    item.IS_LOCKED = "Y";
                     item.SOURCE_CODE = item.TRANS_CODE;
                     item.SOURCE_ORDER = item.TRANS_NO;
                     item.SOURCE_LINE = item.TRANS_LINE;
-                    item.TRANS_CODE = nameof(BIZ_U9_RECEIPT);
-                    item.TRANS_NO = receipt.ORDER_NO;
-                    item.TRANS_LINE = receiptDtl.LINE_NO;
-                    item.PROD_DATE = item.PROD_DATE < new DateTime(2000, 1, 1) ? DateTime.Now : item.PROD_DATE;
-                    item.FIRST_IN_DATE = item.FIRST_IN_DATE < new DateTime(2000, 1, 1) ? DateTime.Now : item.FIRST_IN_DATE;
+                    item.TRANS_CODE = nameof(BIZ_WMS_PREP);
+                    item.TRANS_NO = CurPREP.Order.ORDER_NO;
+                    item.TRANS_LINE = CurPrepDtl.ORDER_LINE;
                 }
-                Result putonResult = PutOn(input.AuthOption, nLocation.LOCATION_CODE);
-                if (!putonResult.IsSuccessed)
+                foreach (var item in CurInvItem.Packages)
+                {
+                    item.SOURCE_CODE = item.TRANS_CODE;
+                    item.SOURCE_ORDER = item.TRANS_NO;
+                    item.SOURCE_LINE = item.TRANS_LINE;
+                    item.TRANS_CODE = nameof(BIZ_WMS_PREP);
+                    item.TRANS_NO = CurPREP.Order.ORDER_NO;
+                    item.TRANS_LINE = CurPrepDtl.ORDER_LINE;
+                }
+                Result downResult = TakeDown(CurSn, input.AuthOption, WMS_ITEM.STATUSs.OffShelf);
+                if (!downResult.IsSuccessed)
                 {
                     action.IsSuccessed = false;
-                    action.LocaleMsg = putonResult.LocaleMsg;
-                    ResetScan();
+                    action.LocaleMsg = downResult.LocaleMsg;
+                    ResetScanInfo();
                     return SetOutPutMqttMsg(action, input.Locale);
                 }
-
-                //鏇存柊鍗曟嵁淇℃伅
-                foreach(var sn in receiptSn)
+                else//澶勭悊澶囨枡浠诲姟鏁版嵁
                 {
-                    sn.STATUS = WMS_ITEM.STATUSs.InStore.GetValue();
-                    sn.IS_IN = "Y";
-                }
-                //濡傛灉褰撳墠琛屼笂鏋跺畬鎴愭爣璁颁负寰呭鏍�
-                receiptDtl.QTY_IN = receipt.SnList.Where(q => q.LINE_NO == receiptDtl.LINE_NO && q.STATUS  == WMS_ITEM.STATUSs.InStore.GetValue()).Sum(q => q.QTY);
-                if (receiptDtl.QTY_IN == receiptDtl.QTY)
-                {
-                    receiptDtl.STATUS = BIZ_U9_RECEIPT.STATUSs.Review.GetValue();
-                    //褰撳墠鍗曟嵁鏄庣粏宸茬粡鍏ㄩ儴涓婃灦瀹屾垚锛屽彲浠ヨ皟鐢║9琛屽鎺ュ彛
-                    var iInput = new SubmitLineInput
+                    foreach (var sn in CurSn)
                     {
-                        userId = UserCode,
-                        IsLogin = true,
-                        param = new()
+                        sn.STATUS = WMS_ITEM.STATUSs.OffShelf.GetValue();
+                        sn.DOWN_TIME = DateTime.Now;
+                        if (sn.NEED_CUTTING == "Y")
                         {
-                            RcvLineID = receiptDtl.ID,
-                            RcvDocNo = receiptDtl.ORDER_NO,
-                            DocLineNo = receiptDtl.LINE_NO,
-                            OrgCode = receiptDtl.AUTH_ORG,
+                            sn.NEED_CUTTING = "N";
+                            sn.SN = sn.DeliverySN;
+                            sn.QTY = sn.QTY_DLVY;
                         }
-                    };
-                    var result = await DI.Resolve<IWMS_U9C>().ReceivementApproveLine(iInput);
-                    if (!result.IsSuccessed)
+                    }
+                    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 = DateTime.Now;
+
+                    //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
+                    var _CurSn = CurSn.Clone();
+                    var _CurPrepDtl = CurPrepDtl.Clone();
+                    var _CurPREPOrder = CurPREP.Order.Clone();
+                    var _CurPREPCurBatch = CurPREP.Order.CurBatch.Clone();
+                    AddCommitAction("UpdatePrep", () =>
                     {
-                        action.IsSuccessed = false;
-                        action.LocaleMsg = result.LocaleMsg;
-                        return SetOutPutMqttMsg(action, input.Locale);
+                        //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
+                        var db = GetCommitDB();
+                        //鏁版嵁淇濆瓨閫昏緫
+                        db.Insertable(_CurSn, UserCode).ExecuteCommand();
+                        _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();
+                    });
+
+                    //鐏伅
+                    if (CurInvItem.Shelf.IsLightShelf)
+                    {
+                        await Share.Shelf.DownSingle(TransID, CurInvItem.Location);
                     }
                 }
-                else
-                {
-                    receiptDtl.STATUS = BIZ_U9_RECEIPT.STATUSs.Storing.GetValue();
-                }
-                var dtlStatus = receipt.Details.Select(q => q.STATUS).Distinct();
-                if (dtlStatus.Count() == 1 && dtlStatus.First() == BIZ_U9_RECEIPT.STATUSs.Review.GetValue())
-                {
-                    receipt.STATUS = BIZ_U9_RECEIPT.STATUSs.Review.GetValue();
-                }
-                else
-                {
-                    receipt.STATUS = BIZ_U9_RECEIPT.STATUSs.Storing.GetValue();
-                }
-
-                //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
-                var _receipt = receipt.Clone();
-                AddCommitAction("Receipt", () =>
-                {
-                    //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
-                    var db = GetCommitDB();
-                    //鏁版嵁淇濆瓨閫昏緫
-                    db.Updateable(receipt, UserCode).UpdateColumns(q => new { q.STATUS, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
-                    db.Updateable(receiptDtl, UserCode).UpdateColumns(q => new { q.STATUS, q.QTY_IN, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
-                    db.Updateable(receiptSn, UserCode).UpdateColumns(q => new { q.STATUS, q.IS_IN, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
-                });
 
                 //瀹屾垚鎵�鏈夊鐞嗗悗浣跨敤浜嬪姟淇濆瓨鏁版嵁
                 action = DoIfFinish(action, input.Locale);
@@ -329,10 +633,22 @@
             {
                 //鍙栨秷褰撳墠鎿嶄綔
                 ResetScan();
+                //娓呯悊鏆傚瓨鏁版嵁鎻愪氦鎿嶄綔
+                DBCommitList.Clear();
                 //action.CatchExceptionWithLog(ex, $"鎵弿鏉$爜[{input.SN}]澶嶆牳寮傚父");
                 action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", input.SN));
             }
             return SetOutPutMqttMsg(action, input.Locale);
+        }
+
+        /// <summary>
+        /// 瀹為檯闇�姹傛暟閲忚绠楁柟娉�
+        /// </summary>
+        /// <param name="dtl"></param>
+        /// <returns></returns>
+        private double GetActReqQty(BIZ_WMS_PREP_DTL dtl)
+        {
+            return dtl.QTY_REQ;
         }
 
         /// <summary>
@@ -442,22 +758,21 @@
             doAfterSave?.Invoke();
 
             // 杩斿洖鏁版嵁
-            action.Data.Data = new DefaultInStoreOutput
+            action.Data.Data = new DefaultScanItemOutput()
             {
-                Barcode = CurInvItem.SN,
-                MaterialCode = CurInvItem.ItemInfo.ITEM_CODE,
+                SN = CurInvItem.SN,
+                ItemCode = CurInvItem.ItemInfo.ITEM_CODE,
                 MaterialName = CurInvItem.ItemInfo.ITEM_NAME,
-                CurrentQty = CurInvItem.Items[0].QTY,
-                Unit = CurInvItem.Items[0].UNIT,
+                Qty = CurInvItem.CurPkg.QTY,
+                Unit = CurInvItem.CurPkg.UNIT,
+                regionCode = CurInvItem.Region.REGION_CODE,
+                locationCode = CurInvItem.Location?.LOCATION_CODE,
                 DateCode = CurInvItem.Items[0].PROD_DATE,
-                WarehouseCode = CurInvItem.Warehouse.WH_CODE,
-                RegionCode = CurInvItem.Region.REGION_CODE,
-                ShelfCode = CurInvItem.Shelf.SHELF_CODE,
-                LocationCode = CurInvItem.Location.LOCATION_CODE,
+                ScanAfCut = CurInvItem.Warehouse.SCAN_AF_CUT
             };
 
-            //action.LocaleMsg = Biz.L($"鎵弿鏉$爜[{0}]涓婃灦鍒板偍浣峓{1}]鎴愬姛");
-            action.LocaleMsg = Biz.L("WMS.Default.ScanItem.PutOnSucceeded", CurInvItem.SN, CurInvItem.Location.LOCATION_CODE);
+            //action.LocaleMsg = Biz.L($"鎵弿鏉$爜[{0}]浠庡偍浣峓{1}]涓嬫灦鎴愬姛");
+            action.LocaleMsg = Biz.L("WMS.Default.ScanItem.TakeDownSucceeded", CurInvItem.SN, CurInvItem.Location?.LOCATION_CODE);
 
             //閲嶇疆宸ュ簭
             ResetScanInfo();
@@ -482,12 +797,18 @@
         /// </summary>
         public void ResetScanInfo()
         {
-            Command = null;
+            Command = "Normal";
             CurInvItem = null;
         }
 
         public override bool Close(bool needSaveHistoryLog = false)
         {
+            //CloseLight(LocationHis).Wait();
+            if (!(CurPREP?.Order?.ORDER_NO ?? "").IsNullOrEmpty())
+            {
+                MainDB.Deleteable<WMS_ITEM_POOL>().Where(x => x.TRANS_NO == CurPREP.Order.ORDER_NO).ExecuteCommand();
+            }
+
             this.IsFinished = true;
             return IsFinished ? base.Close(needSaveHistoryLog) : IsFinished;
         }
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 92a8a89..4ffdf1e 100644
--- a/Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs
+++ b/Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs
@@ -93,6 +93,7 @@
         }
 
         /// <summary>
+        /// Scan(ApiAction(BaseInput))
         /// 鎵弿鍏ュ彛
         /// </summary>
         /// <param name="action"></param>
@@ -137,5 +138,82 @@
             return Ok(response);
         }
 
-    }
+        /// <summary>
+        /// GetPrepInfo(ApiAction)
+        /// 鑾峰彇褰撳墠鎵�鏈夊崟鎹俊鎭�
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("api/[controller]/Out_PREP/GetPrepInfo")]
+        public async Task<IActionResult> Out_BIZ_WMS_PREP_GetPrepInfoAsync([FromBody] ApiAction 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)
+                    {
+                        response = action.GetResponse(await trans.GetPrepInfo());
+                    }
+                    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);
+        }
+
+        /// <summary>
+        /// GetCurPrepItem(ApiAction)
+        /// 鑾峰彇褰撳墠鎵�鏈夊崟鎹俊鎭�
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("api/[controller]/Out_PREP/GetCurPrepItem")]
+        public async Task<IActionResult> Out_BIZ_WMS_PREP_GetCurPrepItemAsync([FromBody] ApiAction 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)
+                    {
+                        response = action.GetResponse(await trans.GetCurPrepItem());
+                    }
+                    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 1cfbc17..55a42fc 100644
--- a/Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs
+++ b/Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs
@@ -20,6 +20,18 @@
         /// </summary>
         public Task<ApiAction<ScanOutput>> Scan(BaseInput input);
 
+        /// <summary>
+        ///  鑾峰彇褰撳墠澶囨枡鐨勫鏂欎换鍔′俊鎭�
+        /// </summary>
+        /// <returns></returns>
+        public Task<ApiAction<BIZ_WMS_PREP>> GetPrepInfo();
+
+        /// <summary>
+        ///  鑾峰彇褰撳墠澶囨枡鐨勭墿鏂欒淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        public Task<ApiAction<BIZ_WMS_PREP_DTL>> GetCurPrepItem();
+
         public bool Close(bool needSaveHistoryLog = false);
     }
 }
diff --git a/Tiger.IBusiness.WMS/Transaction/IPreparation.cs b/Tiger.IBusiness.WMS/Transaction/IPreparation.cs
index 1cb6299..5a143d8 100644
--- a/Tiger.IBusiness.WMS/Transaction/IPreparation.cs
+++ b/Tiger.IBusiness.WMS/Transaction/IPreparation.cs
@@ -15,7 +15,7 @@
     public interface IPreparation
     {
         #region Propertys & Variables
-        public BIZ_WMS_PREP PrepOrder { get; set; }
+        public BIZ_WMS_PREP Order { get; set; }
         #endregion Propertys & Variables
 
         #region Functions
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
index dfe1964..9a754ea 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
@@ -3,6 +3,7 @@
 using System.Linq;
 using System.ComponentModel;
 using System.Collections.Generic;
+using Tiger.Model.Extensions;
 
 namespace Tiger.Model
 {
@@ -60,6 +61,8 @@
 		[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.Close.GetValue());
         #endregion
 
         #region 澶栭敭灞炴��
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 beace7a..20f7759 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs
@@ -7,224 +7,234 @@
 namespace Tiger.Model
 {
 	/// <summary>
-	/// 实体:备料任务(WMS)物料明细
+	/// 瀹炰綋锛氬鏂欎换鍔�(WMS)鐗╂枡鏄庣粏
 	/// </summary>
 	[Description("Primary:ID")]
-	[DisplayName("备料任务(WMS)物料明细")]
+	[DisplayName("澶囨枡浠诲姟(WMS)鐗╂枡鏄庣粏")]
 	[Serializable]
 	[SugarTable("BIZ_WMS_PREP_DTL")]
 	public class BIZ_WMS_PREP_DTL : DbEntityWithAuth
 	{
-		#region 构造函数
+		#region 鏋勯�犲嚱鏁�
 		/// <summary>
-		/// 实体:备料任务(WMS)物料明细
+		/// 瀹炰綋锛氬鏂欎换鍔�(WMS)鐗╂枡鏄庣粏
 		/// </summary>
 		public BIZ_WMS_PREP_DTL() {}
 		#endregion
 
-		#region 公共属性
+		#region 鍏叡灞炴��
 		/// <summary>
-		/// 备料任务号
+		/// 澶囨枡浠诲姟鍙�
 		/// </summary>
-		[DisplayName("备料任务号")]
+		[DisplayName("澶囨枡浠诲姟鍙�")]
 		public string ORDER_NO { get; set; }
 		/// <summary>
-		/// 备料任务行号
+		/// 澶囨枡浠诲姟琛屽彿
 		/// </summary>
-		[DisplayName("备料任务行号")]
+		[DisplayName("澶囨枡浠诲姟琛屽彿")]
 		public string ORDER_LINE { get; set; }
 		/// <summary>
-		/// 物料编码
+		/// 鐗╂枡缂栫爜
 		/// </summary>
-		[DisplayName("物料编码")]
+		[DisplayName("鐗╂枡缂栫爜")]
 		public string ITEM_CODE { get; set; }
 		/// <summary>
-		/// 替代料,多个用“,”分隔
+		/// 鏇夸唬鏂欙紝澶氫釜鐢ㄢ��,鈥濆垎闅�
 		/// </summary>
-		[DisplayName("替代料,多个用“,”分隔")]
+		[DisplayName("鏇夸唬鏂欙紝澶氫釜鐢ㄢ��,鈥濆垎闅�")]
 		public string SUBITEM_CODE { get; set; }
 		/// <summary>
-		/// 单位
+		/// 鍗曚綅
 		/// </summary>
-		[DisplayName("单位")]
+		[DisplayName("鍗曚綅")]
 		public string UNIT { get; set; }
 		/// <summary>
-		/// 生产计划损耗比例(%)
+		/// 鐢熶骇璁″垝鎹熻�楁瘮渚�(%)
 		/// </summary>
-		[DisplayName("生产计划损耗比例(%)")]
+		[DisplayName("鐢熶骇璁″垝鎹熻�楁瘮渚�(%)")]
 		public double PLAN_LOSS_RATE { get; set; }
 		/// <summary>
-		/// 生产计划损耗数量
+		/// 鐢熶骇璁″垝鎹熻�楁暟閲�
 		/// </summary>
-		[DisplayName("生产计划损耗数量")]
+		[DisplayName("鐢熶骇璁″垝鎹熻�楁暟閲�")]
 		public double PLAN_LOSS_QTY { get; set; }
 		/// <summary>
-		/// 是否计算损耗(Y/N)
+		/// 鏄惁璁$畻鎹熻��(Y/N)
 		/// </summary>
-		[DisplayName("是否计算损耗(Y/N)")]
+		[DisplayName("鏄惁璁$畻鎹熻��(Y/N)")]
 		public string IS_CALC_LOSS { get; set; }
 		/// <summary>
-		/// 是否最小包装发料(Y/N)
+		/// 鏄惁鏈�灏忓寘瑁呭彂鏂�(Y/N)
 		/// </summary>
-		[DisplayName("是否最小包装发料(Y/N)")]
+		[DisplayName("鏄惁鏈�灏忓寘瑁呭彂鏂�(Y/N)")]
 		public string IS_WHOLE { 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>
-		/// 状态(0UnCalc未计算|1FistrLack首套缺料|2SupplyLack补料缺料|3Enough满足需求|4NoCalc不参与备料计算|5Cancel已作废|6Finish备料完成)
+		/// 鐘舵��(0UnCalc鏈绠梶1FistrLack棣栧缂烘枡|2SupplyLack琛ユ枡缂烘枡|3Enough婊¤冻闇�姹倈4NoCalc涓嶅弬涓庡鏂欒绠梶5Cancel宸蹭綔搴焲6Finish澶囨枡瀹屾垚)
 		/// </summary>
-		[DisplayName("状态(0UnCalc未计算|1FistrLack首套缺料|2SupplyLack补料缺料|3Enough满足需求|4NoCalc不参与备料计算|5Cancel已作废|6Finish备料完成)")]
+		[DisplayName("鐘舵��(0UnCalc鏈绠梶1FistrLack棣栧缂烘枡|2SupplyLack琛ユ枡缂烘枡|3Enough婊¤冻闇�姹倈4NoCalc涓嶅弬涓庡鏂欒绠梶5Cancel宸蹭綔搴焲6Finish澶囨枡瀹屾垚)")]
 		public int STATUS { get; set; }
 		/// <summary>
-		/// 单位用量
+		/// 鍗曚綅鐢ㄩ噺
 		/// </summary>
-		[DisplayName("单位用量")]
+		[DisplayName("鍗曚綅鐢ㄩ噺")]
 		public double QTY_UNIT { get; set; }
 		/// <summary>
-		/// 需求数量
+		/// 闇�姹傛暟閲�
 		/// </summary>
-		[DisplayName("需求数量")]
+		[DisplayName("闇�姹傛暟閲�")]
 		public double QTY_REQ { get; set; }
 		/// <summary>
-		/// 已备料数量
+		/// 宸插鏂欐暟閲�
 		/// </summary>
-		[DisplayName("已备料数量")]
+		[DisplayName("宸插鏂欐暟閲�")]
 		public double QTY_PREP { get; set; }
 		/// <summary>
-		/// 发出数量
+		/// 鍙戝嚭鏁伴噺
 		/// </summary>
-		[DisplayName("发出数量")]
+		[DisplayName("鍙戝嚭鏁伴噺")]
 		public double QTY_DLVY { 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 string SMT_NO { get; set; }
 		/// <summary>
-		/// 站位号
+		/// 绔欎綅鍙�
 		/// </summary>
-		[DisplayName("站位号")]
+		[DisplayName("绔欎綅鍙�")]
 		public string STATION_NO { get; set; }
 		/// <summary>
-		/// 飞达号
+		/// 椋炶揪鍙�
 		/// </summary>
-		[DisplayName("飞达号")]
+		[DisplayName("椋炶揪鍙�")]
 		public string FEEDER_NO { get; set; }
 		/// <summary>
-		/// 料枪类型
+		/// 鏂欐灙绫诲瀷
 		/// </summary>
-		[DisplayName("料枪类型")]
+		[DisplayName("鏂欐灙绫诲瀷")]
 		public string FEEDER_TYPE { get; set; }
 		/// <summary>
-		/// 备注
+		/// 澶囨敞
 		/// </summary>
-		[DisplayName("备注")]
+		[DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
 		/// <summary>
-		/// 计算字段无需更新和显示
+		/// 璁$畻瀛楁鏃犻渶鏇存柊鍜屾樉绀�
 		/// </summary>
-		[DisplayName("计算字段无需更新和显示")]
+		[DisplayName("璁$畻瀛楁鏃犻渶鏇存柊鍜屾樉绀�")]
 		public double TEMP_QTY { get; set; }
-		#endregion
+        #endregion
 
-		#region 虚拟属性
-		/*例子
+        #region 铏氭嫙灞炴��
+        /*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
-		#endregion
+        [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
 
-		#region 外键属性
-		/*例子
-		//一对一外键导航
-		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是BIZ_WMS_PREP_DTL类里面的外键ID字段
-		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
-		//一对多外键导航
-		[Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_WMS_PREP_DTLId))]//ClassA表中的BIZ_WMS_PREP_DTLId
-		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
-		//多对多外键导航
-		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_DTLId), nameof(MappingClass.ClassAId))]//注意顺序
-		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+        #region 澶栭敭灞炴��
+        /*渚嬪瓙
+		//涓�瀵逛竴澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疊IZ_WMS_PREP_DTL绫婚噷闈㈢殑澶栭敭ID瀛楁
+		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//涓�瀵瑰澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_WMS_PREP_DTLId))]//ClassA琛ㄤ腑鐨凚IZ_WMS_PREP_DTLId
+		public List<ClassA> ClassAList { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//澶氬澶氬閿鑸�
+		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_DTLId), 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>
-		/// 枚举:状态(0UnCalc未计算|1FistrLack首套缺料|2SupplyLack补料缺料|3Enough满足需求|4NoCalc不参与备料计算|5Cancel已作废|6Finish备料完成)
-		/// </summary>
-		public enum STATUSs
+        /// <summary>
+        /// 鏋氫妇锛氱姸鎬�(0UnCalc鏈绠梶1FistrLack棣栧缂烘枡|2SupplyLack琛ユ枡缂烘枡|3Enough婊¤冻闇�姹倈4NoCalc涓嶅弬涓庡鏂欒绠梶5Cancel宸蹭綔搴焲6Finish澶囨枡瀹屾垚)
+        /// </summary>
+        public enum STATUSs
 		{
-			[Description("未计算")]
+			[Description("鏈绠�")]
 			UnCalc = 0,
-			[Description("首套缺料")]
+			[Description("棣栧缂烘枡")]
 			FistrLack = 1,
-			[Description("补料缺料")]
+			[Description("琛ユ枡缂烘枡")]
 			SupplyLack = 2,
-			[Description("满足需求")]
+			[Description("婊¤冻闇�姹�")]
 			Enough = 3,
-			[Description("不参与备料计算")]
+			[Description("涓嶅弬涓庡鏂欒绠�")]
 			NoCalc = 4,
-			[Description("已作废")]
+			[Description("宸蹭綔搴�")]
 			Cancel = 5,
-			[Description("备料完成")]
+			[Description("澶囨枡瀹屾垚")]
 			Finish = 6,
 		}
 		#endregion
 
-		#region 公共方法
+		#region 鍏叡鏂规硶
 
 		#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 51efbd9..810f9b1 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs
@@ -7,225 +7,235 @@
 namespace Tiger.Model
 {
 	/// <summary>
-	/// 实体:备料任务(WMS)条码明细
+	/// 瀹炰綋锛氬鏂欎换鍔�(WMS)鏉$爜鏄庣粏
 	/// </summary>
 	[Description("Primary:ID")]
-	[DisplayName("备料任务(WMS)条码明细")]
+	[DisplayName("澶囨枡浠诲姟(WMS)鏉$爜鏄庣粏")]
 	[Serializable]
 	[SugarTable("BIZ_WMS_PREP_SN")]
 	public class BIZ_WMS_PREP_SN : DbEntityWithAuth
 	{
-		#region 构造函数
+		#region 鏋勯�犲嚱鏁�
 		/// <summary>
-		/// 实体:备料任务(WMS)条码明细
+		/// 瀹炰綋锛氬鏂欎换鍔�(WMS)鏉$爜鏄庣粏
 		/// </summary>
 		public BIZ_WMS_PREP_SN() {}
 		#endregion
 
-		#region 公共属性
+		#region 鍏叡灞炴��
 		/// <summary>
-		/// 备料任务号
+		/// 澶囨枡浠诲姟鍙�
 		/// </summary>
-		[DisplayName("备料任务号")]
+		[DisplayName("澶囨枡浠诲姟鍙�")]
 		public string ORDER_NO { get; set; }
 		/// <summary>
-		/// 备料任务行号
+		/// 澶囨枡浠诲姟琛屽彿
 		/// </summary>
-		[DisplayName("备料任务行号")]
+		[DisplayName("澶囨枡浠诲姟琛屽彿")]
 		public string ORDER_LINE { get; set; }
 		/// <summary>
-		/// 发料批次
+		/// 鍙戞枡鎵规
 		/// </summary>
-		[DisplayName("发料批次")]
+		[DisplayName("鍙戞枡鎵规")]
 		public string ORDER_BATCH { get; set; }
 		/// <summary>
-		/// 物品标签
+		/// 鐗╁搧鏍囩
 		/// </summary>
-		[DisplayName("物品标签")]
+		[DisplayName("鐗╁搧鏍囩")]
 		public string SN { get; set; }
 		/// <summary>
-		/// 物品编码
+		/// 鐗╁搧缂栫爜
 		/// </summary>
-		[DisplayName("物品编码")]
+		[DisplayName("鐗╁搧缂栫爜")]
 		public string ITEM_CODE { get; set; }
 		/// <summary>
-		/// 单位
+		/// 鍗曚綅
 		/// </summary>
-		[DisplayName("单位")]
+		[DisplayName("鍗曚綅")]
 		public string UNIT { get; set; }
 		/// <summary>
-		/// 物品数量
+		/// 鐗╁搧鏁伴噺
 		/// </summary>
-		[DisplayName("物品数量")]
-		public string QTY { get; set; }
+		[DisplayName("鐗╁搧鏁伴噺")]
+		public double QTY { get; set; }
 		/// <summary>
-		/// 单位用量
+		/// 鍗曚綅鐢ㄩ噺
 		/// </summary>
-		[DisplayName("单位用量")]
+		[DisplayName("鍗曚綅鐢ㄩ噺")]
 		public double QTY_UNIT { get; set; }
 		/// <summary>
-		/// 发出数量
+		/// 鍙戝嚭鏁伴噺
 		/// </summary>
-		[DisplayName("发出数量")]
+		[DisplayName("鍙戝嚭鏁伴噺")]
 		public double QTY_DLVY { get; set; }
 		/// <summary>
-		/// 状态(同WMS_ITEM状态)
+		/// 鐘舵��(鍚學MS_ITEM鐘舵��)
 		/// </summary>
-		[DisplayName("状态(同WMS_ITEM状态)")]
+		[DisplayName("鐘舵��(鍚學MS_ITEM鐘舵��)")]
 		public int STATUS { get; set; }
 		/// <summary>
-		/// 发料仓库
+		/// 鍙戞枡浠撳簱
 		/// </summary>
-		[DisplayName("发料仓库")]
+		[DisplayName("鍙戞枡浠撳簱")]
 		public string WH_CODE { get; set; }
 		/// <summary>
-		/// 发料储区
+		/// 鍙戞枡鍌ㄥ尯
 		/// </summary>
-		[DisplayName("发料储区")]
+		[DisplayName("鍙戞枡鍌ㄥ尯")]
 		public string REGION_CODE { get; set; }
 		/// <summary>
-		/// 发料货架/料车
+		/// 鍙戞枡璐ф灦/鏂欒溅
 		/// </summary>
-		[DisplayName("发料货架/料车")]
+		[DisplayName("鍙戞枡璐ф灦/鏂欒溅")]
 		public string SHELF_CODE { get; set; }
 		/// <summary>
-		/// 发料储位
+		/// 鍙戞枡鍌ㄤ綅
 		/// </summary>
-		[DisplayName("发料储位")]
+		[DisplayName("鍙戞枡鍌ㄤ綅")]
 		public string LOCATION_CODE { get; set; }
 		/// <summary>
-		/// 下架时间
+		/// 涓嬫灦鏃堕棿
 		/// </summary>
-		[DisplayName("下架时间")]
+		[DisplayName("涓嬫灦鏃堕棿")]
 		public DateTime DOWN_TIME { get; set; } = DateTime.MinValue;
 		/// <summary>
-		/// 出库时间
+		/// 鍑哄簱鏃堕棿
 		/// </summary>
-		[DisplayName("出库时间")]
+		[DisplayName("鍑哄簱鏃堕棿")]
 		public DateTime DLVY_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_LINE { 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 string SMT_NO { get; set; }
 		/// <summary>
-		/// 站位号
+		/// 绔欎綅鍙�
 		/// </summary>
-		[DisplayName("站位号")]
+		[DisplayName("绔欎綅鍙�")]
 		public string STATION_NO { get; set; }
 		/// <summary>
-		/// 飞达号
+		/// 椋炶揪鍙�
 		/// </summary>
-		[DisplayName("飞达号")]
+		[DisplayName("椋炶揪鍙�")]
 		public string FEEDER_NO { get; set; }
 		/// <summary>
-		/// 料枪类型
+		/// 鏂欐灙绫诲瀷
 		/// </summary>
-		[DisplayName("料枪类型")]
+		[DisplayName("鏂欐灙绫诲瀷")]
 		public string FEEDER_TYPE { get; set; }
 		/// <summary>
-		/// 上料顺序
+		/// 涓婃枡椤哄簭
 		/// </summary>
-		[DisplayName("上料顺序")]
+		[DisplayName("涓婃枡椤哄簭")]
 		public int LOAD_SEQ { get; set; }
 		/// <summary>
-		/// 是否首套料(Y/N)
+		/// 鏄惁棣栧鏂�(Y/N)
 		/// </summary>
-		[DisplayName("是否首套料(Y/N)")]
+		[DisplayName("鏄惁棣栧鏂�(Y/N)")]
 		public string IS_FIRST { get; set; }
 		/// <summary>
-		/// 是否需要截料发料(Y/N)
+		/// 鏄惁闇�瑕佹埅鏂欏彂鏂�(Y/N)
 		/// </summary>
-		[DisplayName("是否需要截料发料(Y/N)")]
+		[DisplayName("鏄惁闇�瑕佹埅鏂欏彂鏂�(Y/N)")]
 		public string NEED_CUTTING { get; set; }
 		/// <summary>
-		/// 备注
+		/// 澶囨敞
 		/// </summary>
-		[DisplayName("备注")]
+		[DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
-		#endregion
+        #endregion
 
-		#region 虚拟属性
-		/*例子
+        #region 铏氭嫙灞炴��
+        /*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
-		#endregion
+        /// <summary>
+        /// 鎴枡鍚庡彂鍑虹殑SN
+        /// </summary>
+        [SugarColumn(IsIgnore = true)]
+        public string DeliverySN { get; set; }
+        /// <summary>
+        /// 鎴枡鍚庝繚鐣欑殑SN
+        /// </summary>
+        [SugarColumn(IsIgnore = true)]
+        public string ReserveSN { get; set; }
+        #endregion
 
-		#region 外键属性
-		/*例子
-		//一对一外键导航
-		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是BIZ_WMS_PREP_SN类里面的外键ID字段
-		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
-		//一对多外键导航
-		[Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_WMS_PREP_SNId))]//ClassA表中的BIZ_WMS_PREP_SNId
-		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
-		//多对多外键导航
-		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_SNId), nameof(MappingClass.ClassAId))]//注意顺序
-		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+        #region 澶栭敭灞炴��
+        /*渚嬪瓙
+		//涓�瀵逛竴澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疊IZ_WMS_PREP_SN绫婚噷闈㈢殑澶栭敭ID瀛楁
+		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//涓�瀵瑰澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_WMS_PREP_SNId))]//ClassA琛ㄤ腑鐨凚IZ_WMS_PREP_SNId
+		public List<ClassA> ClassAList { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//澶氬澶氬閿鑸�
+		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_SNId), 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,
 		}
 		*/
-		#endregion
+        #endregion
 
-		#region 公共方法
+        #region 鍏叡鏂规硶
 
-		#endregion
+        #endregion
 
-	}//endClass
+    }//endClass
 }
\ No newline at end of file

--
Gitblit v1.9.3