From 36746596927952a6b860129a62eec9059bf083a7 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期六, 26 四月 2025 18:06:27 +0800
Subject: [PATCH] 优化了备料逻辑

---
 Tiger.Business.WMS/Extensions/Yada/OutExtension.cs |  370 +++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 318 insertions(+), 52 deletions(-)

diff --git a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
index c66af5a..5b505b3 100644
--- a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
+++ b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
@@ -1,7 +1,9 @@
 锘縰sing MailKit.Search;
+using Microsoft.Scripting.Utils;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using Org.BouncyCastle.Asn1.X509;
+using Org.BouncyCastle.Ocsp;
 using Rhea.Common;
 using SqlSugar;
 using System;
@@ -12,8 +14,6 @@
 using Tiger.Model.Base;
 using Tiger.Model.Entitys.MES.U9C;
 using Tiger.Model.MES.Yada;
-using static IronPython.SQLite.PythonSQLite;
-using static Microsoft.Scripting.Hosting.Shell.ConsoleHostOptions;
 
 namespace Tiger.Business.WMS.Extensions
 {
@@ -37,10 +37,54 @@
                     return nameof(BIZ_MES_WO);
                 case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
                     return nameof(BIZ_U9_SCM_OUT);
+                case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
+                    return nameof(BIZ_WMS_TRANSFER);
                 case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                 default:
                     return "";
             }
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍙戞枡绫诲瀷锛岃幏鍙栧彂鏂欏崟鎹殑閫夋嫨鍒楄〃锛堝甫鍒嗛〉锛�
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public static PageAble<BIZ_WMS_PREP_SRC> GetPickList(this BIZ_WMS_PREP.BIZ_TYPEs type, BaseInputWithPage input)
+        {
+            // 鏌ヨ鍗曟嵁鏄庣粏
+            var pickList = new PageAble<BIZ_WMS_PREP_SRC>();
+            switch (type)
+            {
+                //case BIZ_WMS_PREP.BIZ_TYPEs.Others:
+                //    {
+                //        var dtls = Biz.Db.Queryable<BIZ_U9_MISC_OUT_DTL>().Where(q => q.ORDER_NO == orderNo).ToList();
+                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
+                //    }
+                //    break;
+                //case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
+                //    {
+                //        var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_MOPickList>().Where(q => q.MoDocNo == orderNo).ToList();
+                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
+                //    }
+                //    break;
+                //case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
+                //    {
+                //        var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_SCMPickList>().Where(q => q.PoDocNo == orderNo).ToList();
+                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
+                //    }
+                //    break;
+                //case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
+                //    {
+                //        var dtls = Biz.Db.Queryable<BIZ_WMS_TRANSFER_DTL>().Where(q => q.ORDER_NO == orderNo).ToList();
+                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
+                //    }
+                //    break;
+                case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
+                default:
+                    break;
+            }
+            return pickList;
         }
 
         /// <summary>
@@ -73,6 +117,12 @@
                         pickList = dtls.Select(q => q.GetPickItem()).ToList();
                     }
                     break;
+                case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
+                    {
+                        var dtls = Biz.Db.Queryable<BIZ_WMS_TRANSFER_DTL>().Where(q => q.ORDER_NO == orderNo).ToList();
+                        pickList = dtls.Select(q => q.GetPickItem()).ToList();
+                    }
+                    break;
                 case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                 default:
                     break;
@@ -93,6 +143,7 @@
                 case BIZ_WMS_PREP.BIZ_TYPEs.Others:
                 case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
                 case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
+                case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
                 case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                 default:
                     return dtl.QTY_REQ;
@@ -106,16 +157,18 @@
         /// <param name="trans"></param>
         /// <param name="input"></param>
         /// <returns></returns>
-        public static async Task<ApiAction> CommitToERP(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BaseInput input)
+        public static async Task<ApiAction> GenerateDlvyBatch(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
         {
             switch (type)
             {
                 case BIZ_WMS_PREP.BIZ_TYPEs.Others:
-                    return await MiscShipApprove(trans, input);
+                    return await MiscShipApprove(trans, range);
                 case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
-                    return await CreateIssueDoc(trans, input);
+                    return await CreateIssueDoc(trans, range);
                 case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
-                    return await CreatePMIssueDoc(trans, input);
+                    return await CreatePMIssueDoc(trans, range);
+                case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
+                    return await TransferComplete(trans, range);
                 case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                 default:
                     throw new NotImplementedException($"鍙戞枡鍗曟嵁绫诲瀷[{type.GetDesc()}]鏈疄鐜癊RP鎺ュ彛璋冪敤");
@@ -126,9 +179,9 @@
         /// U9鏉傚彂鍗曞鏍�
         /// </summary>
         /// <param name="trans"></param>
-        /// <param name="input"></param>
+        /// <param name="range"></param>
         /// <returns></returns>
-        private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BaseInput input)
+        private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
         {
             var action = new ApiAction();
 
@@ -151,25 +204,67 @@
                 return action;
             }
 
-            var curBatch = trans.CurPREP.Order.CurBatch;
-            curBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
-            curBatch.PREP_PERSON = trans.UserCode;
-            curBatch.FINISH_TIME = DateTime.Now;
-            curBatch.REQ_PERSON = trans.UserCode;
-            curBatch.DLVY_TIME = DateTime.Now;
+            var batch = new BIZ_WMS_PREP_BTH()
+            {
+                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
+                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
+                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
+                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
+                PREP_PERSON = trans.UserCode,
+                FINISH_TIME = DateTime.Now,
+                REQ_PERSON = trans.UserCode,
+                DLVY_TIME = DateTime.Now,
+            };
+            trans.CurPREP.Order.Batchs.Add(batch);
+
             foreach (var item in trans.CurPREP.Order.SourceDetails)
             {
                 item.QTY_ACT_DLVY = item.QTY_ACT_REQ;
             }
             trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue();
-            var orders = trans.MainDB.Queryable<BIZ_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList();
-            foreach (var item in orders)
+            var orders = trans.MainDB.Queryable<BIZ_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).IncludesAllFirstLayer().ToList();
+            foreach (var order in orders)
             {
-                item.STATUS = BIZ_U9_MISC_OUT.STATUSs.Sended.GetValue();
-                item.PREP_PERSON = trans.UserCode;
-                item.FINISH_TIME = DateTime.Now;
-                item.REQ_PERSON = trans.UserCode;
-                item.DLVY_TIME = DateTime.Now;
+                order.STATUS = BIZ_U9_MISC_OUT.STATUSs.Sended.GetValue();
+                order.PREP_PERSON = trans.UserCode;
+                order.FINISH_TIME = DateTime.Now;
+                order.REQ_PERSON = trans.UserCode;
+                order.DLVY_TIME = DateTime.Now;
+                foreach (var dtl in order.Details)
+                {
+                    dtl.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue();
+                }
+                order.SnList ??= new();
+                foreach (var sn in trans.CurPREP.Order.SnList)
+                {
+                    var dtl = order.Details.Where(q => q.ITEM_CODE == sn.ITEM_CODE).First();
+                    order.SnList.Add(new()
+                    {
+                        AUTH_ORG = dtl.AUTH_ORG,
+                        ORDER_NO = dtl.ORDER_NO,
+                        LINE_NO = dtl.LINE_NO,
+                        SN = sn.SN,
+                        STATUS = sn.STATUS,
+                        ITEM_CODE = sn.ITEM_CODE,
+                        QTY = sn.QTY,
+                        UNIT = sn.UNIT,
+                        WH_CODE = sn.WH_CODE,
+                        REGION_CODE = sn.REGION_CODE,
+                        SHELF_CODE = sn.SHELF_CODE,
+                        LOCATION_CODE = sn.LOCATION_CODE,
+                        DOWN_TIME = sn.DOWN_TIME,
+                        DLVY_TIME = DateTime.Now,
+                        IS_OUT = "Y",
+                        LOTNO = sn.LOTNO,
+                    });
+                }
+            }
+            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList();
+            var history = new List<WMS_ITEM_HIS>();
+            foreach (var item in items)
+            {
+                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡杩囪处鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
             }
 
             //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
@@ -178,8 +273,14 @@
             {
                 db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                 db.Updateable(trans.CurPREP.Order.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
-                db.Updateable(curBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
+                db.Insertable(batch, trans.UserCode).ExecuteCommand();
+                db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO)
+                    .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand();
+                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Insertable(history, trans.UserCode).ExecuteCommand();
                 db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
+                db.Updateable(orders.SelectMany(q => q.Details).ToList(), trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Storageable(orders.SelectMany(q => q.SnList).ToList(), trans.UserCode).ToStorage().AsInsertable.ExecuteCommand();
             });
             if (dbTran.IsSuccess)
             {
@@ -199,18 +300,21 @@
         /// U9鍒涘缓鐢熶骇棰嗘枡鍗�
         /// </summary>
         /// <param name="trans"></param>
-        /// <param name="input"></param>
+        /// <param name="range"></param>
         /// <returns></returns>
-        private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input)
+        private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
         {
             var action = new ApiAction();
 
-            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.ORDER_BATCH == trans.CurPREP.Order.CurBatch.BATCH.ToString()).ToList();
+            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue())
+                                                .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID)
+                                                .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID)
+                                                .ToList();
             if (!sns.Any())
             {
                 action.IsSuccessed = false;
-                //action.LocaleMsg = Biz.L("鍒涘缓鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鎵规[{1}]鏈壘鍒板凡涓嬫灦鐨勭墿鏂欐暟鎹�");
-                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, trans.CurPREP.Order.CurBatch.BATCH);
+                //action.LocaleMsg = Biz.L("鍒涘缓鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鏈壘鍒皗1}宸蹭笅鏋剁殑鐗╂枡鏁版嵁");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc());
                 return action;
             }
             var wos = Biz.DataSource["YadaU9C"].Client.Queryable<mes_Mo>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.DocNo)).ToList();
@@ -272,14 +376,36 @@
                 return action;
             }
 
-            var curBatch = trans.CurPREP.Order.CurBatch;
-            curBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
-            curBatch.PREP_PERSON = trans.UserCode;
-            curBatch.FINISH_TIME = DateTime.Now;
-            curBatch.REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD));
-            curBatch.REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code));
-            curBatch.REQ_PERSON = trans.UserCode;
-            curBatch.DLVY_TIME   = DateTime.Now;
+
+            var batch = new BIZ_WMS_PREP_BTH()
+            {
+                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
+                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
+                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
+                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
+                PREP_PERSON = trans.UserCode,
+                FINISH_TIME = DateTime.Now,
+                REQ_PERSON = trans.UserCode,
+                REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)),
+                REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)),
+                DLVY_TIME = DateTime.Now,
+            };
+            trans.CurPREP.Order.Batchs.Add(batch);
+            foreach (var sn in sns)
+            {
+                sn.DLVY_BATCH = batch.DLVY_BATCH;
+                sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                sn.REQ_ID = batch.REQ_ID;
+                sn.REQ_ORDER = batch.REQ_ORDER;
+            }
+
+            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList();
+            var history = new List<WMS_ITEM_HIS>();
+            foreach (var item in items)
+            {
+                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡杩囪处鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+            }
 
             var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList();
             var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q));
@@ -294,12 +420,15 @@
             {
                 db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                 db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
-                db.Updateable(curBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_ID, q.REQ_ORDER, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
+                db.Insertable(batch, trans.UserCode).ExecuteCommand();
+                db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH, q.REQ_ID, q.REQ_ORDER }).ExecuteCommand();
+                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Insertable(history, trans.UserCode).ExecuteCommand();
             });
             if (dbTran.IsSuccess)
             {
                 //action.LocaleMsg = Biz.L($"鍒涘缓鐢熶骇棰嗘枡鍗昜{0}]鎴愬姛锛屾潵婧愬崟鍙峰涓嬶細{1}");
-                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.Success", curBatch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.Success", batch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
             }
             else
             {
@@ -314,18 +443,21 @@
         /// U9鍒涘缓濮斿鐢熶骇棰嗘枡鍗�
         /// </summary>
         /// <param name="trans"></param>
-        /// <param name="input"></param>
+        /// <param name="range"></param>
         /// <returns></returns>
-        private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input)
+        private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
         {
             var action = new ApiAction();
 
-            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.ORDER_BATCH == trans.CurPREP.Order.CurBatch.BATCH.ToString()).ToList();
+            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue())
+                                    .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID)
+                                    .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID)
+                                    .ToList();
             if (!sns.Any())
             {
                 action.IsSuccessed = false;
-                //action.LocaleMsg = Biz.L("鍒涘缓濮斿鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鎵规[{1}]鏈壘鍒板凡涓嬫灦鐨勭墿鏂欐暟鎹�");
-                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, trans.CurPREP.Order.CurBatch.BATCH);
+                //action.LocaleMsg = Biz.L("鍒涘缓濮斿鐢熶骇棰嗘枡鍗曞け璐ワ紝澶囨枡浠诲姟[{0}]鏈壘鍒皗1}宸蹭笅鏋剁殑鐗╂枡鏁版嵁");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc());
                 return action;
             }
             var temp = sns.GroupBy(q => new { q.ITEM_CODE, q.UNIT, q.WH_CODE, q.LOCATION_CODE })
@@ -387,14 +519,35 @@
                 return action;
             }
 
-            var curBatch = trans.CurPREP.Order.CurBatch;
-            curBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
-            curBatch.PREP_PERSON = trans.UserCode;
-            curBatch.FINISH_TIME = DateTime.Now;
-            curBatch.REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD));
-            curBatch.REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code));
-            curBatch.REQ_PERSON = trans.UserCode;
-            curBatch.DLVY_TIME = DateTime.Now;
+            var batch = new BIZ_WMS_PREP_BTH()
+            {
+                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
+                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
+                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
+                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
+                PREP_PERSON = trans.UserCode,
+                FINISH_TIME = DateTime.Now,
+                REQ_PERSON = trans.UserCode,
+                REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)),
+                REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)),
+                DLVY_TIME = DateTime.Now,
+            };
+            trans.CurPREP.Order.Batchs.Add(batch);
+            foreach (var sn in sns)
+            {
+                sn.DLVY_BATCH = batch.DLVY_BATCH;
+                sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                sn.REQ_ID = batch.REQ_ID;
+                sn.REQ_ORDER = batch.REQ_ORDER;
+            }
+
+            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList();
+            var history = new List<WMS_ITEM_HIS>();
+            foreach (var item in items)
+            {
+                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡杩囪处鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+            }
 
             var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList();
             var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q));
@@ -419,7 +572,10 @@
             {
                 db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                 db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
-                db.Updateable(curBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_ID, q.REQ_ORDER, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
+                db.Insertable(batch, trans.UserCode).ExecuteCommand();
+                db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH, q.REQ_ID, q.REQ_ORDER }).ExecuteCommand();
+                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Insertable(history, trans.UserCode).ExecuteCommand();
                 if (orders.Any())
                 {
 	                db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
@@ -428,7 +584,7 @@
             if (dbTran.IsSuccess)
             {
                 //action.LocaleMsg = Biz.L($"鍒涘缓濮斿鐢熶骇棰嗘枡鍗昜{0}]鎴愬姛锛屾潵婧愬崟鍙峰涓嬶細{1}");
-                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.Success", curBatch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.Success", batch.REQ_ORDER, string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
             }
             else
             {
@@ -438,5 +594,115 @@
             }
             return action;
         }
+
+        /// <summary>
+        /// 璋冩嫧鍗曞畬鎴愬彂鏂�
+        /// </summary>
+        /// <param name="trans"></param>
+        /// <param name="range"></param>
+        /// <returns></returns>
+        private static async Task<ApiAction> TransferComplete(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
+        {
+            var action = new ApiAction();
+
+            var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList();
+            var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Transfer.GetActReqQty(q));
+            if (noFinish.Any())
+            {
+                action.IsSuccessed = false;
+                //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}]鏈兘鎻愪氦瀹℃牳锛屾湭澶囨枡瀹屾垚鐨勮濡備笅锛歿1}");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.TransferComplete.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join("锛�", noFinish.Select(q => q.ORDER_LINE)));
+                return action;
+            }
+
+            var batch = new BIZ_WMS_PREP_BTH()
+            {
+                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
+                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
+                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
+                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
+                PREP_PERSON = trans.UserCode,
+                FINISH_TIME = DateTime.Now,
+                REQ_PERSON = trans.UserCode,
+                DLVY_TIME = DateTime.Now,
+            };
+            trans.CurPREP.Order.Batchs.Add(batch);
+
+            foreach (var item in trans.CurPREP.Order.SourceDetails)
+            {
+                item.QTY_ACT_DLVY = item.QTY_ACT_REQ;
+            }
+            trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue();
+            var orders = trans.MainDB.Queryable<BIZ_WMS_TRANSFER>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).IncludesAllFirstLayer().ToList();
+            foreach (var order in orders)
+            {
+                order.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue();
+                order.OUT_WH_CODE = string.Join(",", trans.CurPREP.Order.SnList.Select(q => q.WH_CODE).Distinct());
+                foreach (var dtl in order.Details)
+                {
+                    dtl.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue();
+                    dtl.OUT_WH_CODE = string.Join(",", trans.CurPREP.Order.SnList.Select(q => q.WH_CODE).Distinct());
+                    dtl.QTY_OUT = dtl.QTY_REQ;
+                    dtl.OUT_LOTNO = string.Join(",", trans.CurPREP.Order.SnList.Select(q => q.LOTNO).Distinct());
+                }
+                order.SnList ??= new();
+                foreach (var sn in trans.CurPREP.Order.SnList)
+                {
+                    var dtl = order.Details.Where(q => q.ITEM_CODE ==  sn.ITEM_CODE).First();
+                    order.SnList.Add(new()
+                    {
+                        AUTH_ORG = dtl.AUTH_ORG,
+                        ORDER_NO = dtl.ORDER_NO,
+                        ORDER_LINE = dtl.ORDER_LINE,
+                        SN = sn.SN,
+                        STATUS = sn.STATUS,
+                        ITEM_CODE = sn.ITEM_CODE,
+                        QTY = sn.QTY,
+                        LOTNO = sn.LOTNO,
+                        OUT_WH_CODE = sn.WH_CODE,
+                        OUT_REGION_CODE = sn.REGION_CODE,
+                        OUT_SHELF_CODE = sn.SHELF_CODE,
+                        OUT_LOCATION_CODE = sn.LOCATION_CODE,
+                        OUT_TIME = DateTime.Now,
+                    });
+                }
+            }
+            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList();
+            var history = new List<WMS_ITEM_HIS>();
+            foreach(var item in items)
+            {
+                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
+                history.Add(new WMS_ITEM_HIS(item, $"鏉$爜[{item.SN}]鍙戞枡鎴愬姛锛屾搷浣滃崟鎹甗{item.TRANS_NO}]"));
+            }
+
+            //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
+            var db = trans.GetCommitDB();
+            var dbTran = db.UseTran(() =>
+            {
+                db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Updateable(trans.CurPREP.Order.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
+                db.Insertable(batch, trans.UserCode).ExecuteCommand();
+                db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO)
+                    .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand();
+                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                db.Insertable(history, trans.UserCode).ExecuteCommand();
+                db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.OUT_WH_CODE }).ExecuteCommand();
+                db.Updateable(orders.SelectMany(q => q.Details).ToList(), trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.OUT_WH_CODE, q.QTY_OUT, q.OUT_LOTNO }).ExecuteCommand();
+                db.Storageable(orders.SelectMany(q => q.SnList).ToList(), trans.UserCode).ToStorage().AsInsertable.ExecuteCommand();
+            });
+            if (dbTran.IsSuccess)
+            {
+                //action.LocaleMsg = Biz.L($"璋冩嫧鍗曞彂鏂欏畬鎴愶紝鍗曞彿濡備笅锛歿0}");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.Success", string.Join("锛�", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
+            }
+            else
+            {
+                Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception");
+                //鎶涘嚭寮傚父
+                throw dbTran.ErrorException;
+            }
+            return action;
+        }
+
     }//endClass
 }
\ No newline at end of file

--
Gitblit v1.9.3