| | |
| | | #region Propertys & Variables |
| | | public string ID { get; set; } = Guid.NewGuid().ToString("N"); |
| | | public string Name { get; set; } |
| | | private DateTime BeginAt; |
| | | private DateTime EndAt; |
| | | public TimeSpan ElapsedTime => EndAt - BeginAt; |
| | | public IWorkStep.NodeTypes NodeType { get; set; } |
| | | public MES_WO_NODE Node { get; set; } |
| | | public MES_WO_OPER OperSetting { get; set; } |
| | |
| | | /// <returns></returns> |
| | | public ApiAction<SubmitOutput> TryBegin(SubmitInput input) |
| | | { |
| | | BeginAt = DateTime.Now; |
| | | return CurAction.TryBegin(input); |
| | | } |
| | | |
| | |
| | | /// <returns></returns> |
| | | public ApiAction<SubmitOutput> End(SubmitInput input) |
| | | { |
| | | return CurAction.End(input); |
| | | var result = CurAction.End(input); |
| | | EndAt = DateTime.Now; |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取工步当前耗时 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public TimeSpan GetElapsedTime() |
| | | { |
| | | return DateTime.Now - BeginAt; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | var curNode = CurBatch.GetNode(PostCode); |
| | | try |
| | | { |
| | | //当工步列表为空,则执行当前工序的必要逻辑当作第一个工序节点,完成后按需求创建后续的工步列表 |
| | | if (Steps.IsNullOrEmpty()) |
| | | { |
| | | BeginAt = DateTime.Now; |
| | | //判断工单实时状态判断是否可以生产 |
| | | var woStatus = CurBatch.CheckCanProduce(curNode); |
| | | if (!woStatus.IsSuccessed) |
| | |
| | | return canGotoNext; |
| | | } |
| | | |
| | | //当工步列表为空,则执行当前工序的必要逻辑当作第一个工序节点,完成后按需求创建后续的工步列表 |
| | | if (Steps.IsNullOrEmpty()) |
| | | { |
| | | //绑定条码到工单 |
| | | foreach (var wipSN in wipSNs) |
| | | { |
| | |
| | | { |
| | | var curStep = Steps.Where(q => q.NodeType == IWorkStep.NodeTypes.Node && !q.IsFinished).OrderBy(q => q.Sequence).First(); |
| | | |
| | | //根据工序节点工步的序号处理相应工步的处理逻辑 |
| | | switch (curStep.Sequence) |
| | | { |
| | | case 2: |
| | | { |
| | | //第二工步的处理逻辑 |
| | | |
| | | |
| | | //完成当前工序节点工步 |
| | | curStep.IsFinished = true; |
| | | curStep.Status = StepStatus.Finished; |
| | | CurStep = curStep; |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | |
| | | //未完成所有工步 |
| | | if (!IsFinishAllSteps) |
| | |
| | | var curNode = CurBatch.GetNode(PostCode); |
| | | try |
| | | { |
| | | //当工步列表为空,则执行当前工序的必要逻辑当作第一个工序节点,完成后按需求创建后续的工步列表 |
| | | if (Steps.IsNullOrEmpty()) |
| | | { |
| | | BeginAt = DateTime.Now; |
| | | //判断工单实时状态判断是否可以生产 |
| | | var woStatus = CurBatch.CheckCanProduce(curNode); |
| | | if (!woStatus.IsSuccessed) |
| | |
| | | return canGotoNext; |
| | | } |
| | | |
| | | //当工步列表为空,则执行当前工序的必要逻辑当作第一个工序节点,完成后按需求创建后续的工步列表 |
| | | if (Steps.IsNullOrEmpty()) |
| | | { |
| | | //绑定条码到工单 |
| | | foreach (var wipSN in wipSNs) |
| | | { |
| | |
| | | { |
| | | var curStep = Steps.Where(q => q.NodeType == IWorkStep.NodeTypes.Node && !q.IsFinished).OrderBy(q => q.Sequence).First(); |
| | | |
| | | //根据工序节点工步的序号处理相应工步的处理逻辑 |
| | | switch (curStep.Sequence) |
| | | { |
| | | case 2: |
| | | { |
| | | //第二工步的处理逻辑 |
| | | |
| | | |
| | | //完成当前工序节点工步 |
| | | curStep.IsFinished = true; |
| | | curStep.Status = StepStatus.Finished; |
| | | CurStep = curStep; |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | |
| | | //未完成所有工步 |
| | | if (!IsFinishAllSteps) |
| | |
| | | #region Propertys & Variables |
| | | public string UserCode { get; set; } |
| | | public string PostCode { get; set; } |
| | | protected DateTime BeginAt; |
| | | protected DateTime EndAt; |
| | | public TimeSpan ElapsedTime => EndAt - BeginAt; |
| | | public MES_FACTORY CurFactory { get; set; } |
| | | public MES_WORKSHOP CurWorkshop { get; set; } |
| | | public MES_LINE CurLine { get; set; } |
| | |
| | | action.Invoke(); |
| | | } |
| | | } |
| | | //记录工序耗时 |
| | | EndAt = DateTime.Now; |
| | | var ids = CurWipSNHiss.Select(q => q.ID).ToList(); |
| | | GetCommitDB().Updateable<MES_WIP_HIS>().SetColumns(q => q.ELAPSED_TIME == ElapsedTime.TotalMilliseconds.ToInt64()).Where(q => ids.Contains(q.ID)).ExecuteCommand(); |
| | | }); |
| | | if (dbTran.IsSuccess) |
| | | { |
| | |
| | | var curNode = CurBatch.GetNode(PostCode); |
| | | try |
| | | { |
| | | //当工步列表为空,则执行当前工序的必要逻辑当作第一个工序节点,完成后按需求创建后续的工步列表 |
| | | if (Steps.IsNullOrEmpty()) |
| | | { |
| | | BeginAt = DateTime.Now; |
| | | //判断工单实时状态判断是否可以生产 |
| | | var woStatus = CurBatch.CheckCanProduce(curNode); |
| | | if (!woStatus.IsSuccessed) |
| | |
| | | return canGotoNext; |
| | | } |
| | | |
| | | //当工步列表为空,则执行当前工序的必要逻辑当作第一个工序节点,完成后按需求创建后续的工步列表 |
| | | if (Steps.IsNullOrEmpty()) |
| | | { |
| | | //绑定条码到工单 |
| | | foreach (var wipSN in wipSNs) |
| | | { |
| | |
| | | { |
| | | var curStep = Steps.Where(q => q.NodeType == IWorkStep.NodeTypes.Node && !q.IsFinished).OrderBy(q => q.Sequence).First(); |
| | | |
| | | //根据工序节点工步的序号处理相应工步的处理逻辑 |
| | | switch (curStep.Sequence) |
| | | { |
| | | case 2: |
| | | { |
| | | //第二工步的处理逻辑 |
| | | |
| | | |
| | | //完成当前工序节点工步 |
| | | curStep.IsFinished = true; |
| | | curStep.Status = StepStatus.Finished; |
| | | CurStep = curStep; |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | |
| | | //未完成所有工步 |
| | | if (!IsFinishAllSteps) |
| | |
| | | ACT_SN = wipSn.SN, |
| | | ACT_VALUE_1 = CurAssembly.ToJson(), |
| | | ACT_RESULT = "Y", |
| | | ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(), |
| | | TRACE_INFO = $"以下物料上料完成:{string.Join(",", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}", |
| | | }; |
| | | wipActs.Add(wipAct); |
| | |
| | | ACT_VALUE_4 = "", |
| | | ACT_VALUE_5 = "", |
| | | ACT_RESULT = "Y", |
| | | ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(), |
| | | TRACE_INFO = $"执行成功", |
| | | }; |
| | | wipActs.Add(wipAct); |
| | |
| | | ACT_TYPE = NodeAct.ACT_TYPE, |
| | | ACT_SN = wipSn.SN, |
| | | ACT_RESULT = "Y", |
| | | ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(), |
| | | TRACE_INFO = $"条码[{wipSn.SN}]可以在工单[{wipSn.WORK_ORDER}]投料生产,其中U9检查耗时{U9Cost:0.0000}秒", |
| | | }; |
| | | wipActs.Add(wipAct); |
| | |
| | | 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); |
| | |
| | | ACT_VALUE_1 = Label.LABEL_CODE, |
| | | ACT_VALUE_2 = Label.Variables.ToJson(), |
| | | ACT_RESULT = "Y", |
| | | ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(), |
| | | TRACE_INFO = $"标签{Label.LABEL_NAME}[{Label.LABEL_CODE}]打印成功", |
| | | }; |
| | | wipActs.Add(wipAct); |
| | |
| | | ACT_VALUE_1 = Label.LABEL_CODE, |
| | | ACT_VALUE_2 = Label.Variables.ToJson(), |
| | | ACT_RESULT = "Y", |
| | | ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(), |
| | | TRACE_INFO = $"厂内条码[{FlowCSN.FLOW_SN}]绑定客户条码[{FlowCSN.CUST_SN}]成功", |
| | | }; |
| | | wipActs.Add(wipAct); |
| | |
| | | ACT_TYPE = NodeAct.ACT_TYPE, |
| | | ACT_SN = wipSn.SN, |
| | | ACT_RESULT = "Y", |
| | | ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(), |
| | | TRACE_INFO = $"产品[{CurPosition.CurSN}]验证通过", |
| | | }; |
| | | wipActs.Add(wipAct); |
| | |
| | | ACT_TYPE = NodeAct.ACT_TYPE, |
| | | ACT_SN = wipSn.SN, |
| | | ACT_RESULT = "Y", |
| | | ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(), |
| | | TRACE_INFO = $"条码[{CurPosition.CurSN}]称重数据[{CurPkg.WEIGHT} {CurPkg.WEIGHT_UNIT}]保存成功", |
| | | }; |
| | | wipActs.Add(wipAct); |
| | |
| | | ACT_SN = wipSn.SN, |
| | | ACT_VALUE_1 = CurWipExt.ToJson(), |
| | | ACT_RESULT = "Y", |
| | | ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(), |
| | | TRACE_INFO = $"产品[{CurPosition.CurSN}]绑定[{ExtInfo.FIELD_NAME}]标签条码[{CurWipExt.GetType().GetProperty($"FIELD_{ExtInfo.SEQ.ToString("00")}")?.GetValue(CurWipExt)?.ToString()}]保存成功", |
| | | }; |
| | | wipActs.Add(wipAct); |
| | |
| | | ACT_SN = wipSn.SN, |
| | | ACT_VALUE_1 = CurAssembly.ToJson(), |
| | | ACT_RESULT = "Y", |
| | | ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(), |
| | | TRACE_INFO = $"以下物料上料完成:{string.Join(",", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}", |
| | | }; |
| | | wipActs.Add(wipAct); |
| | |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public abstract ApiAction<OutputT> End(InputT input); |
| | | /// <summary> |
| | | /// 获取工步当前耗时 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public TimeSpan GetElapsedTime(); |
| | | #endregion Functions |
| | | } |
| | | |
| | |
| | | [DisplayName("备注")] |
| | | public string REMARK { get; set; } |
| | | /// <summary> |
| | | /// 操作耗时(s) |
| | | /// </summary> |
| | | [DisplayName("操作耗时(ms)")] |
| | | public long ELAPSED_TIME { get; set; } = 0; |
| | | /// <summary> |
| | | /// 追溯信息 |
| | | /// </summary> |
| | | [DisplayName("追溯信息")] |
| | |
| | | [DisplayName("备注")] |
| | | public string REMARK { get; set; } |
| | | /// <summary> |
| | | /// 操作耗时(s) |
| | | /// </summary> |
| | | [DisplayName("操作耗时(ms)")] |
| | | public long ELAPSED_TIME { get; set; } = 0; |
| | | /// <summary> |
| | | /// 追溯信息 |
| | | /// </summary> |
| | | [DisplayName("追溯信息")] |