之前提到的D365中,Workflow避免同一审核人多次审批,有一种场景没有考虑到,当在一个审批节点中,设置了多个审批人,但是审批的策略为单个人审批通过,这样就会出现一个问题,假如,节点中设置了A和B两个人,A审批了此节点,因为策略是单个人审批通过,节点就完成,这样B就会被系统自动更新为完成,导致下一个节点中如果再次出现B审批人,之前的逻辑,会跳过B,导致B没法审批,为了修复这个问题,想到两种方案来处理。
一,在WorkflowWorkItemTable增加标识字段来,区分是否是由系统自动完成的,来判断是否要跳过工作项的创建。
二,通过WorkflowTrackingCommentTable的Comment字段做处理,如果是系统自动完成的工作项,Comment字段一定是空的。手工完成的工作项,如果为空,通过后台强制赋予固定的字符串,这样就可以通过,Comment是否为空来区分工作项是系统自动完成,还是手工完成。
通过第二种方式,在测试中发现,Comment是memo字段,在D365中无法通过非空来过滤,这个问题在2012也存在,所以这里无法直接进行筛选来判断,我们可以通过直接写SQL语句来查找,当然也可以增加一个非memo类型的string字段,当WorkflowTrackingCommentTable插入时,将Comment字段自动赋给我们增加的字段,然后通过新加的字段来判断。
SQL查下语句
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; }
标签:Comment,Workflow,workItemActivityContext,D365,字段,审批,审核,strQuery From: https://www.cnblogs.com/dingkui/p/16707152.html