服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2024-11-04 f4ce2bcaa377c5fe869c0e8f0e1640cee3f8a400
增加在线产品异常下线功能
已修改13个文件
332 ■■■■ 文件已修改
Tiger.Api/Language.db 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Common/WoContext.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Common/WorkBatch.cs 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Transaction/CollectNode.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Transaction/PackingNode.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Transaction/TestNode.cs 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/Transaction/YadaPacking.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business.MES/WorkAction/PackingAction.cs 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/BIZ_MES_WO_SN.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/MES_WIP_ACT.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/MES_WIP_DFT.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Api/Language.db
Binary files differ
Tiger.Business.MES/Common/WoContext.cs
@@ -128,6 +128,7 @@
                                BATCH_NO = woSN.BATCH_NO,
                                HOLD_FLAG = "N",
                                FINISHED_FLAG = "N",
                                UNBIND_FLAG = "N",
                                INV_FLAG = "N",
                                DFT_FLAG = "N",
                                DFT_COUNT = 0,
@@ -188,6 +189,7 @@
                                BATCH_NO = woSN.BATCH_NO,
                                HOLD_FLAG = "N",
                                FINISHED_FLAG = "N",
                                UNBIND_FLAG = "N",
                                INV_FLAG = "N",
                                DFT_FLAG = "N",
                                DFT_COUNT = 0,
Tiger.Business.MES/Common/WorkBatch.cs
@@ -10,6 +10,8 @@
using Tiger.IBusiness;
using Tiger.Model.Entitys.MES.Position;
using Tiger.Business.MES;
using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser;
using Org.BouncyCastle.Ocsp;
namespace Tiger.Business
{
@@ -60,17 +62,17 @@
            return this;
        }
        public void Update()
        public void Update(bool updateAll = false)
        {
            var wo = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
            var batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.BATCH_NO == Batch.BATCH_NO).First();
            if (WoContext.WoBatchDic.ContainsKey(batch.BATCH_NO))
            {
                if (wo.STATUS > BIZ_MES_WO.STATUSs.Working.GetValue() || batch.STATUS > BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
                if (wo.STATUS < BIZ_MES_WO.STATUSs.Release.GetValue() || batch.STATUS > BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
                {
                    WoContext.WoBatchDic.Remove(Batch.BATCH_NO);
                }
                else if(wo.UPDATE_TIME > WO.UPDATE_TIME || batch.UPDATE_TIME > Batch.UPDATE_TIME)
                else if(updateAll || wo.UPDATE_TIME > WO.UPDATE_TIME || batch.UPDATE_TIME > Batch.UPDATE_TIME)
                {
                    GetBatchInfo();
                }
@@ -160,21 +162,20 @@
                action.LocaleMsg = new("MES.WorkBatch.WoStatusCanNotWork", WO.ORDER_NO, Batch.STATUS.GetEnumDesc<BIZ_MES_WO.STATUSs>());
            }
            //工单批次投入数量减去报废数量如果大于等于计划数量,则不允许生产
            //if (curNode.IS_INPUT == "Y" && Batch.INPUT_QTY - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
            if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q => q.STATUS > BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() && q.BATCH_NO == Batch.BATCH_NO) - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
            if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO && BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() < q.STATUS && q.STATUS <= BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) >= Batch.PLAN_QTY)
            {
                action.IsSuccessed = false;
                action.Data.SetValue(this, null);
                //action.LocaleMsg = new($"工单批次[{0}]已投入 {1},其中报废 {2},以满足计划数量[{3}],无需继续投入");
                action.LocaleMsg = new("MES.WorkBatch.BatchInputEnough", Batch.BATCH_NO, WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO), Batch.SCRAP_QTY, Batch.PLAN_QTY);
                action.LocaleMsg = new("MES.WorkBatch.BatchInputEnough", Batch.BATCH_NO, WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO), WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO && q.STATUS > BIZ_MES_WO_SN.STATUSs.Finished.GetValue()), Batch.PLAN_QTY);
            }
            //工单投入数量减去报废数量如果大于等于计划数量,则不允许生产
            if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q => q.STATUS > BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() && q.WORK_ORDER == WO.ORDER_NO) - WO.SCRAP_QTY >= WO.PLAN_QTY)
            if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q =>q.WORK_ORDER == WO.ORDER_NO && BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() < q.STATUS && q.STATUS <= BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) >= WO.PLAN_QTY)
            {
                action.IsSuccessed = false;
                action.Data.SetValue(this, null);
                //action.LocaleMsg = new($"工单[{0}]已投入 {1},其中报废 {2},以满足计划数量[{3}],无需继续投入");
                action.LocaleMsg = new("MES.WorkBatch.WoInputEnough", WO.ORDER_NO, WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO), WO.SCRAP_QTY, WO.PLAN_QTY);
                action.LocaleMsg = new("MES.WorkBatch.WoInputEnough", WO.ORDER_NO, WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO), WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS > BIZ_MES_WO_SN.STATUSs.Finished.GetValue()), WO.PLAN_QTY);
            }
            return action;
@@ -420,7 +421,7 @@
                    {
                        //在前置工序查找还有没有后续工序没完成的前置工序
                        var prepIDs = curNode.PrepNodeIDs.Where(id =>
                                                             Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == e.TGT_NODE && h.IsFinished))
                                                             Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.UNBIND_FLAG != "Y" && h.NODE_ID == e.TGT_NODE && h.IsFinished))
                                                             ).ToList();
                        foreach (var prepID in prepIDs)
                        {
@@ -461,13 +462,13 @@
            var result = new List<MES_WO_NODE>();
            var nextNodes = Nodes.Where(q => q.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue()
                                                                && Edges.Any(e => e.SRC_NODE == parent.ID && e.TGT_NODE == q.ID)
                                                                && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == q.ID && h.IsFinished)
                                                                && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.UNBIND_FLAG != "Y" && h.NODE_ID == q.ID && h.IsFinished)
                                                             ).ToList();
            //尝试将当前工序的后续工序添加到可以执行的工序列表
            foreach (var next in nextNodes)
            {
                //查找有没有前置工序找不到已良品过站的历史记录,若有则不允许继续执行
                if (!next.PrepNodeIDs.Any(id => !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == id && h.IsFinished)) || parent.IS_FIRST_NODE == "Y")
                if (!next.PrepNodeIDs.Any(id => !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.UNBIND_FLAG != "Y" && h.NODE_ID == id && h.IsFinished)) || parent.IS_FIRST_NODE == "Y")
                {
                    var setting = NodeSets.FirstOrDefault(q => q.NODE_ID == next.ID);
                    //后续工序是启用的,则添加
@@ -521,7 +522,7 @@
                    {
                        //在前置工序查找还有没有后续工序没完成的前置工序
                        var prepIDs = curNode.PrepNodeIDs.Where(id =>
                                                             Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == e.TGT_NODE && h.IsFinished))
                                                             Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.UNBIND_FLAG != "Y" && h.NODE_ID == e.TGT_NODE && h.IsFinished))
                                                             ).ToList();
                        foreach (var prepID in prepIDs)
                        {
@@ -569,6 +570,110 @@
            return result;
        }
        /// <summary>
        /// 从工单中移除正在生产的条码
        /// </summary>
        /// <param name="wipList"></param>
        /// <returns></returns>
        public ApiAction RemoveWipSn(List<MES_WIP_DATA> wipList, string user)
        {
            var action = UnbindWipSnFromWO(WO, wipList, user);
            //移除成功则处理工单缓存中的数据
            if (action.IsSuccessed)
            {
                Update(true);
            }
            return action;
        }
        /// <summary>
        /// 从工单中解绑正在生产的条码
        /// </summary>
        /// <param name="wo"></param>
        /// <param name="wipList"></param>
        /// <returns></returns>
        public static ApiAction UnbindWipSnFromWO(BIZ_MES_WO wo, List<MES_WIP_DATA> wipList, string user)
        {
            var action = new ApiAction();
            var wipIDs = wipList.Select(q => q.ID);
            var batchs = wipList.Where(q => !q.BATCH_NO.IsNullOrEmpty()).GroupBy(q => new { q.BATCH_NO }).Select(g => new {
                g.Key.BATCH_NO,
                Qty = g.Count(),
                FinishQty = g.Count(q => q.STATUS == MES_WIP_DATA.STATUSs.Finished.GetValue()),
            });
            var db = Biz.Db;
            var dbTran = db.UseTran(() =>
            {
                //BIZ_MES_WO
                wo.INPUT_QTY -= wipList.Count;
                wo.OUTPUT_QTY -= wipList.Count(q => q.STATUS == MES_WIP_DATA.STATUSs.Finished.GetValue());
                wo.SCRAP_QTY += wipList.Count;
                db.Updateable(wo, user).UpdateColumns(q => new { q.INPUT_QTY, q.OUTPUT_QTY, q.SCRAP_QTY, q.UPDATE_USER, q.UPDATE_TIME }).ExecuteCommand();
                //BIZ_MES_WO_BATCH
                foreach (var batch in batchs)
                {
                    db.Updateable<BIZ_MES_WO_BATCH>(user)
                         .SetColumns(q => q.INPUT_QTY == q.INPUT_QTY - batch.Qty)
                         .SetColumns(q => q.OUTPUT_QTY == q.OUTPUT_QTY - batch.FinishQty)
                         .SetColumns(q => q.SCRAP_QTY == q.SCRAP_QTY + batch.Qty)
                         .Where(q => q.BATCH_NO == q.BATCH_NO)
                         .ExecuteCommand();
                }
                //BIZ_MES_WO_SN
                db.Updateable<BIZ_MES_WO_SN>(user)
                            .SetColumns(q => q.STATUS == BIZ_MES_WO_SN.STATUSs.Offline.GetValue())
                            .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.WIP_ID))
                            .ExecuteCommand();
                //MES_WIP_DATA & MES_WIP_HIS
                var wipHiss = new List<MES_WIP_HIS>();
                foreach (var wipSN in wipList.Where(q => q.STATUS != MES_WIP_DATA.STATUSs.Offline.GetValue()))
                {
                    wipSN.STATUS = MES_WIP_DATA.STATUSs.Offline.GetValue();
                    wipSN.UNBIND_FLAG = "Y";
                    wipSN.NODE_ID = "";
                    wipSN.NODE_NAME = "下线退库";
                    wipSN.OPERATION_TIME = DateTime.Now;
                    var his = new MES_WIP_HIS(wipSN, $"工单[{wipSN.WORK_ORDER}]条码[{wipSN.SN}]下线");
                    wipHiss.Add(his);
                }
                db.Storageable(wipList, user).ExecuteCommand();
                db.Storageable(wipHiss, user).ExecuteCommand();
                db.Updateable<MES_WIP_HIS>(user)
                           .SetColumns(q => q.UNBIND_FLAG == "Y")
                           .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.WIP_ID))
                           .ExecuteCommand();
                //MES_WIP_PKG
                var curpkg = db.Queryable<MES_WIP_PKG>().Where(q => wipIDs.Contains(q.WIP_ID)).ToList();
                db.Deleteable(curpkg).ExecuteCommand();
                var pkgs = new List<MES_WIP_PKG>();
                do
                {
                    var parentSns = curpkg.Where(q => !q.PARENT_SN.IsNullOrEmpty()).Select(q => q.PARENT_SN).Distinct();
                    curpkg = db.Queryable<MES_WIP_PKG>().Where(q => parentSns.Contains(q.SN)).ToList();
                    foreach (var pkg in curpkg)
                    {
                        pkg.QTY = db.Queryable<MES_WIP_PKG>().Where(q => q.PARENT_SN == pkg.SN).Sum(q => q.QTY);
                        pkgs.Add(pkg);
                    }
                }
                while (curpkg.Any());
                db.Updateable(curpkg, user).ExecuteCommand();
                //MES_WIP_DFT,在上仓库装配和维修之前,先把不良记录标记为已处理
                db.Updateable<MES_WIP_DFT>(user)
                           .SetColumns(q => q.STATUS == MES_WIP_DFT.STATUSs.Resolved.GetValue())
                           .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.WIP_ID))
                           .ExecuteCommand();
            });
            if (!dbTran.IsSuccess)
            {
                //抛出异常
                throw dbTran.ErrorException;
            }
            return action;
        }
        #endregion
        /// <summary>
Tiger.Business.MES/Transaction/CollectNode.cs
@@ -268,6 +268,7 @@
                            HOLD_FLAG = "N",
                            REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
                            FINISHED_FLAG = "N",
                            UNBIND_FLAG = "N",
                            INV_FLAG = "N",
                            DFT_FLAG = "N",
                            DFT_COUNT = 0,
Tiger.Business.MES/Transaction/PackingNode.cs
@@ -308,6 +308,7 @@
                            HOLD_FLAG = "N",
                            REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
                            FINISHED_FLAG = "N",
                            UNBIND_FLAG = "N",
                            INV_FLAG = "N",
                            DFT_FLAG = "N",
                            DFT_COUNT = 0,
@@ -670,7 +671,7 @@
                        var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList();
                        var wo = _pkgList.First().WORK_ORDER;
                        //包装信息保存到生产过程记录
                        db.Updateable<MES_WIP_HIS>()
                        db.Updateable<MES_WIP_HIS>(UserCode)
                            .SetColumns(q => q.TRAY_SN == curPkg.Item.Package.SN)
                            .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                            .SetColumns(q => q.CARTON_SN == curPkg.Item.Package.SN)
Tiger.Business.MES/Transaction/TestNode.cs
@@ -1,13 +1,6 @@
using Rhea.Common;
using Tiger.IBusiness;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tiger.IBusiness;
using Tiger.Model;
using Tiger.Model.Entitys.MES.Position;
@@ -269,6 +262,7 @@
                            HOLD_FLAG = "N",
                            REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
                            FINISHED_FLAG = "N",
                            UNBIND_FLAG = "N",
                            INV_FLAG = "N",
                            DFT_FLAG = "N",
                            DFT_COUNT = 0,
@@ -413,8 +407,16 @@
                                LOCK_BATCH = wipSN.LOCK_BATCH,
                                WIP_ID = wipSN.ID,
                            };
                            wipSN.Defects.Add(defect);
                            CurDefects.Add(defect);
                        }
                    }
                    //产品被判断不良后下线,并从工单中移除正在生产的条码
                    if (CurDefects.Any() && curNodeSetting.IF_DFT_OFFLINE == "Y")
                    {
                        woStatus.Data.ShortMsg = new("产品下线", ShortMessage.Types.Error);
                        return OfflineIfDefect(action, wipSNs, input.Locale);
                    }
                    //工单开工
@@ -622,7 +624,7 @@
            SaveStepsCommitActionToDB(endAction);
            //保存成功,返回过站消息
            CurOperInfo(locale).InputQty += CurWipSNs.Count;
            operInfo.InputQty += CurWipSNs.Count;
            action.Data.OperInfo = operInfo;
            action.Data.ShortMsg = new(CurWipSNs.Any(q => q.DFT_FLAG == "Y") ? "不良过站" : "良品过站", ShortMessage.Types.Success);
            //action.LocaleMsg = new($"工单[{CurWipSN.WORK_ORDER}]的条码[{CurWipSN.SN}]在岗位[{CurWipSN.POST_CODE}]工序[{CurWipSN.NODE_NAME}]过站成功,状态[{CurWipSN.STATUS.GetEnumDesc<MES_WIP_DATA.STATUSs>()}]");
@@ -640,6 +642,75 @@
        }
        /// <summary>
        /// 产品被判断不良后下线
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        public ApiAction<SubmitOutput> OfflineIfDefect(ApiAction<SubmitOutput> action, List<MES_WIP_DATA> wipSNs, string locale)
        {
            var operInfo = SetOperNodeInfo(CurOperInfo(locale));
            operInfo.CurNode = wipSNs.FirstOrDefault()?.NODE_NAME;
            operInfo.NextNode = "下线退库";
            //更新工单条码明细信息
            var woSNs = CurBatch.WoSNs.Where(q => wipSNs.Any(w => q.WIP_ID == w.ID)).ToList();
            foreach (var woSN in woSNs)
            {
                woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Offline.GetValue();
            }
            //条码下线
            foreach (var wipSN in wipSNs)
            {
                wipSN.STATUS = MES_WIP_DATA.STATUSs.Offline.GetValue();
                wipSN.UNBIND_FLAG = "Y";
            }
            var wipHiss = new List<MES_WIP_HIS>();
            foreach (var wipSN in wipSNs)
            {
                var his = new MES_WIP_HIS(wipSN, $"工单[{wipSN.WORK_ORDER}]条码[{wipSN.SN}]在岗位[{wipSN.POST_CODE}]工序[{wipSN.NODE_NAME}]因不良[{wipSN.Defects.FirstOrDefault()?.DFT_NAME}]下线(TransId: {TransID} )");
                wipSN.History.Add(his);
                wipHiss.Add(his);
            }
            //创建变量克隆对象用于传入DBSubmitAction中保存当前需要暂存的数据值
            var _woSns = woSNs.Clone();
            var _wipSns = wipSNs.Clone();
            var _wipHiss = wipHiss.Clone();
            var _defect = CurDefects.Clone();
            //使用统一的事务DB对象
            var db = GetCommitDB();
            //保存数据库
            var dbTran = db.UseTran(() =>
            {
                //数据保存逻辑
                db.Storageable(_woSns, UserCode).ExecuteCommand();
                db.Storageable(_wipSns, UserCode).ExecuteCommand();
                db.Storageable(_wipHiss, UserCode).ExecuteCommand();
                db.Storageable(_defect, UserCode).ExecuteCommand();
            });
            if (!dbTran.IsSuccess)
            {
                //抛出异常
                throw dbTran.ErrorException;
            }
            //从工单中移除正在生产的条码
            CurBatch.RemoveWipSn(wipSNs, UserCode);
            //保存成功,返回过站消息
            action.Data.OperInfo = operInfo;
            action.Data.ShortMsg = new("下线退库", ShortMessage.Types.Warning);
            //action.LocaleMsg = new($"工单[0]的条码[1]在岗位[2]工序[3]因不良[4]下线,状态[5]");
            action.LocaleMsg = new("MES.Transaction.TestNode.OfflineIfDefect", wipSNs.First().WORK_ORDER, CurSN, wipSNs.First().POST_CODE, wipSNs.First().NODE_NAME, wipSNs.First().Defects.FirstOrDefault()?.DFT_NAME, wipSNs.First().STATUS.GetEnumDesc<MES_WIP_DATA.STATUSs>());
            //重置工序
            ResetNode();
            return action;
        }
        /// <summary>
        /// 测试工序:获取工序不良代码
        /// </summary>
        /// <returns></returns>
Tiger.Business.MES/Transaction/YadaPacking.cs
@@ -323,6 +323,7 @@
                            HOLD_FLAG = "N",
                            REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
                            FINISHED_FLAG = "N",
                            UNBIND_FLAG = "N",
                            INV_FLAG = "N",
                            DFT_FLAG = "N",
                            DFT_COUNT = 0,
@@ -685,7 +686,7 @@
                        var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList();
                        var wo = _pkgList.First().WORK_ORDER;
                        //包装信息保存到生产过程记录
                        db.Updateable<MES_WIP_HIS>()
                        db.Updateable<MES_WIP_HIS>(UserCode)
                            .SetColumns(q => q.TRAY_SN == curPkg.Item.Package.SN)
                            .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                            .SetColumns(q => q.CARTON_SN == curPkg.Item.Package.SN)
Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -895,28 +895,28 @@
                        var actID = _pkgList.First().ACT_ID;
                        var wo = _pkgList.First().WORK_ORDER;
                        //包装信息保存到在制品信息表
                        db.Updateable<MES_WIP_DATA>()
                        db.Updateable<MES_WIP_DATA>(CurPosition.UserCode)
                            .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                            .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                            .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                            .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.ID))
                            .ExecuteCommand();
                        //包装信息保存到生产过程记录
                        db.Updateable<MES_WIP_HIS>()
                        db.Updateable<MES_WIP_HIS>(CurPosition.UserCode)
                            .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                            .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                            .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                            .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && wipIDs.Contains(q.WIP_ID))
                            .ExecuteCommand();
                        //包装信息保存到生产行为记录
                        db.Updateable<MES_WIP_ACT>()
                        db.Updateable<MES_WIP_ACT>(CurPosition.UserCode)
                            .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                            .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                            .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                            .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && q.ACT_ID == actID && wipIDs.Contains(q.WIP_ID))
                            .ExecuteCommand();
                        //包装信息保存到工单条码明细表
                        db.Updateable<BIZ_MES_WO_SN>()
                        db.Updateable<BIZ_MES_WO_SN>(CurPosition.UserCode)
                            .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                            .SetColumns(q => q.OUTER_SN == CurPkg.Item.Package.SN)
                            .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.WIP_ID))
@@ -945,7 +945,7 @@
                            var actID = _pkgList.First(q => !q.WIP_ID.IsNullOrEmpty()).ACT_ID;
                            var wo = _pkgList.First(q => !q.WIP_ID.IsNullOrEmpty()).WORK_ORDER;
                            //包装信息保存到在制品信息表
                            db.Updateable<MES_WIP_DATA>()
                            db.Updateable<MES_WIP_DATA>(CurPosition.UserCode)
                                .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                                .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
@@ -953,20 +953,20 @@
                                .ExecuteCommand();
                            //包装信息保存到生产过程记录
                            var endOperCode = CurPkg.IsReachedEndNode ? "EndNode" : "NotReachedEndNode";
                            db.Updateable<MES_WIP_HIS>()
                            db.Updateable<MES_WIP_HIS>(CurPosition.UserCode)
                                .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                                .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                                .Where(q => q.WORK_ORDER == wo && (q.NODE_ID == nodeID || q.OPER_CODE == endOperCode) && wipIDs.Contains(q.WIP_ID))
                                .ExecuteCommand();
                            //包装信息保存到生产行为记录
                            db.Updateable<MES_WIP_ACT>()
                            db.Updateable<MES_WIP_ACT>(CurPosition.UserCode)
                                .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                                .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                                .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && q.ACT_ID == actID && wipIDs.Contains(q.WIP_ID))
                                .ExecuteCommand();
                            db.Updateable<MES_WIP_ACT>()
                            db.Updateable<MES_WIP_ACT>(CurPosition.UserCode)
                                .SetColumns(q => q.ACT_VALUE_1 == (CurPkg.IsFinished ? "Y" : "N"))
                                .SetColumns(q => q.ACT_VALUE_2 == CurPkg.ToJson())
                                .SetColumns(q => q.ACT_VALUE_3 == (CurPkg.IsFinished ? LabelDic[CurPkg.Item.PKG_LEVEL].ToJson() : ""))
@@ -974,7 +974,7 @@
                                .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && q.ACT_ID == actID && q.WIP_ID == _lastWipID)
                                .ExecuteCommand();
                            var InStoreLabel = CurPkg.IsFinished ? CurPkg.InStoreLabel?.ToJson() : "";
                            db.Updateable<MES_WIP_ACT>()
                            db.Updateable<MES_WIP_ACT>(CurPosition.UserCode)
                                .SetColumns(q => q.ACT_VALUE_1 == (CurPkg.IsFinished ? "Y" : "N"))
                                .SetColumns(q => q.ACT_VALUE_2 == CurPkg.ToJson())
                                .SetColumns(q => q.ACT_VALUE_3 == InStoreLabel)
@@ -982,7 +982,7 @@
                                .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && q.ACT_ID == CurPkg.InStoreActID && q.WIP_ID == _lastWipID)
                                .ExecuteCommand();
                            //包装信息保存到工单条码明细表
                            db.Updateable<BIZ_MES_WO_SN>()
                            db.Updateable<BIZ_MES_WO_SN>(CurPosition.UserCode)
                                .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                .SetColumns(q => q.OUTER_SN == CurPkg.Item.Package.SN)
                                .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.WIP_ID))
Tiger.Model.Net/Entitys/MES/BIZ_MES_WO_SN.cs
@@ -64,9 +64,9 @@
        [DisplayName("物料编码")]
        public string ITEM_CODE { get; set; }
        /// <summary>
        /// 状态(0NotInput未投入|1Inputed已投入|2Finished已完工|3Scrap已报废)
        /// 状态(0NotInput未投入|1Inputed已投入|2Finished已完工|3Offline异常下线|4Scrap已报废)
        /// </summary>
        [DisplayName("状态(0NotInput未投入|1Inputed已投入|2Finished已完工|3Scrap已报废)")]
        [DisplayName("状态(0NotInput未投入|1Inputed已投入|2Finished已完工|3Offline异常下线|4Scrap已报废)")]
        public int STATUS { get; set; }
        /// <summary>
        /// 备注
@@ -108,7 +108,7 @@
        */
        /// <summary>
        /// 枚举:状态(0NotInput未投入|1Inputed已投入|2Finished已完工|3Scrap已报废)
        /// 枚举:状态(0NotInput未投入|1Inputed已投入|2Finished已完工|3Offline异常下线|4Scrap已报废)
        /// </summary>
        public enum STATUSs
        {
@@ -118,8 +118,10 @@
            Inputed = 1,
            [Description("已完工")]
            Finished = 2,
            [Description("异常下线")]
            Offline = 3,
            [Description("已报废")]
            Scrap = 3,
            Scrap = 4,
        }
        #endregion
Tiger.Model.Net/Entitys/MES/MES_WIP_ACT.cs
@@ -39,9 +39,9 @@
        [DisplayName("过站条码")]
        public string SN { get; set; }
        /// <summary>
        /// 状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6Scrap已报废|7InStorage已入库|8Reject已拒收|9Shipped已出货)
        /// 状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6InStorage已入库|7Reject已拒收|8Shipped已出货|9Offline异常下线|10Scrap已报废)
        /// </summary>
        [DisplayName("状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6Scrap已报废|7InStorage已入库|8Reject已拒收|9Shipped已出货)")]
        [DisplayName("状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6InStorage已入库|7Reject已拒收|8Shipped已出货|9Offline异常下线|10Scrap已报废)")]
        public int STATUS { get; set; }
        /// <summary>
        /// 物料编码
@@ -248,7 +248,7 @@
        */
        /// <summary>
        /// 枚举:状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6Scrap已报废|7InStorage已入库|8Reject已拒收|9Shipped已出货)
        /// 枚举:状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6InStorage已入库|7Reject已拒收|8Shipped已出货|9Offline异常下线|10Scrap已报废)
        /// </summary>
        public enum STATUSs
        {
@@ -264,14 +264,16 @@
            Repair = 4,
            [Description("已完工")]
            Finished = 5,
            [Description("已报废")]
            Scrap = 6,
            [Description("已入库")]
            InStorage = 7,
            InStorage = 6,
            [Description("已拒收")]
            Reject = 8,
            Reject = 7,
            [Description("已出货")]
            Shipped = 9,
            Shipped = 8,
            [Description("异常下线")]
            Offline = 9,
            [Description("已报废")]
            Scrap = 10,
        }
        /// <summary>
Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs
@@ -29,9 +29,9 @@
        [DisplayName("过站条码")]
        public string SN { get; set; }
        /// <summary>
        /// 状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6Scrap已报废|7InStorage已入库|8Reject已拒收|9Shipped已出货)
        /// 状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6InStorage已入库|7Reject已拒收|8Shipped已出货|9Offline异常下线|10Scrap已报废)
        /// </summary>
        [DisplayName("状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6Scrap已报废|7InStorage已入库|8Reject已拒收|9Shipped已出货)")]
        [DisplayName("状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6InStorage已入库|7Reject已拒收|8Shipped已出货|9Offline异常下线|10Scrap已报废))")]
        public int STATUS { get; set; }
        /// <summary>
        /// 物料编码
@@ -108,6 +108,11 @@
        /// </summary>
        [DisplayName("返工标记")]
        public string REWORK_FLAG { get; set; }
        /// <summary>
        /// 解绑标记(因异常下线导致当前记录从工单生产数据中移除,不参与工艺流程计算和数据统计)
        /// </summary>
        [DisplayName("解绑标记(因异常下线导致当前记录从工单生产数据中移除,不参与工艺流程计算和数据统计)")]
        public string UNBIND_FLAG { get; set; }
        /// <summary>
        /// 是否完工
        /// </summary>
@@ -258,7 +263,7 @@
        [Navigate(NavigateType.OneToMany, nameof(MES_WIP_HIS.WIP_ID), nameof(ID), "GHOST_ROW = 0")]//ClassA表中的MES_WIP_DATAId
        public List<MES_WIP_HIS> _History { get; set; }//注意禁止手动赋值,只能是null
        [SugarColumn(IsIgnore = true)]
        public List<MES_WIP_HIS> History => _History ?? new List<MES_WIP_HIS>();
        public List<MES_WIP_HIS> History => _History.Where(q => q.UNBIND_FLAG != "Y").ToList() ?? new List<MES_WIP_HIS>();
        [Navigate(NavigateType.OneToMany, nameof(MES_WIP_DFT.WIP_ID), nameof(ID), "GHOST_ROW = 0")]//ClassA表中的MES_WIP_DATAId
        public List<MES_WIP_DFT> _Defects { get; set; }//注意禁止手动赋值,只能是null
        [SugarColumn(IsIgnore = true)]
@@ -277,7 +282,7 @@
        */
        /// <summary>
        /// 枚举:状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6Scrap已报废|7InStorage已入库|8Reject已拒收|9Shipped已出货)
        /// 枚举:状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6InStorage已入库|7Reject已拒收|8Shipped已出货|9Offline异常下线|10Scrap已报废)
        /// </summary>
        public enum STATUSs
        {
@@ -293,14 +298,16 @@
            Repair = 4,
            [Description("已完工")]
            Finished = 5,
            [Description("已报废")]
            Scrap = 6,
            [Description("已入库")]
            InStorage = 7,
            InStorage = 6,
            [Description("已拒收")]
            Reject = 8,
            Reject = 7,
            [Description("已出货")]
            Shipped = 9,
            Shipped = 8,
            [Description("异常下线")]
            Offline = 9,
            [Description("已报废")]
            Scrap = 10,
        }
        /// <summary>
Tiger.Model.Net/Entitys/MES/MES_WIP_DFT.cs
@@ -34,9 +34,9 @@
        [DisplayName("过站条码")]
        public string SN { get; set; }
        /// <summary>
        /// 状态(0WaitHandle待处理|1Repairing维修中|2Resolved已处理)
        /// 状态(0WaitHandle待处理|1Repairing维修中|2Resolved已处理|3Scrap已报废)
        /// </summary>
        [DisplayName("状态(0WaitHandle待处理|1Repairing维修中|2Resolved已处理)")]
        [DisplayName("状态(0WaitHandle待处理|1Repairing维修中|2Resolved已处理|3Scrap已报废)")]
        public int STATUS { get; set; }
        /// <summary>
        /// 物料编码
@@ -263,7 +263,7 @@
        */
        /// <summary>
        /// 枚举:状态(0WaitHandle待处理|1Repairing维修中|2Resolved已处理)
        /// 枚举:状态(0WaitHandle待处理|1Repairing维修中|2Resolved已处理|3Scrap已报废)
        /// </summary>
        public enum STATUSs
        {
@@ -273,6 +273,8 @@
            Repairing = 1,
            [Description("已处理")]
            Resolved = 2,
            [Description("已报废")]
            Scrap = 3,
        }
        /// <summary>
Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs
@@ -52,6 +52,7 @@
            SEGMENT = data.SEGMENT;
            HOLD_FLAG = data.HOLD_FLAG;
            REWORK_FLAG = data.REWORK_FLAG;
            UNBIND_FLAG = data.UNBIND_FLAG;
            FINISHED_FLAG = data.FINISHED_FLAG;
            DFT_FLAG = data.DFT_FLAG;
            DFT_COUNT = data.DFT_COUNT;
@@ -92,9 +93,9 @@
        [DisplayName("过站条码")]
        public string SN { get; set; }
        /// <summary>
        /// 状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6Scrap已报废|7InStorage已入库|8Reject已拒收|9Shipped已出货)
        /// 状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6InStorage已入库|7Reject已拒收|8Shipped已出货|9Offline异常下线|10Scrap已报废)
        /// </summary>
        [DisplayName("状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6Scrap已报废|7InStorage已入库|8Reject已拒收|9Shipped已出货)")]
        [DisplayName("状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6InStorage已入库|7Reject已拒收|8Shipped已出货|9Offline异常下线|10Scrap已报废)")]
        public int STATUS { get; set; }
        /// <summary>
        /// 物料编码
@@ -171,6 +172,11 @@
        /// </summary>
        [DisplayName("返工标记")]
        public string REWORK_FLAG { get; set; }
        /// <summary>
        /// 解绑标记(因异常下线导致当前记录从工单生产数据中移除,不参与工艺流程计算和数据统计)
        /// </summary>
        [DisplayName("解绑标记(因异常下线导致当前记录从工单生产数据中移除,不参与工艺流程计算和数据统计)")]
        public string UNBIND_FLAG { get; set; }
        /// <summary>
        /// 是否完工
        /// </summary>
@@ -341,7 +347,7 @@
        */
        /// <summary>
        /// 枚举:状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6Scrap已报废|7InStorage已入库|8Reject已拒收|9Shipped已出货)
        /// 枚举:状态(0Init初始化|1Input已投入|2OK良品过站|3NG不良过站|4Repair维修中|5Finished已完工|6InStorage已入库|7Reject已拒收|8Shipped已出货|9Offline异常下线|10Scrap已报废)
        /// </summary>
        public enum STATUSs
        {
@@ -357,14 +363,16 @@
            Repair = 4,
            [Description("已完工")]
            Finished = 5,
            [Description("已报废")]
            Scrap = 6,
            [Description("已入库")]
            InStorage = 7,
            InStorage = 6,
            [Description("已拒收")]
            Reject = 8,
            Reject = 7,
            [Description("已出货")]
            Shipped = 9,
            Shipped = 8,
            [Description("异常下线")]
            Offline = 9,
            [Description("已报废")]
            Scrap = 10,
        }
        /// <summary>