From 3ab68d4877acffcb9677ecf369e15210e5db6981 Mon Sep 17 00:00:00 2001
From: Ben Lin <maobin001@msn.com>
Date: 星期一, 28 四月 2025 17:03:08 +0800
Subject: [PATCH] 一些更改

---
 Tiger.Business.WMS/Common/WmsTask.cs |  471 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 468 insertions(+), 3 deletions(-)

diff --git a/Tiger.Business.WMS/Common/WmsTask.cs b/Tiger.Business.WMS/Common/WmsTask.cs
index 6a0045c..3b052c8 100644
--- a/Tiger.Business.WMS/Common/WmsTask.cs
+++ b/Tiger.Business.WMS/Common/WmsTask.cs
@@ -1,4 +1,6 @@
-锘縰sing Rhea.Common;
+锘縰sing Microsoft.Extensions.Options;
+using Rhea.Common;
+using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -7,6 +9,8 @@
 using Tiger.IBusiness;
 using Tiger.Model;
 using Tiger.Model.Entitys.MES.Position;
+using Tiger.Model.Entitys.MES.U9C;
+using static IronPython.Modules._ast;
 
 namespace Tiger.Business.WMS.Transaction
 {
@@ -127,6 +131,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>
@@ -146,6 +260,7 @@
                     foreach (var item in CurInvItem.Items)
                     {
                         item.STATUS = WMS_ITEM.STATUSs.InStore.GetValue();
+                        item.LOTNO = item.LOTNO.IsNullOrEmpty(new Barcode(item.SN).LotNo);
                         item.SUPP_LOTNO = CurInvItem.Barcode.LotNo;
                         item.FIRST_IN_DATE = item.FIRST_IN_DATE <= DateTime.MinValue ? DateTime.Now : item.FIRST_IN_DATE;
                         item.PROD_DATE = item.PROD_DATE <= DateTime.MinValue ? item.FIRST_IN_DATE : item.PROD_DATE;
@@ -205,6 +320,213 @@
         }
 
         /// <summary>
+        /// 涓嬫灦鐗╂枡鎺ㄨ崘锛岃繑鍥炲浐瀹氫釜鏁扮殑鏈�灏忓寘瑁呯墿鏂欏簱瀛樺垪琛�
+        /// </summary>
+        /// <param name="order">棰嗘枡鍗曞彿</param>
+        /// <param name="itemCode">鐗╂枡缂栫爜</param>
+        /// <param name="option">澶囨枡鐗╂枡鎺ㄨ崘閫夐」</param>
+        /// <param name="auth">鎺堟潈鏌ヨ閫夐」</param>
+        /// <param name="returnCount">杩斿洖鐨勬渶灏忓寘瑁呯墿鏂欎釜鏁帮紝榛樿杩斿洖1涓�</param>
+        /// <returns></returns>
+        public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, int returnCount = 1)
+        {
+            var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") };
+            try
+            {
+                var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
+                                                                JoinType.Left, q.SN == p.SN,
+                                                                JoinType.Left, q.WH_ID == w.ID,
+                                                                JoinType.Left, q.REGION_ID == r.ID,
+                                                                JoinType.Left, q.SHELF_ID == s.ID,
+                                                                JoinType.Left, q.LOCATION_ID == l.ID))
+                                             //妫�鏌ョ敤鎴锋潈闄�
+                                             .ByAuth(auth)
+                                            //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓悓涓�涓崟鎹殑鐗╂枡
+                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N")
+                                            //鍙厑璁告湭閿佸畾鐨�
+                                            .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
+                                            //鍙厑璁哥墿鏂欑姸鎬佹槸鍦ㄥ簱鐨�
+                                            .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(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg)
+                                            //濡傛灉鏈変紶鍏ヤ粨搴擄紝鍒欏彧鍏佽浠撳簱鐨勭墿鏂�
+                                            .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg)
+                                            //濡傛灉鏈変紶鍏ュ偍鍖猴紝鍒欏彧鍏佽鍌ㄥ尯鐨勭墿鏂�
+                                            .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg)
+                                            //濡傛灉鏈変紶鍏ヨ揣鏋讹紝鍒欏彧鍏佽璐ф灦鐨勭墿鏂�
+                                            .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg)
+                                            //浼樺厛浣跨敤搴撳瓨姹犱腑鐨勭墿鏂�
+                                            .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
+                                            //浼樺厛浣跨敤灏炬暟鐗╂枡(鎴枡鎴栬�呴��鏂欎箣鍚庣殑鐗╂枡)
+                                            //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
+                                            //澶囨枡绛栫暐锛氭寜鐢熶骇鏃ユ湡鍏堣繘鍏堝嚭
+                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE)
+                                            //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛�
+                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY)
+                                            //鏈�鍚庢寜鏉$爜鎺掑簭
+                                            .OrderBy(q => q.SN);
+                var items = query.Select((q, p, w, r, s, l) => new SuggestItem
+                                    {
+                                        Item = q,
+                                        poolItem = null,
+                                        Warehouse = w,
+                                        Region = r,
+                                        Shelf = s,
+                                        Location = l,
+                                    }).Take(returnCount).ToList();
+                //foreach (var item in items)
+                //{
+                //    var inv = Get(item.SN, option, false);
+                //    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="option">澶囨枡鐗╂枡鎺ㄨ崘閫夐」</param>
+        /// <param name="auth">鎺堟潈鏌ヨ閫夐」</param>
+        /// <param name="reqQty">闇�姹傛暟閲忥紝浼氳繑鍥炴弧瓒抽渶姹傜殑鐗╂枡涓暟</param>
+        /// <returns></returns>
+        public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, double reqQty)
+        {
+            var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") };
+            try
+            {
+                var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
+                                                                JoinType.Left, q.SN == p.SN,
+                                                                JoinType.Left, q.WH_ID == w.ID,
+                                                                JoinType.Left, q.REGION_ID == r.ID,
+                                                                JoinType.Left, q.SHELF_ID == s.ID,
+                                                                JoinType.Left, q.LOCATION_ID == l.ID))
+                                             //妫�鏌ョ敤鎴锋潈闄�
+                                             .ByAuth(auth)
+                                            //鍏佽浣跨敤宸茬粡鍒嗛厤鍒板簱瀛樻睜涓殑鐗╂枡
+                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N")
+                                            //鍙厑璁告湭閿佸畾鐨�
+                                            .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
+                                            //鍙厑璁哥墿鏂欑姸鎬佹槸鍦ㄥ簱鐨�
+                                            .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(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg)
+                                            //濡傛灉鏈変紶鍏ヤ粨搴擄紝鍒欏彧鍏佽浠撳簱鐨勭墿鏂�
+                                            .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg)
+                                            //濡傛灉鏈変紶鍏ュ偍鍖猴紝鍒欏彧鍏佽鍌ㄥ尯鐨勭墿鏂�
+                                            .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg)
+                                            //濡傛灉鏈変紶鍏ヨ揣鏋讹紝鍒欏彧鍏佽璐ф灦鐨勭墿鏂�
+                                            .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg)
+                                            //浼樺厛浣跨敤搴撳瓨姹犱腑鐨勭墿鏂�
+                                            .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
+                                            //浼樺厛浣跨敤灏炬暟鐗╂枡(鎴枡鎴栬�呴��鏂欎箣鍚庣殑鐗╂枡)
+                                            //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
+                                            //澶囨枡绛栫暐锛氭寜鐢熶骇鏃ユ湡鍏堣繘鍏堝嚭
+                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE)
+                                            //鎸夌敓浜ф棩鏈熷厛杩涘厛鍑猴紝鍐嶆寜鐗╂枡鏁伴噺浠庡皬鍒板ぇ锛�
+                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY)
+                                            //鏈�鍚庢寜鏉$爜鎺掑簭
+                                            .OrderBy(q => q.SN);
+                var takeCount = 0;
+                var checkSum = 0.0;
+                var checkCount = 0;
+                do
+                {
+                    takeCount += 50;
+                    var check = query.Select((q, p, w, r, s, l) => new
+                                            {
+                                                ItemCode = q.ITEM_CODE,
+                                                Sn = q.SN,
+                                                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 = query.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 +541,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 +567,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;
@@ -277,6 +599,108 @@
                     db.Updateable(_Items, UserCode).ExecuteCommand();
                     db.Insertable(_History, UserCode).ExecuteCommand();
                     db.Updateable(_Packages, UserCode).ExecuteCommand();
+                });
+            }
+            catch (Exception ex)
+            {
+                result.CatchExceptionWithLog(ex, Biz.L("WMS.WmsItem.TakeDown.Exception", CurInvItem.SN, CurInvItem?.Location?.LOCATION_CODE));
+            }
+            return result;
+        }
+
+        /// <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)
@@ -341,8 +765,49 @@
             action.Data.MqttMsg = msg;
             return action;
         }
+
+        /// <summary>
+        /// 璁剧疆褰撳墠鐗╂枡鐨勯粯璁ゅ偍浣�
+        /// </summary>
+        public ApiAction<ScanOutput> SetDefaultLocation(DbClient db, BAS_ITEM Item, WMS_LOCATION location, long RcvLineId)
+        {
+            var action = new ApiAction<ScanOutput>(new ScanOutput());
+
+            //璋冪敤璁剧疆榛樿鍌ㄤ綅鎺ュ彛
+            var iInput = new CreateRcvLineLocationInput
+            {
+                IsLogin = true,
+                RcvLineLocationParam = new()
+                {
+                    RcvLineId = RcvLineId,
+                    BinCode = location.LOCATION_CODE,
+                }
+            };
+            var result =  DI.Resolve<IWMS_U9C>().CreateRcvLineLocation(iInput).Result;
+            if (!result.IsSuccessed)
+            {
+                action.IsSuccessed = false;
+                action.LocaleMsg = result.LocaleMsg;
+            }
+            else
+            {
+                Item.DEFAULT_LOCATION = location.LOCATION_CODE;
+                db.Updateable(Item, UserCode).UpdateColumns(q => new { q.DEFAULT_LOCATION, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
+            }
+
+            return action;
+        }
         #endregion Functions
 
+        /// <summary>
+        /// 閲嶇疆鏈鎵爜淇℃伅
+        /// </summary>
+        public virtual void ResetScan()
+        {
+            //娓呯悊鏆傚瓨鏁版嵁鎻愪氦鎿嶄綔
+            DBCommitList.Clear();
+        }
+
         public override bool Close(bool needSaveHistoryLog = false)
         {
             //needSaveHistoryLog = true;

--
Gitblit v1.9.3