From 43b2af8956d54dc3a53f211c53d8af582806b6ba Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期二, 08 四月 2025 11:18:58 +0800
Subject: [PATCH] 备料任务合并发料只适用于包装车间工单发料 备料任务增加根据发料类型,调用相应发料单据的ERP接口

---
 Tiger.Business.WMS/ERP/U9C_WMS.cs                           |    2 
 Tiger.Api/Language.db                                       |    0 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SRC_DTL.cs         |   40 +++-
 Tiger.Model.Net/Entitys/MES/ParameterEntity/U9CParameter.cs |    8 
 Tiger.Business.WMS/Extensions/Yada/OutExtension.cs          |  309 ++++++++++++++++++++++++++-----------
 Tiger.Business.WMS/Common/Preparation.cs                    |   37 ++++
 Tiger.Model.Net/Entitys/MES/YadaU9/mes_SCMPickList.cs       |    1 
 Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs     |    2 
 Tiger.Model.Net/Entitys/MES/YadaU9/mes_MOPickList.cs        |    1 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs                 |   38 ++++
 Tiger.Business.WMS/Common/WmsTask.cs                        |    1 
 Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs              |   17 +
 12 files changed, 327 insertions(+), 129 deletions(-)

diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index 5265410..d00248d 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 cb21723..9862cc5 100644
--- a/Tiger.Business.WMS/Common/Preparation.cs
+++ b/Tiger.Business.WMS/Common/Preparation.cs
@@ -1,4 +1,5 @@
-锘縰sing Rhea.Common;
+锘縰sing MailKit.Search;
+using Rhea.Common;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
@@ -72,6 +73,15 @@
 	                    };
 	                }
 	            }
+                //鍚堝苟鍙戞枡鍙�傜敤浜庡寘瑁呰溅闂村伐鍗曞彂鏂欙紝闆呰揪鍖呰杞﹂棿缂栫爜锛�1002310010030758
+                else if (Order.WS_CODE != "1002310010030758")
+                {
+                    action.IsSuccessed = false;
+                    //action.LocaleMsg = Biz.L("澶囨枡浠诲姟[{0}]涓嶆槸鍖呰杞﹂棿宸ュ崟鍙戞枡锛屾棤娉曞悎骞跺崟鎹彂鏂�");
+                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.PrepNot1002310010030758", Order.ORDER_NO);
+                    return action;
+                }
+
 	            if (!src.IsNullOrEmpty() && src.ORDER_NO != Order.ORDER_NO)
 	            {
 	                action.IsSuccessed = false;
@@ -79,9 +89,9 @@
 	                action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.NoFound", orderNo, src.ORDER_NO, Order.ORDER_NO);
 	                return action;
 	            }
-	
-	            // 鏌ヨ鍗曟嵁鏄庣粏锛屽苟鍚堝苟鍒板鏂欏崟鐨勫鏂欐槑缁嗕腑
-	            var dtls = bizType.GetPickList(orderNo);
+
+                // 鏌ヨ鍗曟嵁鏄庣粏锛屽苟鍚堝苟鍒板鏂欏崟鐨勫鏂欐槑缁嗕腑
+                var dtls = bizType.GetPickList(orderNo);
 	            if (dtls.Sum(q => q.QTY_ACT_REQ) <= 0)
 	            {
 	                action.IsSuccessed = false;
@@ -89,6 +99,23 @@
 	                action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.NoNeedPrep", orderNo);
 	                return action;
 	            }
+                //鍚堝苟鍙戞枡鍙�傜敤浜庡寘瑁呰溅闂村伐鍗曞彂鏂�
+                if (src.IsNullOrEmpty() && Order.BIZ_TYPE == BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder.GetValue())
+                {
+                    var wo = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == orderNo).First();
+                    //闆呰揪鍖呰杞﹂棿缂栫爜锛�1002310010030758
+                    if (wo?.WS_CODE == "1002310010030758")
+                    {
+                        Order.WS_CODE = wo.WS_CODE;
+                    }
+                    else
+                    {
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = Biz.L("鍗曟嵁[{0}]涓嶆槸鍖呰杞﹂棿宸ュ崟锛屾棤娉曞悎骞跺崟鎹彂鏂�");
+                        action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.WoNot1002310010030758", orderNo);
+                        return action;
+                    }
+                }
 
                 Order.SourceOrders = Order.SourceOrders ?? new();
                 Order.SourceDetails = Order.SourceDetails ?? new();
@@ -168,7 +195,7 @@
                 {
                     var o = db.Storageable(Order, UserCode).WhereColumns(t => new { t.ORDER_NO, t.GHOST_ROW }).ToStorage();
                     o.AsInsertable.ExecuteCommand();
-                    o.AsUpdateable.IgnoreColumns(q => q.ID).UpdateColumns(q => new { q.SOURCE_CODE, q.SOURCE_ORDER, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
+                    o.AsUpdateable.IgnoreColumns(q => q.ID).UpdateColumns(q => new { q.WS_CODE, q.SOURCE_CODE, q.SOURCE_ORDER, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                     db.Storageable(Order.SourceOrders, UserCode).WhereColumns(t => new { t.ORDER_NO, t.SOURCE_ORDER, t.GHOST_ROW }).ToStorage().AsInsertable.ExecuteCommand();
                     db.Storageable(Order.SourceDetails, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage().AsInsertable.ExecuteCommand();
                     var d = db.Storageable(Order.Details, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage();
diff --git a/Tiger.Business.WMS/Common/WmsTask.cs b/Tiger.Business.WMS/Common/WmsTask.cs
index 9066eaa..852a03c 100644
--- a/Tiger.Business.WMS/Common/WmsTask.cs
+++ b/Tiger.Business.WMS/Common/WmsTask.cs
@@ -258,6 +258,7 @@
                     foreach (var item in CurInvItem.Items)
                     {
                         item.STATUS = WMS_ITEM.STATUSs.InStore.GetValue();
+                        item.LOTNO = item.LOTNO.IsNullOrEmpty(new Barcode(item.SN).LotNo);
                         item.SUPP_LOTNO = CurInvItem.Barcode.LotNo;
                         item.FIRST_IN_DATE = item.FIRST_IN_DATE <= DateTime.MinValue ? DateTime.Now : item.FIRST_IN_DATE;
                         item.PROD_DATE = item.PROD_DATE <= DateTime.MinValue ? item.FIRST_IN_DATE : item.PROD_DATE;
diff --git a/Tiger.Business.WMS/ERP/U9C_WMS.cs b/Tiger.Business.WMS/ERP/U9C_WMS.cs
index ba66a6d..afe58ff 100644
--- a/Tiger.Business.WMS/ERP/U9C_WMS.cs
+++ b/Tiger.Business.WMS/ERP/U9C_WMS.cs
@@ -185,6 +185,7 @@
                                 TRANS_CODE = nameof(BIZ_U9_ASN),
                                 TRANS_NO = info.ORDER_NO,
                                 TRANS_LINE = info.LINE_NO,
+                                LOTNO = barcode.LotNo,
                                 SUPP_CODE = dtl.SUPP_CODE,
                                 SUPP_LOTNO = dtl.SUPP_LOTNO,
                             };
@@ -207,6 +208,7 @@
                                 TRANS_CODE = nameof(BIZ_U9_ASN),
                                 TRANS_NO = info.ORDER_NO,
                                 TRANS_LINE = info.LINE_NO,
+                                LOTNO = barcode.LotNo,
                                 SUPP_CODE = dtl.SUPP_CODE,
                                 SUPP_LOTNO = dtl.SUPP_LOTNO,
                             };
diff --git a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
index eb99666..c66af5a 100644
--- a/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
+++ b/Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
@@ -12,6 +12,7 @@
 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
@@ -150,12 +151,17 @@
                 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;
+            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();
-            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)
             {
@@ -171,7 +177,8 @@
             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(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.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)
@@ -187,72 +194,7 @@
             }
             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>
@@ -263,18 +205,66 @@
         {
             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())
+            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();
+            if (!sns.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)));
+                //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);
                 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();
+            var temp = sns.GroupBy(q => new { q.ITEM_CODE, q.UNIT, q.WH_CODE, q.LOCATION_CODE })
+                                .Select(g => new PickListDTOs
+                                {
+                                    Item = new() { Code = g.Key.ITEM_CODE },
+                                    IssueWh = new() { Code = g.Key.WH_CODE },
+                                    IssueBin = new() { code = g.Key.LOCATION_CODE },
+                                    IssueQty = g.Sum(q => q.QTY),
+                                    IssuedQty = g.Sum(q => q.QTY),
+                                    IssueUOM = new() { Code = g.Key.UNIT.IsNullOrEmpty("PCS") },
+                                    Lot = new() { code = g.Max(q => q.LOTNO) },
+                                }).ToList();
+            var pickList = new List<PickListDTOs>();
+            var prepSrcList = new List<BIZ_WMS_PREP_SRC_DTL>();
+            foreach (var dtl in temp)
+            {
+                var remain = dtl.IssueQty;
+                var srcDtls = trans.CurPREP.Order.SourceDetails.Where(q => q.ITEM_CODE == dtl.Item.Code).ToList();
+                var count = srcDtls.Count;
+                foreach (var src in srcDtls)
+                {
+                    var actQty = src.QTY_ACT_REQ - src.QTY_ACT_DLVY;
+                    if (remain > 0 && actQty > 0)
+                    {
+                        //瀹為檯闇�姹傚ぇ浜庡墿浣欏緟鍒嗛厤鏁伴噺锛屾垨鑰呭綋鍓嶆槸鏈�鍚庝竴涓潵婧愭槑缁嗚锛屽垯鍒嗛厤鍓╀綑鏁伴噺
+	                    var dlvy = (actQty > remain || count == 1) ? remain : actQty;
+                        src.QTY_ACT_DLVY += dlvy;
+                        prepSrcList.Add(src);
+                        var pick = new PickListDTOs
+                        {
+                            Item = dtl.Item,
+                            IssueWh = dtl.IssueWh,
+                            IssueBin = dtl.IssueBin,
+                            IssueQty = dlvy,
+                            IssuedQty = dlvy,
+                            IssueUOM = dtl.IssueUOM,
+                            MOPickList = src.SOURCE_ID.ToInt64(),
+                            Lot = dtl.Lot,
+                        };
+                        pickList.Add(pick);
+                        remain -= pick.IssueQty;
+                    }
+                    count--;
+                }
+            }
 
-            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);
+            var iInput = new CreateProdMaterialReqInput {CreateProdMaterialReqParam = new() { new() {
+                MOs = trans.CurPREP.Order.SourceOrders.Select(q => new MOs { Code = q.SOURCE_ORDER }).ToList(),
+                PickListDTOs = pickList,
+                BusinessType = wos.First().BusinessType,
+            }}};
+            var result = await DI.Resolve<IWMS_U9C>().CreateProdMaterialReq(iInput);
             if (!result.IsSuccessed)
             {
                 action.IsSuccessed = false;
@@ -282,20 +272,20 @@
                 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)
+            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 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())
             {
-                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;
+                trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue();
             }
 
             //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
@@ -303,13 +293,142 @@
             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();
+                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();
             });
             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)));
+                //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)));
+            }
+            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 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();
+            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);
+                return action;
+            }
+            var temp = sns.GroupBy(q => new { q.ITEM_CODE, q.UNIT, q.WH_CODE, q.LOCATION_CODE })
+                                .Select(g => new PickListDTOs2
+                                {
+                                    Item = new() { Code = g.Key.ITEM_CODE },
+                                    IssueWh = new() { Code = g.Key.WH_CODE },
+                                    IssueBin = new() { code = g.Key.LOCATION_CODE },
+                                    IssueQty = g.Sum(q => q.QTY),
+                                    IssuedQty = g.Sum(q => q.QTY),
+                                    IssueUOM = new() { Code = g.Key.UNIT.IsNullOrEmpty("PCS") },
+                                    Lot = new() { code = g.Max(q => q.LOTNO) },
+                                }).ToList();
+            var pickList = new List<PickListDTOs2>();
+            var prepSrcList = new List<BIZ_WMS_PREP_SRC_DTL>();
+            foreach (var dtl in temp)
+            {
+                var remain = dtl.IssueQty;
+                var srcDtls = trans.CurPREP.Order.SourceDetails.Where(q => q.ITEM_CODE == dtl.Item.Code).ToList();
+                var count = srcDtls.Count;
+                foreach (var src in srcDtls)
+                {
+                    var actQty = src.QTY_ACT_REQ - src.QTY_ACT_DLVY;
+                    if (remain > 0 && actQty > 0)
+                    {
+                        //瀹為檯闇�姹傚ぇ浜庡墿浣欏緟鍒嗛厤鏁伴噺锛屾垨鑰呭綋鍓嶆槸鏈�鍚庝竴涓潵婧愭槑缁嗚锛屽垯鍒嗛厤鍓╀綑鏁伴噺
+                        var dlvy = (actQty > remain || count == 1) ? remain : actQty;
+                        src.QTY_ACT_DLVY += dlvy;
+                        prepSrcList.Add(src);
+                        var pick = new PickListDTOs2
+                        {
+                            Item = dtl.Item,
+                            IssueWh = dtl.IssueWh,
+                            IssueBin = dtl.IssueBin,
+                            IssueQty = dlvy,
+                            IssuedQty = dlvy,
+                            IssueUOM = dtl.IssueUOM,
+                            SCMOPickList = src.SOURCE_ID.ToInt64(),
+                            Lot = dtl.Lot,
+                        };
+                        pickList.Add(pick);
+                        remain -= pick.IssueQty;
+                    }
+                    count--;
+                }
+            }
+
+            var iInput = new CreateOutProdMaterialReqInput { CreateOutProdMaterialReqParam = new() { new() {
+                POLine = trans.CurPREP.Order.SourceOrders.Select(q => new POLine { Code = q.SOURCE_ORDER }).ToList(),
+                BusinessDate = DateTime.Now.ToString("yyyy-MM-dd"),
+                PickListDTOs = pickList,
+                BusinessCreatedOn = DateTime.Now.ToString("yyyy-MM-dd"),
+            }}};
+            var result = await DI.Resolve<IWMS_U9C>().CreateOutProdMaterialReq(iInput);
+            if (!result.IsSuccessed)
+            {
+                action.IsSuccessed = false;
+                action.LocaleMsg = result.LocaleMsg;
+                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 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));
+            var orders = new List<BIZ_U9_SCM_OUT>();
+            if (!noFinish.Any())
+            {
+                trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue();
+                orders = trans.MainDB.Queryable<BIZ_U9_SCM_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_SCM_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(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();
+                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();
+                }
+            });
+            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)));
             }
             else
             {
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 adcf836..ab6b7ef 100644
--- a/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
+++ b/Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
@@ -453,9 +453,11 @@
                     ORDER_BATCH = CurPREP.Order.CurBatch.BATCH.ToString(),
                     SN = q.SN,
                     ITEM_CODE = q.ITEM_CODE,
+                    UNIT = q.UNIT,
                     QTY = q.QTY,
                     QTY_DLVY = q.QTY,
                     STATUS = q.STATUS,
+                    LOTNO = q.LOTNO,
                     WH_CODE = CurInvItem.Warehouse.WH_CODE,
                     REGION_CODE = CurInvItem.Region.REGION_CODE,
                     SHELF_CODE = CurInvItem.Shelf.SHELF_CODE,
diff --git a/Tiger.Model.Net/Entitys/MES/ParameterEntity/U9CParameter.cs b/Tiger.Model.Net/Entitys/MES/ParameterEntity/U9CParameter.cs
index 8cc7c41..3fec36c 100644
--- a/Tiger.Model.Net/Entitys/MES/ParameterEntity/U9CParameter.cs
+++ b/Tiger.Model.Net/Entitys/MES/ParameterEntity/U9CParameter.cs
@@ -440,7 +440,7 @@
         /// <summary>
         /// 鐢熶骇璁㈠崟缂栫爜
         /// </summary>
-        public MOs MOs { get; set; }
+        public List<MOs> MOs { get; set; }
         /// <summary>
         /// 棰嗘枡鍗曡闆嗗悎
         /// </summary>
@@ -489,7 +489,7 @@
         /// <summary>
         /// 澶囨枡琛ㄨID
         /// </summary>
-        public string MOPickList { get; set; }
+        public long MOPickList { get; set; }
         /// <summary>
         /// 鍙戞枡鎵规
         /// </summary>
@@ -588,7 +588,7 @@
         /// <summary>
         /// 涓氬姟鏃ユ湡
         /// </summary>
-        public DateTime BusinessDate { get; set; }
+        public string BusinessDate { get; set; }
         /// <summary>
         /// 棰嗘枡琛岄泦鍚�
         /// </summary>
@@ -633,7 +633,7 @@
         /// <summary>
         /// 濮斿璁㈠崟澶囨枡琛ㄨID
         /// </summary>
-        public string SCMOPickList { get; set; }
+        public long SCMOPickList { get; set; }
         /// <summary>
         /// 鍙戞枡鎵规
         /// </summary>
diff --git a/Tiger.Model.Net/Entitys/MES/YadaU9/mes_MOPickList.cs b/Tiger.Model.Net/Entitys/MES/YadaU9/mes_MOPickList.cs
index b7e84a5..a3de1b1 100644
--- a/Tiger.Model.Net/Entitys/MES/YadaU9/mes_MOPickList.cs
+++ b/Tiger.Model.Net/Entitys/MES/YadaU9/mes_MOPickList.cs
@@ -178,6 +178,7 @@
                 ITEM_CODE = Code,
                 UNIT = IssueUOM,
                 SOURCE_CODE = nameof(BIZ_MES_WO),
+                SOURCE_ID = PickListId.ToString(),
                 SOURCE_ORDER = MoDocNo,
                 SOURCE_LINE = DocLineNO.ToString(),
                 QTY_REQ = ActualReqQty,
diff --git a/Tiger.Model.Net/Entitys/MES/YadaU9/mes_SCMPickList.cs b/Tiger.Model.Net/Entitys/MES/YadaU9/mes_SCMPickList.cs
index f83004e..6938aa7 100644
--- a/Tiger.Model.Net/Entitys/MES/YadaU9/mes_SCMPickList.cs
+++ b/Tiger.Model.Net/Entitys/MES/YadaU9/mes_SCMPickList.cs
@@ -137,6 +137,7 @@
                 ITEM_CODE = ItemCode,
                 UNIT = IssueUOM,
                 SOURCE_CODE = nameof(BIZ_U9_SCM_OUT),
+                SOURCE_ID = SCMPickListID.ToString(),
                 SOURCE_ORDER = PoDocNo,
                 SOURCE_LINE =PickLineNo.ToString(),
                 QTY_REQ = ActualReqQty,
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
index 3c7434d..d7dbb93 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
@@ -49,10 +49,40 @@
 		/// </summary>
 		[DisplayName("鏉ユ簮鍗曞彿锛屽涓敤鈥�,鈥濆垎闅旓紝璺熺紪鐮佷竴涓�瀵瑰簲")]
 		public string SOURCE_ORDER { get; set; }
-		/// <summary>
-		/// 澶囨敞
-		/// </summary>
-		[DisplayName("澶囨敞")]
+        /// <summary>
+        /// 宸ュ巶缂栫爜
+        /// </summary>
+        [DisplayName("宸ュ巶缂栫爜")]
+        public string FTY_CODE { get; set; }
+        /// <summary>
+        /// 杞﹂棿缂栫爜
+        /// </summary>
+        [DisplayName("杞﹂棿缂栫爜")]
+        public string WS_CODE { get; set; }
+        /// <summary>
+        /// 浜х嚎缂栫爜
+        /// </summary>
+        [DisplayName("浜х嚎缂栫爜")]
+        public string LINE_CODE { get; set; }
+        /// <summary>
+        /// 宀椾綅缂栫爜
+        /// </summary>
+        [DisplayName("宀椾綅缂栫爜")]
+        public string POST_CODE { get; set; }
+        /// <summary>
+        /// 宸ュ簭缂栫爜
+        /// </summary>
+        [DisplayName("宸ュ簭缂栫爜")]
+        public string OPER_CODE { get; set; }
+        /// <summary>
+        /// 鍔犲伐娈�
+        /// </summary>
+        [DisplayName("鍔犲伐娈�")]
+        public string SEGMENT { get; set; }
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        [DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
         #endregion
 
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs
index 810f9b1..a709798 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs
@@ -48,15 +48,20 @@
 		/// </summary>
 		[DisplayName("鐗╁搧缂栫爜")]
 		public string ITEM_CODE { get; set; }
-		/// <summary>
+        /// <summary>
+        /// 鎵规鍙�
+        /// </summary>
+        [DisplayName("鎵规鍙�")]
+		public string LOTNO { get; set; }
+        /// <summary>
 		/// 鍗曚綅
 		/// </summary>
 		[DisplayName("鍗曚綅")]
-		public string UNIT { get; set; }
-		/// <summary>
-		/// 鐗╁搧鏁伴噺
-		/// </summary>
-		[DisplayName("鐗╁搧鏁伴噺")]
+        public string UNIT { get; set; }
+        /// <summary>
+        /// 鐗╁搧鏁伴噺
+        /// </summary>
+        [DisplayName("鐗╁搧鏁伴噺")]
 		public double QTY { get; set; }
 		/// <summary>
 		/// 鍗曚綅鐢ㄩ噺
diff --git a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SRC_DTL.cs b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SRC_DTL.cs
index 6306266..9c03306 100644
--- a/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SRC_DTL.cs
+++ b/Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SRC_DTL.cs
@@ -75,6 +75,11 @@
 		[DisplayName("鏉ユ簮鍗曟嵁缂栫爜")]
 		public string SOURCE_CODE { get; set; }
 		/// <summary>
+		/// 鏉ユ簮鍗旾D
+		/// </summary>
+		[DisplayName("鏉ユ簮鍗旾D")]
+		public string SOURCE_ID { get; set; }
+		/// <summary>
 		/// 鏉ユ簮鍗曞彿
 		/// </summary>
 		[DisplayName("鏉ユ簮鍗曞彿")]
@@ -104,10 +109,15 @@
 		/// </summary>
 		[DisplayName("瀹為檯闇�姹傛暟閲�")]
 		public double QTY_ACT_REQ { get; set; }
-		/// <summary>
-		/// 宸ュ巶缂栫爜
+        /// <summary>
+		/// 瀹為檯鍙戞枡鏁伴噺
 		/// </summary>
-		[DisplayName("宸ュ巶缂栫爜")]
+		[DisplayName("瀹為檯鍙戞枡鏁伴噺")]
+        public double QTY_ACT_DLVY { get; set; }
+        /// <summary>
+        /// 宸ュ巶缂栫爜
+        /// </summary>
+        [DisplayName("宸ュ巶缂栫爜")]
 		public string FTY_CODE { get; set; }
 		/// <summary>
 		/// 杞﹂棿缂栫爜
@@ -159,10 +169,10 @@
 		/// </summary>
 		[DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
-        #endregion
+		#endregion
 
-        #region 铏氭嫙灞炴��
-        /*渚嬪瓙
+		#region 铏氭嫙灞炴��
+		/*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
@@ -170,8 +180,8 @@
         public iPrepPickItem Source { get; set; }
         #endregion
 
-        #region 澶栭敭灞炴��
-        /*渚嬪瓙
+		#region 澶栭敭灞炴��
+		/*渚嬪瓙
 		//涓�瀵逛竴澶栭敭瀵艰埅
 		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疊IZ_WMS_PREP_SRC_DTL绫婚噷闈㈢殑澶栭敭ID瀛楁
 		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
@@ -182,10 +192,10 @@
 		[Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_SRC_DTLId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
 		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
 		*/
-        #endregion
+		#endregion
 
-        #region 鏋氫妇鍙橀噺
-        /*渚嬪瓙
+		#region 鏋氫妇鍙橀噺
+		/*渚嬪瓙
 		public enum FieldNames
 		{
 			[Description("鏋氫妇鎻忚堪0")]
@@ -194,11 +204,11 @@
 			Enum1,
 		}
 		*/
-        #endregion
+		#endregion
 
-        #region 鍏叡鏂规硶
+		#region 鍏叡鏂规硶
 
-        #endregion
+		#endregion
 
-    }//endClass
+	}//endClass
 }
\ No newline at end of file

--
Gitblit v1.9.3