Dynamics 365 工作流

1、新建工作流状态枚举类

 

 2、将枚举类添加到需要实现工作流的表字段里

3、表需要实现canSubmitToWorkflow方法并在需要添加的表单里开启对应的属性

复制代码
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、创建一个用于工作流查询的Query

5、创建workflow category

Module 列表里所展示的元素可以在ModuleAxapta基础类里进行扩展,但需要关联到现有的模块里

6、创建workflow type

7、重写workflow typeevent handler

复制代码
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);
    }
View Code
复制代码

8、创建workflow approval

 

9、重写workflow approvalevent handler

复制代码
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、扩展workflow typesubmitworkflow approvalresubmit

复制代码
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();
            }
        }

    }
View Code
复制代码

Resubmit

 11、workflow approval添加到workflow typeSupported Elements

12、

workflow category 所配置的module里添加新的工作流

应收账款 ——> 设置 ——> 应收账款工作流

新建的时候需要用IE浏览器打开,不能用chrome

 13、

启用工作流

数据的状态默认不能为none,否则工作流图标不显示。

需要在表的值初始化里面加上状态值的初始化。

工作流需要开启批处理服务

 

 

 

posted @   左耳右击  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
点击右上角即可分享
微信分享提示