| | |
| | | using Rhea.Common; |
| | | using Microsoft.CodeAnalysis.Differencing; |
| | | using Rhea.Common; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | |
| | | 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 |
| | |
| | | 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"; |
| | |
| | | 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}]"); |
| | |
| | | } |
| | | |
| | | //如果返回成功则认为当前行为可以开始执行,否则返回失败 |
| | | action.IsSuccessed = true; |
| | | //action.IsSuccessed = true; |
| | | return action; |
| | | } |
| | | |
| | |
| | | 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; |
| | | } |
| | | //验证当前包装条码是否已经被扫描过 |
| | |
| | | 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:打印,打印当前包装层级的标签 |
| | |
| | | if (!pInput.WeightInfo.IsNullOrEmpty() && pInput.WeightInfo.Weight > 0) |
| | | { |
| | | //验证重量数据是否符合设置好的重量范围 |
| | | if (!PkgProd.IsNullOrEmpty() && (pInput.WeightInfo.Weight < PkgProd.MIN_WEIGHT || PkgProd.MAX_WEIGHT < pInput.WeightInfo.Weight)) |
| | | if (!PkgProd.IsNullOrEmpty() && ((pInput.WeightInfo.Weight < PkgProd.MIN_WEIGHT && !IsManually) || PkgProd.MAX_WEIGHT < pInput.WeightInfo.Weight)) |
| | | { |
| | | action.IsSuccessed = false; |
| | | CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("重量超限")); |
| | |
| | | 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"; |
| | |
| | | |
| | | //手动结束包装默认从第二层包装开始验证 |
| | | 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"; |
| | |
| | | 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"; |
| | |
| | | //最外层包装已经完成包装,保存包装数据到数据库 |
| | | else |
| | | { |
| | | CurPkg.Item = CurPkgItem; |
| | | action = CompletePkg(); |
| | | } |
| | | } |
| | |
| | | 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, |
| | |
| | | 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) |
| | |
| | | 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"; |
| | |
| | | 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()); |
| | |
| | | action.LocaleMsg = new("MES.WorkAction.PackingAction.PackageComplete", CurPkg.Item.PKG_LEVEL, CurPkg.Item.PKG_NAME); |
| | | |
| | | //手动结束包装则标记行为完成 |
| | | //if (CurStep.IsNullOrEmpty()) |
| | | //if (IsManually) |
| | | //{ |
| | | // IsFinished = true; |
| | | //} |
| | |
| | | } |
| | | |
| | | //不是手动结束包装则保存行为操作记录 |
| | | if (!CurStep.IsNullOrEmpty()) |
| | | if (!IsManually) |
| | | { |
| | | //记录行为操作记录 |
| | | var wipActs = new List<MES_WIP_ACT>(); |
| | |
| | | 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); |
| | |
| | | } |
| | | else |
| | | { |
| | | var _pkgList = CurPkg.IsFinished ? GetPackageList(CurPkg.Item) : new(); |
| | | //保存数据 |
| | | var db = Biz.Db; |
| | | var dbTran = db.UseTran(() => |
| | | if (CurPkg.IsFinished) |
| | | { |
| | | 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(); |
| | | } |
| | | } |
| | | }); |
| | | if (!dbTran.IsSuccess) |
| | | { |
| | | //抛出异常 |
| | | throw dbTran.ErrorException; |
| | | var _pkgList = GetPackageList(CurPkg.Item); |
| | | |
| | | //最外层包装已经完成包装,则把工序中暂存标记设为false,统一提交包装内产品的过站记录 |
| | | CurPosition.NeedTemporaryStoreDBCommitAction = false; |
| | | //保存数据 |
| | | CurPosition.SaveStepsCommitActionToDB(() => |
| | | { |
| | | var db = CurPosition.GetCommitDB(); |
| | | 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(); |
| | | } |
| | | } |
| | | }); |
| | | //如果当前条码已经完工,检查当前工单批次和工单是否完工 |
| | | if (CurPkg.IsReachedEndNode) |
| | | { |
| | | CurPosition.WorkBatch.CheckIsComplete(CurPosition.UserCode); |
| | | } |
| | | } |
| | | } |
| | | |