From 21cce90e8d660954f0b89bfe25b9f5218dcbaacd Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期一, 12 五月 2025 00:32:34 +0800
Subject: [PATCH] 退料单(U9)上架事务

---
 Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RETURN.cs             |  543 +++++++++++++++++++++++++++++++
 Tiger.Api/Language.db                                               |    0 
 Tiger.Controllers.WMS/Controllers/WMSController.In_BIZ_U9_RETURN.cs |  231 +++++++++++++
 Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs            |    2 
 Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN_DTL.cs                    |  118 +++---
 Tiger.IBusiness.WMS/Transaction/IIn_BIZ_U9_RETURN.cs                |   38 ++
 Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN.cs                        |   65 ++-
 7 files changed, 915 insertions(+), 82 deletions(-)

diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index 0a86bb1..eca36b7 100644
--- a/Tiger.Api/Language.db
+++ b/Tiger.Api/Language.db
Binary files differ
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 54d990b..3d49dd0 100644
--- a/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
+++ b/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RECEIPT.cs
@@ -70,7 +70,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))
diff --git a/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RETURN.cs b/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RETURN.cs
new file mode 100644
index 0000000..5c052ee
--- /dev/null
+++ b/Tiger.Business.WMS/Transaction/Yada/In_BIZ_U9_RETURN.cs
@@ -0,0 +1,543 @@
+using Rhea.Common;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Tiger.Model;
+using Tiger.IBusiness;
+using Tiger.Model.Sharetronic.Shelf;
+using Tiger.Business.WMS.Sharetronic.Shelf;
+
+namespace Tiger.Business.WMS.Transaction
+{
+    /// <summary>
+    /// 閫�鏂欏崟(U9)涓婃灦浜嬪姟
+    /// </summary>
+    public class In_BIZ_U9_RETURN : WmsTask, IIn_BIZ_U9_RETURN
+    {
+        public IIn_BIZ_U9_RETURN Init(string id, string userCode, string apiHost, string orgCode)
+        {
+            base.Init(id, userCode, apiHost, orgCode);
+            Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]");
+            return this;
+        }
+
+        #region Propertys & Variables
+        public BIZ_U9_RETURN CurOrder { get; set; }
+        #endregion
+
+        #region Functions
+        /// <summary>
+        /// 鎵弿鍏ュ彛
+        /// </summary>
+        public async Task<ApiAction<ScanOutput>> Scan(BaseInput input)
+        {
+            var action = new ApiAction<ScanOutput>(new ScanOutput());
+            try
+            {
+                if (input.Command == "ScanOrder")
+                {
+                    var inputOrder = new BaseInput<BIZ_U9_RETURN>(input);
+                    if (inputOrder.Data?.ORDER_NO == null)
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("閫夋嫨鐨勫崟鍙蜂笉鑳戒负绌�");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanOrder.OrderNoEmptyFailure");
+                        return SetOutPutMqttMsg(action, input.Locale);
+                    }
+                    action = await ScanOrder(inputOrder);
+                }
+                else
+                {
+                    if (CurOrder.IsNullOrEmpty())
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("涓婃灦鍓嶈鍏堥�夋嫨闇�瑕佷笂鏋剁殑閫�鏂欏崟");
+                        action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RETURN.ScanItem.NoScanOrder");
+                        action.Data.Command = "ScanOrder";
+                        return SetOutPutMqttMsg(action, input.Locale);
+                    }
+                    if (input.SN.IsNullOrEmpty())
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("鏉$爜涓嶈兘涓虹┖");
+                        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 (!whUnit.IsNullOrEmpty() || string.IsNullOrEmpty(CurScanShelf?.ShelfCode))
+                    {
+                        action = await ScanShelf(input.SN, whUnit);
+                    }
+                    else//鎵弿鐗╂枡骞跺鏍�
+                    {
+                        action = await ScanItem(input);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                //鍙栨秷褰撳墠鎿嶄綔
+                ResetTrans();
+                //action.CatchExceptionWithLog(ex, $"鎵弿[{input.SN}]寮傚父");
+                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.Scan.ScanException", input.SN));
+            }
+            return SetOutPutMqttMsg(action, input.Locale);
+        }
+
+        /// <summary>
+        /// 鎵弿閫�鏂欏崟鍙风爜
+        /// </summary>
+        public async Task<ApiAction<ScanOutput>> ScanOrder(BaseInput<BIZ_U9_RETURN> input)
+        {
+            var action = new ApiAction<ScanOutput>(new ScanOutput());
+            try
+            {
+                var returnOrder = await MainDB.Queryable<BIZ_U9_RETURN>().Where(q => q.ORDER_NO == input.Data.ORDER_NO).Includes(q => q.Details, d => d._ItemInfos).IncludesAllFirstLayer().FirstAsync();
+                if (returnOrder.IsNullOrEmpty())
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L("鎵句笉鍒伴��鏂欏崟[{0}]鐨勪俊鎭紝璇烽噸鏂伴�夋嫨姝g‘鐨勯��鏂欏崟");
+                    action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RETURN.ScanOrder.ReturnNotExists", input.Data.ORDER_NO);
+                    return SetOutPutMqttMsg(action, input.Locale);
+                }
+                action.Data.Command = "Normal";
+                action.Data.Data = CurOrder = returnOrder;
+            }
+            catch (Exception ex)
+            {
+                //鍙栨秷褰撳墠鎿嶄綔
+                ResetTrans();
+                //action.CatchExceptionWithLog(ex, $"閫夋嫨閫�鏂欏崟寮傚父(Data: {0})");
+                action.CatchExceptionWithLog(ex, Biz.L("WMS.In_BIZ_U9_RETURN.ScanOrderException", input?.Data));
+            }
+            return action;
+        }
+
+        /// <summary>
+        /// 鎵弿鐗╂枡骞跺鏍革紝濡傛灉鐗╂枡宸茬粡瀹屾垚绉诲簱鍒欒揣鏋朵笂浜伅鎻愰啋鍌ㄤ綅
+        /// </summary>
+        public async Task<ApiAction<ScanOutput>> ScanItem(BaseInput input)
+        {
+            var action = new ApiAction<ScanOutput>(new ScanOutput() { Command = Command });
+            try
+            {
+                if (CurInvItem.IsNullOrEmpty())
+                {
+                    //瑙f瀽鏉$爜
+                    Result<IInventory> result = GetInventory(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);
+                    }
+                    //榛樿鍌ㄤ綅楠岃瘉
+                    if (!inv.ItemInfo.DEFAULT_LOCATION.IsNullOrEmpty() && inv.ItemInfo.DEFAULT_LOCATION != CurScanShelf.LocationCode)
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("鐗╂枡[{0}]鍙厑璁镐笂鏋跺埌鍌ㄤ綅[{1}]锛岃閲嶆柊鎵弿鍌ㄤ綅");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanItem.DefaultLocationError", inv.ItemInfo.ITEM_CODE, inv.ItemInfo.DEFAULT_LOCATION);
+                        return SetOutPutMqttMsg(action, input.Locale);
+                    }
+                    //鍒ゆ柇褰撳墠鏉$爜鏄惁灞炰簬褰撳墠閫�鏂欏崟
+                    if (inv.Items.First().TRANS_NO != CurOrder.ORDER_NO)
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("鏉$爜鎵�灞炵殑鍗曟嵁[{0}]涓嶆槸閫夋嫨鐨勯��鏂欏崟[{1}]锛岃閲嶆柊鎵弿姝g‘鐨勬潯鐮佹垨閫夋嫨鍏朵粬閫�鏂欏崟");
+                        action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RETURN.ScanItem.NotCurOrder", CurInvItem.Items.First().TRANS_NO, CurOrder.ORDER_NO);
+                        return SetOutPutMqttMsg(action, input.Locale);
+                    }
+                    CurInvItem = inv;
+                }
+
+                var returnOrder = await MainDB.Queryable<BIZ_U9_RETURN>().Where(q => q.ORDER_NO == CurOrder.ORDER_NO).Includes(q => q.Details, d => d._ItemInfos).IncludesAllFirstLayer().FirstAsync();
+                var returnDtl = returnOrder.Details.First(q => q.LINE_NO == CurInvItem.Items.First().TRANS_LINE);
+                if (returnDtl.STATUS > BIZ_U9_RETURN.STATUSs.Storing.GetValue())
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L("閫�鏂欏崟涓[{0}]鐘舵�乕{1}]寮傚父锛岃鎵弿姝g‘鐨勬潯鐮�");
+                    action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RETURN.ScanItem.ReturnDtlStatusException", returnDtl.LINE_NO, returnDtl.STATUS.GetEnumDesc<BIZ_U9_RETURN.STATUSs>());
+                    return SetOutPutMqttMsg(action, input.Locale);
+                }
+                var returnSn = returnOrder.SnList.Where(q => CurInvItem.Items.Any(i => i.SN == q.SN)).ToList();
+                if (returnSn.Any(q => q.STATUS != WMS_ITEM.STATUSs.WaitIn.GetValue()))
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L("閫�鏂欏崟涓潯鐮乕{0}]鐘舵�乕{1}]寮傚父锛岃鎵弿姝g‘鐨勬潯鐮�");
+                    action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RETURN.ScanItem.ReturnSnStatusException", CurInvItem.SN, returnSn.First(q => q.STATUS != WMS_ITEM.STATUSs.WaitIn.GetValue()).STATUS.GetEnumDesc<WMS_ITEM.STATUSs>());
+                    return SetOutPutMqttMsg(action, input.Locale);
+                }
+
+                var nLocation = new WMS_LOCATION();
+                // 鍒ゆ柇鏄惁鏅鸿兘璐ф灦
+                if (CurScanShelf.Shelf.IsLightShelf)
+                {
+                    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>();
+
+                    nLocation = reaultShelf.GetLocation();
+                    if (nLocation == null)
+                    {
+                        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);
+                    }
+                    var locationData = MainDB.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == nLocation.ID).First();
+                    if (!locationData.IsNullOrEmpty())
+                    {
+                        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.Location = nLocation;
+                    CurScanShelf.LocationCode = nLocation.LOCATION_CODE;
+                }
+                else
+                {
+                    if (CurScanShelf.LocationCode.IsNullOrEmpty() || CurScanShelf.WarehouseCode.IsNullOrEmpty())
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("璇疯緭鍏ユ垨鎵弿鏈夋晥鐨勮揣鏋�/鍌ㄤ綅鐮�");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty");
+                        return SetOutPutMqttMsg(action, input.Locale);
+                    }
+
+                    nLocation = await MainDB.Queryable<WMS_LOCATION>().Where(t => t.LOCATION_CODE == CurScanShelf.LocationCode && t.AUTH_ORG == OrgCode).FirstAsync();
+                }
+
+                //鍒ゆ柇鍌ㄤ綅鏄惁鍗曟斁
+                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);
+                    ResetTrans();
+                    return SetOutPutMqttMsg(action, input.Locale);
+                }
+
+                CurOrder = returnOrder;
+
+                //鎵ц涓婃灦鏁版嵁澶勭悊
+                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_RETURN);
+                    item.TRANS_NO = returnOrder.ORDER_NO;
+                    item.TRANS_LINE = returnDtl.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;
+                }
+                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_RETURN);
+                    item.TRANS_NO = returnOrder.ORDER_NO;
+                    item.TRANS_LINE = returnDtl.LINE_NO;
+                }
+                Result putonResult = PutOn(input.AuthOption, nLocation.LOCATION_CODE);
+                if (!putonResult.IsSuccessed)
+                {
+                    action.IsSuccessed = false;
+                    action.LocaleMsg = putonResult.LocaleMsg;
+                    ResetTrans();
+                    return SetOutPutMqttMsg(action, input.Locale);
+                }
+
+                //鏇存柊鍗曟嵁淇℃伅
+                foreach (var sn in returnSn)
+                {
+                    sn.STATUS = WMS_ITEM.STATUSs.InStore.GetValue();
+                    sn.IS_IN = "Y";
+                }
+                //濡傛灉褰撳墠琛屼笂鏋跺畬鎴愭爣璁颁负寰呭鏍�
+                returnDtl.QTY_IN = returnOrder.SnList.Where(q => q.LINE_NO == returnDtl.LINE_NO && q.STATUS == WMS_ITEM.STATUSs.InStore.GetValue()).Sum(q => q.QTY);
+                if (returnDtl.QTY_IN == returnDtl.QTY)
+                {
+                    returnDtl.STATUS = BIZ_U9_RETURN.STATUSs.Review.GetValue();
+                    //褰撳墠鍗曟嵁鏄庣粏琛屽凡缁忓叏閮ㄤ笂鏋跺畬鎴愶紝鍙互璋冪敤U9瀹℃牳鎺ュ彛锛屽鏋滃鏍稿け璐ュ垯鎶ラ敊锛屾渶鍚庝竴涓笂鏋跺け璐�
+                    //var iInput = new SubmitLineInput
+                    //{
+                    //    userId = UserCode,
+                    //    IsLogin = true,
+                    //    param = new()
+                    //    {
+                    //        RcvLineID = receiptDtl.ID,
+                    //        RcvDocNo = receiptDtl.ORDER_NO,
+                    //        DocLineNo = receiptDtl.LINE_NO,
+                    //        OrgCode = receiptDtl.AUTH_ORG,
+                    //    }
+                    //};
+                    //var result = await DI.Resolve<IWMS_U9C>().ReceivementApproveLine(iInput);
+                    //if (!result.IsSuccessed)
+                    //{
+                    //    action.IsSuccessed = false;
+                    //    action.LocaleMsg = result.LocaleMsg;
+                    //    return SetOutPutMqttMsg(action, input.Locale);
+                    //}
+                    //else
+                    //{
+                    //    receiptDtl.STATUS = BIZ_U9_RECEIPT.STATUSs.Finished.GetValue();
+                    //}
+                }
+                else
+                {
+                    returnDtl.STATUS = BIZ_U9_RETURN.STATUSs.Storing.GetValue();
+                }
+                //鏇存柊鍗曟嵁鐘舵��
+                if (returnOrder.Details.Any(q => q.STATUS < BIZ_U9_RETURN.STATUSs.Review.GetValue()))
+                {
+                    returnOrder.STATUS = BIZ_U9_RETURN.STATUSs.Storing.GetValue();
+                }
+                else if (returnOrder.Details.Any(q => q.STATUS < BIZ_U9_RETURN.STATUSs.Finished.GetValue()))
+                {
+                    returnOrder.STATUS = BIZ_U9_RETURN.STATUSs.Review.GetValue();
+                }
+                else
+                {
+                    returnOrder.STATUS = BIZ_U9_RETURN.STATUSs.Finished.GetValue();
+                }
+
+                //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
+                var _returnOrder = returnOrder.Clone();
+                AddCommitAction("Return", () =>
+                {
+                    //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
+                    var db = GetCommitDB();
+                    //鏁版嵁淇濆瓨閫昏緫
+                    db.Updateable(returnOrder, UserCode).UpdateColumns(q => new { q.STATUS, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
+                    db.Updateable(returnDtl, UserCode).UpdateColumns(q => new { q.STATUS, q.QTY_IN, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
+                    db.Updateable(returnSn, UserCode).UpdateColumns(q => new { q.STATUS, q.IS_IN, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
+                });
+
+                //瀹屾垚鎵�鏈夊鐞嗗悗浣跨敤浜嬪姟淇濆瓨鏁版嵁
+                action = DoIfFinish(action, input.Locale);
+            }
+            catch (Exception ex)
+            {
+                //鍙栨秷褰撳墠鎿嶄綔
+                ResetTrans();
+                //action.CatchExceptionWithLog(ex, $"鎵弿鏉$爜[{input.SN}]澶嶆牳寮傚父");
+                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", input.SN));
+            }
+            return SetOutPutMqttMsg(action, input.Locale);
+        }
+
+        /// <summary>
+        /// 鎵弿璐ф灦鎴栬�呭偍浣�
+        /// </summary>
+        public async Task<ApiAction<ScanOutput>> ScanShelf(string Code, V_WH_UNIT whUnit)
+        {
+            var action = new ApiAction<ScanOutput>(new ScanOutput() { Command = Command });
+            try
+            {
+                if (Code.IsNullOrEmpty())
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L("璇疯緭鍏ユ垨鎵弿鏈夋晥鐨勮揣鏋�/鍌ㄤ綅鐮�");
+                    action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty");
+                    return action;
+                }
+                if (!CurOrder.Details.Any(q => q.ItemInfo.DEFAULT_LOCATION.IsNullOrEmpty() || q.ItemInfo.DEFAULT_LOCATION == Code))
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L("褰撳墠鍌ㄤ綅[{0}]涓嶅湪閫�鏂欏崟闇�瑕佷笂鏋剁殑鍌ㄤ綅鍒楄〃涓細{1}");
+                    action.LocaleMsg = Biz.L("WMS.In_BIZ_U9_RETURN.ScanShelf.NoContainLocation", Code, string.Join(", ", CurOrder.Details.Select(q => q.ItemInfo.DEFAULT_LOCATION)));
+                    return action;
+                }
+
+                CurScanShelf = new ScanShelfInfo();
+
+                // 鏌ヨ璐ф灦淇℃伅
+                whUnit = whUnit.IsNullOrEmpty(await MainDB.Queryable<V_WH_UNIT>().Where(t => (t.SHELF_CODE.ToUpper() == Code || t.LOCATION_CODE.ToUpper() == Code) && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync());
+
+                // 鎵弿璐ф灦浠g爜锛屼笖涓烘櫤鑳借揣鏋�
+                if (!whUnit.IsNullOrEmpty() && whUnit.SHELF_CODE  == Code)
+                {
+                    CurScanShelf.Shelf = whUnit.Shelf;
+                    CurScanShelf.WarehouseCode = whUnit.WH_CODE;
+                    CurScanShelf.RegionCode = whUnit.REGION_CODE;
+                    CurScanShelf.ShelfCode = whUnit.SHELF_CODE;
+                    CurScanShelf.ShelfType = whUnit.SHELF_TYPE;
+                    CurScanShelf.IsSmartRack = true;
+                }
+                // 鎵弿搴撲綅浠g爜
+                else if (!whUnit.IsNullOrEmpty() && whUnit.LOCATION_CODE == Code)
+                {
+                    if (whUnit.IS_ACTIVE == "N")
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("鎵弿鐨勫偍浣峓{0}]鏈惎鐢�");
+                        action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfOrLocationDisabled", Code);
+                        return action;
+                    }
+                    if (whUnit.Shelf.IsLightShelf || whUnit.Location.IS_SINGLE == "Y")
+                    {
+                        var locationData = MainDB.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == whUnit.LOCATION_ID && q.AUTH_ORG == OrgCode).First();
+                        if (!locationData.IsNullOrEmpty())
+                        {
+                            action.IsSuccessed = false;
+                            //action.LocaleMsg = Biz.L("鍌ㄤ綅[{0}]宸插瓨鏈夌墿鏂橻{1}]锛岃妫�鏌ョ郴缁熷簱瀛樹俊鎭�");
+                            action.LocaleMsg = Biz.L($"WMS.Default.ScanShelf.ItemAlreadyExistsInLocation", Code, locationData.SN);
+                            return action;
+                        }
+                    }
+                    CurScanShelf.Shelf = whUnit.Shelf;
+                    CurScanShelf.Location = whUnit.Location;
+                    CurScanShelf.WarehouseCode = whUnit.WH_CODE;
+                    CurScanShelf.RegionCode = whUnit.REGION_CODE;
+                    CurScanShelf.ShelfCode = whUnit .SHELF_CODE;
+                    CurScanShelf.LocationCode = whUnit.LOCATION_CODE;
+                    CurScanShelf.IsSmartRack = false;
+                }
+                else
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L("璇疯緭鍏ユ垨鎵弿鏈夋晥鐨勮揣鏋�/鍌ㄤ綅鐮�");
+                    action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ShelfCanNotEmpty");
+                    return action;
+                }
+
+                CurScanShelf.IsScanShelf = true;
+                //action.LocaleMsg = Biz.L("鎵弿璐ф灦/鍌ㄤ綅[{0}]鎴愬姛");
+                action.LocaleMsg = Biz.L("WMS.Default.ScanShelf.ScanSucceeded", Code);
+                action.Data.Data = CurScanShelf;
+            }
+            catch (Exception ex)
+            {
+                //鍙栨秷褰撳墠鎿嶄綔
+                ResetTrans();
+                //action.CatchExceptionWithLog(ex, $"鎵弿璐ф灦/鍌ㄤ綅[{0}]寮傚父");
+                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanShelf.ScanException", Code));
+            }
+            return action;
+        }
+
+        /// <summary>
+        /// 瀹屾垚鎵�鏈夊鐞嗗悗浣跨敤浜嬪姟淇濆瓨鏁版嵁
+        /// </summary>
+        /// <param name="action"></param>
+        /// <param name="locale"></param>
+        /// <param name="doAfterSave"></param>
+        /// <returns></returns>
+        public ApiAction<ScanOutput> DoIfFinish(ApiAction<ScanOutput> action, string locale, Action doAfterSave = null)
+        {
+            //淇濆瓨鏁版嵁搴�
+            SaveCommitListToDB();
+
+            //淇濆瓨鏁版嵁鎴愬姛鍚庢墽琛�
+            doAfterSave?.Invoke();
+
+            // 杩斿洖鏁版嵁
+            action.Data.Data = new DefaultInStoreOutput
+            {
+                Barcode = CurInvItem.SN,
+                MaterialCode = CurInvItem.ItemInfo.ITEM_CODE,
+                MaterialName = CurInvItem.ItemInfo.ITEM_NAME,
+                CurrentQty = CurInvItem.Items[0].QTY,
+                Unit = CurInvItem.Items[0].UNIT,
+                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,
+            };
+
+            //action.LocaleMsg = Biz.L($"鎵弿鏉$爜[{0}]涓婃灦鍒板偍浣峓{1}]鎴愬姛");
+            action.LocaleMsg = Biz.L("WMS.Default.ScanItem.PutOnSucceeded", CurInvItem.SN, CurInvItem.Location.LOCATION_CODE);
+
+            //閲嶇疆宸ュ簭
+            ResetScan();
+            return SetOutPutMqttMsg(action, locale);
+        }
+
+        /// <summary>
+        ///  鑾峰彇闇�瑕佷笂鏋剁殑閫�鏂欏崟鍒楄〃锛堝甫鍒嗛〉锛�
+        /// </summary>
+        /// <returns></returns>
+        public async Task<ApiAction<PageAble<BIZ_U9_RETURN>>> GetOrderList(BaseInputWithPage input)
+        {
+            var action = new ApiAction<PageAble<BIZ_U9_RETURN>>();
+
+            action.Data = await MainDB.Queryable<BIZ_U9_RETURN>().Where(q => q.STATUS == BIZ_U9_RETURN.STATUSs.WaitIn.GetValue()).ToPageAsync(input.pageIndex, input.pageSize);
+
+            return action;
+        }
+
+        /// <summary>
+        ///  鑾峰彇褰撳墠閫�鏂欏崟淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        public async Task<ApiAction<BIZ_U9_RETURN>> GetCurOrder()
+        {
+            var action = new ApiAction<BIZ_U9_RETURN>();
+            action.Data = CurOrder;
+            return action;
+        }
+
+        #endregion
+
+        /// <summary>
+        /// 閲嶇疆浜嬪姟鏁版嵁锛屾湁闇�瑕佸垯閲嶅啓姝ゆ柟娉�
+        /// </summary>
+        public override void ResetTrans()
+        {
+            ResetScan();
+            CurScanShelf = null;
+            base.ResetTrans();
+        }
+
+        /// <summary>
+        /// 閲嶇疆鏈鎵爜淇℃伅
+        /// </summary>
+        public override void ResetScan()
+        {
+            Command = "Normal";
+            CurInvItem = null;
+            base.ResetScan();
+        }
+
+        public override bool Close(bool needSaveHistoryLog = false)
+        {
+            this.IsFinished = true;
+            return IsFinished ? base.Close(needSaveHistoryLog) : IsFinished;
+        }
+
+    }//endClass
+}
\ No newline at end of file
diff --git a/Tiger.Controllers.WMS/Controllers/WMSController.In_BIZ_U9_RETURN.cs b/Tiger.Controllers.WMS/Controllers/WMSController.In_BIZ_U9_RETURN.cs
new file mode 100644
index 0000000..86c69bf
--- /dev/null
+++ b/Tiger.Controllers.WMS/Controllers/WMSController.In_BIZ_U9_RETURN.cs
@@ -0,0 +1,231 @@
+using System;
+using System.Threading.Tasks;
+using Rhea.Common;
+using Tiger.Model;
+using Tiger.IBusiness;
+using Microsoft.AspNetCore.Mvc;
+using Autofac;
+
+namespace Tiger.Api.Controllers.WMS
+{
+    public partial class WMSController : ControllerBase
+    {
+        /// <summary>
+        /// GetTransaction(ApiAction(Data:UserId))
+        /// 鏍规嵁ApiAction鐨刬d杩斿洖涓�涓��鏂欏崟(U9)涓婃灦浜嬪姟
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("api/[controller]/In_U9Return/GetTransaction")]
+        public IActionResult In_BIZ_U9_RETURN_GetTransaction([FromBody] ApiAction<USER> action)
+        {
+            ApiAction response;
+            IIn_BIZ_U9_RETURN trans = null;
+            try
+            {
+                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
+                {
+                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IIn_BIZ_U9_RETURN;
+                }
+                else
+                {
+                    trans = AutoFacContainer.Instance.Resolve<IIn_BIZ_U9_RETURN>().Init(action.ID, action.Data?.USER_CODE, Request.Host.Value, action.Data?.ORG_CODE);
+                    iBiz.WMS.Context.NewTransaction(HttpContext, trans);
+                }
+
+                response = action.GetResponse();
+            }
+            catch (System.Exception ex)
+            {
+                response = action.GetResponse().CatchExceptionWithLog(ex);
+            }
+            trans?.AddHistory(Request, action);
+            return Ok(response);
+        }
+
+        /// <summary>
+        /// CloseTransaction(ApiAction)
+        /// 鍏抽棴浜嬪姟
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("api/[controller]/In_U9Return/CloseTransaction")]
+        public IActionResult In_BIZ_U9_RETURN_CloseTransaction([FromBody] ApiAction action)
+        {
+            ApiAction response;
+            IIn_BIZ_U9_RETURN trans = null;
+            try
+            {
+                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
+                {
+                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IIn_BIZ_U9_RETURN;
+                    if (!trans.IsFinished)
+                    {
+                        if (action.IsAsync)
+                        {
+                            response = action.GetResponse(trans.Close());
+                        }
+                        else
+                        {
+                            lock (trans.TransLock) { response = action.GetResponse(trans.Close()); }
+                        }
+                        response.Message = $"閫�鏂欏崟(U9)涓婃灦浜嬪姟[ID:{action.ID}]鍏抽棴{(response.IsSuccessed ? "鎴愬姛" : "澶辫触")}";
+                    }
+                    else
+                    {
+                        response = action.GetResponse($"Transaction Error: 閫�鏂欏崟(U9)涓婃灦浜嬪姟[ID:{action.ID}]宸茬粡鍏抽棴", false);
+                    }
+                }
+                else
+                {
+                    response = action.GetResponse($"Transaction Error: 閫�鏂欏崟(U9)涓婃灦浜嬪姟[ID:{action.ID}]宸茬粡鍏抽棴", false);
+                }
+            }
+            catch (System.Exception ex)
+            {
+                response = action.GetResponse().CatchExceptionWithLog(ex);
+            }
+            trans?.AddHistory(Request, action);
+            return Ok(response);
+        }
+
+        /// <summary>
+        /// 鎵弿鍏ュ彛
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("api/[controller]/In_U9Return/Scan")]
+        public async Task<IActionResult> In_BIZ_U9_RETURN_ScanAsync([FromBody] ApiAction<BaseInput> action)
+        {
+            ApiAction response;
+            IIn_BIZ_U9_RETURN trans = null;
+            try
+            {
+                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
+                {
+                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IIn_BIZ_U9_RETURN;
+                    if (!trans.IsFinished)
+                    {
+                        if (action.IsAsync)
+                        {
+                            response = action.GetResponse(await trans.Scan(action.Data));
+                        }
+                        else
+                        {
+                            lock (trans.TransLock) { response = action.GetResponse(trans.Scan(action.Data).Result); }
+                        }
+                    }
+                    else
+                    {
+                        response = action.GetResponse($"Transaction Error: 閫�鏂欏崟(U9)涓婃灦浜嬪姟[ID:{action.ID}]宸茬粡鍏抽棴锛岃閲嶆柊鎵撳紑閫�鏂欏崟(U9)涓婃灦鍔熻兘", false);
+                    }
+                }
+                else
+                {
+                    response = action.GetResponse($"Transaction Error: 閫�鏂欏崟(U9)涓婃灦浜嬪姟[ID:{action.ID}]鏁版嵁涓㈠け锛岃閲嶆柊鎵撳紑閫�鏂欏崟(U9)涓婃灦鍔熻兘", false);
+                }
+            }
+            catch (System.Exception ex)
+            {
+                response = action.GetResponse().CatchExceptionWithLog(ex);
+            }
+            trans?.AddHistory(Request, action);
+            return Ok(response);
+        }
+
+        /// <summary>
+        /// GetOrderList(ApiAction(BasePageInput))
+        ///  鑾峰彇闇�瑕佷笂鏋剁殑閫�鏂欏崟鍒楄〃锛堝甫鍒嗛〉锛�
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("api/[controller]/In_U9Return/GetOrderList")]
+        public async Task<IActionResult> In_BIZ_U9_RETURN_GetOrderListAsync([FromBody] ApiAction<BaseInputWithPage> action)
+        {
+            ApiAction response;
+            IIn_BIZ_U9_RETURN trans = null;
+            try
+            {
+                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
+                {
+                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IIn_BIZ_U9_RETURN;
+                    if (!trans.IsFinished)
+                    {
+                        if (action.IsAsync)
+                        {
+                            response = action.GetResponse(await trans.GetOrderList(action.Data));
+                        }
+                        else
+                        {
+                            lock (trans.TransLock) { response = action.GetResponse(trans.GetOrderList(action.Data).Result); }
+                        }
+                    }
+                    else
+                    {
+                        response = action.GetResponse($"Transaction Error: 閫�鏂欏崟(U9)涓婃灦浜嬪姟[ID:{action.ID}]宸茬粡鍏抽棴锛岃閲嶆柊鎵撳紑閫�鏂欏崟(U9)涓婃灦鍔熻兘", false);
+                    }
+                }
+                else
+                {
+                    response = action.GetResponse($"Transaction Error: 閫�鏂欏崟(U9)涓婃灦浜嬪姟[ID:{action.ID}]鏁版嵁涓㈠け锛岃閲嶆柊鎵撳紑閫�鏂欏崟(U9)涓婃灦鍔熻兘", false);
+                }
+            }
+            catch (System.Exception ex)
+            {
+                response = action.GetResponse().CatchExceptionWithLog(ex);
+            }
+            trans?.AddHistory(Request, action);
+            return Ok(response);
+        }
+
+        /// <summary>
+        /// GetCurOrder(ApiAction)
+        /// 鑾峰彇褰撳墠閫�鏂欏崟淇℃伅
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("api/[controller]/In_U9Return/GetCurOrder")]
+        public async Task<IActionResult> In_BIZ_U9_RETURN_GetCurOrderAsync([FromBody] ApiAction<BaseInput> action)
+        {
+            ApiAction response;
+            IIn_BIZ_U9_RETURN trans = null;
+            try
+            {
+                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
+                {
+                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IIn_BIZ_U9_RETURN;
+                    if (!trans.IsFinished)
+                    {
+                        if (action.IsAsync)
+                        {
+                            response = action.GetResponse(await trans.GetCurOrder());
+                        }
+                        else
+                        {
+                            lock (trans.TransLock) { response = action.GetResponse(trans.GetCurOrder().Result); }
+                        }
+                    }
+                    else
+                    {
+                        response = action.GetResponse($"Transaction Error: 閫�鏂欏崟(U9)涓婃灦浜嬪姟[ID:{action.ID}]宸茬粡鍏抽棴锛岃閲嶆柊鎵撳紑閫�鏂欏崟(U9)涓婃灦鍔熻兘", false);
+                    }
+                }
+                else
+                {
+                    response = action.GetResponse($"Transaction Error: 閫�鏂欏崟(U9)涓婃灦浜嬪姟[ID:{action.ID}]鏁版嵁涓㈠け锛岃閲嶆柊鎵撳紑閫�鏂欏崟(U9)涓婃灦鍔熻兘", false);
+                }
+            }
+            catch (System.Exception ex)
+            {
+                response = action.GetResponse().CatchExceptionWithLog(ex);
+            }
+            trans?.AddHistory(Request, action);
+            return Ok(response);
+        }
+    }
+}
diff --git a/Tiger.IBusiness.WMS/Transaction/IIn_BIZ_U9_RETURN.cs b/Tiger.IBusiness.WMS/Transaction/IIn_BIZ_U9_RETURN.cs
new file mode 100644
index 0000000..e085980
--- /dev/null
+++ b/Tiger.IBusiness.WMS/Transaction/IIn_BIZ_U9_RETURN.cs
@@ -0,0 +1,38 @@
+using Rhea.Common;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tiger.Model;
+using Tiger.Model.MES.Yada;
+
+namespace Tiger.IBusiness
+{
+    /// <summary>
+    /// 閫�鏂欏崟(U9)涓婃灦浜嬪姟
+    /// </summary>
+    public interface IIn_BIZ_U9_RETURN : IWmsTask
+    {
+        public IIn_BIZ_U9_RETURN Init(string id, string userCode, string apiHost, string orgCode);
+
+        /// <summary>
+        /// 鎵弿鍏ュ彛
+        /// </summary>
+        public Task<ApiAction<ScanOutput>> Scan(BaseInput input);
+
+        /// <summary>
+        ///  鑾峰彇闇�瑕佷笂鏋剁殑閫�鏂欏崟鍒楄〃锛堝甫鍒嗛〉锛�
+        /// </summary>
+        /// <returns></returns>
+        public Task<ApiAction<PageAble<BIZ_U9_RETURN>>> GetOrderList(BaseInputWithPage input);
+
+        /// <summary>
+        ///  鑾峰彇褰撳墠閫�鏂欏崟淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        public Task<ApiAction<BIZ_U9_RETURN>> GetCurOrder();
+
+        public bool Close(bool needSaveHistoryLog = false);
+    }
+}
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN.cs
index 3ab7440..b0dd3e6 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN.cs
@@ -29,9 +29,14 @@
 		[DisplayName("鍗曟嵁鍙�")]
 		public string ORDER_NO { get; set; }
 		/// <summary>
-		/// 鐘舵��(0Init鍒濆鍖東1Imported宸插鍏2Counting娓呯偣涓瓅3Storing涓婃灦涓瓅4Review寰呭鏍竱5Finished宸插畬鎴恷6Cancel宸蹭綔搴�)
+		/// 鐘舵��(0Production鐢熶骇閫�鏂檤1Outsourcing濮斿閫�鏂�)
 		/// </summary>
-		[DisplayName("鐘舵��(0Init鍒濆鍖東1Imported宸插鍏2Counting娓呯偣涓瓅3Storing涓婃灦涓瓅4Review寰呭鏍竱5Finished宸插畬鎴恷6Cancel宸蹭綔搴�)")]
+		[DisplayName("鐘舵��(0Production鐢熶骇閫�鏂檤1Outsourcing濮斿閫�鏂�)")]
+		public int RETURN_TYPE { get; set; }
+		/// <summary>
+		/// 鐘舵��(0Init鍒濆鍖東1Imported宸插鍏2Counting娓呯偣涓瓅3WaitIn寰呬笂鏋秥4Storing涓婃灦涓瓅5Review寰呭鏍竱6Finished宸插畬鎴恷7Cancel宸蹭綔搴�)
+		/// </summary>
+		[DisplayName("鐘舵��(0Init鍒濆鍖東1Imported宸插鍏2Counting娓呯偣涓瓅3WaitIn寰呬笂鏋秥4Storing涓婃灦涓瓅5Review寰呭鏍竱6Finished宸插畬鎴恷7Cancel宸蹭綔搴�)")]
 		public int STATUS { get; set; }
 		/// <summary>
 		/// 鏉ユ簮鍗曟嵁缂栫爜
@@ -89,7 +94,6 @@
 		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_U9_RETURNId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
 		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
 		*/
-
         [Navigate(NavigateType.OneToMany, nameof(BIZ_U9_RETURN_DTL.ORDER_NO), nameof(ORDER_NO), "GHOST_ROW = 0")]//涓�瀵逛竴 ClassAId鏄疊IZ_U9_RETURN绫婚噷闈㈢殑澶栭敭ID瀛楁
         public List<BIZ_U9_RETURN_DTL> Details { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
         [Navigate(NavigateType.OneToMany, nameof(BIZ_U9_RETURN_SN.ORDER_NO), nameof(ORDER_NO), "GHOST_ROW = 0")]//涓�瀵逛竴 ClassAId鏄疊IZ_U9_RETURN绫婚噷闈㈢殑澶栭敭ID瀛楁
@@ -108,30 +112,43 @@
 		*/
 
         /// <summary>
-        /// 鏋氫妇锛氱姸鎬�(0Init鍒濆鍖東1Imported宸插鍏2Counting娓呯偣涓瓅3Storing涓婃灦涓瓅4Review寰呭鏍竱5Finished宸插畬鎴恷6Cancel宸蹭綔搴�)
+        /// 鏋氫妇锛氱姸鎬�(0Production鐢熶骇閫�鏂檤1Outsourcing濮斿閫�鏂�)
+        /// </summary>
+        public enum RETURN_TYPEs
+		{
+			[Description("鐢熶骇閫�鏂�")]
+			Production = 0,
+			[Description("濮斿閫�鏂�")]
+			Outsourcing = 1,
+		}
+
+        /// <summary>
+        /// 鏋氫妇锛氱姸鎬�(0Init鍒濆鍖東1Imported宸插鍏2Counting娓呯偣涓瓅3WaitIn寰呬笂鏋秥4Storing涓婃灦涓瓅5Review寰呭鏍竱6Finished宸插畬鎴恷7Cancel宸蹭綔搴�)
         /// </summary>
         public enum STATUSs
-		{
-			[Description("鍒濆鍖�")]
-			Init = 0,
-			[Description("宸插鍏�")]
-			Imported = 1,
-			[Description("娓呯偣涓�")]
-			Counting = 2,
-			[Description("涓婃灦涓�")]
-			Storing = 3,
-			[Description("寰呭鏍�")]
-			Review = 4,
-			[Description("宸插畬鎴�")]
-			Finished = 5,
-			[Description("宸蹭綔搴�")]
-			Cancel = 6,
-		}
-		#endregion
+        {
+            [Description("鍒濆鍖�")]
+            Init = 0,
+            [Description("宸插鍏�")]
+            Imported = 1,
+            [Description("娓呯偣涓�")]
+            Counting = 2,
+            [Description("寰呬笂鏋�")]
+            WaitIn = 3,
+            [Description("涓婃灦涓�")]
+            Storing = 4,
+            [Description("寰呭鏍�")]
+            Review = 5,
+            [Description("宸插畬鎴�")]
+            Finished = 6,
+            [Description("宸蹭綔搴�")]
+            Cancel = 7,
+        }
+        #endregion
 
-		#region 鍏叡鏂规硶
+        #region 鍏叡鏂规硶
 
-		#endregion
+        #endregion
 
-	}//endClass
+    }//endClass
 }
\ No newline at end of file
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN_DTL.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN_DTL.cs
index 702a201..86990b8 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN_DTL.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_U9_RETURN_DTL.cs
@@ -7,130 +7,134 @@
 namespace Tiger.Model
 {
 	/// <summary>
-	/// 实体:退料单(U9)明细
+	/// 瀹炰綋锛氶��鏂欏崟(U9)鏄庣粏
 	/// </summary>
 	[Description("Primary:ID")]
-	[DisplayName("退料单(U9)明细")]
+	[DisplayName("閫�鏂欏崟(U9)鏄庣粏")]
 	[Serializable]
 	[SugarTable("BIZ_U9_RETURN_DTL")]
 	public class BIZ_U9_RETURN_DTL : DbEntityWithAuth
 	{
-		#region 构造函数
+		#region 鏋勯�犲嚱鏁�
 		/// <summary>
-		/// 实体:退料单(U9)明细
+		/// 瀹炰綋锛氶��鏂欏崟(U9)鏄庣粏
 		/// </summary>
 		public BIZ_U9_RETURN_DTL() {}
 		#endregion
 
-		#region 公共属性
+		#region 鍏叡灞炴��
 		/// <summary>
-		/// 单据号
+		/// 鍗曟嵁鍙�
 		/// </summary>
-		[DisplayName("单据号")]
+		[DisplayName("鍗曟嵁鍙�")]
 		public string ORDER_NO { get; set; }
 		/// <summary>
-		/// 单据行号
+		/// 鍗曟嵁琛屽彿
 		/// </summary>
-		[DisplayName("单据行号")]
+		[DisplayName("鍗曟嵁琛屽彿")]
 		public string LINE_NO { 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>
-		/// 来源单行ID
+		/// 鏉ユ簮鍗曡ID
 		/// </summary>
-		[DisplayName("来源单行ID")]
+		[DisplayName("鏉ユ簮鍗曡ID")]
 		public string SOURCE_ID { get; set; }
 		/// <summary>
-		/// 状态(同单据状态)
+		/// 鐘舵��(鍚屽崟鎹姸鎬�)
 		/// </summary>
-		[DisplayName("状态(同单据状态)")]
+		[DisplayName("鐘舵��(鍚屽崟鎹姸鎬�)")]
 		public int STATUS { get; set; }
 		/// <summary>
-		/// 物料编码
+		/// 鐗╂枡缂栫爜
 		/// </summary>
-		[DisplayName("物料编码")]
+		[DisplayName("鐗╂枡缂栫爜")]
 		public string ITEM_CODE { get; set; }
 		/// <summary>
-		/// 单位
+		/// 鍗曚綅
 		/// </summary>
-		[DisplayName("单位")]
+		[DisplayName("鍗曚綅")]
 		public string UNIT { get; set; }
 		/// <summary>
-		/// 单据数量
+		/// 鍗曟嵁鏁伴噺
 		/// </summary>
-		[DisplayName("单据数量")]
+		[DisplayName("鍗曟嵁鏁伴噺")]
 		public double QTY { get; set; }
 		/// <summary>
-		/// 入库数量
+		/// 鍏ュ簱鏁伴噺
 		/// </summary>
-		[DisplayName("入库数量")]
+		[DisplayName("鍏ュ簱鏁伴噺")]
 		public double QTY_IN { get; set; }
 		/// <summary>
-		/// 批次号
+		/// 鎵规鍙�
 		/// </summary>
-		[DisplayName("批次号")]
+		[DisplayName("鎵规鍙�")]
 		public string LOTNO { get; set; }
 		/// <summary>
-		/// ERP编码
+		/// ERP缂栫爜
 		/// </summary>
-		[DisplayName("ERP编码")]
+		[DisplayName("ERP缂栫爜")]
 		public string ERP_CODE { get; set; }
 		/// <summary>
-		/// 备注
+		/// 澶囨敞
 		/// </summary>
-		[DisplayName("备注")]
+		[DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
-		#endregion
+        #endregion
 
-		#region 虚拟属性
-		/*例子
+        #region 铏氭嫙灞炴��
+        /*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
-		#endregion
+        #endregion
 
-		#region 外键属性
-		/*例子
-		//一对一外键导航
-		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是BIZ_U9_RETURN_DTL类里面的外键ID字段
-		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
-		//一对多外键导航
-		[Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_U9_RETURN_DTLId))]//ClassA表中的BIZ_U9_RETURN_DTLId
-		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
-		//多对多外键导航
-		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_U9_RETURN_DTLId), nameof(MappingClass.ClassAId))]//注意顺序
-		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+        #region 澶栭敭灞炴��
+        /*渚嬪瓙
+		//涓�瀵逛竴澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疊IZ_U9_RETURN_DTL绫婚噷闈㈢殑澶栭敭ID瀛楁
+		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//涓�瀵瑰澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_U9_RETURN_DTLId))]//ClassA琛ㄤ腑鐨凚IZ_U9_RETURN_DTLId
+		public List<ClassA> ClassAList { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//澶氬澶氬閿鑸�
+		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_U9_RETURN_DTLId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
+		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
 		*/
-		#endregion
+        [Navigate(NavigateType.OneToMany, nameof(BAS_ITEM.ITEM_CODE), nameof(ITEM_CODE), "GHOST_ROW = 0")]//涓�瀵逛竴 ClassAId鏄疊IZ_U9_RETURN_DTL绫婚噷闈㈢殑澶栭敭ID瀛楁
+        public List<BAS_ITEM> _ItemInfos { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+        [SugarColumn(IsIgnore = true)]
+        public BAS_ITEM ItemInfo => _ItemInfos?.FirstOrDefault(q => q.AUTH_ORG == AUTH_ORG);
+        #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