服务端的TigerApi 框架,基于.NET6 2024 版本
318f08db1998f6a9e08f05ec8edc5aec4aad7882..531f16f2f15bf792e3e719e00abb57a95356dedd
9 天以前 Rodney Chen
Merge branch 'master' of http://47.115.28.255:8110/r/TigerClouds-Tech/Serve...
531f16 对比 | 目录
9 天以前 Rodney Chen
优化了一些已知问题
7e73e5 对比 | 目录
已修改7个文件
377 ■■■■■ 文件已修改
Tiger.Business.MES/iERP/U9C_MES.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Extensions/Yada/OutExtension.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_U9_MISC_OUT_DTL.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_TRANSFER_DTL.cs 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/WMS/WMS_ITEM_POOL.cs 284 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/iERP/U9C_MES.cs
@@ -31,11 +31,11 @@
        public ApiAction GetBasItem(U9C_Base_Input input)
        {
            var action = new ApiAction();
            var db = Biz.Db;
            Logger.Scheduler.Info($"物料信息开始同步。。。数据检查进行中。。。");
            Logger.Scheduler.Info($"{input.triggerDetail}");
            DbClient db = Biz.DataSource["YadaU9C"].Client;
            var list = db.Queryable<dynamic>().AS("mes_ItemMaster").Where("ModifiedOn > @startTime And ModifiedOn < @endTime", new { startTime = input.startTime, endTime = input.endTime }).ToList();
            var orgs = Biz.Db.Queryable<SYS_ORGANIZATION>().ToList();
            var list = Biz.DataSource["YadaU9C"].Client.Queryable<dynamic>().AS("mes_ItemMaster").Where("ModifiedOn > @startTime And ModifiedOn < @endTime", new { startTime = input.startTime, endTime = input.endTime }).ToList();
            var orgs = db.Queryable<SYS_ORGANIZATION>().ToList();
            List<BAS_ITEM> items = new();
            var itemExts = new List<BAS_ITEM_EXT>();
            if (list != null && list.Count > 0)
@@ -67,6 +67,13 @@
                            RULE_CODE = di["BarRule"] == null ? "" : di["BarRule"].ToString(),
                            DEFAULT_LOCATION = di["BinCode"] == null ? "" : di["BinCode"].ToString(),
                        };
                        var whUnit = db.Queryable<V_WH_UNIT>().Where(t => t.LOCATION_CODE == basItem.DEFAULT_LOCATION && t.AUTH_ORG == basItem.AUTH_ORG).First();
                        if (!whUnit.IsNullOrEmpty())
                        {
                            basItem.DEFAULT_WH = whUnit.WH_CODE;
                            basItem.DEFAULT_REGION = whUnit.REGION_CODE;
                            basItem.DEFAULT_SHELF = whUnit.SHELF_CODE;
                        }
                        items.Add(basItem);
                        var extInfo = new BAS_ITEM_EXT()
                        {
@@ -88,7 +95,7 @@
                }
            }
            Logger.Scheduler.Info($"物料信息存入实体中,总数:[{items.Count}]");
            db = Biz.Db;
            //var dbTran = db.UseTran(() =>
            //{
            if (items.Any())
Tiger.Business.WMS/Extensions/Yada/OutExtension.cs
@@ -12,8 +12,6 @@
using Tiger.Model.Base;
using Tiger.Model.Entitys.MES.U9C;
using Tiger.Model.MES.Yada;
using static IronPython.SQLite.PythonSQLite;
using static Microsoft.Scripting.Hosting.Shell.ConsoleHostOptions;
namespace Tiger.Business.WMS.Extensions
{
@@ -37,6 +35,8 @@
                    return nameof(BIZ_MES_WO);
                case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
                    return nameof(BIZ_U9_SCM_OUT);
                case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
                    return nameof(BIZ_WMS_TRANSFER);
                case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                default:
                    return "";
@@ -73,6 +73,12 @@
                        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;
@@ -93,6 +99,7 @@
                case BIZ_WMS_PREP.BIZ_TYPEs.Others:
                case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
                case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
                case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
                case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                default:
                    return dtl.QTY_REQ;
@@ -116,6 +123,7 @@
                    return await CreateIssueDoc(trans, input);
                case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
                    return await CreatePMIssueDoc(trans, input);
                case BIZ_WMS_PREP.BIZ_TYPEs.Transfer:
                case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
                default:
                    throw new NotImplementedException($"发料单据类型[{type.GetDesc()}]未实现ERP接口调用");
Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
@@ -415,6 +415,14 @@
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemIsLock", inv.CurPkg.SN);
                    return SetOutPutMqttMsg(action, input.Locale);
                }
                //验证条码是否被其他用户和单据锁定
                if (inv.Items.Any(q => q.IS_LOCKED == "Y"))
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("条码[{0}]已被锁定,请重新扫描");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemIsLock", inv.CurPkg.SN);
                    return SetOutPutMqttMsg(action, input.Locale);
                }
                //储位验证
                if (inv.Location.IsNullOrEmpty())
                {
@@ -432,13 +440,22 @@
                    return SetOutPutMqttMsg(action, input.Locale);
                }
                //判断是否在备料中的物料
                if (!CurPREP.Order.Details.Any(q => q.ITEM_CODE == inv.ItemInfo.ITEM_CODE))
                if (inv.ItemInfo.ITEM_CODE != CurPrepDtl.ITEM_CODE)
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L($"当前备料任务[{0}]不包含条码[{1}]的物料编码[{2}],请放回原储位");
                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
                    //action.LocaleMsg = Biz.L($"条码[{0}]不是当前选中的物料行[{1}],请放回原储位或者重新选择下架物料行");
                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.CurPkg.SN, CurPrepDtl.ITEM_CODE);
                    return action;
                }
                //判断是否在备料中的物料
                //if (!CurPREP.Order.Details.Any(q => q.ITEM_CODE == inv.ItemInfo.ITEM_CODE))
                //{
                //    action.IsSuccessed = false;
                //    //action.LocaleMsg = Biz.L($"当前备料任务[{0}]不包含条码[{1}]的物料编码[{2}],请放回原储位");
                //    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
                //    return action;
                //}
                //ProcessingOrderDetail = input.SN;
                //if (WMSContext.TransactionDic.Where(q => !string.IsNullOrWhiteSpace(q.Value.ProcessingSn)).Any(q => q.Value.ProcessingSn == ProcessingSn && q.Value.TransID != this.TransID))
                //{
Tiger.Model.Net/Entitys/WMS/BIZ_U9_MISC_OUT_DTL.cs
@@ -155,7 +155,7 @@
                AUTH_ORG = AUTH_ORG,
                ITEM_CODE = ITEM_CODE,
                UNIT = UNIT,
                SOURCE_CODE = nameof(BIZ_U9_SCM_OUT),
                SOURCE_CODE = nameof(BIZ_U9_MISC_OUT),
                SOURCE_ORDER = ORDER_NO,
                SOURCE_LINE = LINE_NO,
                QTY_REQ = QTY,
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_PREP.cs
@@ -141,9 +141,11 @@
            Requisition = 1,
            [Description("工单备料")]
            WorkOrder = 2,
            [Description("委外备料")]
            Outsourcing = 3,
        }
            [Description("委外备料")]
            Outsourcing = 3,
            [Description("调拨备料")]
            Transfer = 4,
        }
        /// <summary>
        /// 枚举:状态(0Init初始化|1Called已叫料|2WaitPick待捡料|3Picking捡料中|4Picked已捡完|5Sended已发料|6Close已关闭|7Cancel作废)
Tiger.Model.Net/Entitys/WMS/BIZ_WMS_TRANSFER_DTL.cs
@@ -3,6 +3,7 @@
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using Tiger.Model.Base;
namespace Tiger.Model
{
@@ -13,8 +14,8 @@
    [DisplayName("调拨单(WMS)明细")]
    [Serializable]
    [SugarTable("BIZ_WMS_TRANSFER_DTL")]
    public class BIZ_WMS_TRANSFER_DTL : DbEntityWithAuth
    {
    public class BIZ_WMS_TRANSFER_DTL : DbEntityWithAuth, iPrepPickItem
    {
        #region 构造函数
        /// <summary>
        /// 实体:调拨单(WMS)明细
@@ -145,8 +146,8 @@
        public BAS_ITEM ItemInfo => _ItemInfos?.FirstOrDefault(q => q.AUTH_ORG == AUTH_ORG);
        #endregion
        #region 枚举变量
        /*例子
        #region 枚举变量
        /*例子
        public enum FieldNames
        {
            [Description("枚举描述0")]
@@ -155,11 +156,25 @@
            Enum1,
        }
        */
        #endregion
        #endregion
        #region 公共方法
        #region 公共方法
        public BIZ_WMS_PREP_SRC_DTL GetPickItem()
        {
            return new BIZ_WMS_PREP_SRC_DTL()
            {
                Source = this,
                AUTH_ORG = AUTH_ORG,
                ITEM_CODE = ITEM_CODE,
                UNIT = UNIT,
                SOURCE_CODE = nameof(BIZ_WMS_TRANSFER),
                SOURCE_ORDER = ORDER_NO,
                SOURCE_LINE = ORDER_LINE,
                QTY_REQ = QTY_REQ,
                QTY_ACT_REQ = QTY_REQ - QTY_OUT,
            };
        }
        #endregion
        #endregion
    }//endClass
    }//endClass
}
Tiger.Model.Net/Entitys/WMS/WMS_ITEM_POOL.cs
@@ -7,151 +7,237 @@
namespace Tiger.Model
{
    /// <summary>
    /// 实体:备料库存池
    /// 实体:备料库存池
    /// </summary>
    [Description("Primary:ID")]
    [DisplayName("备料库存池")]
    [Serializable]
    [SugarTable("WMS_ITEM_POOL")]
    public class WMS_ITEM_POOL : DbEntityNoGhostWithAuth
    {
        #region 构造函数
    {
        #region 构造函数
        /// <summary>
        /// 实体:备料库存池
        /// 实体:备料库存池
        /// </summary>
        public WMS_ITEM_POOL() {}
        #endregion
        #endregion
        #region 公共属性
        /// <summary>
        /// 业务单据编码
        /// </summary>
        public string TRANS_CODE { get; set; }
        /// <summary>
        /// 业务单据号码
        /// </summary>
        public string TRANS_NO { get; set; }
        /// <summary>
        /// 业务单据行号
        /// </summary>
        public string TRANS_LINE { get; set; }
        /// <summary>
        /// 来源单据编码
        /// </summary>
        public string SOURCE_CODE { get; set; }
        /// <summary>
        /// 来源单据号码
        /// </summary>
        public string SOURCE_ORDER { get; set; }
        /// <summary>
        /// 来源单据行号
        /// </summary>
        public string SOURCE_LINE { get; set; }
        #region 公共属性
        /// <summary>
        /// 物料编码
        /// 事务ID
        /// </summary>
        [DisplayName("事务ID")]
        public string TRANS_ID { get; set; }
        /// <summary>
        /// 业务单据编码
        /// </summary>
        [DisplayName("业务单据编码")]
        public string TRANS_CODE { get; set; }
        /// <summary>
        /// 业务单据号码
        /// </summary>
        [DisplayName("业务单据号码")]
        public string TRANS_NO { get; set; }
        /// <summary>
        /// 业务单据行号
        /// </summary>
        [DisplayName("业务单据行号")]
        public string TRANS_LINE { get; set; }
        /// <summary>
        /// 来源单据编码
        /// </summary>
        [DisplayName("来源单据编码")]
        public string SOURCE_CODE { get; set; }
        /// <summary>
        /// 来源单据号码
        /// </summary>
        [DisplayName("来源单据号码")]
        public string SOURCE_ORDER { get; set; }
        /// <summary>
        /// 来源单据行号
        /// </summary>
        [DisplayName("来源单据行号")]
        public string SOURCE_LINE { get; set; }
        /// <summary>
        /// 备料策略(位标志枚举)(1FIFO先进先出|2FSFO/尾数优先)
        /// </summary>
        [DisplayName("备料策略(位标志枚举)(1FIFO先进先出|2FSFO/尾数优先)")]
        public int STRATEGY { get; set; }
        /// <summary>
        /// 发料方式(0Supply正常发料|1First首套发料)
        /// </summary>
        [DisplayName("发料方式(0Supply正常发料|1First首套发料)")]
        public int DLVY_MODE { get; set; }
        /// <summary>
        /// 是否被锁定(Y/N),锁定则不允许其他事务分配当前物料
        /// </summary>
        [DisplayName("是否被锁定(Y/N),锁定则不允许其他事务分配当前物料")]
        public string IS_LOCKED { get; set; }
        /// <summary>
        /// 物料编码
        /// </summary>
        [DisplayName("物料编码")]
        public string ITEM_CODE { get; set; }
        /// <summary>
        /// 物料条码
        /// 物料条码
        /// </summary>
        [DisplayName("物料条码")]
        public string SN { get; set; }
        /// <summary>
        /// 物料数量
        /// 物料数量
        /// </summary>
        [DisplayName("物料数量")]
        public double QTY { get; set; }
        /// <summary>
        /// 已分配数量
        /// 已分配数量
        /// </summary>
        [DisplayName("已分配数量")]
        public double ALLOC_QTY { get; set; }
        /// <summary>
        /// 生产日期
        /// </summary>
        public DateTime PROD_DATE { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 储位ID
        /// </summary>
        public string LOCATION_ID { get; set; }
        /// <summary>
        /// 是否首套料(Y/N)
        /// </summary>
        public string IS_FIRST { get; set; }
        /// <summary>
        /// 分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
        /// 生产日期
        /// </summary>
        [DisplayName("生产日期")]
        public DateTime PROD_DATE { get; set; } = DateTime.MinValue;
        /// <summary>
        /// 仓库ID
        /// </summary>
        [DisplayName("仓库ID")]
        public string WH_ID { get; set; }
        /// <summary>
        /// 储区ID
        /// </summary>
        [DisplayName("储区ID")]
        public string REGION_ID { get; set; }
        /// <summary>
        /// 货架/料车ID
        /// </summary>
        [DisplayName("货架/料车ID")]
        public string SHELF_ID { get; set; }
        /// <summary>
        /// 储位ID
        /// </summary>
        [DisplayName("储位ID")]
        public string LOCATION_ID { get; set; }
        /// <summary>
        /// 是否首套料(Y/N)
        /// </summary>
        [DisplayName("是否首套料(Y/N)")]
        public string IS_FIRST { get; set; }
        /// <summary>
        /// 分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
        /// </summary>
        [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作废)")]
        public int STATUS { get; set; }
        /// <summary>
        /// 加工段
        /// 加工段
        /// </summary>
        [DisplayName("加工段")]
        public string SEGMENT { get; set; }
        /// <summary>
        /// 目标产线代码
        /// 目标产线编码
        /// </summary>
        [DisplayName("目标产线编码")]
        public string LINE_CODE { get; set; }
        /// <summary>
        /// 备注
        /// 备注
        /// </summary>
        [DisplayName("备注")]
        public string REMARK { get; set; }
        #endregion
        #endregion
        #region 虚拟属性
        /*例子
        #region 虚拟属性
        /*例子
        [SugarColumn(IsIgnore = true)]
        public string FieldName { get; set; }
        */
        #endregion
        #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
        #endregion
        #region 枚举变量
        /// <summary>
        /// 分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
        #region 枚举变量
        /*例子
        public enum FieldNames
        {
            [Description("枚举描述0")]
            Enum0,
            [Description("枚举描述1")]
            Enum1,
        }
        */
        /// <summary>
        /// 枚举:备料策略(位标志枚举)(1FIFO先进先出|2FSFO/尾数优先)
        /// </summary>
        public enum ALLOC_MODEs
        {
            [Description("全部分配")]
            AllAllocated,
            [Description("部分分配")]
            PartialAllocate,
        }
        public enum STRATEGYs
        {
            [Description("先进先出")]
            FIFO = 1,
            [Description("尾数优先")]
            FSFO = 2,
        }
        /// <summary>
        /// 状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)
        /// </summary>
        public enum STATUSs
        {
            [Description("待捡料")]
            WaitPick,
            [Description("捡料中")]
            Picking,
            [Description("待发料")]
            WaitSend,
            [Description("已发料")]
            Sended,
            [Description("已关闭")]
            Close,
            [Description("作废")]
            Cancel,
        }
        #endregion
        /// <summary>
        /// 枚举:发料方式(0Supply正常发料|1First首套发料)
        /// </summary>
        public enum DLVY_MODEs
        {
            [Description("正常发料")]
            Supply = 0,
            [Description("首套发料")]
            First = 1,
        }
        #region 公共方法
        /// <summary>
        /// 枚举:分配状态(0AllAllocated全部分配|1PartialAllocate部分分配)
        /// </summary>
        public enum ALLOC_MODEs
        {
            [Description("全部分配")]
            AllAllocated = 0,
            [Description("部分分配")]
            PartialAllocate = 1,
        }
        #endregion
        /// <summary>
        /// 枚举:状态(0WaitPick待捡料|1Picking捡料中|2WaitSend待发料|3Sended已发料|4Close已关闭|5Cancel作废)
        /// </summary>
        public enum STATUSs
        {
            [Description("待捡料")]
            WaitPick = 0,
            [Description("捡料中")]
            Picking = 1,
            [Description("待发料")]
            WaitSend = 2,
            [Description("已发料")]
            Sended = 3,
            [Description("已关闭")]
            Close = 4,
            [Description("作废")]
            Cancel = 5,
        }
        #endregion
    }//endClass
        #region 公共方法
        #endregion
    }//endClass
}