如何为工作流操作的Case关闭按钮添加未完成任务校验?
实现Case关闭时未完成任务的校验方案
针对关闭Case(工作流动作)时需校验未完成任务的需求,以下是三种可行实现方案:
方案一:工作流中配置校验逻辑
无需编写代码,直接在工作流设计器中添加验证规则:
- 打开对应Case的工作流设计界面,定位到Close动作的触发节点
- 添加「自定义验证条件」,配置查询逻辑:关联当前Case的
CaseID,过滤出状态不为“已完成”的CRTask记录 - 设置验证失败时的错误提示文本(如“存在未完成任务,无法关闭Case”)
- 保存并发布工作流,触发Close动作时会自动执行校验,不满足条件则阻止动作执行并弹出提示
方案二:代码重写Close动作的执行逻辑
通过PXOverride拦截工作流动作的执行,添加前置校验:
public delegate IEnumerable CloseDelegate(PXAdapter adapter); [PXOverride] public IEnumerable Close(PXAdapter adapter, CloseDelegate baseMethod) { CRCase currentCase = adapter.Get<CRCase>(); if (currentCase == null) return baseMethod(adapter); // 查询当前Case关联的未完成任务 var uncompletedTasks = PXSelect<CRTask, Where<CRTask.caseID, Equal<Required<CRCase.caseID>>, And<CRTask.status, NotEqual<CRTaskStatus.completed>>>> .Select(Base, currentCase.CaseID); if (uncompletedTasks.Count > 0) { throw new PXException("存在未完成的任务,无法关闭当前Case"); } return baseMethod(adapter); }
- 该代码需放置在
CRCaseMaint扩展类中,执行Close动作前会先校验未完成任务,存在则抛出错误中断流程
方案三:代码动态禁用Close按钮
在Case页面加载时,根据未完成任务状态控制Close按钮的可用性:
protected virtual void CRCase_RowSelected(PXCache cache, PXRowSelectedEventArgs e) { CRCase currentCase = e.Row as CRCase; if (currentCase == null) return; // 判断是否存在未完成任务 bool hasUncompletedTasks = PXSelect<CRTask, Where<CRTask.caseID, Equal<Required<CRCase.caseID>>, And<CRTask.status, NotEqual<CRTaskStatus.completed>>>> .Select(Base, currentCase.CaseID).Any(); // 获取Close动作实例(需确认工作流动作的ActionID,通常为"Close") PXAction<CRCase> closeAction = Base.Actions["Close"] as PXAction<CRCase>; if (closeAction != null) { // 有未完成任务则禁用按钮 closeAction.SetEnabled(!hasUncompletedTasks); // 若需隐藏按钮,替换为:closeAction.SetVisible(!hasUncompletedTasks); } }
- 该逻辑在
CRCase_RowSelected事件中执行,用户打开Case页面时自动判断按钮状态,提前阻止无效操作
内容的提问来源于stack exchange,提问作者JvD
相关产品推荐
相关产品推荐

