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; }
分类:
D365
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?