D365: Workflow避免同一审核人多次审批(问题处理2:审批人拒绝,重新提交后,审批流直接流转到拒绝人节点)
前面提到过,当审批人出现在多个节点,前面的节点审批完成后,后面节点如果再次出现同一审批人,系统自动审批,在测试中发现另外一种场景,当审批流执行了多个节点后,中间节点的某个审批人拒绝了提交的单据,当用户再次提交审批流后,系统会出现新的bug,由于我们改过的逻辑,当审批流的工作项中出现了完成的记录,系统会自动跳过或者审批后创建的节点,这里没有考虑拒绝的情况,经过调查,按下面方法修复了此问题,修复后也解决了审批人拒绝,重新提交后,审批流直接流转到拒绝人节点,这个也是标准功能存在的缺陷。
代码也很简单,在处理工作项时,只需要加一个判断,判断当前的工作项的类型是否是WorkflowWorkItemType::WorkItem。
public static void removeWorkItems(WorkItemActivityContextCollection _workItems) { Microsoft.Dynamics.AX.Framework.Workflow.Runtime.WorkItemActivityContext workItemActivityContext; System.Collections.IEnumerator enumerator; WorkflowWorkItemTable workItemTable; WorkflowStepTable workflowStepTable; int i; Array array; boolean skip; next removeWorkItems(_workItems); for (i = 0; i < _workItems.Count; i++) { workItemActivityContext = _workItems.get_ITEM(i); skip = SysWorkflowWorkItemHelper::skipWorkItem(workItemActivityContext); if (skip) { if (_workItems.Count == 1) { workItemTable = WorkflowWorkItemTable::findActivityInstanceId(workItemActivityContext.get_ActivityId()); if (workItemTable.RecId == 0) { new SysWorkflowWorkItem().callCreateWorkItems(workItemActivityContext, NoYes::Yes); } workItemTable = WorkflowWorkItemTable::findActivityInstanceId(workItemActivityContext.get_ActivityId()); if (workItemTable) { if (workItemTable.Type == WorkflowWorkItemType::WorkItem) { WorkflowWorkItemActionManager::dispatchWorkItemAction( workItemTable, "Auto Approve", workItemTable.UserId, WorkflowWorkItemActionType::Complete, workItemTable.MenuItemName); } } } else { workflowStepTable = WorkflowStepTable::find(workItemActivityContext.StepActivityId); if (workflowStepTable.CompletionPolicy == WorkflowStepCompletionPolicy::Single) { _workItems.Remove(workItemActivityContext); } else { workItemTable = WorkflowWorkItemTable::findActivityInstanceId(workItemActivityContext.get_ActivityId()); if (workItemTable.RecId == 0) { new SysWorkflowWorkItem().callCreateWorkItems(workItemActivityContext, NoYes::Yes); } workItemTable = WorkflowWorkItemTable::findActivityInstanceId(workItemActivityContext.get_ActivityId()); if (workItemTable) { if (workItemTable.Type == WorkflowWorkItemType::WorkItem) { WorkflowWorkItemActionManager::dispatchWorkItemAction( workItemTable, "Auto Approve", workItemTable.UserId, WorkflowWorkItemActionType::Complete, workItemTable.MenuItemName); } } } } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?