Dynamics 365 工作流
1、新建工作流状态枚举类
2、
public boolean canSubmitToWorkflow(str _workflowType = '') { boolean ret; ret = super(_workflowType); if(this.WorkFlowStatus == IWS_Luke_WorkFlowStatus::NotSubmitted || this.WorkFlowStatus == IWS_Luke_WorkFlowStatus::Rejected || this.WorkFlowStatus == IWS_Luke_WorkFlowStatus::ChangeRequested ) { ret = true; } return ret; } //用于更新状态 public static void updateWorkFlowStatus(RecId _recId,IWS_Luke_WorkFlowStatus _status) { IWS_OrderHeaderTrain orderHeader; if(_recId) { checkFailed("RecId is incorrect!"); } select firstonly orderHeader where orderHeader.RecId == _recId; if(orderHeader) { ttsbegin; orderHeader.selectForUpdate(true); orderHeader.WorkFlowStatus = _status; orderHeader.update(); ttscommit; } }
4、
7、

public void started(WorkflowEventArgs _workflowEventArgs) { // TODO: Write code to execute once the workflow is started. Info("TypeEventstarted"); IWS_OrderHeaderTrain::updateWorkFlowStatus( _workflowEventArgs.parmWorkflowContext().parmRecId(), IWS_Luke_WorkFlowStatus::PendingApproval); } public void canceled(WorkflowEventArgs _workflowEventArgs) { // TODO: Write code to execute once the workflow is canceled. Info("TypeEventcanceled"); IWS_OrderHeaderTrain::updateWorkFlowStatus( _workflowEventArgs.parmWorkflowContext().parmRecId(), IWS_Luke_WorkFlowStatus::Rejected); } public void completed(WorkflowEventArgs _workflowEventArgs) { // TODO: Write code to execute once the workflow is completed. Info("TypeEventcompleted"); IWS_OrderHeaderTrain::updateWorkFlowStatus( _workflowEventArgs.parmWorkflowContext().parmRecId(), IWS_Luke_WorkFlowStatus::Approved); }
8、创建workflow approval
9、
public void started(WorkflowElementEventArgs _workflowElementEventArgs) { // TODO: Write code to execute once the workflow is started. Info("ApprovalEventstarted"); IWS_OrderHeaderTrain::updateWorkFlowStatus( _workflowElementEventArgs.parmWorkflowContext().parmRecId(), IWS_Luke_WorkFlowStatus::PendingApproval); } public void canceled(WorkflowElementEventArgs _workflowElementEventArgs) { // TODO: Write code to execute once the workflow is canceled. Info("ApprovalEventcanceled"); IWS_OrderHeaderTrain::updateWorkFlowStatus( _workflowElementEventArgs.parmWorkflowContext().parmRecId(), IWS_Luke_WorkFlowStatus::Cancelled); } public void completed(WorkflowElementEventArgs _workflowElementEventArgs) { // TODO: Write code to execute once the workflow is completed. Info("ApprovalEventcompleted"); IWS_OrderHeaderTrain::updateWorkFlowStatus( _workflowElementEventArgs.parmWorkflowContext().parmRecId(), IWS_Luke_WorkFlowStatus::Approved); } public void denied(WorkflowElementEventArgs _workflowElementEventArgs) { // TODO: Write code to execute once the workflow is denied. Info("ApprovalEventdenied"); } public void changeRequested(WorkflowElementEventArgs _workflowElementEventArgs) { // TODO: Write code to execute once change is requested for the workflow. Info("ApprovalEventchangeRequested"); IWS_OrderHeaderTrain::updateWorkFlowStatus( _workflowElementEventArgs.parmWorkflowContext().parmRecId(), IWS_Luke_WorkFlowStatus::ChangeRequested); } public void returned(WorkflowElementEventArgs _workflowElementEventArgs) { // TODO: Write code to execute once the workflow is returned. Info("ApprovalEventreturned"); IWS_OrderHeaderTrain::updateWorkFlowStatus( _workflowElementEventArgs.parmWorkflowContext().parmRecId(), IWS_Luke_WorkFlowStatus::Rejected); } public void created(WorkflowWorkItemsEventArgs _workflowWorkItemsEventArgs) { // TODO: Write code to execute once work items are created. Info("ApprovalEventcreated"); }
10、

submit public static void main(Args args) { // TODO: Write code to execute once a work item is submitted. WorkFlowComment note=""; WorkFlowSubmitDialog workflowSubmitDialog; WorkFlowCorrelationId workflowCorrelationId; WorkFlowTypeName workflowTypeName = workFlowTypeStr('IWS_Luke_WorkFlowType'); IWS_OrderHeaderTrain orderHeader; //open workflow dialog workflowSubmitDialog = WorkFlowSubmitDialog::construct(args.caller().getActiveWorkflowConfiguration()); workflowSubmitDialog.run(); if(workflowSubmitDialog.parmIsClosedOK()) { //Get comments from the submit to workflow dialog. note = workflowSubmitDialog.parmWorkflowComment(); orderHeader = args.record(); try { ttsbegin; workflowCorrelationId = workflow::activateFromWorkflowType(workflowTypeName,orderHeader.RecId,note,NoYes::No); orderHeader.selectForUpdate(true); orderHeader.WorkFlowStatus = IWS_Luke_WorkFlowStatus::Submitted; orderHeader.update(); ttscommit; info("审批通过!"); } catch(Exception::Error) { error("审批不通过!"); } } args.caller().updateWorkFlowControls(); if(orderHeader) { if(orderHeader.dataSource()) { orderHeader.dataSource().research(true); orderHeader.dataSource().active(); } } }
Resubmit
11、
12、
应收账款 ——> 设置 ——> 应收账款工作流
13、
数据的状态默认不能为none,否则工作流图标不显示。
需要在表的值初始化里面加上状态值的初始化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结