服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2024-09-13 94f78e8c3fa502bc52eba2b88d45d5813609036c
优化工单缓存对象更新逻辑
已修改10个文件
109 ■■■■ 文件已修改
Tiger.Api/Controllers/MES/MESController.PackingNode.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Transaction/CollectNode.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Transaction/PackingNode.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Transaction/TestNode.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/WorkAction/PackingAction.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/MES/Biz.WorkBatch.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/MES/WoContext.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.IBusiness/MES/Transaction/IPackingNode.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/BAS/BAS_PKG_RULE.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Controllers/MES/MESController.PackingNode.cs
@@ -253,11 +253,11 @@
                    {
                        if (action.IsAsync)
                        {
                            response = action.GetResponse(await trans.CompletePkg());
                            response = action.GetResponse(await trans.CompletePkg(action));
                        }
                        else
                        {
                            lock (trans.TransLock) { response = action.GetResponse(trans.CompletePkg().Result); }
                            lock (trans.TransLock) { response = action.GetResponse(trans.CompletePkg(action).Result); }
                        }
                    }
                    else
Tiger.Business.MES/Transaction/CollectNode.cs
@@ -40,14 +40,15 @@
            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
            try
            {
                //更新CurBatch
                CurBatch = WoContext.GetBatch(CurBatch?.OrderNo, CurLine.LINE_CODE);
                //工步列表为空或者工序节点工步有未完成时,优先完成工序节点工步
                if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps)
                {
                    //先判断当前工单不为空且当前岗位在当前工单是不是首站,如果是则不允许变更当前工单,尝试把条码绑定到当前工单
                    if (!CurBatch.IsNullOrEmpty() && CurBatch.IsFirstNode(PostCode))
                    {
                        //更新CurBatch
                        CurBatch?.Update();
                        //提交数据
                        action = NodeSubmit(action, input);
                        //更新工序信息
                        if (!action.IsSuccessed)
@@ -93,6 +94,8 @@
                                        return action;
                                    }
                                }
                                //更新CurBatch
                                CurBatch?.Update();
                                //条码过站
                                action = NodeSubmit(action, input);
                                if (!action.IsSuccessed && !CurWipSNs.Any())
@@ -134,6 +137,9 @@
                //完成工序节点工步后,后开始执行当前工序的行为工步
                else if (IsFinishNodeSteps && !IsFinishAllSteps)
                {
                    //更新CurBatch
                    CurBatch?.Update();
                    var submitStep = Steps.Where(q => q.ID == input.CurStepID && !q.IsFinished).FirstOrDefault();
                    if (submitStep.IsNullOrEmpty())
                    {
@@ -214,7 +220,7 @@
                    return woStatus;
                }
                
                var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => (q.SN == input.SN || q.TRAY_SN == input.SN) && q.WORK_ORDER == CurBatch.WO.ORDER_NO).ToList();
                var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).ToList();
                if (wipSNs.IsNullOrEmpty())
                {
                    var wipSN = new MES_WIP_DATA()
Tiger.Business.MES/Transaction/PackingNode.cs
@@ -63,14 +63,15 @@
                else
                {
                    NodeCmd = "NodeSubmit";
                    //更新CurBatch
                    CurBatch = WoContext.GetBatch(CurBatch?.OrderNo, CurLine.LINE_CODE);
                    //工步列表为空或者工序节点工步有未完成时,优先完成工序节点工步
                    if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps)
                    {
                        //先判断当前工单不为空且当前岗位在当前工单是不是首站,如果是则不允许变更当前工单,尝试把条码绑定到当前工单
                        if (!CurBatch.IsNullOrEmpty() && CurBatch.IsFirstNode(PostCode))
                        {
                            //更新CurBatch
                            CurBatch?.Update();
                            //提交数据
                            action = NodeSubmit(action, input);
                            //更新工序信息
                            if (!action.IsSuccessed)
@@ -134,8 +135,10 @@
                                            return action;
                                        }
                                    }
                                    //条码过站
                                    action = NodeSubmit(action, input);
                                    //更新CurBatch
                                    CurBatch?.Update();
                                    //条码过站
                                    action = NodeSubmit(action, input);
                                    if (!action.IsSuccessed && !CurWipSNs.Any())
                                    {
                                        var info = WoContext.GetSnOperInfo(input.SN).Data;
@@ -175,6 +178,9 @@
                    //完成工序节点工步后,后开始执行当前工序的行为工步
                    else if (IsFinishNodeSteps && !IsFinishAllSteps)
                    {
                        //更新CurBatch
                        CurBatch?.Update();
                        var submitStep = Steps.Where(q => q.ID == input.CurStepID && !q.IsFinished).FirstOrDefault();
                        if (submitStep.IsNullOrEmpty())
                        {
@@ -254,8 +260,8 @@
                    woStatus.Data.ShortMsg = new("工单异常", ShortMessage.Types.Error);
                    return woStatus;
                }
                var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => (q.SN == input.SN || q.TRAY_SN == input.SN) && q.WORK_ORDER == CurBatch.WO.ORDER_NO).ToList();
                var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).ToList();
                if (wipSNs.IsNullOrEmpty())
                {
                    var wipSN = new MES_WIP_DATA()
@@ -583,7 +589,7 @@
        /// 包装工序:手动结束包装
        /// </summary>
        /// <returns></returns>
        public async Task<ApiAction<SubmitOutput>> CompletePkg()
        public async Task<ApiAction<SubmitOutput>> CompletePkg(ApiAction input)
        {
            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
            try
@@ -593,6 +599,12 @@
                {
                    if (Context.ContainsKey("CurPackage"))
                    {
                        int shipQty = input.Data.ToInt32();
                        //有填出货数量则验证当前包装数量必须等于(出货数量/包装规则数量)的余数
                        if (shipQty > 0)
                        {
                        }
                        NodeCmd = "PkgSubmit";
                        TempPkgAction = new PackingAction();
Tiger.Business.MES/Transaction/TestNode.cs
@@ -41,14 +41,15 @@
            
            try
            {
                //更新CurBatch
                CurBatch = WoContext.GetBatch(CurBatch?.OrderNo, CurLine.LINE_CODE);
                //工步列表为空或者工序节点工步有未完成时,优先完成工序节点工步
                if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps)
                {
                    //先判断当前工单不为空且当前岗位在当前工单是不是首站,如果是则不允许变更当前工单,尝试把条码绑定到当前工单
                    if (!CurBatch.IsNullOrEmpty() && CurBatch.IsFirstNode(PostCode))
                    {
                        //更新CurBatch
                        CurBatch?.Update();
                        //提交数据
                        action = NodeSubmit(action, input);
                        //更新工序信息
                        if (!action.IsSuccessed)
@@ -94,6 +95,8 @@
                                        return action;
                                    }
                                }
                                //更新CurBatch
                                CurBatch?.Update();
                                //条码过站
                                action = NodeSubmit(action, input);
                                if (!action.IsSuccessed && !CurWipSNs.Any())
@@ -135,6 +138,9 @@
                //完成工序节点工步后,开始执行当前工序的行为工步
                else if (IsFinishNodeSteps && !IsFinishAllSteps)
                {
                    //更新CurBatch
                    CurBatch?.Update();
                    var submitStep = Steps.Where(q => q.ID == input.CurStepID && !q.IsFinished).FirstOrDefault();
                    if (submitStep.IsNullOrEmpty())
                    {
@@ -214,7 +220,7 @@
                    return woStatus;
                }
                var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => (q.SN == input.SN || q.TRAY_SN == input.SN) && q.WORK_ORDER == CurBatch.WO.ORDER_NO).ToList();
                var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).ToList();
                if (wipSNs.IsNullOrEmpty())
                {
                    var wipSN = new MES_WIP_DATA()
Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -31,6 +31,7 @@
        public Dictionary<int, BAS_LABEL_TEMP> LabelDic { get; set; }    = new();
        public List<BAS_LABEL_PV> LabelPV { get; set; } = new();
        public int FinishLevel = 0;
        private bool IsManually => CurStep.IsNullOrEmpty();
        #endregion Propertys & Variables
        #region Functions
@@ -330,7 +331,7 @@
                        if (!pInput.WeightInfo.IsNullOrEmpty() && pInput.WeightInfo.Weight > 0)
                        {
                            //验证重量数据是否符合设置好的重量范围
                            if (!PkgProd.IsNullOrEmpty() && (pInput.WeightInfo.Weight < PkgProd.MIN_WEIGHT || PkgProd.MAX_WEIGHT < pInput.WeightInfo.Weight))
                            if (!PkgProd.IsNullOrEmpty() && ((pInput.WeightInfo.Weight < PkgProd.MIN_WEIGHT && !IsManually) || PkgProd.MAX_WEIGHT < pInput.WeightInfo.Weight))
                            {
                                action.IsSuccessed = false;
                                CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("重量超限"));
@@ -617,7 +618,7 @@
                        CurPkgItem = curItem;
                        //添加明细后判断当前包装层级的明细数量是否等于包装数量,若相等则标记当前包装层级为完成并尝试打印标签
                        if (CurPkgItem.Items.Count(q => q.IsFinished) == CurPkgItem.PKG_QTY || CurStep.IsNullOrEmpty())
                        if (CurPkgItem.Items.Count(q => q.IsFinished) == CurPkgItem.PKG_QTY || IsManually)
                        {
                            //打印前称重:如果当前的包装明细的上一层包装对象是最外层包装且需要称重时,先称重,合格后在发印或者扫描最外层包装标签
                            if (CurPkgItem.PKG_LEVEL == CurPkg.Item.PKG_LEVEL && CurPkg.NeedWeighing)
@@ -729,7 +730,7 @@
            action.LocaleMsg = new("MES.WorkAction.PackingAction.PackageComplete", CurPkg.Item.PKG_LEVEL, CurPkg.Item.PKG_NAME);
            //手动结束包装则标记行为完成
            //if (CurStep.IsNullOrEmpty())
            //if (IsManually)
            //{
            //    IsFinished = true;
            //}
@@ -753,7 +754,7 @@
            }
            
            //不是手动结束包装则保存行为操作记录
            if (!CurStep.IsNullOrEmpty())
            if (!IsManually)
            {
                //记录行为操作记录
                var wipActs = new List<MES_WIP_ACT>();
Tiger.Business/MES/Biz.WorkBatch.cs
@@ -55,11 +55,26 @@
            public WorkBatch Init(string lineCode)
            {
                LineCode = lineCode;
                GetBatchInfo();
                return this;
            }
            public void Update()
            {
                if (!WoContext.WoBatchDic.ContainsKey(Batch.BATCH_NO))
                {
                    GetBatchInfo();
                    WoContext.WoBatchDic.Add(Batch.BATCH_NO, this);
                }
            }
            private void GetBatchInfo()
            {
                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
                Product = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == WO.ITEM_CODE && q.AUTH_ORG == WO.AUTH_ORG).First();
                Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == LineCode &&
                                    (q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())).First();
                Customer = Biz.Db.Queryable<BAS_CUSTOMER>().Where(q => q.CUST_CODE == WO.CUST_CODE).First();
                Customer = Biz.Db.Queryable<BAS_CUSTOMER>().Where(q => q.CUST_CODE == WO.CUST_CODE).First();
                WoSNs = Biz.Db.Queryable<BIZ_MES_WO_SN>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                Edges = Biz.Db.Queryable<MES_WO_EDGE>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                Nodes = Biz.Db.Queryable<MES_WO_NODE>().Where(q => q.WORK_ORDER == OrderNo).IncludesAllFirstLayer().ToList();
@@ -74,8 +89,6 @@
                var first = Nodes.First(q => q.IS_FIRST_NODE == "Y");
                first.Sequence = 1;
                NodeSorting(first);
                return this;
            }
            /// <summary>
Tiger.Business/MES/WoContext.cs
@@ -33,7 +33,11 @@
        /// <returns></returns>
        public static WorkBatch GetBatch(string workorder, string lineCode)
        {
            return WoBatchDic.FirstOrDefault(q => q.Value.Batch.ORDER_NO == workorder && q.Value.Batch.ACT_LINE == lineCode).Value;
            if (ExistsBatch(workorder, lineCode))
            {
                return WoBatchDic.FirstOrDefault(q => q.Value.Batch.ORDER_NO == workorder && q.Value.Batch.ACT_LINE == lineCode).Value;
            }
            return null;
        }
        /// <summary>
Tiger.IBusiness/MES/Transaction/IPackingNode.cs
@@ -37,6 +37,6 @@
        /// 包装工序:手动结束包装
        /// </summary>
        /// <returns></returns>
        public Task<ApiAction<SubmitOutput>> CompletePkg();
        public Task<ApiAction<SubmitOutput>> CompletePkg(ApiAction input);
    }
}
Tiger.Model.Net/Entitys/BAS/BAS_PKG_RULE.cs
@@ -76,7 +76,24 @@
        #endregion
        #region 公共方法
        public int GetTotalQty()
        {
            int qty = 0;
            foreach (var dtl in Details.OrderBy(q => q.PKG_LEVEL))
            {
                if (dtl.PKG_LEVEL == 1)
                {
                    qty = dtl.PKG_QTY;
                }
                else
                {
                    qty *= dtl.PKG_QTY;
                }
            }
            return qty;
        }
        #endregion
    }//endClass
Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
@@ -180,7 +180,7 @@
        public MES_WIP_PKG Package { get; set; }
        public bool IsFinished { get; set; } = false;
        public List<WipPkgItem> Items { get; set; } = new List<WipPkgItem>();
        public int TotalQty => Items.Any() ? Items.Sum(q => q.TotalQty) : 1;
    }
    /// <summary>