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查下语句
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; }

浙公网安备 33010602011771号