From d2f14f6bb44c6dd19cc0816a033452b6de56184b Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期日, 06 四月 2025 18:09:45 +0800
Subject: [PATCH] 增加备料任务调用U9接口方法

---
 Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs |  700 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 513 insertions(+), 187 deletions(-)

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..adcf836 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,11 @@
 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;
+using MailKit.Search;
+using Tiger.Business.WMS.Extensions;
 
 namespace Tiger.Business.WMS.Transaction
 {
@@ -31,7 +31,14 @@
         }
 
         #region Propertys & Variables
-        private Preparation CurPREP;
+        public Preparation CurPREP { get; set; }
+        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 +55,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 +88,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);
                     }
@@ -73,7 +97,7 @@
             catch (Exception ex)
             {
                 //鍙栨秷褰撳墠鎿嶄綔
-                ResetScan();
+                ResetTrans();
                 //action.CatchExceptionWithLog(ex, $"鎵弿[{input.SN}]寮傚父");
                 action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.Scan.ScanException", input.SN));
             }
@@ -96,30 +120,263 @@
                     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)
             {
                 //鍙栨秷褰撳墠鎿嶄綔
-                ResetScan();
+                ResetTrans();
                 //action.CatchExceptionWithLog(ex, $"澶囨枡浠诲姟鎵弿鍗曟嵁寮傚父(Data: {0})");
                 action.CatchExceptionWithLog(ex, Biz.L("WMS.Out_BIZ_WMS_PREP.ScanOrderException", input?.Data));
+            }
+            return action;
+        }
+
+        /// <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 > CurPREP.BizType.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, CurPREP.BizType.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 > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.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 > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
+                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, actQty);
+                    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)
+            {
+                //鍙栨秷褰撳墠鎿嶄綔
+                ResetTrans();
+                //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;
         }
@@ -132,195 +389,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 > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.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, CurPREP.BizType.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 > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.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, CurPREP.BizType.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;
+                    action.LocaleMsg = downResult.LocaleMsg;
                     ResetScan();
                     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 = CurPREP.Order.CurBatch.PICK_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : CurPREP.Order.CurBatch.PICK_TIME;
+
+                    //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
+                    var _CurSn = CurSn.Clone();
+                    var _CurPrepDtl = CurPrepDtl.Clone();
+                    var _CurPREPOrder = CurPREP.Order.Clone();
+                    var _CurPREPCurBatch = CurPREP.Order.CurBatch.Clone();
+                    AddCommitAction("UpdatePrep", () =>
                     {
-                        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);
@@ -328,7 +635,7 @@
             catch (Exception ex)
             {
                 //鍙栨秷褰撳墠鎿嶄綔
-                ResetScan();
+                ResetTrans();
                 //action.CatchExceptionWithLog(ex, $"鎵弿鏉$爜[{input.SN}]澶嶆牳寮傚父");
                 action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", input.SN));
             }
@@ -419,7 +726,7 @@
             catch (Exception ex)
             {
                 //鍙栨秷褰撳墠鎿嶄綔
-                ResetScan();
+                ResetTrans();
                 //action.CatchExceptionWithLog(ex, $"鎵弿璐ф灦/鍌ㄤ綅[{0}]寮傚父");
                 action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanShelf.ScanException", Code));
             }
@@ -442,52 +749,71 @@
             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();
+            ResetScan();
             return SetOutPutMqttMsg(action, locale);
+        }
+
+        /// <summary>
+        /// 璋冪敤鍙戞枡鍗曟嵁鐨凟RP鎺ュ彛
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public async Task<ApiAction> CommitToERP(BaseInput input)
+        {
+            var action = await CurPREP.Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>() .CommitToERP(this, input);
+            return action;
         }
 
         #endregion
 
         /// <summary>
-        /// 閲嶇疆褰撳墠鎿嶄綔锛屾湁闇�瑕佸垯閲嶅啓姝ゆ柟娉�
+        /// 閲嶇疆浜嬪姟鏁版嵁锛屾湁闇�瑕佸垯閲嶅啓姝ゆ柟娉�
         /// </summary>
-        public override void ResetScan()
+        public override void ResetTrans()
         {
-            base.ResetScan();
-            ResetScanInfo();
+            ResetScan();
             CurPREP = new(MainDB, UserCode, OrgCode);
+            CurPrepDtl = new();
             CurScanShelf = null;
+            base.ResetTrans();
         }
 
         /// <summary>
-        /// 閲嶇疆鎵爜淇℃伅
+        /// 閲嶇疆鏈鎵爜淇℃伅
         /// </summary>
-        public void ResetScanInfo()
+        public override void ResetScan()
         {
-            Command = null;
+            Command = "Normal";
             CurInvItem = null;
+            CurSn = new();
+            base.ResetScan();
         }
 
         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;
         }

--
Gitblit v1.9.3