服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2024-11-21 a55e502c37bdc2831fc904c08961e9bca7778ae7
Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -84,7 +84,7 @@
                        IS_MIN_PKG = max.PkgType.IS_MIN_PKG,
                        PKG_LEVEL = max.PKG_LEVEL,
                        PKG_QTY = max.PKG_QTY,
                        LABEL_CODE = LabelDic.Count > max.PKG_LEVEL ? LabelDic[max.PKG_LEVEL]?.LABEL_CODE : null,
                        LABEL_CODE = LabelDic.Count >= max.PKG_LEVEL ? LabelDic[max.PKG_LEVEL]?.LABEL_CODE : null,
                        SN = CurPosition.GenerateSN(max.SN_RULE, this),
                    }
                };
@@ -100,7 +100,7 @@
                            IS_MIN_PKG = dtl.PkgType.IS_MIN_PKG,
                            PKG_LEVEL = dtl.PKG_LEVEL,
                            PKG_QTY = dtl.PKG_QTY,
                            LABEL_CODE = LabelDic.Count > dtl.PKG_LEVEL ? LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE : null,
                            LABEL_CODE = LabelDic.Count >= dtl.PKG_LEVEL ? LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE : null,
                            SN = CurPosition.GenerateSN(dtl.SN_RULE, this),
                        };
                        if (!child.IsNullOrEmpty())
@@ -230,6 +230,12 @@
                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("打印标签"));
@@ -371,6 +377,7 @@
                            //最外层包装已处理完成则直接结束行为
                            if (CurPkg.Item.PKG_LEVEL == FinishLevel)
                            {
                                CurPkg.Item.WipSNs = CurPosition.CurWipSNs.ToDictionary(k => k.ID, v => v.SN);
                                action = End(input);
                            }
                            //最外层包装未打印扫描则继续
@@ -399,6 +406,12 @@
                                    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("打印标签"));
@@ -497,6 +510,12 @@
                            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("打印标签"));
@@ -552,7 +571,7 @@
                    CurPkgItem.Package.WIP_ID = CurPosition.CurWipSNs.Count == 1 ? CurPosition.CurWipSNs.First().ID : null;
                    CurPkgItem.Package.PKG_TYPE = dtl.PkgType.PKG_NAME;
                    CurPkgItem.Package.ITEM_CODE = CurPosition.CurWipSNs.First().ITEM_CODE;
                    CurPkgItem.Package.QTY = CurPosition.CurWipSNs.First().QTY;
                    CurPkgItem.Package.QTY = CurPosition.CurWipSNs.Sum(q => q.QTY);
                    CurPkgItem.Package.UNIT = dtl.PkgType.PKG_NAME;
                    CurPkgItem.Package.WORK_ORDER = CurPosition.CurWipSNs.First().WORK_ORDER;
                    CurPkgItem.Package.BATCH_NO = CurPosition.CurWipSNs.First().BATCH_NO;
@@ -566,7 +585,11 @@
                    CurPkgItem.Package.OPER_CODE = CurPosition.CurWipSNs.First().OPER_CODE;
                    CurPkgItem.Package.SEGMENT = CurPosition.CurWipSNs.First().SEGMENT;
                    CurPkgItem.Package.ACT_ID = NodeAct.ID;
                    CurPkgItem.Package.ACT_NAME = NodeAct.ACT_NAME;
                    CurPkgItem.Package.FLOW_SN = CurPosition.CurWipSNs.First().FLOW_SN;
                    CurPkgItem.WipSNs = CurPosition.CurWipSNs.ToDictionary(k => k.ID, v => v.SN);
                    FinishLevel++;
                    //完成包装的层级小于最外层包装层级
                    if (FinishLevel < PkgRule.Details.Max(q => q.PKG_LEVEL))
@@ -608,6 +631,8 @@
                            POST_CODE = CurPkgItem.Items.First().Package.POST_CODE,
                            OPER_CODE = CurPkgItem.Items.First().Package.OPER_CODE,
                            SEGMENT = CurPkgItem.Items.First().Package.SEGMENT,
                            ACT_ID = CurPkgItem.Items.First().Package.ACT_ID,
                            ACT_NAME = CurPkgItem.Items.First().Package.ACT_NAME,
                        } : new()
                        {
                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
@@ -629,6 +654,7 @@
                            OPER_CODE = CurPosition.CurWipSNs.First().OPER_CODE,
                            SEGMENT = CurPosition.CurWipSNs.First().SEGMENT,
                            ACT_ID = NodeAct.ID,
                            ACT_NAME = NodeAct.ACT_NAME,
                            FLOW_SN = CurPosition.CurWipSNs.First().FLOW_SN,
                        };
                        FinishLevel++;
@@ -717,6 +743,12 @@
                                    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("打印标签"));
@@ -758,27 +790,6 @@
                CurPosition.ResetNode();
            }
            return action;
        }
        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()
@@ -864,6 +875,7 @@
                        ACT_VALUE_1 = CurPkg.IsFinished ? "Y" : "N",
                        ACT_VALUE_2 = CurPkg.ToJson(),
                        ACT_VALUE_3 = CurPkg.IsFinished ? LabelDic[CurPkg.Item.PKG_LEVEL].ToJson() : "",
                        ACT_VALUE_4 = "Customer",
                        ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(),
                        TRACE_INFO = $"产品条码[{string.Join(",", CurPosition.CurSN)}]包装完成",
                    };
@@ -872,7 +884,8 @@
                //创建变量克隆对象用于传入DBSubmitAction中保存当前需要暂存的数据值
                var _wipActs = wipActs.Clone();
                var _pkgList = CurPkg.IsFinished ? CurPosition.GetPackageList(CurPkg.Item) : new();
                var _pkgList = CurPkg.IsFinished ? CurPosition.GetPackageList(CurPkg.Item).Clone() : new();
                var _wipIDs = CurPkg.IsFinished ? CurPkg.Item.GetWipSnList().Select(q => q.Key).ToList().Clone() : new();
                //保存数据
                CurStep.DBSubmitAction = () =>
                {
@@ -884,36 +897,36 @@
                    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 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>()
                        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))
                            .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))
                            .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))
                            .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))
                            .Where(q => q.WORK_ORDER == wo && _wipIDs.Contains(q.WIP_ID))
                            .ExecuteCommand();
                    }
                };
@@ -923,6 +936,8 @@
                if (CurPkg.IsFinished)
                {
                    var _pkgList = CurPosition.GetPackageList(CurPkg.Item).Clone();
                    var _wipIDs = CurPkg.Item.GetWipSnList().Select(q => q.Key).ToList().Clone();
                    var _lastWipID = CurPosition.LastWipSNs?.FirstOrDefault()?.ID;
                    //最外层包装已经完成包装,则把工序中暂存标记设为false,统一提交包装内产品的过站记录
                    CurPosition.NeedTemporaryStoreDBCommitAction = false;
@@ -933,42 +948,57 @@
                        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;
                            //var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList();
                            var nodeID = _pkgList.First(q => !q.NODE_ID.IsNullOrEmpty()).NODE_ID;
                            var actID = _pkgList.First(q => !q.ACT_ID.IsNullOrEmpty()).ACT_ID;
                            var wo = _pkgList.First(q => !q.WORK_ORDER.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)
                                .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.ID))
                                .Where(q => q.WORK_ORDER == wo && _wipIDs.Contains(q.ID))
                                .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))
                                .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))
                                .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>(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() : ""))
                                .SetColumns(q => q.ACT_VALUE_4 == "Customer")
                                .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>(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)
                                .SetColumns(q => q.ACT_VALUE_4 == "InStore")
                                .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))
                                .Where(q => q.WORK_ORDER == wo && _wipIDs.Contains(q.WIP_ID))
                                .ExecuteCommand();
                        }
                    });
                    //如果当前条码已经完工,检查当前工单批次和工单是否完工
                    if (CurPkg.IsReachedEndNode)
                    //if (CurPkg.IsReachedEndNode)
                    {
                        CurPosition.WorkBatch.CheckIsComplete(CurPosition.UserCode);
                    }