服务端的TigerApi 框架,基于.NET6 2024 版本
备料任务合并发料只适用于包装车间工单发料
备料任务增加根据发料类型,调用相应发料单据的ERP接口
已修改12个文件
456 ■■■■ 文件已修改
Tiger.Api/Language.db 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Preparation.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/WmsTask.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/ERP/U9C_WMS.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Extensions/Yada/OutExtension.cs 309 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/ParameterEntity/U9CParameter.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/YadaU9/mes_MOPickList.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/YadaU9/mes_SCMPickList.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SRC_DTL.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Language.db
Binary files differ
Tiger.Business.WMS/Common/Preparation.cs
@@ -1,4 +1,5 @@
using Rhea.Common;
using 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();
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;
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,
                            };
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;
            }
            //使用统一的事务DB对象
            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();
            }
            //使用统一的事务DB对象
@@ -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;
                }
            }
            //使用统一的事务DB对象
            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
            {
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,
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>
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,
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,
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
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>
        /// 单位用量
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SRC_DTL.cs
@@ -75,6 +75,11 @@
        [DisplayName("来源单据编码")]
        public string SOURCE_CODE { get; set; }
        /// <summary>
        /// 来源单ID
        /// </summary>
        [DisplayName("来源单ID")]
        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是BIZ_WMS_PREP_SRC_DTL类里面的外键ID字段
        public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
@@ -182,10 +192,10 @@
        [Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_SRC_DTLId), nameof(MappingClass.ClassAId))]//注意顺序
        public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
        */
        #endregion
        #endregion
        #region 枚举变量
        /*例子
        #region 枚举变量
        /*例子
        public enum FieldNames
        {
            [Description("枚举描述0")]
@@ -194,11 +204,11 @@
            Enum1,
        }
        */
        #endregion
        #endregion
        #region 公共方法
        #region 公共方法
        #endregion
        #endregion
    }//endClass
    }//endClass
}