using Rhea.Common; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tiger.IBusiness; using Tiger.IBusiness.MES.WorkAction; using Tiger.Model; using Tiger.Model.Entitys.MES.Position; using Tiger.Model.MES.Yada; namespace Tiger.Business.MES.WorkAction { public class ThreeInOne : IThreeInOne { #region Propertys & Variables #region 固定写法,工序中的必要信息 public bool IsFinished { get; set; } = false; public IWorkStep CurStep { get; set; } public IPosition CurPosition { get; set; } public MES_WO_NODE_ACT NodeAct { get; set; } public MES_WO_ACTION Setting { get; set; } #endregion public MES_CUST_SN CurCSN { get; set; } public BAS_LABEL_TEMP Label { get; set; } public List LabelPV { get; set; } public List MoPickList { get; set; } #endregion Propertys & Variables #region Functions /// /// 初始化工序行为 /// /// public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting) { #region 固定写法,给默认变量赋值 CurStep = curStep; CurPosition = position; NodeAct = nodeAct; Setting = setting; #endregion Label = Biz.Db.Queryable().Where(q => q.LABEL_CODE == setting.LABEL_CODE).IncludesAllFirstLayer().First(); LabelPV = Biz.Db.Queryable().ToList(); MoPickList = Biz.DataSource["YadaU9C"].Client.Queryable().Where(q => q.MoDocNo == CurPosition.WorkBatch.WO.ORDER_NO).ToList(); } /// /// 获取行为开始的提示信息 /// /// public Locale GetBeginMsg() { var msg = new Locale("MES.WorkAction.ThreeInOne.BeginMsg", CurPosition.CurSN); //var msg = new Locale($"开始检查条码[{CurPosition.CurSN}]的是否已绑定客户条码"); return msg; } /// /// 尝试开始执行工序行为 /// /// public ApiAction TryBegin(SubmitInput input) { var action = new ApiAction(new SubmitOutput()); //只允许单个产品进行客户条码绑定 if (CurPosition.CurWipSNs.Count > 1) { CurStep.Message = Biz.L("请扫描单个产品"); CurStep.Status = StepStatus.Error; action.Data.ShortMsg = new("请扫描单个产品", ShortMessage.Types.Error); //action.LocaleMsg = new($"条码[{0}]是包装/载具条码,请重新扫描单个厂内条码进行客户条码绑定"); action.LocaleMsg = new("MES.WorkAction.ThreeInOne.NotProductSN", CurPosition.CurSN); //重置工序操作 CurPosition.ResetNode(); action.IsSuccessed = false; return action; } var wipSn = CurPosition.CurWipSNs.First(); CurCSN = Biz.Db.Queryable().Where(q => q.FLOW_SN == wipSn.SN).First(); //厂内条码已绑定客户条码,直接结束行为 if (!CurCSN.IsNullOrEmpty()) { //客户条码已绑定当前工单或者其批次属于当前工单上料物料的推荐批次 if (CurCSN.WORK_ORDER == CurPosition.WorkBatch.WO.ORDER_NO || MoPickList.Any(q => q.Code == CurCSN.ITEM_CODE && q.SuggestedBatch == CurCSN.WORK_ORDER)) { CurCSN.WORK_ORDER = CurPosition.WorkBatch.WO.ORDER_NO; CurCSN.ITEM_CODE = CurPosition.WorkBatch.WO.ITEM_CODE; action.Data.Data = new { NeedPrint = false, NeedScan = false, Label = "", }; action = End(input); } else { action.Data.Data = new { NeedPrint = false, NeedScan = false, Label = "", }; CurStep.Message = Biz.L("投料错误"); CurStep.Status = StepStatus.Error; action.Data.ShortMsg = new("投料错误", ShortMessage.Types.Failed); action.IsSuccessed = false; //action.LocaleMsg = new($"产品的客户条码[{0}]属于工单[{1}]不适用于当前工单[{2}]的生产"); action.LocaleMsg = new("MES.WorkAction.ThreeInOne.InputSnError", CurCSN.CUST_SN, CurCSN.WORK_ORDER, CurPosition.WorkBatch.WO.ORDER_NO); //如果行为设置为出错需要重置工序操作 if (NodeAct.NEED_RESET == "Y") { CurPosition.ResetNode(); } return action; } } //厂内条码未绑定客户条码 else { //如果客户条码标签模板为空则不需要打印,等待扫描客户条码进行绑定 if (Label.IsNullOrEmpty()) { action.Data.Data = new { NeedPrint = false, NeedScan = true, Label = "", }; CurStep.Message = Biz.L("扫描客户标签"); CurStep.Status = StepStatus.Normal; action.Data.ShortMsg = new("扫描客户标签", ShortMessage.Types.Normal); //action.LocaleMsg = new Locale($"请扫描厂内条码[{0}]需要绑定客户条码"); action.LocaleMsg = new Locale("MES.WorkAction.ThreeInOne.BeginScan", wipSn.SN); } else { //设置打印变量值 Label = CurPosition.SetLabelVariables(LabelPV, Label); action.Data.Data = new { NeedPrint = true, NeedScan = true, Label, }; CurStep.Message = Biz.L("扫描已打印的客户标签"); CurStep.Status = StepStatus.Normal; action.Data.ShortMsg = new("扫描已打印的客户标签", ShortMessage.Types.Normal); //action.LocaleMsg = new Locale($"开始打印厂内条码[{0}]对应的客户条码"); action.LocaleMsg = new Locale("MES.WorkAction.ThreeInOne.BeginPrint", wipSn.SN); } } //如果返回成功则认为当前行为可以开始执行,否则返回失败 action.IsSuccessed = true; return action; } /// /// 工序行为提交数据 /// /// public ApiAction Submit(SubmitInput input) { var action = new ApiAction(new SubmitOutput()); var csn = input.Data; CurCSN = Biz.Db.Queryable().Where(q => q.CUST_SN == input.Data).First() ?? new() { CUST_SN = input.Data, }; //客户条码已绑定其他厂内条码 if (!CurCSN.FLOW_SN.IsNullOrEmpty() && CurCSN.FLOW_SN != CurPosition.CurWipSNs.First().SN) { CurStep.Message = Biz.L("绑定失败"); CurStep.Status = StepStatus.Error; action.Data.ShortMsg = new("绑定失败", ShortMessage.Types.Failed); action.IsSuccessed = false; //action.LocaleMsg = new($"厂内条码[{0}]绑定客户条码[{1}]失败,客户条码已绑定厂内条码[{2}]"); action.LocaleMsg = new("MES.WorkAction.ThreeInOne.BindingOtherSN", CurPosition.CurWipSNs.First().SN, CurCSN.CUST_SN, CurCSN.FLOW_SN); //如果行为设置为出错需要重置工序操作 if (NodeAct.NEED_RESET == "Y") { CurPosition.ResetNode(); } } //客户条码不属于当前工单的客户 else if (CurCSN.CUST_CODE.IsNullOrEmpty(CurPosition.WorkBatch.WO.CUST_CODE) != CurPosition.WorkBatch.WO.CUST_CODE) { CurStep.Message = Biz.L("绑定失败"); CurStep.Status = StepStatus.Error; action.Data.ShortMsg = new("绑定失败", ShortMessage.Types.Failed); action.IsSuccessed = false; //action.LocaleMsg = new($"客户条码[{0}]属于客户[{1}],与当前工单的客户[{2}]不一致"); action.LocaleMsg = new("MES.WorkAction.ThreeInOne.NotSameCustomer", CurCSN.CUST_SN, CurCSN.CUST_CODE, CurPosition.WorkBatch.WO.CUST_CODE); //如果行为设置为出错需要重置工序操作 if (NodeAct.NEED_RESET == "Y") { CurPosition.ResetNode(); } } //提交数据执行失败 else { CurCSN.CUST_CODE = CurPosition.WorkBatch.WO.CUST_CODE; CurCSN.FLOW_SN = CurPosition.CurWipSNs.First().SN; CurCSN.WORK_ORDER = CurPosition.WorkBatch.WO.ORDER_NO; CurCSN.ITEM_CODE = CurPosition.WorkBatch.WO.ITEM_CODE; action = End(input); } return action; } /// /// 结束执行工序行为 /// /// public ApiAction End(SubmitInput input) { var action = new ApiAction(new SubmitOutput()); //记录行为操作记录 var wipActs = new List(); var woSns = new List(); var snHiss = new List(); foreach (var wipSn in CurPosition.CurWipSNs) { //更新在制品信息SN为客户条码 wipSn.SN = CurCSN.CUST_SN; //更新在制品信息历史得SN为客户条码 var his = CurPosition.CurWipSNHiss.First(q => q.WIP_ID == wipSn.ID); his.SN = CurCSN.CUST_SN; snHiss.Add(his); //更新工单条码表的 var woSn = CurPosition.WorkBatch.WoSNs.First(q => q.WIP_ID == wipSn.ID); woSn.SN = CurCSN.CUST_SN; woSns.Add(woSn); var wipAct = new MES_WIP_ACT() { AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG, AUTH_PROD = CurPosition.CurLine.LINE_CODE, HIS_ID = CurPosition.CurWipSNHiss.First(q => q.SN == wipSn.SN).ID, WIP_ID = wipSn.ID, SN = wipSn.SN, STATUS = wipSn.STATUS, ITEM_CODE = wipSn.ITEM_CODE, WORK_ORDER = wipSn.WORK_ORDER, BATCH_NO = wipSn.BATCH_NO, ROT_CODE = wipSn.ROT_CODE, NODE_ID = wipSn.NODE_ID, NODE_NAME = wipSn.NODE_NAME, ACT_ID = NodeAct.ID, ACT_NAME = NodeAct.ACT_NAME, FTY_CODE = wipSn.FTY_CODE, WS_CODE = wipSn.WS_CODE, LINE_CODE = wipSn.LINE_CODE, POST_CODE = wipSn.POST_CODE, OPER_CODE = wipSn.OPER_CODE, SEGMENT = wipSn.SEGMENT, FLOW_SN = wipSn.FLOW_SN, TRAY_SN = wipSn.TRAY_SN, INNER_SN = wipSn.INNER_SN, CARTON_SN = wipSn.CARTON_SN, PALLET_SN = wipSn.PALLET_SN, OPERATION_TIME = DateTime.Now, SFTS_CODE = wipSn.SFTS_CODE, SFT_CODE = wipSn.SFT_CODE, PRD_CODE = wipSn.PRD_CODE, ACT_TYPE = NodeAct.ACT_TYPE, ACT_SN = wipSn.SN, ACT_VALUE_1 = Label.LABEL_CODE, ACT_VALUE_2 = Label.Variables.ToJson(), ACT_RESULT = "Y", TRACE_INFO = $"厂内条码[{0}]已绑定客户条码[{1}]成功", }; wipActs.Add(wipAct); } //创建变量克隆对象用于传入DBSubmitAction中保存当前需要暂存的数据值 var _wipSns = CurPosition.CurWipSNs.Clone(); var _snHiss = snHiss.Clone(); var _woSns = woSns.Clone(); var _wipActs = wipActs.Clone(); var _CurCSN = CurCSN.Clone(); //保存数据 CurStep.DBSubmitAction = () => { var db = CurPosition.GetCommitDB(); db.Storageable(_wipSns, CurPosition.UserCode).ExecuteCommand(); db.Storageable(_snHiss, CurPosition.UserCode).ExecuteCommand(); db.Storageable(_woSns, CurPosition.UserCode).ExecuteCommand(); db.Storageable(_wipActs, CurPosition.UserCode).ExecuteCommand(); db.Storageable(_CurCSN, CurPosition.UserCode).ExecuteCommand(); }; IsFinished = true; CurStep.Message = Biz.L("客户条码已绑定"); CurStep.Status = StepStatus.Finished; action.Data.ShortMsg = new("客户条码已绑定", ShortMessage.Types.Success); //action.LocaleMsg = new($"厂内条码[{0}]已绑定客户条码[{1}]完成", Label.LABEL_NAME); action.LocaleMsg = new("MES.WorkAction.ThreeInOne.BindingComplete", CurCSN.FLOW_SN, CurCSN.CUST_SN); return action; } #endregion Functions } }