服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
4 天以前 beca28ecb3a730ffb33c21e0c55c729774725faf
优化备料单发料逻辑
已修改22个文件
1092 ■■■■■ 文件已修改
Tiger.Api/Language.db 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/Preparation.cs 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Common/WmsTask.cs 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Extensions/Yada/OutExtension.cs 282 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/Api/Input_Entitys.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_BTH.cs 213 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/V_ITEM_BIZ_ERP_RECEIPT_SN.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_A.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_D.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_HIS.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_X.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_Y.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/WMS_ITEM.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/WMS_ITEM_HIS.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/WMS_ITEM_POOL.cs 180 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Language.db
Binary files differ
Tiger.Business.WMS/Common/Preparation.cs
@@ -1,21 +1,18 @@
using MailKit.Search;
using Rhea.Common;
using Rhea.Common;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.Business.WMS.Extensions;
using Tiger.Business.WMS.Transaction;
using Tiger.IBusiness;
using Tiger.Model;
using Tiger.Model.Entitys.MES.Position;
using Tiger.Model.Extensions;
namespace Tiger.Business.WMS.Common
{
    /// <summary>
    /// 备料任务单据
    /// </summary>
@@ -30,11 +27,13 @@
        #region Propertys & Variables
        private static object AddOrderLock { get; } = new object();
        private static object AddBatchLock { get; } = new object();
        public DbClient MainDB { get; set; }
        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>();
        public SuggestOption Option { get; set; }
        #endregion Propertys & Variables
        #region Functions
@@ -120,7 +119,6 @@
                Order.SourceOrders = Order.SourceOrders ?? new();
                Order.SourceDetails = Order.SourceDetails ?? new();
                Order.Details = Order.Details ?? new();
                Order.Batchs = Order.Batchs ?? new();
                Order.SnList = Order.SnList ?? new();
                var srcOrder = new BIZ_WMS_PREP_SRC()
                {
@@ -172,23 +170,7 @@
                var srcInfo = Order.SourceOrders.Select(q => new { q.SOURCE_CODE, q.SOURCE_ORDER }).DistinctBy(q => q.SOURCE_ORDER).OrderBy(q => q.SOURCE_ORDER);
                Order.SOURCE_CODE = string.Join(",", srcInfo.Select(q => q.SOURCE_CODE));
                Order.SOURCE_ORDER = string.Join(",", srcInfo.Select(q => q.SOURCE_ORDER));
                if (Order.CurBatch.IsNullOrEmpty())
                {
                    var bacth = new BIZ_WMS_PREP_BTH()
                    {
                        AUTH_ORG = OrgCode,
                        ORDER_NO = Order.ORDER_NO,
                        BATCH = Order.Batchs.Max(q => q.BATCH) + 1,
                        PREP_MODE = BIZ_WMS_PREP_BTH.PREP_MODEs.Whole.GetValue(),
                        DLVY_MODE = BIZ_WMS_PREP_BTH.DLVY_MODEs.Supply.GetValue(),
                        STATUS = BIZ_WMS_PREP_BTH.STATUSs.WaitPick.GetValue(),
                        CALL_TIME = DateTime.Now,
                        PRIORITY = 4,
                    };
                    bacth.PLAN_TIME = bacth.CALL_TIME.AddHours(1);
                    Order.Batchs.Add(bacth);
                }
                //使用统一的事务DB对象
                var db = Biz.Db;
                var dbTran = db.UseTran(() =>
@@ -201,7 +183,6 @@
                    var d = db.Storageable(Order.Details, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage();
                    d.AsInsertable.ExecuteCommand();
                    d.AsUpdateable.IgnoreColumns(q => q.ID).UpdateColumns(q => new { q.QTY_REQ, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                    db.Storageable(Order.Batchs, UserCode).WhereColumns(t => new { t.ORDER_NO, t.BATCH, t.GHOST_ROW }).ToStorage().AsInsertable.ExecuteCommand();
                });
                if (dbTran.IsSuccess)
                {
Tiger.Business.WMS/Common/WmsTask.cs
@@ -1,4 +1,5 @@
using Rhea.Common;
using Microsoft.Extensions.Options;
using Rhea.Common;
using SqlSugar;
using System;
using System.Collections.Generic;
@@ -323,28 +324,25 @@
        /// </summary>
        /// <param name="order">领料单号</param>
        /// <param name="itemCode">物料编码</param>
        /// <param name="erpWH">物料的ERP库位</param>
        /// <param name="whID">物料所在的仓库编码</param>
        /// <param name="regionID">物料所在的储区编码</param>
        /// <param name="shelfID">物料所在的货架编码</param>
        /// <param name="option">授权查询选项</param>
        /// <param name="option">备料物料推荐选项</param>
        /// <param name="auth">授权查询选项</param>
        /// <param name="returnCount">返回的最小包装物料个数,默认返回1个</param>
        /// <returns></returns>
        public Result<List<SuggestItem>> Suggest(string order, string itemCode, string erpWH, string whID, string regionID, string shelfID, AuthOption option, int returnCount = 1)
        public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, int returnCount = 1)
        {
            var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") };
            try
            {
                var items = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                                                                JoinType.Left, q.SN == p.SN,
                                                                JoinType.Left, q.WH_ID == w.ID,
                                                                JoinType.Left, q.REGION_ID == r.ID,
                                                                JoinType.Left, q.SHELF_ID == s.ID,
                                                                JoinType.Left, q.LOCATION_ID == l.ID))
                                             //检查用户权限
                                             .ByAuth(option)
                                            //允许使用已经分配到库存池中的物料
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order))
                                             .ByAuth(auth)
                                            //允许使用已经分配到库存池中同一个单据的物料
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N")
                                            //只允许未锁定的
                                            .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
                                            //只允许物料状态是在库的
@@ -352,30 +350,32 @@
                                            //如果有传入料号,则只允该料号的物料
                                            .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode)
                                            //如果有传入库位,则只允该库位中的物料
                                            .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入仓库,则只允该仓库的物料
                                            .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入储区,则只允该储区的物料
                                            .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入货架,则只允该货架的物料
                                            .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg)
                                            //优先使用库存池中的物料
                                            .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
                                            //优先使用尾数物料(截料或者退料之后的物料)
                                            .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //按生产日期先进先出,再按物料数量从小到大,最后按条码排序
                                            .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN)
                                            .Select((q, p, w, r, s, l) => new SuggestItem
                                            {
                                                Item = q,
                                                poolItem = null,
                                                Warehouse = w,
                                                Region = r,
                                                Shelf = s,
                                                Location = l,
                                            })
                                            //检查用户权限
                                            .Take(returnCount).ToList();
                                            //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //备料策略:按生产日期先进先出
                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE)
                                            //按生产日期先进先出,再按物料数量从小到大,
                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY)
                                            //最后按条码排序
                                            .OrderBy(q => q.SN);
                var items = query.Select((q, p, w, r, s, l) => new SuggestItem
                                    {
                                        Item = q,
                                        poolItem = null,
                                        Warehouse = w,
                                        Region = r,
                                        Shelf = s,
                                        Location = l,
                                    }).Take(returnCount).ToList();
                //foreach (var item in items)
                //{
                //    var inv = Get(item.SN, option, false);
@@ -410,34 +410,25 @@
        /// </summary>
        /// <param name="order">领料单号</param>
        /// <param name="itemCode">物料编码</param>
        /// <param name="erpWH">物料的ERP库位</param>
        /// <param name="whID">物料所在的仓库编码</param>
        /// <param name="regionID">物料所在的储区编码</param>
        /// <param name="shelfID">物料所在的货架编码</param>
        /// <param name="option">授权查询选项</param>
        /// <param name="option">备料物料推荐选项</param>
        /// <param name="auth">授权查询选项</param>
        /// <param name="reqQty">需求数量,会返回满足需求的物料个数</param>
        /// <returns></returns>
        public Result<List<SuggestItem>> Suggest(string order, string itemCode, string erpWH, string whID, string regionID, string shelfID, AuthOption option, double reqQty)
        public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, double reqQty)
        {
            var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") };
            try
            {
                var takeCount = 0;
                var checkSum = 0.0;
                var checkCount = 0;
                do
                {
                    takeCount += 50;
                    var check = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                                                                JoinType.Left, q.SN == p.SN,
                                                                JoinType.Left, q.WH_ID == w.ID,
                                                                JoinType.Left, q.REGION_ID == r.ID,
                                                                JoinType.Left, q.SHELF_ID == s.ID,
                                                                JoinType.Left, q.LOCATION_ID == l.ID))
                                             //检查用户权限
                                             .ByAuth(option)
                                             .ByAuth(auth)
                                            //允许使用已经分配到库存池中的物料
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order))
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N")
                                            //只允许未锁定的
                                            .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
                                            //只允许物料状态是在库的
@@ -445,20 +436,30 @@
                                            //如果有传入料号,则只允该料号的物料
                                            .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode)
                                            //如果有传入库位,则只允该库位中的物料
                                            .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入仓库,则只允该仓库的物料
                                            .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入储区,则只允该储区的物料
                                            .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入货架,则只允该货架的物料
                                            .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg)
                                            //优先使用库存池中的物料
                                            .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
                                            //优先使用尾数物料(截料或者退料之后的物料)
                                            .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //按生产日期先进先出,再按物料数量从小到大,最后按条码排序
                                            .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN)
                                            .Select((q, p, w, r, s, l) => new
                                            //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //备料策略:按生产日期先进先出
                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE)
                                            //按生产日期先进先出,再按物料数量从小到大,
                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY)
                                            //最后按条码排序
                                            .OrderBy(q => q.SN);
                var takeCount = 0;
                var checkSum = 0.0;
                var checkCount = 0;
                do
                {
                    takeCount += 50;
                    var check = query.Select((q, p, w, r, s, l) => new
                                            {
                                                ItemCode = q.ITEM_CODE,
                                                Sn = q.SN,
@@ -484,37 +485,7 @@
                    }
                } while (checkSum < reqQty && checkCount >= takeCount);
                var items = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                                                                JoinType.Left, q.SN == p.SN,
                                                                JoinType.Left, q.WH_ID == w.ID,
                                                                JoinType.Left, q.REGION_ID == r.ID,
                                                                JoinType.Left, q.SHELF_ID == s.ID,
                                                                JoinType.Left, q.LOCATION_ID == l.ID))
                                             //检查用户权限
                                             .ByAuth(option)
                                            //允许使用已经分配到库存池中的物料
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order))
                                            //只允许未锁定的
                                            .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
                                            //只允许物料状态是在库的
                                            .Where((q, p, w, r, s, l) => q.STATUS == WMS_ITEM.STATUSs.InStore.GetValue())
                                            //如果有传入料号,则只允该料号的物料
                                            .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode)
                                            //如果有传入库位,则只允该库位中的物料
                                            .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg)
                                            //如果有传入仓库,则只允该仓库的物料
                                            .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg)
                                            //如果有传入储区,则只允该储区的物料
                                            .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg)
                                            //如果有传入货架,则只允该货架的物料
                                            .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg)
                                            //优先使用库存池中的物料
                                            .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
                                            //优先使用尾数物料(截料或者退料之后的物料)
                                            .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //按生产日期先进先出,再按物料数量从小到大,最后按条码排序
                                            .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN)
                                            .Select((q, p, w, r, s, l) => new SuggestItem
                var items = query.Select((q, p, w, r, s, l) => new SuggestItem
                                            {
                                                Item = q,
                                                poolItem = null,
Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
@@ -1,4 +1,5 @@
using MailKit.Search;
using Microsoft.Scripting.Utils;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Org.BouncyCastle.Asn1.X509;
@@ -41,6 +42,48 @@
                default:
                    return "";
            }
        }
        /// <summary>
        /// 根据发料类型,获取发料单据的选择列表(带分页)
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static PageAble<BIZ_WMS_PREP_SRC> GetPickList(this BIZ_WMS_PREP.BIZ_TYPEs type, BaseInputWithPage input)
        {
            // 查询单据明细
            var pickList = new PageAble<BIZ_WMS_PREP_SRC>();
            switch (type)
            {
                //case BIZ_WMS_PREP.BIZ_TYPEs.Others:
                //    {
                //        var dtls = Biz.Db.Queryable<BIZ_U9_MISC_OUT_DTL>().Where(q => q.ORDER_NO == orderNo).ToList();
                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
                //    }
                //    break;
                //case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
                //    {
                //        var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_MOPickList>().Where(q => q.MoDocNo == orderNo).ToList();
                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
                //    }
                //    break;
                //case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
                //    {
                //        var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_SCMPickList>().Where(q => q.PoDocNo == orderNo).ToList();
                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
                //    }
                //    break;
                //case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
                //    {
                //        var dtls = Biz.Db.Queryable<BIZ_WMS_TRANSFER_DTL>().Where(q => q.ORDER_NO == orderNo).ToList();
                //        pickList = dtls.Select(q => q.GetPickItem()).ToList();
                //    }
                //    break;
                case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                default:
                    break;
            }
            return pickList;
        }
        /// <summary>
@@ -113,17 +156,18 @@
        /// <param name="trans"></param>
        /// <param name="input"></param>
        /// <returns></returns>
        public static async Task<ApiAction> CommitToERP(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BaseInput input)
        public static async Task<ApiAction> GenerateDlvyBatch(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
        {
            switch (type)
            {
                case BIZ_WMS_PREP.BIZ_TYPEs.Others:
                    return await MiscShipApprove(trans, input);
                    return await MiscShipApprove(trans, range);
                case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
                    return await CreateIssueDoc(trans, input);
                    return await CreateIssueDoc(trans, range);
                case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
                    return await CreatePMIssueDoc(trans, input);
                    return await CreatePMIssueDoc(trans, range);
                case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
                    return await TransferComplete(trans, range);
                case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                default:
                    throw new NotImplementedException($"发料单据类型[{type.GetDesc()}]未实现ERP接口调用");
@@ -134,9 +178,9 @@
        /// U9杂发单审核
        /// </summary>
        /// <param name="trans"></param>
        /// <param name="input"></param>
        /// <param name="range"></param>
        /// <returns></returns>
        private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BaseInput input)
        private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
        {
            var action = new ApiAction();
@@ -159,12 +203,19 @@
                return action;
            }
            var curBatch = trans.CurPREP.Order.CurBatch;
            curBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
            curBatch.PREP_PERSON = trans.UserCode;
            curBatch.FINISH_TIME = DateTime.Now;
            curBatch.REQ_PERSON = trans.UserCode;
            curBatch.DLVY_TIME = DateTime.Now;
            var batch = new BIZ_WMS_PREP_BTH()
            {
                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
                PREP_PERSON = trans.UserCode,
                FINISH_TIME = DateTime.Now,
                REQ_PERSON = trans.UserCode,
                DLVY_TIME = DateTime.Now,
            };
            trans.CurPREP.Order.Batchs.Add(batch);
            foreach (var item in trans.CurPREP.Order.SourceDetails)
            {
                item.QTY_ACT_DLVY = item.QTY_ACT_REQ;
@@ -179,6 +230,13 @@
                item.REQ_PERSON = trans.UserCode;
                item.DLVY_TIME = DateTime.Now;
            }
            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList();
            var history = new List<WMS_ITEM_HIS>();
            foreach (var item in items)
            {
                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
                history.Add(new WMS_ITEM_HIS(item, $"条码[{item.SN}]发料过账成功,操作单据[{item.TRANS_NO}]"));
            }
            //使用统一的事务DB对象
            var db = trans.GetCommitDB();
@@ -186,7 +244,11 @@
            {
                db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                db.Updateable(trans.CurPREP.Order.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
                db.Updateable(curBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
                db.Insertable(batch, trans.UserCode).ExecuteCommand();
                db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO)
                    .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand();
                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                db.Insertable(history, trans.UserCode).ExecuteCommand();
                db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
            });
            if (dbTran.IsSuccess)
@@ -207,18 +269,21 @@
        /// U9创建生产领料单
        /// </summary>
        /// <param name="trans"></param>
        /// <param name="input"></param>
        /// <param name="range"></param>
        /// <returns></returns>
        private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input)
        private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
        {
            var action = new ApiAction();
            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.ORDER_BATCH == trans.CurPREP.Order.CurBatch.BATCH.ToString()).ToList();
            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue())
                                                .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID)
                                                .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID)
                                                .ToList();
            if (!sns.Any())
            {
                action.IsSuccessed = false;
                //action.LocaleMsg = Biz.L("创建生产领料单失败,备料任务[{0}]批次[{1}]未找到已下架的物料数据");
                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, trans.CurPREP.Order.CurBatch.BATCH);
                //action.LocaleMsg = Biz.L("创建生产领料单失败,备料任务[{0}]未找到{1}已下架的物料数据");
                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc());
                return action;
            }
            var wos = Biz.DataSource["YadaU9C"].Client.Queryable<mes_Mo>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.DocNo)).ToList();
@@ -280,14 +345,34 @@
                return action;
            }
            var curBatch = trans.CurPREP.Order.CurBatch;
            curBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
            curBatch.PREP_PERSON = trans.UserCode;
            curBatch.FINISH_TIME = DateTime.Now;
            curBatch.REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD));
            curBatch.REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code));
            curBatch.REQ_PERSON = trans.UserCode;
            curBatch.DLVY_TIME   = DateTime.Now;
            var batch = new BIZ_WMS_PREP_BTH()
            {
                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
                PREP_PERSON = trans.UserCode,
                FINISH_TIME = DateTime.Now,
                REQ_PERSON = trans.UserCode,
                REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)),
                REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)),
                DLVY_TIME = DateTime.Now,
            };
            trans.CurPREP.Order.Batchs.Add(batch);
            foreach (var sn in sns)
            {
                sn.DLVY_BATCH = batch.DLVY_BATCH;
                sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
            }
            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList();
            var history = new List<WMS_ITEM_HIS>();
            foreach (var item in items)
            {
                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
                history.Add(new WMS_ITEM_HIS(item, $"条码[{item.SN}]发料过账成功,操作单据[{item.TRANS_NO}]"));
            }
            var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList();
            var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q));
@@ -302,12 +387,15 @@
            {
                db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
                db.Updateable(curBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_ID, q.REQ_ORDER, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
                db.Insertable(batch, trans.UserCode).ExecuteCommand();
                db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH }).ExecuteCommand();
                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                db.Insertable(history, trans.UserCode).ExecuteCommand();
            });
            if (dbTran.IsSuccess)
            {
                //action.LocaleMsg = Biz.L($"创建生产领料单[{0}]成功,来源单号如下:{1}");
                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.Success", curBatch.REQ_ORDER, string.Join(",", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.Success", batch.REQ_ORDER, string.Join(",", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
            }
            else
            {
@@ -322,18 +410,21 @@
        /// U9创建委外生产领料单
        /// </summary>
        /// <param name="trans"></param>
        /// <param name="input"></param>
        /// <param name="range"></param>
        /// <returns></returns>
        private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input)
        private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
        {
            var action = new ApiAction();
            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.ORDER_BATCH == trans.CurPREP.Order.CurBatch.BATCH.ToString()).ToList();
            var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue())
                                    .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID)
                                    .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID)
                                    .ToList();
            if (!sns.Any())
            {
                action.IsSuccessed = false;
                //action.LocaleMsg = Biz.L("创建委外生产领料单失败,备料任务[{0}]批次[{1}]未找到已下架的物料数据");
                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, trans.CurPREP.Order.CurBatch.BATCH);
                //action.LocaleMsg = Biz.L("创建委外生产领料单失败,备料任务[{0}]未找到{1}已下架的物料数据");
                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc());
                return action;
            }
            var temp = sns.GroupBy(q => new { q.ITEM_CODE, q.UNIT, q.WH_CODE, q.LOCATION_CODE })
@@ -395,14 +486,33 @@
                return action;
            }
            var curBatch = trans.CurPREP.Order.CurBatch;
            curBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue();
            curBatch.PREP_PERSON = trans.UserCode;
            curBatch.FINISH_TIME = DateTime.Now;
            curBatch.REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD));
            curBatch.REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code));
            curBatch.REQ_PERSON = trans.UserCode;
            curBatch.DLVY_TIME = DateTime.Now;
            var batch = new BIZ_WMS_PREP_BTH()
            {
                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
                PREP_PERSON = trans.UserCode,
                FINISH_TIME = DateTime.Now,
                REQ_PERSON = trans.UserCode,
                REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)),
                REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)),
                DLVY_TIME = DateTime.Now,
            };
            trans.CurPREP.Order.Batchs.Add(batch);
            foreach (var sn in sns)
            {
                sn.DLVY_BATCH = batch.DLVY_BATCH;
                sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
            }
            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList();
            var history = new List<WMS_ITEM_HIS>();
            foreach (var item in items)
            {
                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
                history.Add(new WMS_ITEM_HIS(item, $"条码[{item.SN}]发料过账成功,操作单据[{item.TRANS_NO}]"));
            }
            var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList();
            var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q));
@@ -427,7 +537,10 @@
            {
                db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
                db.Updateable(curBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_ID, q.REQ_ORDER, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
                db.Insertable(batch, trans.UserCode).ExecuteCommand();
                db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH }).ExecuteCommand();
                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                db.Insertable(history, trans.UserCode).ExecuteCommand();
                if (orders.Any())
                {
                    db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand();
@@ -436,7 +549,7 @@
            if (dbTran.IsSuccess)
            {
                //action.LocaleMsg = Biz.L($"创建委外生产领料单[{0}]成功,来源单号如下:{1}");
                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.Success", curBatch.REQ_ORDER, string.Join(",", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.Success", batch.REQ_ORDER, string.Join(",", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER)));
            }
            else
            {
@@ -446,5 +559,88 @@
            }
            return action;
        }
        /// <summary>
        /// 调拨单完成发料
        /// </summary>
        /// <param name="trans"></param>
        /// <param name="range"></param>
        /// <returns></returns>
        private static async Task<ApiAction> TransferComplete(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range)
        {
            var action = new ApiAction();
            var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList();
            var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Transfer.GetActReqQty(q));
            if (noFinish.Any())
            {
                action.IsSuccessed = false;
                //action.LocaleMsg = Biz.L("备料任务[{0}]未能提交审核,未备料完成的行如下:{1}");
                action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.TransferComplete.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join(",", noFinish.Select(q => q.ORDER_LINE)));
                return action;
            }
            var batch = new BIZ_WMS_PREP_BTH()
            {
                AUTH_ORG = trans.CurPREP.Order.AUTH_ORG,
                ORDER_NO = trans.CurPREP.Order.ORDER_NO,
                DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}",
                STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(),
                PREP_PERSON = trans.UserCode,
                FINISH_TIME = DateTime.Now,
                REQ_PERSON = trans.UserCode,
                DLVY_TIME = DateTime.Now,
            };
            trans.CurPREP.Order.Batchs.Add(batch);
            foreach (var item in trans.CurPREP.Order.SourceDetails)
            {
                item.QTY_ACT_DLVY = item.QTY_ACT_REQ;
            }
            trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue();
            //var orders = trans.MainDB.Queryable<BIZ_WMS_TRANSFER>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList();
            //foreach (var item in orders)
            //{
            //    item.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue();
            //    item.PREP_PERSON = trans.UserCode;
            //    item.FINISH_TIME = DateTime.Now;
            //    item.REQ_PERSON = trans.UserCode;
            //    item.DLVY_TIME = DateTime.Now;
            //}
            var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList();
            var history = new List<WMS_ITEM_HIS>();
            foreach(var item in items)
            {
                item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue();
                history.Add(new WMS_ITEM_HIS(item, $"条码[{item.SN}]发料成功,操作单据[{item.TRANS_NO}]"));
            }
            //使用统一的事务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.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand();
                db.Insertable(batch, trans.UserCode).ExecuteCommand();
                db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO)
                    .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand();
                db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
                db.Insertable(history, trans.UserCode).ExecuteCommand();
                //db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.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
@@ -14,6 +14,7 @@
using Tiger.Model.Sharetronic.Shelf;
using MailKit.Search;
using Tiger.Business.WMS.Extensions;
using static Tiger.Model.BIZ_WMS_PREP_BTH;
namespace Tiger.Business.WMS.Transaction
{
@@ -171,8 +172,8 @@
            var action = new ApiAction<ScanOutput>(new ScanOutput());
            try
            {
                var inputDtl = input?.Data?.JsonToObject<BIZ_WMS_PREP_DTL>();
                var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == inputDtl.ID).First();
                var option = CurPREP.Option = new BaseInput<SuggestOption>(input).Data;
                var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == option.LineID).First();
                if (prepDtl.IsNullOrEmpty())
                {
                    action.IsSuccessed = false;
@@ -202,10 +203,10 @@
                }
                //如果是首套发料,则只推荐当前物料行的一盘物料
                if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.First.GetValue())
                if (option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.First)
                {
                    //推荐物料
                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, 1);
                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, option, input.AuthOption, 1);
                    action.LocaleMsg = result.LocaleMsg;
                    if (result.IsException)
                    {
@@ -232,11 +233,11 @@
                }
                //如果是正常发料,则按实际需求数量推荐当前物料行的所有物料
                if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.Supply.GetValue())
                if (option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.Supply)
                {
                    //推荐物料
                    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);
                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, option, input.AuthOption, actQty);
                    action.LocaleMsg = result.LocaleMsg;
                    if (result.IsException)
                    {
@@ -290,10 +291,6 @@
        {
            var action = new ApiAction<BIZ_WMS_PREP_DTL>();
            var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == CurPrepDtl.ID).First();
            prepDtl.ERP_WH = CurPrepDtl.ERP_WH;
            prepDtl.WH_ID = CurPrepDtl.WH_ID;
            prepDtl.REGION_ID = CurPrepDtl.REGION_ID;
            prepDtl.SHELF_ID = CurPrepDtl.SHELF_ID;
            prepDtl.Suggests = Suggests;
            CurPrepDtl = prepDtl;
            CurPREP.Order.Details.RemoveAll(q => q.ID == CurPrepDtl.ID);
@@ -467,7 +464,6 @@
                CurSn = CurInvItem.Items.Select(q => new BIZ_WMS_PREP_SN() {
                    ORDER_NO = CurPREP.Order.ORDER_NO,
                    ORDER_LINE = CurPrepDtl.ORDER_LINE,
                    ORDER_BATCH = CurPREP.Order.CurBatch.BATCH.ToString(),
                    SN = q.SN,
                    ITEM_CODE = q.ITEM_CODE,
                    UNIT = q.UNIT,
@@ -475,22 +471,21 @@
                    QTY_DLVY = q.QTY,
                    STATUS = q.STATUS,
                    LOTNO = q.LOTNO,
                    WH_ID = CurInvItem.Warehouse.ID,
                    WH_CODE = CurInvItem.Warehouse.WH_CODE,
                    REGION_ID = CurInvItem.Region.ID,
                    REGION_CODE = CurInvItem.Region.REGION_CODE,
                    SHELF_ID = CurInvItem.Shelf.ID,
                    SHELF_CODE = CurInvItem.Shelf.SHELF_CODE,
                    LOCATION_ID = CurInvItem.Location.ID,
                    LOCATION_CODE = CurInvItem.Location.LOCATION_CODE,
                    FTY_CODE = CurPREP.Order.CurBatch.FTY_CODE,
                    WS_CODE = CurPREP.Order.CurBatch.WS_CODE,
                    LINE_CODE = CurPREP.Order.CurBatch.LINE_CODE,
                    POST_CODE = CurPREP.Order.CurBatch.POST_CODE,
                    OPER_CODE = CurPREP.Order.CurBatch.OPER_CODE,
                    SEGMENT = CurPREP.Order.CurBatch.SEGMENT,
                    SMT_NO = CurPrepDtl.SMT_NO,
                    STATION_NO = CurPrepDtl.STATION_NO,
                    FEEDER_NO = CurPrepDtl.FEEDER_NO,
                    FEEDER_TYPE = CurPrepDtl.FEEDER_TYPE,
                    IS_FIRST = CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.First.GetValue() ? "Y" : "N",
                    IS_FIRST = CurPREP.Option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.First ? "Y" : "N",
                    NEED_CUTTING = "N",
                    TRACE_ID = TransID,
                }).ToList();
@@ -621,14 +616,11 @@
                    }
                    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 = CurPREP.Order.CurBatch.PICK_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : CurPREP.Order.CurBatch.PICK_TIME;
                    //创建变量克隆对象用于传入DBSubmitAction中保存当前需要暂存的数据值
                    var _CurSn = CurSn.Clone();
                    var _CurPrepDtl = CurPrepDtl.Clone();
                    var _CurPREPOrder = CurPREP.Order.Clone();
                    var _CurPREPCurBatch = CurPREP.Order.CurBatch.Clone();
                    AddCommitAction("UpdatePrep", () =>
                    {
                        //使用统一的事务DB对象
@@ -638,7 +630,6 @@
                        _CurPrepDtl.QTY_PREP = db.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == _CurPrepDtl.ORDER_NO && q.ORDER_LINE == _CurPrepDtl.ORDER_LINE).Sum(q => q.QTY_DLVY);
                        db.Updateable(_CurPrepDtl, UserCode).UpdateColumns(q => new { q.QTY_PREP, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                        db.Updateable(_CurPREPOrder, UserCode).UpdateColumns(q => new { q.STATUS, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                        db.Updateable(_CurPREPCurBatch, UserCode).UpdateColumns(q => new { q.STATUS, q.PICK_TIME, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                    });
                    //灭灯
@@ -790,13 +781,14 @@
        }
        /// <summary>
        /// 调用发料单据的ERP接口
        /// 创建发料批次以完成本次发料,调用发料单据的ERP接口
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<ApiAction> CommitToERP(BaseInput input)
        public async Task<ApiAction> GenerateDlvyBatch(BaseInput input)
        {
            var action = await CurPREP.Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>() .CommitToERP(this, input);
            var range = input.Data.ToInt32().GetEnum<BATCH_RANGEs>();
            var action = await CurPREP.Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>() .GenerateDlvyBatch(this, range);
            return action;
        }
Tiger.Controllers.WMS/Controllers/WMSController.Out_BIZ_WMS_PREP.cs
@@ -215,5 +215,51 @@
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
        /// <summary>
        /// GenerateDlvyBatch(ApiAction(BaseInput))
        /// 创建发料批次以完成本次发料,调用发料单据的ERP接口
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("api/[controller]/Out_PREP/GenerateDlvyBatch")]
        public async Task<IActionResult> Out_BIZ_WMS_PREP_GenerateDlvyBatchAsync([FromBody] ApiAction<BaseInput> action)
        {
            ApiAction response;
            IOut_BIZ_WMS_PREP trans = null;
            try
            {
                if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
                {
                    trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IOut_BIZ_WMS_PREP;
                    if (!trans.IsFinished)
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(await trans.GenerateDlvyBatch(action.Data));
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.GenerateDlvyBatch(action.Data).Result); }
                        }
                    }
                    else
                    {
                        response = action.GetResponse($"Transaction Error: 备料任务下架事务[ID:{action.ID}]已经关闭,请重新打开备料任务下架功能", false);
                    }
                }
                else
                {
                    response = action.GetResponse($"Transaction Error: 备料任务下架事务[ID:{action.ID}]数据丢失,请重新打开备料任务下架功能", false);
                }
            }
            catch (System.Exception ex)
            {
                response = action.GetResponse().CatchExceptionWithLog(ex);
            }
            trans?.AddHistory(Request, action);
            return Ok(response);
        }
    }//endClass
}
Tiger.IBusiness.WMS/Transaction/IOut_BIZ_WMS_PREP.cs
@@ -32,6 +32,13 @@
        /// <returns></returns>
        public Task<ApiAction<BIZ_WMS_PREP_DTL>> GetCurPrepItem();
        /// <summary>
        /// 创建发料批次以完成本次发料,调用发料单据的ERP接口
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public Task<ApiAction> GenerateDlvyBatch(BaseInput input);
        public bool Close(bool needSaveHistoryLog = false);
    }
}
Tiger.Model.Net/Entitys/WMS/Api/Input_Entitys.cs
@@ -100,6 +100,49 @@
        public string Code { get; set; }
    }
    /// <summary>
    /// 备料物料推荐选项
    /// </summary>
    public class SuggestOption
    {
        /// <summary>
        /// 当前备料行的行ID
        /// </summary>
        public string LineID { get; set; }
        /// <summary>
        /// ERP仓库编码
        /// </summary>
        public string ErpWH { get; set; }
        /// <summary>
        /// 仓库ID
        /// </summary>
        public string WHID { get; set; }
        /// <summary>
        /// 储区ID
        /// </summary>
        public string RegionID { get; set; }
        /// <summary>
        /// 货架ID
        /// </summary>
        public string ShelfID { get; set; }
        /// <summary>
        /// 储位ID
        /// </summary>
        public string LocationID { get; set; }
        /// <summary>
        /// 发料策略
        /// </summary>
        public WMS_ITEM_POOL.STRATEGYs Strategy { get; set; } = WMS_ITEM_POOL.STRATEGYs.FIFO;
        /// <summary>
        /// 发料方式
        /// </summary>
        public WMS_ITEM_POOL.DLVY_MODEs DlvyMode { get; set; } = WMS_ITEM_POOL.DLVY_MODEs.Supply;
        /// <summary>
        /// 是否要锁定物料
        /// </summary>
        public bool NeedLock { get; set; } = false;
    }
    public class OutOthDtlInput : BasePageInput
    {
        public bool IsItemCodeList { get; set; }
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
@@ -91,8 +91,6 @@
        [SugarColumn(IsIgnore = true)]
        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.Sended.GetValue());
        #endregion
        #region 外键属性
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_BTH.cs
@@ -7,240 +7,253 @@
namespace Tiger.Model
{
    /// <summary>
    /// 实体:备料任务(WMS)发料批次
    /// 实体:备料任务(WMS)发料批次
    /// </summary>
    [Description("Primary:ID")]
    [DisplayName("备料任务(WMS)发料批次")]
    [DisplayName("备料任务(WMS)发料批次")]
    [Serializable]
    [SugarTable("BIZ_WMS_PREP_BTH")]
    public class BIZ_WMS_PREP_BTH : DbEntityWithAuth
    {
        #region 构造函数
        #region 构造函数
        /// <summary>
        /// 实体:备料任务(WMS)发料批次
        /// 实体:备料任务(WMS)发料批次
        /// </summary>
        public BIZ_WMS_PREP_BTH() {}
        #endregion
        #region 公共属性
        #region 公共属性
        /// <summary>
        /// 备料任务号
        /// 备料任务号
        /// </summary>
        [DisplayName("备料任务号")]
        [DisplayName("备料任务号")]
        public string ORDER_NO { get; set; }
        /// <summary>
        /// 发料批次
        /// 发料批次
        /// </summary>
        [DisplayName("发料批次")]
        public int BATCH { get; set; }
        [DisplayName("发料批次")]
        public string DLVY_BATCH { get; set; }
        /// <summary>
        /// 备料方式(0Whole整单备料|1SideA/A面备料|2SideB/B面备料)
        /// 备料方式(0Whole整单备料|1SideA/A面备料|2SideB/B面备料)
        /// </summary>
        [DisplayName("备料方式(0Whole整单备料|1SideA/A面备料|2SideB/B面备料)")]
        [DisplayName("备料方式(0Whole整单备料|1SideA/A面备料|2SideB/B面备料)")]
        public int PREP_MODE { get; set; }
        /// <summary>
        /// 发料方式(0Supply正常发料|1First首套发料)
        /// 发料方式(0Supply正常发料|1First首套发料)
        /// </summary>
        [DisplayName("发料方式(0Supply正常发料|1First首套发料)")]
        [DisplayName("发料方式(0Supply正常发料|1First首套发料)")]
        public int DLVY_MODE { get; set; }
        /// <summary>
        /// 状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)
        /// 状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)
        /// </summary>
        [DisplayName("状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)")]
        [DisplayName("状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)")]
        public int STATUS { get; set; }
        /// <summary>
        /// 工厂编码
        /// 工厂编码
        /// </summary>
        [DisplayName("工厂编码")]
        [DisplayName("工厂编码")]
        public string FTY_CODE { get; set; }
        /// <summary>
        /// 车间编码
        /// 车间编码
        /// </summary>
        [DisplayName("车间编码")]
        [DisplayName("车间编码")]
        public string WS_CODE { get; set; }
        /// <summary>
        /// 产线编码
        /// 产线编码
        /// </summary>
        [DisplayName("产线编码")]
        [DisplayName("产线编码")]
        public string LINE_CODE { get; set; }
        /// <summary>
        /// 岗位编码
        /// 岗位编码
        /// </summary>
        [DisplayName("岗位编码")]
        [DisplayName("岗位编码")]
        public string POST_CODE { get; set; }
        /// <summary>
        /// 工序编码
        /// 工序编码
        /// </summary>
        [DisplayName("工序编码")]
        [DisplayName("工序编码")]
        public string OPER_CODE { get; set; }
        /// <summary>
        /// 加工段
        /// 加工段
        /// </summary>
        [DisplayName("加工段")]
        [DisplayName("加工段")]
        public string SEGMENT { get; set; }
        /// <summary>
        /// 叫料时间
        /// 叫料时间
        /// </summary>
        [DisplayName("叫料时间")]
        [DisplayName("叫料时间")]
        public DateTime CALL_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 计划完成时间
        /// 计划完成时间
        /// </summary>
        [DisplayName("计划完成时间")]
        [DisplayName("计划完成时间")]
        public DateTime PLAN_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 备料开始时间
        /// 备料开始时间
        /// </summary>
        [DisplayName("备料开始时间")]
        [DisplayName("备料开始时间")]
        public DateTime PICK_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 备料优先级(1-7)越小越优先
        /// 备料优先级(1-7)越小越优先
        /// </summary>
        [DisplayName("备料优先级(1-7)越小越优先")]
        [DisplayName("备料优先级(1-7)越小越优先")]
        public int PRIORITY { get; set; }
        /// <summary>
        /// 备料人
        /// 备料人
        /// </summary>
        [DisplayName("备料人")]
        [DisplayName("备料人")]
        public string PREP_PERSON { get; set; }
        /// <summary>
        /// 备料完成时间
        /// 备料完成时间
        /// </summary>
        [DisplayName("备料完成时间")]
        [DisplayName("备料完成时间")]
        public DateTime FINISH_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 关联领料单ID
        /// 关联领料单ID
        /// </summary>
        [DisplayName("关联领料单ID")]
        [DisplayName("关联领料单ID")]
        public string REQ_ID { get; set; }
        /// <summary>
        /// 关联领料单号
        /// 关联领料单号
        /// </summary>
        [DisplayName("关联领料单号")]
        [DisplayName("关联领料单号")]
        public string REQ_ORDER { get; set; }
        /// <summary>
        /// 领料人
        /// 领料人
        /// </summary>
        [DisplayName("领料人")]
        [DisplayName("领料人")]
        public string REQ_PERSON { get; set; }
        /// <summary>
        /// 领料部门
        /// 领料部门
        /// </summary>
        [DisplayName("领料部门")]
        [DisplayName("领料部门")]
        public string REQ_DEPT { get; set; }
        /// <summary>
        /// 领料出库时间
        /// 领料出库时间
        /// </summary>
        [DisplayName("领料出库时间")]
        [DisplayName("领料出库时间")]
        public DateTime DLVY_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 备注
        /// 备注
        /// </summary>
        [DisplayName("备注")]
        [DisplayName("备注")]
        public string REMARK { get; set; }
        /// <summary>
        /// -1:未处理,0:同步处理完,>0:同步处理失败次数
        /// -1:未处理,0:同步处理完,>0:同步处理失败次数
        /// </summary>
        [DisplayName("-1:未处理,0:同步处理完,>0:同步处理失败次数")]
        [DisplayName("-1:未处理,0:同步处理完,>0:同步处理失败次数")]
        public int HANDLED { get; set; } = -1;
        /// <summary>
        /// 最后一次同步处理日期
        /// 最后一次同步处理日期
        /// </summary>
        [DisplayName("最后一次同步处理日期")]
        [DisplayName("最后一次同步处理日期")]
        public DateTime HANDLED_DATE { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 过账提交的JSON
        /// 过账提交的JSON
        /// </summary>
        [DisplayName("过账提交的JSON")]
        [DisplayName("过账提交的JSON")]
        public string COMMIT_JSON { get; set; }
        /// <summary>
        /// 过账提交的返回信息
        /// 过账提交的返回信息
        /// </summary>
        [DisplayName("过账提交的返回信息")]
        [DisplayName("过账提交的返回信息")]
        public string COMMIT_MSG { get; set; }
        #endregion
        #endregion
        #region 虚拟属性
        /*例子
        #region 虚拟属性
        /*例子
        [SugarColumn(IsIgnore = true)]
        public string FieldName { get; set; }
        */
        #endregion
        #endregion
        #region 外键属性
        /*例子
        //一对一外键导航
        [Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是BIZ_WMS_PREP_BTH类里面的外键ID字段
        public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
        //一对多外键导航
        [Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_WMS_PREP_BTHId))]//ClassA表中的BIZ_WMS_PREP_BTHId
        public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
        //多对多外键导航
        [Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_BTHId), nameof(MappingClass.ClassAId))]//注意顺序
        public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
        #region 外键属性
        /*例子
        //一对一外键导航
        [Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是BIZ_WMS_PREP_BTH类里面的外键ID字段
        public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
        //一对多外键导航
        [Navigate(NavigateType.OneToMany, nameof(ClassA.BIZ_WMS_PREP_BTHId))]//ClassA表中的BIZ_WMS_PREP_BTHId
        public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
        //多对多外键导航
        [Navigate(typeof(MappingClass), nameof(MappingClass.BIZ_WMS_PREP_BTHId), nameof(MappingClass.ClassAId))]//注意顺序
        public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
        */
        #endregion
        #endregion
        #region 枚举变量
        /*例子
        #region 枚举变量
        /*例子
        public enum FieldNames
        {
            [Description("枚举描述0")]
            [Description("枚举描述0")]
            Enum0,
            [Description("枚举描述1")]
            [Description("枚举描述1")]
            Enum1,
        }
        */
        /// <summary>
        /// 枚举:备料方式(0Whole整单备料|1SideA/A面备料|2SideB/B面备料)
        /// </summary>
        public enum PREP_MODEs
        /// <summary>
        /// 枚举:生成范围(0CurTrans本次操作|1CurWH当前仓库|2Whole当前单据)
        /// </summary>
        public enum BATCH_RANGEs
        {
            [Description("本次操作")]
            CurTrans = 0,
            [Description("当前仓库")]
            CurWH = 1,
            [Description("当前单据")]
            Whole = 2,
        }
        /// <summary>
        /// 枚举:备料方式(0Whole整单备料|1SideA/A面备料|2SideB/B面备料)
        /// </summary>
        public enum PREP_MODEs
        {
            [Description("整单备料")]
            [Description("整单备料")]
            Whole = 0,
            [Description("A面备料")]
            [Description("A面备料")]
            SideA = 1,
            [Description("B面备料")]
            [Description("B面备料")]
            SideB = 2,
        }
        /// <summary>
        /// 枚举:发料方式(0Supply正常发料|1First首套发料)
        /// 枚举:发料方式(0Supply正常发料|1First首套发料)
        /// </summary>
        public enum DLVY_MODEs
        {
            [Description("正常发料")]
            [Description("正常发料")]
            Supply = 0,
            [Description("首套发料")]
            [Description("首套发料")]
            First = 1,
        }
        /// <summary>
        /// 枚举:状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)
        /// 枚举:状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)
        /// </summary>
        public enum STATUSs
        {
            [Description("初始化")]
            [Description("初始化")]
            Init = 0,
            [Description("已叫料")]
            [Description("已叫料")]
            Called = 1,
            [Description("待捡料")]
            [Description("待捡料")]
            WaitPick = 2,
            [Description("捡料中")]
            [Description("捡料中")]
            Picking = 3,
            [Description("已捡完")]
            [Description("已捡完")]
            Picked = 4,
            [Description("已发料")]
            [Description("已发料")]
            Sended = 5,
            [Description("已关闭")]
            [Description("已关闭")]
            Close = 6,
            [Description("作废")]
            [Description("作废")]
            Cancel = 7,
        }
        #endregion
        #region 公共方法
        #region 公共方法
        #endregion
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_DTL.cs
@@ -176,14 +176,6 @@
        public string FieldName { get; set; }
        */
        [SugarColumn(IsIgnore = true)]
        public string ERP_WH { get; set; }
        [SugarColumn(IsIgnore = true)]
        public string WH_ID { get; set; }
        [SugarColumn(IsIgnore = true)]
        public string REGION_ID { get; set; }
        [SugarColumn(IsIgnore = true)]
        public string SHELF_ID { get; set; }
        [SugarColumn(IsIgnore = true)]
        public List<SuggestItem> Suggests { get; set; }
        #endregion
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP_SN.cs
@@ -37,7 +37,7 @@
        /// 发料批次
        /// </summary>
        [DisplayName("发料批次")]
        public string ORDER_BATCH { get; set; }
        public string DLVY_BATCH { get; set; }
        /// <summary>
        /// 物品标签
        /// </summary>
@@ -78,30 +78,50 @@
        /// </summary>
        [DisplayName("状态(同WMS_ITEM状态)")]
        public int STATUS { get; set; }
        /// <summary>
        /// 发料仓库
        /// </summary>
        [DisplayName("发料仓库")]
        public string WH_CODE { get; set; }
        /// <summary>
        /// 发料储区
        /// </summary>
        [DisplayName("发料储区")]
        public string REGION_CODE { get; set; }
        /// <summary>
        /// 发料货架/料车
        /// </summary>
        [DisplayName("发料货架/料车")]
        public string SHELF_CODE { get; set; }
        /// <summary>
        /// 发料储位
        /// </summary>
        [DisplayName("发料储位")]
        public string LOCATION_CODE { get; set; }
        /// <summary>
        /// 下架时间
        /// </summary>
        [DisplayName("下架时间")]
        /// <summary>
        /// 发料仓库ID
        /// </summary>
        [DisplayName("发料仓库ID")]
        public string WH_ID { get; set; }
        /// <summary>
        /// 发料仓库
        /// </summary>
        [DisplayName("发料仓库")]
        public string WH_CODE { get; set; }
        /// <summary>
        /// 发料储区ID
        /// </summary>
        [DisplayName("发料储区ID")]
        public string REGION_ID { get; set; }
        /// <summary>
        /// 发料储区
        /// </summary>
        [DisplayName("发料储区")]
        public string REGION_CODE { get; set; }
        /// <summary>
        /// 发料货架/料车ID
        /// </summary>
        [DisplayName("发料货架/料车ID")]
        public string SHELF_ID { get; set; }
        /// <summary>
        /// 发料货架/料车
        /// </summary>
        [DisplayName("发料货架/料车")]
        public string SHELF_CODE { get; set; }
        /// <summary>
        /// 发料储位ID
        /// </summary>
        [DisplayName("发料储位ID")]
        public string LOCATION_ID { get; set; }
        /// <summary>
        /// 发料储位
        /// </summary>
        [DisplayName("发料储位")]
        public string LOCATION_CODE { get; set; }
        /// <summary>
        /// 下架时间
        /// </summary>
        [DisplayName("下架时间")]
        public DateTime DOWN_TIME { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 出库时间
@@ -193,6 +213,16 @@
        /// </summary>
        [DisplayName("备注")]
        public string REMARK { get; set; }
        /// <summary>
        /// 追溯ID
        /// </summary>
        [DisplayName("追溯ID")]
        public string TRACE_ID { get; set; }
        /// <summary>
        /// 追溯信息
        /// </summary>
        [DisplayName("追溯信息")]
        public string TRACE_INFO { get; set; }
        #endregion
        #region 虚拟属性
Tiger.Model.Net/Entitys/WMS/V_ITEM_BIZ_ERP_RECEIPT_SN.cs
@@ -34,7 +34,7 @@
        /// </summary>
        public string ITEM_CODE { get; set; }
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public int STATUS { get; set; }
        /// <summary>
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM.cs
@@ -46,7 +46,7 @@
        /// </summary>
        public string SN_TYPE { get; set; }
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public int STATUS { get; set; }
        /// <summary>
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_A.cs
@@ -46,7 +46,7 @@
        /// </summary>
        public string SN_TYPE { get; set; }
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public int STATUS { get; set; }
        /// <summary>
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_D.cs
@@ -46,7 +46,7 @@
        /// </summary>
        public string SN_TYPE { get; set; }
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public int STATUS { get; set; }
        /// <summary>
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_HIS.cs
@@ -48,7 +48,7 @@
        /// </summary>
        public string SN_TYPE { get; set; }
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public int STATUS { get; set; }
        /// <summary>
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_X.cs
@@ -46,7 +46,7 @@
        /// </summary>
        public string SN_TYPE { get; set; }
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public int STATUS { get; set; }
        /// <summary>
Tiger.Model.Net/Entitys/WMS/V_WMS_ITEM_Y.cs
@@ -46,7 +46,7 @@
        /// </summary>
        public string SN_TYPE { get; set; }
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public int STATUS { get; set; }
        /// <summary>
Tiger.Model.Net/Entitys/WMS/WMS_ITEM.cs
@@ -45,7 +45,7 @@
        public string SN_TYPE { get; set; }
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public int STATUS { get; set; }
@@ -204,7 +204,7 @@
        #region 枚举变量
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public enum STATUSs
        {
@@ -235,6 +235,9 @@
            [Description("已发料")]
            Sended = 60,
            [Description("被接收")]
            Received = 65,
            [Description("已上料")]
            Loaded = 70,
Tiger.Model.Net/Entitys/WMS/WMS_ITEM_HIS.cs
@@ -74,7 +74,7 @@
        /// </summary>
        public string SN_TYPE { get; set; }
        /// <summary>
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// 储存状态(0NotExists不存在|10Incoming送货中|20WaitTest待检验|21Rejected需退货|30WaitIn待入库|40InStore在库|50OffShelf已下架|60Sended已发料|65Received被接收|70Loaded已上料|80UseUp已耗尽|90Returned已退料|100Shipped已出货)
        /// </summary>
        public int STATUS { get; set; }
        /// <summary>
Tiger.Model.Net/Entitys/WMS/WMS_ITEM_POOL.cs
@@ -7,235 +7,237 @@
namespace Tiger.Model
{
    /// <summary>
    /// 实体:备料库存池
    /// 实体:备料库存池
    /// </summary>
    [Description("Primary:ID")]
    [DisplayName("备料库存池")]
    [DisplayName("备料库存池")]
    [Serializable]
    [SugarTable("WMS_ITEM_POOL")]
    public class WMS_ITEM_POOL : DbEntityNoGhostWithAuth
    {
        #region 构造函数
        #region 构造函数
        /// <summary>
        /// 实体:备料库存池
        /// 实体:备料库存池
        /// </summary>
        public WMS_ITEM_POOL() {}
        #endregion
        #region 公共属性
        #region 公共属性
        /// <summary>
        /// 事务ID
        /// 事务ID
        /// </summary>
        [DisplayName("事务ID")]
        [DisplayName("事务ID")]
        public string TRANS_ID { get; set; }
        /// <summary>
        /// 业务单据编码
        /// 业务单据编码
        /// </summary>
        [DisplayName("业务单据编码")]
        [DisplayName("业务单据编码")]
        public string TRANS_CODE { get; set; }
        /// <summary>
        /// 业务单据号码
        /// 业务单据号码
        /// </summary>
        [DisplayName("业务单据号码")]
        [DisplayName("业务单据号码")]
        public string TRANS_NO { get; set; }
        /// <summary>
        /// 业务单据行号
        /// 业务单据行号
        /// </summary>
        [DisplayName("业务单据行号")]
        [DisplayName("业务单据行号")]
        public string TRANS_LINE { get; set; }
        /// <summary>
        /// 来源单据编码
        /// 来源单据编码
        /// </summary>
        [DisplayName("来源单据编码")]
        [DisplayName("来源单据编码")]
        public string SOURCE_CODE { get; set; }
        /// <summary>
        /// 来源单据号码
        /// 来源单据号码
        /// </summary>
        [DisplayName("来源单据号码")]
        [DisplayName("来源单据号码")]
        public string SOURCE_ORDER { get; set; }
        /// <summary>
        /// 来源单据行号
        /// 来源单据行号
        /// </summary>
        [DisplayName("来源单据行号")]
        [DisplayName("来源单据行号")]
        public string SOURCE_LINE { get; set; }
        /// <summary>
        /// 备料策略(位标志枚举)(1FIFO先进先出|2FSFO/尾数优先)
        /// 备料策略(位标志枚举)(0None不启用|1FIFO先进先出|2FSFO/尾数优先)
        /// </summary>
        [DisplayName("备料策略(位标志枚举)(1FIFO先进先出|2FSFO/尾数优先)")]
        [DisplayName("备料策略(位标志枚举)(0None不启用|1FIFO先进先出|2FSFO/尾数优先)")]
        public int STRATEGY { get; set; }
        /// <summary>
        /// 发料方式(0Supply正常发料|1First首套发料)
        /// 发料方式(0Supply正常发料|1First首套发料)
        /// </summary>
        [DisplayName("发料方式(0Supply正常发料|1First首套发料)")]
        [DisplayName("发料方式(0Supply正常发料|1First首套发料)")]
        public int DLVY_MODE { get; set; }
        /// <summary>
        /// 是否被锁定(Y/N),锁定则不允许其他事务分配当前物料
        /// 是否被锁定(Y/N),锁定则不允许其他事务分配当前物料
        /// </summary>
        [DisplayName("是否被锁定(Y/N),锁定则不允许其他事务分配当前物料")]
        [DisplayName("是否被锁定(Y/N),锁定则不允许其他事务分配当前物料")]
        public string IS_LOCKED { get; set; }
        /// <summary>
        /// 物料编码
        /// 物料编码
        /// </summary>
        [DisplayName("物料编码")]
        [DisplayName("物料编码")]
        public string ITEM_CODE { get; set; }
        /// <summary>
        /// 物料条码
        /// 物料条码
        /// </summary>
        [DisplayName("物料条码")]
        [DisplayName("物料条码")]
        public string SN { get; set; }
        /// <summary>
        /// 物料数量
        /// 物料数量
        /// </summary>
        [DisplayName("物料数量")]
        [DisplayName("物料数量")]
        public double QTY { get; set; }
        /// <summary>
        /// 已分配数量
        /// 已分配数量
        /// </summary>
        [DisplayName("已分配数量")]
        [DisplayName("已分配数量")]
        public double ALLOC_QTY { get; set; }
        /// <summary>
        /// 生产日期
        /// 生产日期
        /// </summary>
        [DisplayName("生产日期")]
        [DisplayName("生产日期")]
        public DateTime PROD_DATE { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 仓库ID
        /// 仓库ID
        /// </summary>
        [DisplayName("仓库ID")]
        [DisplayName("仓库ID")]
        public string WH_ID { get; set; }
        /// <summary>
        /// 储区ID
        /// 储区ID
        /// </summary>
        [DisplayName("储区ID")]
        [DisplayName("储区ID")]
        public string REGION_ID { get; set; }
        /// <summary>
        /// 货架/料车ID
        /// 货架/料车ID
        /// </summary>
        [DisplayName("货架/料车ID")]
        [DisplayName("货架/料车ID")]
        public string SHELF_ID { get; set; }
        /// <summary>
        /// 储位ID
        /// 储位ID
        /// </summary>
        [DisplayName("储位ID")]
        [DisplayName("储位ID")]
        public string LOCATION_ID { get; set; }
        /// <summary>
        /// 是否首套料(Y/N)
        /// 是否首套料(Y/N)
        /// </summary>
        [DisplayName("是否首套料(Y/N)")]
        [DisplayName("是否首套料(Y/N)")]
        public string IS_FIRST { get; set; }
        /// <summary>
        /// 分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
        /// 分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
        /// </summary>
        [DisplayName("分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)")]
        [DisplayName("分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)")]
        public int ALLOC_MODE { get; set; }
        /// <summary>
        /// 状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)
        /// 状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)
        /// </summary>
        [DisplayName("状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)")]
        [DisplayName("状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)")]
        public int STATUS { get; set; }
        /// <summary>
        /// 加工段
        /// 加工段
        /// </summary>
        [DisplayName("加工段")]
        [DisplayName("加工段")]
        public string SEGMENT { get; set; }
        /// <summary>
        /// 目标产线编码
        /// 目标产线编码
        /// </summary>
        [DisplayName("目标产线编码")]
        [DisplayName("目标产线编码")]
        public string LINE_CODE { get; set; }
        /// <summary>
        /// 备注
        /// 备注
        /// </summary>
        [DisplayName("备注")]
        [DisplayName("备注")]
        public string REMARK { get; set; }
        #endregion
        #region 虚拟属性
        /*例子
        #region 虚拟属性
        /*例子
        [SugarColumn(IsIgnore = true)]
        public string FieldName { get; set; }
        */
        #endregion
        #region 外键属性
        /*例子
        //一对一外键导航
        [Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是WMS_ITEM_POOL类里面的外键ID字段
        public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
        //一对多外键导航
        [Navigate(NavigateType.OneToMany, nameof(ClassA.WMS_ITEM_POOLId))]//ClassA表中的WMS_ITEM_POOLId
        public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
        //多对多外键导航
        [Navigate(typeof(MappingClass), nameof(MappingClass.WMS_ITEM_POOLId), nameof(MappingClass.ClassAId))]//注意顺序
        public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
        #region 外键属性
        /*例子
        //一对一外键导航
        [Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是WMS_ITEM_POOL类里面的外键ID字段
        public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
        //一对多外键导航
        [Navigate(NavigateType.OneToMany, nameof(ClassA.WMS_ITEM_POOLId))]//ClassA表中的WMS_ITEM_POOLId
        public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
        //多对多外键导航
        [Navigate(typeof(MappingClass), nameof(MappingClass.WMS_ITEM_POOLId), nameof(MappingClass.ClassAId))]//注意顺序
        public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
        */
        #endregion
        #region 枚举变量
        /*例子
        #region 枚举变量
        /*例子
        public enum FieldNames
        {
            [Description("枚举描述0")]
            [Description("枚举描述0")]
            Enum0,
            [Description("枚举描述1")]
            [Description("枚举描述1")]
            Enum1,
        }
        */
        /// <summary>
        /// 枚举:备料策略(位标志枚举)(1FIFO先进先出|2FSFO/尾数优先)
        /// 枚举:备料策略(位标志枚举)(0None不启用|1FIFO先进先出|2FSFO/尾数优先)
        /// </summary>
        public enum STRATEGYs
        {
            [Description("先进先出")]
            [Description("不启用")]
            None = 0,
            [Description("先进先出")]
            FIFO = 1,
            [Description("尾数优先")]
            [Description("尾数优先")]
            FSFO = 2,
        }
        /// <summary>
        /// 枚举:发料方式(0Supply正常发料|1First首套发料)
        /// 枚举:发料方式(0Supply正常发料|1First首套发料)
        /// </summary>
        public enum DLVY_MODEs
        {
            [Description("正常发料")]
            [Description("正常发料")]
            Supply = 0,
            [Description("首套发料")]
            [Description("首套发料")]
            First = 1,
        }
        /// <summary>
        /// 枚举:分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
        /// 枚举:分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
        /// </summary>
        public enum ALLOC_MODEs
        {
            [Description("全部分配")]
            [Description("全部分配")]
            AllAllocated = 0,
            [Description("部分分配")]
            [Description("部分分配")]
            PartialAllocate = 1,
        }
        /// <summary>
        /// 枚举:状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)
        /// 枚举:状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)
        /// </summary>
        public enum STATUSs
        {
            [Description("待捡料")]
            [Description("待捡料")]
            WaitPick = 0,
            [Description("捡料中")]
            [Description("捡料中")]
            Picking = 1,
            [Description("待发料")]
            [Description("待发料")]
            WaitSend = 2,
            [Description("已发料")]
            [Description("已发料")]
            Sended = 3,
            [Description("已关闭")]
            [Description("已关闭")]
            Close = 4,
            [Description("作废")]
            [Description("作废")]
            Cancel = 5,
        }
        #endregion
        #region 公共方法
        #region 公共方法
        #endregion