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

---
 Tiger.Api/Language.db                                      |    0 
 Tiger.Business.WMS/ERP/WMS_U9C.CreateProdMaterialReq.cs    |   17 +-
 Tiger.Business.WMS/Extensions/Yada/OutExtension.cs         |  257 ++++++++++++++++++++++++++++++++++++++----
 Tiger.Business.WMS/Common/Preparation.cs                   |    1 
 Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs    |   44 ++++---
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs                |    2 
 Tiger.Business.WMS/ERP/WMS_U9C.CreateOutProdMaterialReq.cs |   17 +-
 Tiger.Business.WMS/ERP/WMS_U9C.cs                          |   10 -
 Tiger.Business.WMS/ERP/WMS_U9C.ApproveMiscShip.cs          |   10 -
 9 files changed, 273 insertions(+), 85 deletions(-)

diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index 9a024a6..5265410 100644
--- a/Tiger.Api/Language.db
+++ b/Tiger.Api/Language.db
Binary files differ
diff --git a/Tiger.Business.WMS/Common/Preparation.cs b/Tiger.Business.WMS/Common/Preparation.cs
index 9ebfbb0..cb21723 100644
--- a/Tiger.Business.WMS/Common/Preparation.cs
+++ b/Tiger.Business.WMS/Common/Preparation.cs
@@ -33,6 +33,7 @@
         public string UserCode { get; set; }
         public string OrgCode { get; set; }
         public BIZ_WMS_PREP Order { get; set; }
+        public BIZ_WMS_PREP.BIZ_TYPEs BizType => Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>();
         #endregion Propertys & Variables
 
         #region Functions
diff --git a/Tiger.Business.WMS/ERP/WMS_U9C.ApproveMiscShip.cs b/Tiger.Business.WMS/ERP/WMS_U9C.ApproveMiscShip.cs
index 8c237a9..34c3174 100644
--- a/Tiger.Business.WMS/ERP/WMS_U9C.ApproveMiscShip.cs
+++ b/Tiger.Business.WMS/ERP/WMS_U9C.ApproveMiscShip.cs
@@ -10,17 +10,7 @@
 using System.Linq;
 using Newtonsoft.Json;
 using Tiger.IBusiness;
-using Microsoft.AspNetCore.Http;
-using Tiger.Model.Minsun;
-using Org.BouncyCastle.Asn1.Tsp;
-using Tiger.Model.Entitys.MES.Position;
-using Apache.NMS.ActiveMQ.Commands;
-using System.Security.Cryptography;
-using System.Diagnostics;
 using Tiger.Model.Entitys.MES.U9C;
-using Newtonsoft.Json.Linq;
-using System.Security.Policy;
-using NetTaste;
 
 namespace Tiger.Business.WMS
 {
diff --git a/Tiger.Business.WMS/ERP/WMS_U9C.CreateOutProdMaterialReq.cs b/Tiger.Business.WMS/ERP/WMS_U9C.CreateOutProdMaterialReq.cs
index c947968..b8727ef 100644
--- a/Tiger.Business.WMS/ERP/WMS_U9C.CreateOutProdMaterialReq.cs
+++ b/Tiger.Business.WMS/ERP/WMS_U9C.CreateOutProdMaterialReq.cs
@@ -10,23 +10,20 @@
 using System.Linq;
 using Newtonsoft.Json;
 using Tiger.IBusiness;
-using Microsoft.AspNetCore.Http;
-using Tiger.Model.Minsun;
-using Org.BouncyCastle.Asn1.Tsp;
-using Tiger.Model.Entitys.MES.Position;
-using Apache.NMS.ActiveMQ.Commands;
-using System.Security.Cryptography;
-using System.Diagnostics;
 using Tiger.Model.Entitys.MES.U9C;
-using Newtonsoft.Json.Linq;
-using System.Security.Policy;
-using NetTaste;
 
 namespace Tiger.Business.WMS
 {
     public partial class WMS_U9C
     {
         /// <summary>
+        /// 鍒涘缓濮斿鐢熶骇棰嗘枡鍗�
+        /// </summary>
+        public static string CreateOutProdMaterialReqUrl
+        { get; set; } = "http://172.16.80.20/u9c/webapi/PMIssueDoc/Create"; // ApiConfig.IsTestServer ? Cache.SysParam["CreateOutProdMaterialReqUrl_Test", "U9CUrl"].PARAM_VALUE : Cache.SysParam["CreateOutProdMaterialReqUrl", "U9CUrl"].PARAM_VALUE; //http://172.16.80.20/u9c/webapi/PMIssueDoc/Create
+
+
+        /// <summary>
         /// 鍒涘缓濮斿鐢熶骇棰嗘枡鍗曟帴鍙�
         /// </summary>
         /// <param name="input"></param>
diff --git a/Tiger.Business.WMS/ERP/WMS_U9C.CreateProdMaterialReq.cs b/Tiger.Business.WMS/ERP/WMS_U9C.CreateProdMaterialReq.cs
index 945326c..31dd884 100644
--- a/Tiger.Business.WMS/ERP/WMS_U9C.CreateProdMaterialReq.cs
+++ b/Tiger.Business.WMS/ERP/WMS_U9C.CreateProdMaterialReq.cs
@@ -10,23 +10,20 @@
 using System.Linq;
 using Newtonsoft.Json;
 using Tiger.IBusiness;
-using Microsoft.AspNetCore.Http;
-using Tiger.Model.Minsun;
-using Org.BouncyCastle.Asn1.Tsp;
-using Tiger.Model.Entitys.MES.Position;
-using Apache.NMS.ActiveMQ.Commands;
-using System.Security.Cryptography;
-using System.Diagnostics;
 using Tiger.Model.Entitys.MES.U9C;
-using Newtonsoft.Json.Linq;
-using System.Security.Policy;
-using NetTaste;
 
 namespace Tiger.Business.WMS
 {
     public partial class WMS_U9C
     {
         /// <summary>
+        /// 鍒涘缓鐢熶骇棰嗘枡鍗�
+        /// </summary>
+        public static string CreateProdMaterialReqUrl
+        { get; set; } = "http://172.16.80.20/u9c/webapi/IssueDoc/Create"; // ApiConfig.IsTestServer ? Cache.SysParam["CreateProdMaterialReqUrl_Test", "U9CUrl"].PARAM_VALUE : Cache.SysParam["CreateProdMaterialReqUrl", "U9CUrl"].PARAM_VALUE; //http://172.16.80.20/u9c/webapi/IssueDoc/Create
+
+
+        /// <summary>
         /// 鍒涘缓鐢熶骇棰嗘枡鍗曟帴鍙�
         /// </summary>
         /// <param name="input"></param>
diff --git a/Tiger.Business.WMS/ERP/WMS_U9C.cs b/Tiger.Business.WMS/ERP/WMS_U9C.cs
index 09e150f..53f8f54 100644
--- a/Tiger.Business.WMS/ERP/WMS_U9C.cs
+++ b/Tiger.Business.WMS/ERP/WMS_U9C.cs
@@ -31,20 +31,10 @@
         public static string ApproveLineUrl
         { get; set; } = "http://172.16.80.20/u9c/webapi/Receivement/ApproveLine"; // ApiConfig.IsTestServer ? Cache.SysParam["ApproveLineUrl_Test", "U9CUrl"].PARAM_VALUE : Cache.SysParam["ApproveLineUrl", "U9CUrl"].PARAM_VALUE;  //http://172.16.80.20/u9c/webapi/Receivement/ApproveLine; 娴嬭瘯
         /// <summary>
-        /// 鍒涘缓鐢熶骇棰嗘枡鍗�
-        /// </summary>
-        public static string CreateProdMaterialReqUrl
-        { get; set; } = "http://172.16.80.20/u9c/webapi/IssueDoc/Create"; // ApiConfig.IsTestServer ? Cache.SysParam["CreateProdMaterialReqUrl_Test", "U9CUrl"].PARAM_VALUE : Cache.SysParam["CreateProdMaterialReqUrl", "U9CUrl"].PARAM_VALUE; //http://172.16.80.20/u9c/webapi/IssueDoc/Create
-        /// <summary>
         /// 鍒涘缓鐢熶骇閫�鏂欏崟-鎸夎閫�鏂�
         /// </summary>
         public static string CreateProdReturnOrderNewUrl
         { get; set; } = "http://172.16.80.20/u9c/webapi/IssueDoc/CreateRecedeIssueDocNew"; // ApiConfig.IsTestServer ? Cache.SysParam["CreateProdReturnOrderUrl_Test", "U9CUrl"].PARAM_VALUE : Cache.SysParam["CreateProdReturnOrderUrl", "U9CUrl"].PARAM_VALUE; //http://172.16.80.20/u9c/webapi/IssueDoc/CreateRecedeIssueDocNew
-        /// <summary>
-        /// 鍒涘缓濮斿鐢熶骇棰嗘枡鍗�
-        /// </summary>
-        public static string CreateOutProdMaterialReqUrl
-        { get; set; } = "http://172.16.80.20/u9c/webapi/PMIssueDoc/Create"; // ApiConfig.IsTestServer ? Cache.SysParam["CreateOutProdMaterialReqUrl_Test", "U9CUrl"].PARAM_VALUE : Cache.SysParam["CreateOutProdMaterialReqUrl", "U9CUrl"].PARAM_VALUE; //http://172.16.80.20/u9c/webapi/PMIssueDoc/Create
         /// <summary>
         /// 鍒涘缓濮斿鐢熶骇閫�鏂欏崟
         /// </summary>
diff --git a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
index 48c86d7..eb99666 100644
--- a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
+++ b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
@@ -1,12 +1,18 @@
 锘縰sing MailKit.Search;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
+using Org.BouncyCastle.Asn1.X509;
 using Rhea.Common;
+using SqlSugar;
 using System;
 using System.IO;
+using Tiger.Business.WMS.Transaction;
+using Tiger.IBusiness;
 using Tiger.Model;
 using Tiger.Model.Base;
+using Tiger.Model.Entitys.MES.U9C;
 using Tiger.Model.MES.Yada;
+using static Microsoft.Scripting.Hosting.Shell.ConsoleHostOptions;
 
 namespace Tiger.Business.WMS.Extensions
 {
@@ -74,41 +80,244 @@
         }
 
         /// <summary>
-        /// 鏍规嵁鍙戞枡绫诲瀷锛岃皟鐢ㄧ浉搴斿彂鏂欏崟鎹殑ERP鎺ュ彛
+        /// 瀹為檯闇�姹傛暟閲忚绠楁柟娉�
         /// </summary>
         /// <param name="type"></param>
-        /// <param name="orderNo"></param>
-        /// <param name="commitInput"></param>
+        /// <param name="dtl"></param>
         /// <returns></returns>
-        public static List<BIZ_WMS_PREP_SRC_DTL> CommitToERP(this BIZ_WMS_PREP.BIZ_TYPEs type, string orderNo, object commitInput)
+        public static double GetActReqQty(this BIZ_WMS_PREP.BIZ_TYPEs type, BIZ_WMS_PREP_DTL dtl)
         {
-            // 鏌ヨ鍗曟嵁鏄庣粏
-            var pickList = new List<BIZ_WMS_PREP_SRC_DTL>();
             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.Requisition:
                 default:
-                    break;
+                    return dtl.QTY_REQ;
             }
-            return pickList;
         }
-    }
+
+        /// <summary>
+        /// 鏍规嵁鍙戞枡绫诲瀷锛岃皟鐢ㄧ浉搴斿彂鏂欏崟鎹殑ERP鎺ュ彛
+        /// </summary>
+        /// <param name="type"></param>
+        /// <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)
+        {
+            switch (type)
+            {
+                case BIZ_WMS_PREP.BIZ_TYPEs.Others:
+                    return await MiscShipApprove(trans, input);
+                case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
+                    return await CreateIssueDoc(trans, input);
+                case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
+                    return await CreatePMIssueDoc(trans, input);
+                case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
+                default:
+                    throw new NotImplementedException($"鍙戞枡鍗曟嵁绫诲瀷[{type.GetDesc()}]鏈疄鐜癊RP鎺ュ彛璋冪敤");
+            }
+        }
+
+        /// <summary>
+        /// U9鏉傚彂鍗曞鏍�
+        /// </summary>
+        /// <param name="trans"></param>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BaseInput input)
+        {
+            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.Others.GetActReqQty(q));
+            if (noFinish.Any())
+            {
+                action.IsSuccessed = false;
+                //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}]鏈兘鎻愪氦瀹℃牳锛屾湭澶囨枡瀹屾垚鐨勮濡備笅锛歿1}");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join("锛�", noFinish.Select(q => q.ORDER_LINE)));
+                return action;
+            }
+
+            var iInput = new MiscShipApproveInput { MiscShipApproveParam = trans.CurPREP.Order.SourceOrders.Select(q => new MiscShipApproveParam() { Code = q.ORDER_NO }).ToList() };
+            var result = await DI.Resolve<IWMS_U9C>().MiscShipApprove(iInput);
+            if (!result.IsSuccessed)
+            {
+                action.IsSuccessed = false;
+                action.LocaleMsg = result.LocaleMsg;
+                return action;
+            }
+
+            trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue();
+            trans.CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
+            trans.CurPREP.Order.CurBatch.PREP_PERSON = trans.UserCode;
+            trans.CurPREP.Order.CurBatch.FINISH_TIME = DateTime.Now;
+            trans.CurPREP.Order.CurBatch.REQ_PERSON = trans.UserCode;
+            trans.CurPREP.Order.CurBatch.DLVY_TIME = DateTime.Now;
+            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)
+            {
+                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;
+            }
+
+            //浣跨敤缁熶竴鐨勪簨鍔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.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.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();
+            });
+            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;
+        }
+        /// <summary>
+        /// U9鍒涘缓濮斿鐢熶骇棰嗘枡鍗�
+        /// </summary>
+        /// <param name="trans"></param>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input)
+        {
+            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.Others.GetActReqQty(q));
+            if (noFinish.Any())
+            {
+                action.IsSuccessed = false;
+                //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}]鏈兘鎻愪氦瀹℃牳锛屾湭澶囨枡瀹屾垚鐨勮濡備笅锛歿1}");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join("锛�", noFinish.Select(q => q.ORDER_LINE)));
+                return action;
+            }
+
+            var iInput = new MiscShipApproveInput { MiscShipApproveParam = trans.CurPREP.Order.SourceOrders.Select(q => new MiscShipApproveParam() { Code = q.ORDER_NO }).ToList() };
+            var result = await DI.Resolve<IWMS_U9C>().MiscShipApprove(iInput);
+            if (!result.IsSuccessed)
+            {
+                action.IsSuccessed = false;
+                action.LocaleMsg = result.LocaleMsg;
+                return action;
+            }
+
+            trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue();
+            trans.CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
+            trans.CurPREP.Order.CurBatch.PREP_PERSON = trans.UserCode;
+            trans.CurPREP.Order.CurBatch.FINISH_TIME = DateTime.Now;
+            trans.CurPREP.Order.CurBatch.REQ_PERSON = trans.UserCode;
+            trans.CurPREP.Order.CurBatch.DLVY_TIME = DateTime.Now;
+            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)
+            {
+                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;
+            }
+
+            //浣跨敤缁熶竴鐨勪簨鍔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.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.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();
+            });
+            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;
+        }
+        /// <summary>
+        /// U9鍒涘缓鐢熶骇棰嗘枡鍗�
+        /// </summary>
+        /// <param name="trans"></param>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input)
+        {
+            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.Others.GetActReqQty(q));
+            if (noFinish.Any())
+            {
+                action.IsSuccessed = false;
+                //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}]鏈兘鎻愪氦瀹℃牳锛屾湭澶囨枡瀹屾垚鐨勮濡備笅锛歿1}");
+                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join("锛�", noFinish.Select(q => q.ORDER_LINE)));
+                return action;
+            }
+
+            var iInput = new MiscShipApproveInput { MiscShipApproveParam = trans.CurPREP.Order.SourceOrders.Select(q => new MiscShipApproveParam() { Code = q.ORDER_NO }).ToList() };
+            var result = await DI.Resolve<IWMS_U9C>().MiscShipApprove(iInput);
+            if (!result.IsSuccessed)
+            {
+                action.IsSuccessed = false;
+                action.LocaleMsg = result.LocaleMsg;
+                return action;
+            }
+
+            trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue();
+            trans.CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
+            trans.CurPREP.Order.CurBatch.PREP_PERSON = trans.UserCode;
+            trans.CurPREP.Order.CurBatch.FINISH_TIME = DateTime.Now;
+            trans.CurPREP.Order.CurBatch.REQ_PERSON = trans.UserCode;
+            trans.CurPREP.Order.CurBatch.DLVY_TIME   = DateTime.Now;
+            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)
+            {
+                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;
+            }
+
+            //浣跨敤缁熶竴鐨勪簨鍔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.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.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();
+            });
+            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
diff --git a/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs b/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
index 690b95f..adcf836 100644
--- a/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
+++ b/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
@@ -12,6 +12,8 @@
 using Tiger.Business.WMS.Common;
 using Org.BouncyCastle.Ocsp;
 using Tiger.Model.Sharetronic.Shelf;
+using MailKit.Search;
+using Tiger.Business.WMS.Extensions;
 
 namespace Tiger.Business.WMS.Transaction
 {
@@ -29,7 +31,7 @@
         }
 
         #region Propertys & Variables
-        private Preparation CurPREP;
+        public Preparation CurPREP { get; set; }
         private List<BIZ_WMS_PREP_SN> CurSn = new();
         private BIZ_WMS_PREP_DTL CurPrepDtl = new();
         public List<SuggestItem> Suggests { get; set; } = new();
@@ -156,6 +158,7 @@
         {
             var action = new ApiAction<BIZ_WMS_PREP>();
             CurPREP.Order = MainDB.Queryable<BIZ_WMS_PREP>().Where(q => q.ID == CurPREP.Order.ID).IncludesAllFirstLayer().First();
+
             action.Data = CurPREP.Order;
             return action;
         }
@@ -177,11 +180,11 @@
                     action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NotSelectItem");
                     return action;
                 }
-                if (prepDtl.QTY_PREP > GetActReqQty(prepDtl))
+                if (prepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(prepDtl))
                 {
                     action.IsSuccessed = false;
                     //action.LocaleMsg = Biz.L("褰撳墠閫夋嫨鐗╂枡琛孾{0}]宸插鏂欐暟閲廩{1}]锛屼互婊¤冻瀹為檯闇�姹傛暟閲廩{2}]锛屾棤闇�缁х画澶囨枡");
-                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.SelectItem.PrepFinish", prepDtl.ITEM_CODE, prepDtl.QTY_PREP, GetActReqQty(prepDtl));
+                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.SelectItem.PrepFinish", prepDtl.ITEM_CODE, prepDtl.QTY_PREP, CurPREP.BizType.GetActReqQty(prepDtl));
                     return action;
                 }
                 //鍒犻櫎鐗╂枡姹犱腑涓婁竴娆″垎閰嶇殑鐗╂枡
@@ -215,7 +218,7 @@
                     if (Suggests.Count > 0)
                     {
                         var inv = Suggests.First();
-                        var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
+                        var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
                         if (inv != null && actQty > 0)
                         {
                             inv.poolItem = inv.Item.GetPoolItem(OrgCode, nameof(CurPREP.Order), CurPrepDtl.ORDER_NO, CurPrepDtl.ORDER_LINE, actQty, true);
@@ -232,7 +235,7 @@
                 if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.Supply.GetValue())
                 {
                     //鎺ㄨ崘鐗╂枡
-                    var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
+                    var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
                     Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, actQty);
                     action.LocaleMsg = result.LocaleMsg;
                     if (result.IsException)
@@ -475,7 +478,7 @@
                 //鍒ゆ柇鏄惁瓒呭彂
                 isExceed = false;
                 //璁$畻鍓╀綑闇�姹傛暟閲忓拰鏉$爜涓殑鍙戝嚭鏁伴噺
-                var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
+                var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
                 if (actQty < CurInvItem.CurPkg.QTY)
                 {
                     isExceed = true;
@@ -496,7 +499,7 @@
                 {
                     //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛屾潯鐮侀渶瑕佹埅鏂欙紝鍙戝嚭鏁伴噺[{4}]");
                     //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛岃閫夋嫨瑕佽秴鍙戣繕鏄埅鏂欙紵");
-                    action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, GetActReqQty(CurPrepDtl), actQty);
+                    action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, CurPREP.BizType.GetActReqQty(CurPrepDtl), actQty);
                     action.Data.Command = "ConfirmExceed";
                     action.Data.Data = new  
                     {
@@ -531,11 +534,11 @@
                 var sns = (input.Data ?? "").JsonToObject<List<BIZ_WMS_PREP_SN>>() ?? new List<BIZ_WMS_PREP_SN>();
                 if (!sns.Any())
                 {
-                    var actQty = CurPrepDtl.QTY_PREP > GetActReqQty(CurPrepDtl) ? 0 : (GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
+                    var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
                     action.IsSuccessed = false;
                     //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛屾潯鐮侀渶瑕佹埅鏂欙紝鍙戝嚭鏁伴噺[{4}]");
                     //action.LocaleMsg = Biz.L($"鏉$爜[{0}]鎵弿鎴愬姛锛屽鏂欑墿鏂橻{1}]闇�姹俒{2}]杩橀渶澶囨枡[{3}]锛岃閫夋嫨瑕佽秴鍙戣繕鏄埅鏂欙紵");
-                    action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, GetActReqQty(CurPrepDtl), actQty);
+                    action.LocaleMsg = Biz.L($"WMS.Out_BIZ_WMS_PREP.ScanItem.Success{(isNeedCut ? "" : "Confirm")}", CurInvItem.SN, CurInvItem.ItemInfo.ITEM_CODE, CurPREP.BizType.GetActReqQty(CurPrepDtl), actQty);
                     action.Data.Command = "ConfirmExceed";
                     action.Data.Data = new
                     {
@@ -600,7 +603,7 @@
                     CurPrepDtl.QTY_PREP += CurSn.Sum(q => q.QTY_DLVY);
                     CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Picking.GetValue();
                     CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Picking.GetValue();
-                    CurPREP.Order.CurBatch.PICK_TIME = DateTime.Now;
+                    CurPREP.Order.CurBatch.PICK_TIME = CurPREP.Order.CurBatch.PICK_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : CurPREP.Order.CurBatch.PICK_TIME;
 
                     //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
                     var _CurSn = CurSn.Clone();
@@ -637,16 +640,6 @@
                 action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", input.SN));
             }
             return SetOutPutMqttMsg(action, input.Locale);
-        }
-
-        /// <summary>
-        /// 瀹為檯闇�姹傛暟閲忚绠楁柟娉�
-        /// </summary>
-        /// <param name="dtl"></param>
-        /// <returns></returns>
-        private double GetActReqQty(BIZ_WMS_PREP_DTL dtl)
-        {
-            return dtl.QTY_REQ;
         }
 
         /// <summary>
@@ -777,6 +770,17 @@
             return SetOutPutMqttMsg(action, locale);
         }
 
+        /// <summary>
+        /// 璋冪敤鍙戞枡鍗曟嵁鐨凟RP鎺ュ彛
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public async Task<ApiAction> CommitToERP(BaseInput input)
+        {
+            var action = await CurPREP.Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>() .CommitToERP(this, input);
+            return action;
+        }
+
         #endregion
 
         /// <summary>
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
index 9a754ea..3c7434d 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
@@ -62,7 +62,7 @@
 		public string FieldName { get; set; }
 		*/
         [SugarColumn(IsIgnore = true)]
-        public BIZ_WMS_PREP_BTH CurBatch => Batchs?.OrderBy(q => q.CALL_TIME).FirstOrDefault(q => q.STATUS < STATUSs.Close.GetValue());
+        public BIZ_WMS_PREP_BTH CurBatch => Batchs?.OrderBy(q => q.CALL_TIME).FirstOrDefault(q => q.STATUS < STATUSs.Sended.GetValue());
         #endregion
 
         #region 澶栭敭灞炴��

--
Gitblit v1.9.3