服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2025-04-06 d2f14f6bb44c6dd19cc0816a033452b6de56184b
增加备料任务调用U9接口方法
已修改9个文件
358 ■■■■ 文件已修改
Tiger.Api/Language.db 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Preparation.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/ERP/WMS_U9C.ApproveMiscShip.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/ERP/WMS_U9C.CreateOutProdMaterialReq.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/ERP/WMS_U9C.CreateProdMaterialReq.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/ERP/WMS_U9C.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Extensions/Yada/OutExtension.cs 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Language.db
Binary files differ
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
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
{
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>
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>
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>
Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
@@ -1,12 +1,18 @@
using 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 pickList;
                    return dtl.QTY_REQ;
        }
    }
        /// <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()}]未实现ERP接口调用");
            }
        }
        /// <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;
            }
            //使用统一的事务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>
        /// <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>
        /// <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;
            }
            //使用统一的事务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;
        }
    }//endClass
}
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>
        /// 调用发料单据的ERP接口
        /// </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>
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 外键属性