服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2024-10-27 582d7ab9eb6879f4b5f3e1b1b7d162f3d53a0e39
Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -6,6 +6,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.Business.MES.Transaction;
using Tiger.IBusiness;
using Tiger.IBusiness.MES.WorkAction;
using Tiger.Model;
@@ -29,7 +30,7 @@
        public WipPkgItem CurPkgItem { get; set; }
        public PackingActionOutput CurCmd { get; set; }
        public int PrintTimes = 0;
        public Dictionary<int, BAS_LABEL_TEMP> LabelDic { get; set; }    = new();
        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();
@@ -53,15 +54,16 @@
            PkgRule = Biz.Db.Queryable<BAS_PKG_RULE>().Where(q => q.RULE_CODE == setting.PKG_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Details).First();
            //根据行为设置获取多层包装的标签打印模板字典
            var codes = (Setting.OPTION_1 ?? "").JsonToObject<List<WipPkgItem>>();
            var codes = (Setting.OPTION_1 ?? "").JsonToObject<List<WipPkgItem>>() ?? new List<WipPkgItem>();
            foreach (var code in codes)
            {
                var label = code.LABEL_CODE.IsNullOrEmpty() ? null : Biz.Db.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == code.LABEL_CODE).IncludesAllFirstLayer().First();
                LabelDic.Add(code.PKG_LEVEL, label);
            }
            LabelPV = Biz.Db.Queryable<BAS_LABEL_PV>().ToList();
            //如果工序上下文中没有包装记录则新建一个,有则获取当前的包装记录
            if (CurPosition.Context.ContainsKey("CurPackage") && !CurPosition.Context["CurPackage"].IsNullOrEmpty())
            //如果工序上下文中没有包装记录则新建一个,有且未包装完成则获取当前的包装记录
            if (CurPosition.Context.ContainsKey("CurPackage") && !CurPosition.Context["CurPackage"].IsNullOrEmpty() && !(CurPosition.Context["CurPackage"] as WipPkg).IsFinished)
            {
                CurPkg = (CurPosition.Context["CurPackage"] as WipPkg).Clone();
            }
@@ -73,7 +75,8 @@
                    WorkBatch = CurPosition.WorkBatch.Batch.BATCH_NO,
                    RULE_CODE = PkgRule.RULE_CODE,
                    RULE_NAME = PkgRule.RULE_NAME,
                    ITEM_CODE = CurPosition.WorkBatch.WO.ITEM_CODE,
                    PROD_CODE = CurPosition.WorkBatch.WO.ITEM_CODE,
                    CustSN = Biz.Db.Queryable<MES_CUST_SN>().Where(q => q.FLOW_SN == CurPosition.CurWipSNs.First().FLOW_SN).First(),
                    Item = new WipPkgItem()
                    {
                        PKG_CODE = max.PKG_CODE,
@@ -81,7 +84,8 @@
                        IS_MIN_PKG = max.PkgType.IS_MIN_PKG,
                        PKG_LEVEL = max.PKG_LEVEL,
                        PKG_QTY = max.PKG_QTY,
                        LABEL_CODE = LabelDic[max.PKG_LEVEL]?.LABEL_CODE,
                        LABEL_CODE = LabelDic.Count > max.PKG_LEVEL ? LabelDic[max.PKG_LEVEL]?.LABEL_CODE : null,
                        SN = CurPosition.GenerateSN(max.SN_RULE, this),
                    }
                };
                WipPkgItem child = null;
@@ -96,7 +100,8 @@
                            IS_MIN_PKG = dtl.PkgType.IS_MIN_PKG,
                            PKG_LEVEL = dtl.PKG_LEVEL,
                            PKG_QTY = dtl.PKG_QTY,
                            LABEL_CODE = LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE,
                            LABEL_CODE = LabelDic.Count > dtl.PKG_LEVEL ? LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE : null,
                            SN = CurPosition.GenerateSN(dtl.SN_RULE, this),
                        };
                        if (!child.IsNullOrEmpty())
                        {
@@ -108,6 +113,13 @@
                if (!child.IsNullOrEmpty())
                {
                    CurPkg.Item.Items.Add(child);
                }
                //删除工序上下文中的包装记录
                if (CurPosition.Context.ContainsKey("CurPackage"))
                {
                    CurPosition.Context.Remove("CurPackage");
                    CurPosition.Context.Remove("CurLabelDic");
                }
            }
            //获取是否包装完后需要称重
@@ -146,7 +158,8 @@
            LabelDic = CurPosition.Context["CurLabelDic"] as Dictionary<int, BAS_LABEL_TEMP>;
            LabelPV = Biz.Db.Queryable<BAS_LABEL_PV>().ToList();
            //获取包装规则的称重范围
            PkgProd = Biz.Db.Queryable<BAS_PKG_PROD>().Where(q => q.PKG_RULE_ID == PkgRule.ID && q.ITEM_CODE == CurPkg.ITEM_CODE).First();
            PkgProd = Biz.Db.Queryable<BAS_PKG_PROD>().Where(q => q.PKG_RULE_ID == PkgRule.ID && q.ITEM_CODE == CurPkg.PROD_CODE).First();
            //把
            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("记录包装数据"));
        }
@@ -216,6 +229,13 @@
                data.ExecCode = "Print";
                data.PkgLevel = min.PKG_LEVEL;
                data.PrintLable = LabelDic[min.PKG_LEVEL];
                data.RealPrint = data.PkgLevel != CurPkg.Item.PKG_LEVEL || CurPosition is not YadaPacking || (CurPosition as YadaPacking).IsPrintCustomerLabel;
                //手动结束包装时,如果是RealPrint为false,则返回当前包装信息的入库标签并打印
                if (IsManually && !data.RealPrint && !CurPkg.InStoreLabel.IsNullOrEmpty())
                {
                    data.RealPrint = true;
                    data.PrintLable = CurPkg.InStoreLabel;
                }
                CurCmd = data;
                PrintTimes++;
                CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("打印标签"));
@@ -259,7 +279,7 @@
                            return action;
                        }
                        //验证当前包装条码是否已经被扫描过
                        if (GetPackageList(CurPkg.Item).Any(q => q.SN == pInput.PkgSN))
                        if (CurPosition.GetPackageList(CurPkg.Item).Any(q => q.SN == pInput.PkgSN))
                        {
                            var dtl = PkgRule.Details.First(q => q.PKG_LEVEL == pInput.PkgLevel);
                            CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("扫描错误"));
@@ -300,7 +320,7 @@
                            action.Data.ShortMsg = new("扫描标签", ShortMessage.Types.Normal);
                            //action.LocaleMsg = new($"请扫描第{dtl.PKG_LEVEL}层包装[{dtl.PkgType.PKG_NAME}]的标签条码");
                            action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseScanLabel", dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
                        }
                        }
                        //客户端打印失败
                        else
                        {
@@ -364,34 +384,41 @@
                            {
                                //如果为空则不需要打印
                                if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
                               {
                                   var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                   data.ExecCode = "Scan";
                                   data.PkgLevel = dtl.PKG_LEVEL;
                                   CurCmd = data;
                                {
                                    var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                    data.ExecCode = "Scan";
                                    data.PkgLevel = dtl.PKG_LEVEL;
                                    CurCmd = data;
                                    CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("扫描标签"));
                                    action.Data.Data = data;
                                   action.Data.ShortMsg = new("扫描标签", ShortMessage.Types.Normal);
                                   //action.LocaleMsg = new($"请扫描第{dtl.PKG_LEVEL}层包装[{dtl.PkgType.PKG_NAME}]的标签条码");
                                   action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseScanLabel", dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
                               }
                               else
                               {
                                   //设置打印变量值
                                   LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL], this);
                                   var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                   data.ExecCode = "Print";
                                   data.PkgLevel = dtl.PKG_LEVEL;
                                   data.PrintLable = LabelDic[dtl.PKG_LEVEL];
                                   CurCmd = data;
                                   PrintTimes++;
                                    action.Data.ShortMsg = new("扫描标签", ShortMessage.Types.Normal);
                                    //action.LocaleMsg = new($"请扫描第{dtl.PKG_LEVEL}层包装[{dtl.PkgType.PKG_NAME}]的标签条码");
                                    action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseScanLabel", dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
                                }
                                else
                                {
                                    //设置打印变量值
                                    LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL], this);
                                    var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                    data.ExecCode = "Print";
                                    data.PkgLevel = dtl.PKG_LEVEL;
                                    data.PrintLable = LabelDic[dtl.PKG_LEVEL];
                                    data.RealPrint = data.PkgLevel != CurPkg.Item.PKG_LEVEL || CurPosition is not YadaPacking || (CurPosition as YadaPacking).IsPrintCustomerLabel;
                                    //手动结束包装时,如果是RealPrint为false,则返回当前包装信息的入库标签并打印
                                    if (IsManually && !data.RealPrint && !CurPkg.InStoreLabel.IsNullOrEmpty())
                                    {
                                        data.RealPrint = true;
                                        data.PrintLable = CurPkg.InStoreLabel;
                                    }
                                    CurCmd = data;
                                    PrintTimes++;
                                    CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("打印标签"));
                                    action.Data.Data = data;
                                   action.Data.ShortMsg = new("打印标签", ShortMessage.Types.Normal);
                                   //action.LocaleMsg = new Locale($"开始第{PrintTimes}次打印第{dtl.PKG_LEVEL}层包装[{dtl.PkgType.PKG_NAME}]的标签[{LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE}: {LabelDic[dtl.PKG_LEVEL].LABEL_NAME}]");
                                   action.LocaleMsg = new Locale("MES.WorkAction.PackingAction.BeginPrint", PrintTimes, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME, LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE, LabelDic[dtl.PKG_LEVEL].LABEL_NAME);
                               }
                                    action.Data.ShortMsg = new("打印标签", ShortMessage.Types.Normal);
                                    //action.LocaleMsg = new Locale($"开始第{PrintTimes}次打印第{dtl.PKG_LEVEL}层包装[{dtl.PkgType.PKG_NAME}]的标签[{LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE}: {LabelDic[dtl.PKG_LEVEL].LABEL_NAME}]");
                                    action.LocaleMsg = new Locale("MES.WorkAction.PackingAction.BeginPrint", PrintTimes, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME, LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE, LabelDic[dtl.PKG_LEVEL].LABEL_NAME);
                                }
                            }
                        }
                        else
@@ -481,6 +508,13 @@
                            data.ExecCode = "Print";
                            data.PkgLevel = dtl.PKG_LEVEL;
                            data.PrintLable = LabelDic[dtl.PKG_LEVEL];
                            data.RealPrint = data.PkgLevel != CurPkg.Item.PKG_LEVEL || CurPosition is not YadaPacking || (CurPosition as YadaPacking).IsPrintCustomerLabel;
                            //手动结束包装时,如果是RealPrint为false,则返回当前包装信息的入库标签并打印
                            if (IsManually && !data.RealPrint && !CurPkg.InStoreLabel.IsNullOrEmpty())
                            {
                                data.RealPrint = true;
                                data.PrintLable = CurPkg.InStoreLabel;
                            }
                            CurCmd = data;
                            PrintTimes++;
                            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("打印标签"));
@@ -523,14 +557,15 @@
                        PKG_LEVEL = dtl.PKG_LEVEL,
                        PKG_QTY = dtl.PKG_QTY,
                        LABEL_CODE = LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE,
                        SN = CurPosition.GenerateSN(dtl.SN_RULE, this).IsNullOrEmpty(pInput.PkgSN),
                        IsFinished = true,
                    };
                    CurPkgItem.Package = Biz.Db.Queryable<MES_WIP_PKG>().Where(q => q.SN == pInput.PkgSN && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).First() ?? new()
                    CurPkgItem.Package = Biz.Db.Queryable<MES_WIP_PKG>().Where(q => q.SN == CurPkgItem.SN && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).First() ?? new()
                    {
                        AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
                        AUTH_PROD = CurPosition.CurLine.LINE_CODE,
                        SN = pInput.PkgSN,
                        SN = CurPkgItem.SN,
                    };
                    CurPkgItem.Package.WIP_ID = CurPosition.CurWipSNs.Count == 1 ? CurPosition.CurWipSNs.First().ID : null;
                    CurPkgItem.Package.PKG_TYPE = dtl.PkgType.PKG_NAME;
@@ -548,6 +583,8 @@
                    CurPkgItem.Package.POST_CODE = CurPosition.CurWipSNs.First().POST_CODE;
                    CurPkgItem.Package.OPER_CODE = CurPosition.CurWipSNs.First().OPER_CODE;
                    CurPkgItem.Package.SEGMENT = CurPosition.CurWipSNs.First().SEGMENT;
                    CurPkgItem.Package.ACT_ID = NodeAct.ID;
                    CurPkgItem.Package.FLOW_SN = CurPosition.CurWipSNs.First().FLOW_SN;
                    FinishLevel++;
                    //完成包装的层级小于最外层包装层级
                    if (FinishLevel < PkgRule.Details.Max(q => q.PKG_LEVEL))
@@ -563,7 +600,7 @@
                    }
                }
                //处理其他包装层级数据
                else
                else
                {
                    //客户端提交的包装层级等于当前处理的包装层级
                    if (pInput.PkgLevel == dtl.PKG_LEVEL)
@@ -573,7 +610,7 @@
                        {
                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
                            AUTH_PROD = CurPosition.CurLine.LINE_CODE,
                            SN = pInput.PkgSN,
                            SN = CurPkgItem.SN.IsNullOrEmpty(pInput.PkgSN),
                            PKG_TYPE = dtl.PkgType.PKG_NAME,
                            ITEM_CODE = CurPkgItem.Items.First().Package.ITEM_CODE,
                            QTY = CurPkgItem.Items.Sum(q => q.Package.QTY),
@@ -593,7 +630,7 @@
                        {
                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
                            AUTH_PROD = CurPosition.CurLine.LINE_CODE,
                            SN = pInput.PkgSN,
                            SN = CurPkgItem.SN.IsNullOrEmpty(pInput.PkgSN),
                            PKG_TYPE = dtl.PkgType.PKG_NAME,
                            ITEM_CODE = CurPosition.CurWipSNs.First().ITEM_CODE,
                            QTY = CurPkgItem.Items.Sum(q => q.Package.QTY),
@@ -609,6 +646,8 @@
                            POST_CODE = CurPosition.CurWipSNs.First().POST_CODE,
                            OPER_CODE = CurPosition.CurWipSNs.First().OPER_CODE,
                            SEGMENT = CurPosition.CurWipSNs.First().SEGMENT,
                            ACT_ID = NodeAct.ID,
                            FLOW_SN = CurPosition.CurWipSNs.First().FLOW_SN,
                        };
                        FinishLevel++;
                        //完成包装的层级小于最外层包装层级
@@ -642,6 +681,7 @@
                                    PKG_LEVEL = nextDtl.PKG_LEVEL,
                                    PKG_QTY = nextDtl.PKG_QTY,
                                    LABEL_CODE = LabelDic[nextDtl.PKG_LEVEL]?.LABEL_CODE,
                                    SN = CurPosition.GenerateSN(nextDtl.SN_RULE, this),
                                };
                                curItem.Items.Add(next);
                            }
@@ -650,7 +690,7 @@
                        //添加当前的包装明细到上一层包装的明细列表
                        if (!curItem.Items.Contains(CurPkgItem))
                        {
                           curItem.Items.Add(CurPkgItem);
                            curItem.Items.Add(CurPkgItem);
                        }
                        CurPkgItem = curItem;
@@ -669,39 +709,46 @@
                                action.Data.ShortMsg = new("上称称重", ShortMessage.Types.Success);
                                //action.LocaleMsg = new($"请把外包装上称称重");
                                action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseWeighing");
                            }
                            }
                            else
                            {
                               //如果为空则不需要打印
                               if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
                               {
                                   var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                   data.ExecCode = "Scan";
                                   data.PkgLevel = dtl.PKG_LEVEL;
                                   CurCmd = data;
                                //如果为空则不需要打印
                                if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
                                {
                                    var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                    data.ExecCode = "Scan";
                                    data.PkgLevel = dtl.PKG_LEVEL;
                                    CurCmd = data;
                                    CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("扫描标签"));
                                    action.Data.Data = data;
                                    action.Data.ShortMsg = new("扫描标签", ShortMessage.Types.Normal);
                                    //action.LocaleMsg = new($"请扫描第{dtl.PKG_LEVEL}层包装[{dtl.PkgType.PKG_NAME}]的标签条码");
                                    action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseScanLabel", dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
                               }
                               else
                               {
                                   //设置打印变量值
                                   LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL], this);
                                   var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                   data.ExecCode = "Print";
                                   data.PkgLevel = dtl.PKG_LEVEL;
                                   data.PrintLable = LabelDic[dtl.PKG_LEVEL];
                                   CurCmd = data;
                                   PrintTimes++;
                                }
                                else
                                {
                                    //设置打印变量值
                                    LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL], this);
                                    var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                    data.ExecCode = "Print";
                                    data.PkgLevel = dtl.PKG_LEVEL;
                                    data.PrintLable = LabelDic[dtl.PKG_LEVEL];
                                    data.RealPrint = data.PkgLevel != CurPkg.Item.PKG_LEVEL || CurPosition is not YadaPacking || (CurPosition as YadaPacking).IsPrintCustomerLabel;
                                    //手动结束包装时,如果是RealPrint为false,则返回当前包装信息的入库标签并打印
                                    if (IsManually && !data.RealPrint && !CurPkg.InStoreLabel.IsNullOrEmpty())
                                    {
                                        data.RealPrint = true;
                                        data.PrintLable = CurPkg.InStoreLabel;
                                    }
                                    CurCmd = data;
                                    PrintTimes++;
                                    CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("打印标签"));
                                    action.Data.Data = data;
                                    action.Data.ShortMsg = new("打印标签", ShortMessage.Types.Normal);
                                    //action.LocaleMsg = new Locale($"开始第{PrintTimes}次打印第{dtl.PKG_LEVEL}层包装[{dtl.PkgType.PKG_NAME}]的标签[{LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE}: {LabelDic[dtl.PKG_LEVEL].LABEL_NAME}]");
                                    action.LocaleMsg = new Locale("MES.WorkAction.PackingAction.BeginPrint", PrintTimes, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME, LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE, LabelDic[dtl.PKG_LEVEL].LABEL_NAME);
                               }
                                    action.LocaleMsg = new Locale("MES.WorkAction.PackingAction.BeginPrint", PrintTimes, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME, LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE, LabelDic[dtl.PKG_LEVEL].LABEL_NAME);
                                }
                            }
                        }
                        //当前包装层级的明细数量未达到包装数量,则完成本次扫描,等待下个产品进站
@@ -737,32 +784,17 @@
            return action;
        }
        private List<MES_WIP_PKG> GetPackageList(WipPkgItem parent)
        {
            List<MES_WIP_PKG> list = new();
            if (!parent.Package.IsNullOrEmpty())
            {
                list.Add(parent.Package);
            }
            foreach (var item in parent.Items)
            {
                item.Package.PARENT_SN = parent.Package?.SN;
                list.AddRange(GetPackageList(item));
            }
            return list;
        }
        public List<MES_WIP_PKG> GetMinPackageList(WipPkgItem parent)
        {
            List<MES_WIP_PKG> list = new();
            if (parent.Items.Any())
            {
               foreach (var item in parent.Items)
               {
                   item.Package.PARENT_SN = parent.Package?.SN;
                   list.AddRange(GetMinPackageList(item));
               }
            }
                foreach (var item in parent.Items)
                {
                    item.Package.PARENT_SN = parent.Package?.SN;
                    list.AddRange(GetMinPackageList(item));
                }
            }
            else
            {
                if (!parent.Package.IsNullOrEmpty())
@@ -810,7 +842,7 @@
                CurPkg.Item.Package.WEIGHT = CurPkg.WeightInfo.Weight;
                CurPkg.Item.Package.WEIGHT_UNIT = CurPkg.WeightInfo.Unit;
            }
            //不是手动结束包装则保存行为操作记录
            if (!IsManually)
            {
@@ -818,6 +850,7 @@
                var wipActs = new List<MES_WIP_ACT>();
                foreach (var wipSn in CurPosition.CurWipSNs)
                {
                    var wipAct = new MES_WIP_ACT()
                    {
                        AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
@@ -852,6 +885,9 @@
                        ACT_TYPE = NodeAct.ACT_TYPE,
                        ACT_SN = wipSn.SN,
                        ACT_RESULT = "Y",
                        ACT_VALUE_1 = CurPkg.IsFinished ? "Y" : "N",
                        ACT_VALUE_2 = CurPkg.ToJson(),
                        ACT_VALUE_3 = CurPkg.IsFinished ? LabelDic[CurPkg.Item.PKG_LEVEL].ToJson() : "",
                        ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(),
                        TRACE_INFO = $"产品条码[{string.Join(",", CurPosition.CurSN)}]包装完成",
                    };
@@ -860,7 +896,7 @@
                //创建变量克隆对象用于传入DBSubmitAction中保存当前需要暂存的数据值
                var _wipActs = wipActs.Clone();
                var _pkgList = CurPkg.IsFinished ? GetPackageList(CurPkg.Item) : new();
                var _pkgList = CurPkg.IsFinished ? CurPosition.GetPackageList(CurPkg.Item) : new();
                //保存数据
                CurStep.DBSubmitAction = () =>
                {
@@ -872,96 +908,125 @@
                    if (_pkgList.Any())
                    {
                        db.Storageable(_pkgList, CurPosition.UserCode).ExecuteCommand();
                        foreach (var pkg in _pkgList)
                        {
                            //包装信息保存到在制品信息表
                            db.Updateable<MES_WIP_DATA>()
                                .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 == pkg.WORK_ORDER && q.SN == pkg.SN)
                                .ExecuteCommand();
                            //包装信息保存到工单条码明细表
                            db.Updateable<BIZ_MES_WO_SN>()
                                .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                .SetColumns(q => q.OUTER_SN == CurPkg.Item.Package.SN)
                                .Where(q => q.WORK_ORDER == pkg.WORK_ORDER && q.SN == pkg.SN)
                                .ExecuteCommand();
                        }
                        var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList();
                        var nodeID = _pkgList.First().NODE_ID;
                        var actID = _pkgList.First().ACT_ID;
                        var wo = _pkgList.First().WORK_ORDER;
                        //包装信息保存到在制品信息表
                        db.Updateable<MES_WIP_DATA>()
                            .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>()
                            .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>()
                            .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>()
                            .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))
                            .ExecuteCommand();
                    }
                };
            }
            else
            {
                var _pkgList = CurPkg.IsFinished ? GetPackageList(CurPkg.Item) : new();
                //最外层包装已经完成包装,则把工序中暂存标记设为false,统一提交包装内产品的过站记录
                CurPosition.NeedTemporaryStoreDBCommitAction = false;
                //保存数据
                CurPosition.SaveStepsCommitActionToDB(() =>
                if (CurPkg.IsFinished)
                {
                    var db = CurPosition.GetCommitDB();
                    if (_pkgList.Any())
                    var _pkgList = CurPosition.GetPackageList(CurPkg.Item).Clone();
                    var _lastWipID = CurPosition.LastWipSNs?.FirstOrDefault()?.ID;
                    //最外层包装已经完成包装,则把工序中暂存标记设为false,统一提交包装内产品的过站记录
                    CurPosition.NeedTemporaryStoreDBCommitAction = false;
                    //保存数据
                    CurPosition.SaveStepsCommitActionToDB(() =>
                    {
                        db.Storageable(_pkgList, CurPosition.UserCode).ExecuteCommand();
                        foreach (var pkg in _pkgList)
                        var db = CurPosition.GetCommitDB();
                        if (_pkgList.Any())
                        {
                            db.Storageable(_pkgList, CurPosition.UserCode).ExecuteCommand();
                            var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList();
                            var nodeID = _pkgList.First(q => !q.WIP_ID.IsNullOrEmpty()).NODE_ID;
                            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>()
                                .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 == pkg.WORK_ORDER && q.SN == pkg.SN)
                                .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.ID))
                                .ExecuteCommand();
                            //包装信息保存到生产过程记录
                            var endOperCode = CurPkg.IsReachedEndNode ? "EndNode" : "NotReachedEndNode";
                            db.Updateable<MES_WIP_HIS>()
                                .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>()
                                .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>()
                                .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() : ""))
                                .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && q.ACT_ID == actID && q.WIP_ID == _lastWipID)
                                .ExecuteCommand();
                            //包装信息保存到工单条码明细表
                            db.Updateable<BIZ_MES_WO_SN>()
                                .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                .SetColumns(q => q.OUTER_SN == CurPkg.Item.Package.SN)
                                .Where(q => q.WORK_ORDER == pkg.WORK_ORDER && q.SN == pkg.SN)
                                .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.WIP_ID))
                                .ExecuteCommand();
                        }
                    });
                    //如果当前条码已经完工,检查当前工单批次和工单是否完工
                    //if (CurPkg.IsReachedEndNode)
                    {
                        CurPosition.WorkBatch.CheckIsComplete(CurPosition.UserCode);
                    }
                });
                //如果当前条码已经完工,检查当前工单批次和工单是否完工
                //if (action.Data.OperInfo.IsReachedEndNode)
                {
                    CurPosition.WorkBatch.CheckIsComplete(CurPosition.UserCode);
                }
            }
            if (CurPkg.IsFinished)
            //最外层包装已经完成包装,则把工序中暂存标记设为false,统一提交包装内产品的过站记录
            //最外层包装未完成包装,则把工序中暂存标记设为true,待全部包装完成再统一提交包装内产品的过站记录
            CurPosition.NeedTemporaryStoreDBCommitAction = !CurPkg.IsFinished;
            //如果工序上下文中没有包装记录则新建一个
            if (CurPosition.Context.ContainsKey("CurPackage"))
            {
                //最外层包装已经完成包装,则把工序中暂存标记设为false,统一提交包装内产品的过站记录
                CurPosition.NeedTemporaryStoreDBCommitAction = false;
                //删除工序上下文中的包装记录
                CurPosition.Context.Remove("CurPackage");
                CurPosition.Context.Remove("CurLabelDic");
                //action.LocaleMsg = new($"条码[{CurPkg.Item.Package?.SN}]包装完成");
                action.LocaleMsg = new("MES.WorkAction.PackingAction.PackingSuccess", CurPkg.Item.Package.SN);
                CurPosition.Context["CurPackage"] = CurPkg;
                CurPosition.Context["CurLabelDic"] = LabelDic;
            }
            else
            {
                //最外层包装未完成包装,则把工序中暂存标记设为true,待全部包装完成再统一提交包装内产品的过站记录
                CurPosition.NeedTemporaryStoreDBCommitAction = true;
                //如果工序上下文中没有包装记录则新建一个
                if (CurPosition.Context.ContainsKey("CurPackage"))
                {
                    CurPosition.Context["CurPackage"] = CurPkg;
                    CurPosition.Context["CurLabelDic"] = LabelDic;
                }
                else
                {
                    CurPosition.Context.Add("CurPackage", CurPkg);
                    CurPosition.Context.Add("CurLabelDic", LabelDic);
                }
                //action.LocaleMsg = new($"条码[{CurPosition.CurSN}]包装完成");
                action.LocaleMsg = new("MES.WorkAction.PackingAction.PackingSuccess", CurPosition.CurSN);
                CurPosition.Context.Add("CurPackage", CurPkg);
                CurPosition.Context.Add("CurLabelDic", LabelDic);
            }
            //action.LocaleMsg = new($"条码[{CurPosition.CurSN}]包装完成");
            action.LocaleMsg = new("MES.WorkAction.PackingAction.PackingSuccess", CurPosition.CurSN);
            IsFinished = true;
            CurStep?.SetStatusMessage(StepStatus.Finished, Biz.L("包装完成"));
            action.Data.ShortMsg = new("包装完成", ShortMessage.Types.Success);
            return action;
        }