D365: Workflow避免同一审核人多次审批(问题处理)

之前提到的D365中,Workflow避免同一审核人多次审批,有一种场景没有考虑到,当在一个审批节点中,设置了多个审批人,但是审批的策略为单个人审批通过,这样就会出现一个问题,假如,节点中设置了A和B两个人,A审批了此节点,因为策略是单个人审批通过,节点就完成,这样B就会被系统自动更新为完成,导致下一个节点中如果再次出现B审批人,之前的逻辑,会跳过B,导致B没法审批,为了修复这个问题,想到两种方案来处理。

一,在WorkflowWorkItemTable增加标识字段来,区分是否是由系统自动完成的,来判断是否要跳过工作项的创建。

二,通过WorkflowTrackingCommentTable的Comment字段做处理,如果是系统自动完成的工作项,Comment字段一定是空的。手工完成的工作项,如果为空,通过后台强制赋予固定的字符串,这样就可以通过,Comment是否为空来区分工作项是系统自动完成,还是手工完成。

复制代码
[ExtensionOf(classStr(WorkflowWorkItem))]
final class WorkflowWorkItemCVya_Extension
{
    public server static void takeAction(
        WorkflowWorkItemInstanceId  _workItemId,
        WorkflowOutcomeName         _outcome,
        WorkflowComment             _workflowComment,
        WorkflowUser                _toUser)
    {
        #Workflow

        if (_outcome == #ApprovalActionApprove)
        {
            if (_workflowComment == "")
            {
                _workflowComment = #ApprovalActionApprove;
            }
        }

        next takeAction(_workItemId, _outcome, _workflowComment, _toUser);
    }

}
复制代码

通过第二种方式,在测试中发现,Comment是memo字段,在D365中无法通过非空来过滤,这个问题在2012也存在,所以这里无法直接进行筛选来判断,我们可以通过直接写SQL语句来查找,当然也可以增加一个非memo类型的string字段,当WorkflowTrackingCommentTable插入时,将Comment字段自动赋给我们增加的字段,然后通过新加的字段来判断。

SQL查下语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Connection  connection = new Connection();
        str         strQuery;
        Statement   statement = connection.createStatement();
        SqlStatementExecutePermission permission;
        strQuery    = strFmt("select * from WORKFLOWTRACKINGCOMMENTTABLE c " +
                             "inner join WORKFLOWTRACKINGWORKITEM  i on i.TRACKINGID = c.TRACKINGID " +
                             "inner join WORKFLOWWORKITEMTABLE t on t.RECID = i.WorkflowWorkItemTable " +
                             "where t.CORRELATIONID = '%1' " +
                             "and t.ROOTCORRELATIONID = '%2' " +
                             "and t.ConfigurationId = '%3' " +
                             "and t.UserId = '%4' " +
                             "and t.STATUS = %5 " +
                             "and c.COMMENT_ <> '' ",
                             _workItemActivityContext.WorkflowContext.WorkflowCorrelationId,
                             _workItemActivityContext.WorkflowContext.RootCorrelationId,
                             _workItemActivityContext.ConfigurationId,
                             _workItemActivityContext.User.UserId,
                             enum2int(WorkflowWorkItemStatus::Completed));
        permission = new SqlStatementExecutePermission(strQuery);
        permission.assert();
 
        ResultSet resultSet = statement.executeQuery(strQuery);
 
        while(resultSet.next())
        {
            skip = true;
            break;
        } 

 增加字段来判断

复制代码
[ExtensionOf(tableStr(WorkflowTrackingCommentTable))]
final class WorkflowTrackingCommentTableTVya_Extension
{
    void insert()
    {
        this.VyaComment = this.Comment;

        next insert();
    }

}
复制代码

 

复制代码
public static boolean skipWorkItem(WorkItemActivityContext _workItemActivityContext)
    {
        SysWorkflowElement           sysWorkflowElement;
        WorkflowTrackingCommentTable commentTable;
        WorkflowTrackingWorkItem     trackingWorkItem;
        WorkflowWorkItemTable        workItemTable;
        WorkflowElementEventArgs     elementEventArgs;
        WorkflowWorkItemsEventArgs   workItemEventArgs;
        UserId                       curUserId;
        
        boolean     skip = next skipWorkItem(_workItemActivityContext);
        curUserId   = _workItemActivityContext.User.UserId;

        select firstonly workItemTable
            where workItemTable.ConfigurationId == _workItemActivityContext.ConfigurationId
               && workItemTable.CorrelationId == _workItemActivityContext.WorkflowContext.WorkflowCorrelationId
               && workItemTable.RootCorrelationId == _workItemActivityContext.WorkflowContext.RootCorrelationId
               && workItemTable.UserId == _workItemActivityContext.User.UserId
               && workItemTable.Status == WorkflowWorkItemStatus::Completed
               && workItemTable.Type != WorkflowWorkItemType::Return
            join trackingWorkItem
                where trackingWorkItem.WorkflowWorkItemTable == workItemTable.RecId
            join commentTable
                where commentTable.TrackingId == trackingWorkItem.TrackingId
            && commentTable.VyaComment != "";

        skip    = workItemTable.RecId ? true : false;

        return skip;
    }
复制代码

 

posted @   adingkui  阅读(180)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示