服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2024-10-11 df3b96fa372f3e7bac5867fdec643f2e931e32a7
Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -1,4 +1,5 @@
using Rhea.Common;
using Microsoft.CodeAnalysis.Differencing;
using Rhea.Common;
using SqlSugar;
using System;
using System.Collections.Generic;
@@ -31,6 +32,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
@@ -181,8 +183,20 @@
            action.LocaleMsg = GetBeginMsg();
            var min = PkgRule.Details.OrderBy(q => q.PKG_LEVEL).First();
            if (min.PKG_LEVEL == CurPkg.Item.PKG_LEVEL && CurPkg.NeedWeighing)
            {
                var data = new PackingActionOutput() { PkgInfo = CurPkg };
                data.ExecCode = "Weighing";
                data.PkgLevel = min.PKG_LEVEL;
                CurCmd = data;
                CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("上称称重"));
                action.Data.Data = data;
                action.Data.ShortMsg = new("上称称重", ShortMessage.Types.Success);
                //action.LocaleMsg = new($"请把外包装上称称重");
                action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseWeighing");
            }
            //根据包装不同层级的标签模板代码,如果为空则不需要打印
            if (LabelDic[min.PKG_LEVEL].IsNullOrEmpty())
            else if (LabelDic[min.PKG_LEVEL].IsNullOrEmpty())
            {
                input.Data = new PackingActionInput()
                {
@@ -196,7 +210,7 @@
            else
            {
                //设置打印变量值
                LabelDic[min.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[min.PKG_LEVEL]);
                LabelDic[min.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[min.PKG_LEVEL], this);
                var data = new PackingActionOutput() { PkgInfo = CurPkg };
                data.ExecCode = "Print";
@@ -205,6 +219,7 @@
                CurCmd = data;
                PrintTimes++;
                CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("打印标签"));
                action.IsSuccessed = true;
                action.Data.Data = data;
                action.Data.ShortMsg = new("打印标签", ShortMessage.Types.Normal);
                //action.LocaleMsg = new Locale($"开始第{PrintTimes}次打印第{min.PKG_LEVEL}层包装[{min.PkgType.PKG_NAME}]的标签[{LabelDic[min.PKG_LEVEL]?.LABEL_CODE}: {LabelDic[min.PKG_LEVEL].LABEL_NAME}]");
@@ -212,7 +227,7 @@
            }
            //如果返回成功则认为当前行为可以开始执行,否则返回失败
            action.IsSuccessed = true;
            //action.IsSuccessed = true;
            return action;
        }
@@ -240,6 +255,7 @@
                            action.IsSuccessed = false;
                            //action.LocaleMsg = new($"条码扫描失败,请重新扫描第{dtl.PKG_LEVEL}层包装[{dtl.PkgType.PKG_NAME}]的标签条码");
                            action.LocaleMsg = new("MES.WorkAction.PackingAction.ScanFail", dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
                            CurPosition.ResetNode();
                            return action;
                        }
                        //验证当前包装条码是否已经被扫描过
@@ -251,17 +267,18 @@
                            action.IsSuccessed = false;
                            //action.LocaleMsg = new($"条码[{pInput.PkgSN}]无需重复扫描,请扫描第{dtl.PKG_LEVEL}层包装[{dtl.PkgType.PKG_NAME}]的标签条码");
                            action.LocaleMsg = new("MES.WorkAction.PackingAction.ScanRepeat", pInput.PkgSN, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
                            CurPosition.ResetNode();
                            return action;
                        }
                        //客户端扫描成功
                        CurCmd = null;
                        PrintTimes = 0;
                        action = SavePkgData(input, action);
                        if (action.IsSuccessed)
                        {
                            CurStep?.SetStatusMessage(StepStatus.Success, Biz.L("扫描成功"));
                            action.Data.ShortMsg = new("扫描成功", ShortMessage.Types.Success);
                        }
                        //if (action.IsSuccessed)
                        //{
                        //    CurStep?.SetStatusMessage(StepStatus.Success, Biz.L("扫描成功"));
                        //    action.Data.ShortMsg = new("扫描成功", ShortMessage.Types.Success);
                        //}
                    }
                    break;
                //Print:打印,打印当前包装层级的标签
@@ -318,7 +335,7 @@
                        if (!pInput.WeightInfo.IsNullOrEmpty() && pInput.WeightInfo.Weight > 0)
                        {
                            //验证重量数据是否符合设置好的重量范围
                            if (!PkgProd.IsNullOrEmpty() && (pInput.WeightInfo.Weight < PkgProd.MIN_WEIGHT || PkgProd.MIN_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("重量超限"));
@@ -361,7 +378,7 @@
                               else
                               {
                                   //设置打印变量值
                                   LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL]);
                                   LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL], this);
   
                                   var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                   data.ExecCode = "Print";
@@ -376,8 +393,6 @@
                                   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
                        {
@@ -432,8 +447,20 @@
                        //手动结束包装默认从第二层包装开始验证
                        var dtl = PkgRule.Details.First(q => q.PKG_LEVEL == 2);
                        //行为设定的OPTION_1-9是包装不同层级的标签模板代码,如果为空则不需要打印
                        if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
                        if (dtl.PKG_LEVEL == CurPkg.Item.PKG_LEVEL && CurPkg.NeedWeighing)
                        {
                            var data = new PackingActionOutput() { PkgInfo = CurPkg };
                            data.ExecCode = "Weighing";
                            data.PkgLevel = dtl.PKG_LEVEL;
                            CurCmd = data;
                            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("上称称重"));
                            action.Data.Data = data;
                            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";
@@ -448,7 +475,7 @@
                        else
                        {
                            //设置打印变量值
                            LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL]);
                            LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL], this);
                            var data = new PackingActionOutput() { PkgInfo = CurPkg };
                            data.ExecCode = "Print";
@@ -522,7 +549,18 @@
                    CurPkgItem.Package.OPER_CODE = CurPosition.CurWipSNs.First().OPER_CODE;
                    CurPkgItem.Package.SEGMENT = CurPosition.CurWipSNs.First().SEGMENT;
                    FinishLevel++;
                    action = SavePkgData(input, action);
                    //完成包装的层级小于最外层包装层级
                    if (FinishLevel < PkgRule.Details.Max(q => q.PKG_LEVEL))
                    {
                        //当前处理的包装层级已经处理完,继续往上保存
                        action = SavePkgData(input, action);
                    }
                    //最外层包装已经完成包装,保存包装数据到数据库
                    else
                    {
                        CurPkg.Item = CurPkgItem;
                        action = CompletePkg();
                    }
                }
                //处理其他包装层级数据
                else 
@@ -531,7 +569,27 @@
                    if (pInput.PkgLevel == dtl.PKG_LEVEL)
                    {
                        CurPkgItem.IsFinished = true;
                        CurPkgItem.Package = new()
                        CurPkgItem.Package = IsManually ? new()
                        {
                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
                            AUTH_PROD = CurPosition.CurLine.LINE_CODE,
                            SN = pInput.PkgSN,
                            PKG_TYPE = dtl.PkgType.PKG_NAME,
                            ITEM_CODE = CurPkgItem.Items.First().Package.ITEM_CODE,
                            QTY = CurPkgItem.Items.Sum(q => q.Package.QTY),
                            UNIT = dtl.PkgType.PKG_NAME,
                            WORK_ORDER = CurPkgItem.Items.First().Package.WORK_ORDER,
                            BATCH_NO = CurPkgItem.Items.First().Package.BATCH_NO,
                            ROT_CODE = CurPkgItem.Items.First().Package.ROT_CODE,
                            NODE_ID = CurPkgItem.Items.First().Package.NODE_ID,
                            NODE_NAME = CurPkgItem.Items.First().Package.NODE_NAME,
                            FTY_CODE = CurPkgItem.Items.First().Package.FTY_CODE,
                            WS_CODE = CurPkgItem.Items.First().Package.WS_CODE,
                            LINE_CODE = CurPkgItem.Items.First().Package.LINE_CODE,
                            POST_CODE = CurPkgItem.Items.First().Package.POST_CODE,
                            OPER_CODE = CurPkgItem.Items.First().Package.OPER_CODE,
                            SEGMENT = CurPkgItem.Items.First().Package.SEGMENT,
                        } : new()
                        {
                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
                            AUTH_PROD = CurPosition.CurLine.LINE_CODE,
@@ -597,7 +655,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)
@@ -630,7 +688,7 @@
                               else
                               {
                                   //设置打印变量值
                                   LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL]);
                                   LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL], this);
   
                                   var data = new PackingActionOutput() { PkgInfo = CurPkg };
                                   data.ExecCode = "Print";
@@ -694,6 +752,27 @@
            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));
               }
            }
            else
            {
                if (!parent.Package.IsNullOrEmpty())
                {
                    list.Add(parent.Package);
                }
            }
            return list;
        }
        public ApiAction<SubmitOutput> CompletePkg()
        {
            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
@@ -709,7 +788,7 @@
            action.LocaleMsg = new("MES.WorkAction.PackingAction.PackageComplete", CurPkg.Item.PKG_LEVEL, CurPkg.Item.PKG_NAME);
            //手动结束包装则标记行为完成
            //if (CurStep.IsNullOrEmpty())
            //if (IsManually)
            //{
            //    IsFinished = true;
            //}
@@ -733,7 +812,7 @@
            }
            
            //不是手动结束包装则保存行为操作记录
            if (!CurStep.IsNullOrEmpty())
            if (!IsManually)
            {
                //记录行为操作记录
                var wipActs = new List<MES_WIP_ACT>();
@@ -773,6 +852,7 @@
                        ACT_TYPE = NodeAct.ACT_TYPE,
                        ACT_SN = wipSn.SN,
                        ACT_RESULT = "Y",
                        ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(),
                        TRACE_INFO = $"产品条码[{string.Join(",", CurPosition.CurSN)}]包装完成",
                    };
                    wipActs.Add(wipAct);
@@ -814,10 +894,13 @@
            else
            {
                var _pkgList = CurPkg.IsFinished ? GetPackageList(CurPkg.Item) : new();
                //最外层包装已经完成包装,则把工序中暂存标记设为false,统一提交包装内产品的过站记录
                CurPosition.NeedTemporaryStoreDBCommitAction = false;
                //保存数据
                var db = Biz.Db;
                var dbTran = db.UseTran(() =>
                CurPosition.SaveStepsCommitActionToDB(() =>
                {
                    var db = CurPosition.GetCommitDB();
                    if (_pkgList.Any())
                    {
                        db.Storageable(_pkgList, CurPosition.UserCode).ExecuteCommand();
@@ -839,11 +922,6 @@
                        }
                    }
                });
                if (!dbTran.IsSuccess)
                {
                    //抛出异常
                    throw dbTran.ErrorException;
                }
            }
            if (CurPkg.IsFinished)