二开案例.表单插件.工作流提交界面解锁下一步处理人
【应用场景】
标准产品在会签节点驳回时,不支持选择驳回级次和下一步处理人。因为会签模式下,多个会签处理人选择的下一步处理人可能会不一样,程序无法处理这种混乱的场景,只能强制驳回到上一个节点。
但是,如果会签节点的驳回策略设置的是1人驳回就驳回(会签策略:确定票数=1票)的话,此时允许选择驳回级次,在操作上是可行的,下面将介绍如何通过插件来支持这种特殊的使用场景。
【版本要求】升级至23年6月及更新的补丁版本。
【案例演示】
采购订单三级工作流,第三级审批启用了会签,设置了驳回策略为1人驳回就驳回,通过插件控制,使得三级节点审批时,可以选择驳回级次。
【实现步骤】
<1>编写表单插件,代码如下。
using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Util; using Kingdee.BOS.Workflow.Assignment; using Kingdee.BOS.Workflow.Models.EnumStatus; using Kingdee.BOS.Workflow.PlugIns; using Kingdee.BOS.Workflow.ServiceHelper; using System; using System.ComponentModel; using System.Linq; namespace Jac.XkDemo.BOS.Business.PlugIn { /// <summary> /// 【表单插件】工作流提交界面解锁下一步处理人 /// 需注册此插件的业务对象: /// 工作流: /// 信息中心_任务处理[WF_AssignmentApproval] /// 任务处理H5[WF_AssignmentApprovalH5] /// 审批流: /// 信息中心_ 审批任务处理[AP_ApprovalAssignHandle] /// 审批任务处理H5[AP_ApprovalAssignHandleH5] /// ...... /// </summary> [Description("【表单插件】工作流提交界面解锁下一步处理人"), HotUpdate] public class EnableNextActHandlerFormPlugIn : AbstractDynamicFormPlugIn { private string approvalGroupKey; private ApprovalAssign policy; private ApprovalItem approvalItem; private AssignNextHandleWrapper nextHandlerWapper; public override void DataChanged(DataChangedEventArgs e) { base.DataChanged(e); approvalGroupKey = e.Field.Key; if (e.Field.Key.EqualsIgnoreCase("FRadioGroup") || e.Field.Key.EqualsIgnoreCase("FRApprovalGroup")) { if (CanReject()) { // 【重新提交时跳回本节点】需通过工作流设计器的审批项中的参数【驳回任务时显示【重新提交时跳回本节点】选项】进行启用,在此放开无效 //this.View.StyleManager.SetVisible("FRejectReturn", "", true); this.View.StyleManager.SetEnabled("FNextActHandler", "", true); this.View.Session["WfCanReject"] = true; } else { this.View.Session["WfCanReject"] = false; } } } /// <summary> /// 判断是否可以驳回(会签默认不支持驳回,当会签满足一人驳回就驳回的条件时,允许驳回) /// </summary> /// <returns></returns> private bool CanReject() { var currentAssignId = AssignApprovalBaseEdit.GetParameterAssignId(this.View); if (string.IsNullOrWhiteSpace(currentAssignId)) { return false; } if (policy == null) { policy = AssignmentServiceHelper.GetApprovalAssignByAssignId(this.Context, currentAssignId); } if (policy == null) { return false; } if (policy.Rule == null || policy.Rule.Count == 0) { return false; } // 检查是否存在以下会签策略:投票票数类型=确定票数,投票票数=1(一人驳回就驳回) var assignResult = ObjectUtils.Object2String(this.View.Model.GetValue(approvalGroupKey)); var rejectRule = policy.Rule.FirstOrDefault(o => o.DesideResult == assignResult); if (rejectRule == null) { // 不存在驳回的会签策略 return false; } if (rejectRule.DesideType != VoteType.Determine //投票票数类型 || rejectRule.DetermineDeside != 1 // 投票票数(确定票数) //|| rejectRule.PercentDeside != 1 //投票票数(比例票数) //|| rejectRule.PassType != VoteType.Determine//投票人数类型 //|| rejectRule.DeterminePass != 1 // 投票人数(确定人数) //|| rejectRule.PercentPass != 1 // 投票人数(比例人数) ) { // 一人驳回就驳回 return false; } if (policy.HasAddsign && AssignmentServiceHelper.CheckReceiverIsAddsign(this.Context, currentAssignId, this.Context.UserId)) { // 加签人不允许选择驳回级次 return false; } if (approvalItem == null) { var approvalItems = AssignmentServiceHelper.GetApprovalItemByAssignIds(this.Context, this.Context.UserId, new[] { currentAssignId }); if (approvalItems.Count == 0) { return false; } approvalItem = approvalItems[0]; } if (nextHandlerWapper == null) { nextHandlerWapper = new AssignNextHandleWrapper(currentAssignId, this.Context, policy); } var approvalType = AssignApprovalBaseEditSingle.GetAssignResultType(approvalItem, assignResult, nextHandlerWapper.ActivityDefine); if (approvalType == AssignResultApprovalType.Reject) { return true; } return false; } } /// <summary> /// 【表单插件】工作流驳回-指定下一步处理人界面-允许选择驳回级次 /// 需注册此插件的业务对象: /// 工作流:指定下一步处理人(工作流驳回)[WF_SpecifyNextHandler_WFReject] /// 审批流:指定下一步处理人(驳回) [WF_SpecifyNextHandler_Reject] /// </summary> [Description("【表单插件】工作流驳回-指定下一步处理人界面-允许选择驳回级次"), HotUpdate] public class SpecifyNextHandlerSetCanRejectFormPlugIn : AbstractDynamicFormPlugIn { public override void AfterBindData(EventArgs e) { base.AfterBindData(e); if (this.View.ParentFormView != null && this.View.ParentFormView.Session.ContainsKey("WfCanReject") && ObjectUtils.Object2Bool(this.View.ParentFormView.Session["WfCanReject"])) { this.View.StyleManager.SetEnabled("FNextNode", "canReject", true); } } } }
<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<3>BOSIDE扩展工作流审批相关单据,注册表单插件。
【工作流】
扩展:信息中心_任务处理[WF_AssignmentApproval],注册表单插件,保存元数据。
扩展:任务处理H5[WF_AssignmentApprovalH5],注册表单插件,保存元数据。
扩展:指定下一步处理人(工作流驳回)[WF_SpecifyNextHandler_WFReject],注册表单插件,保存元数据。
【审批流】
扩展:信息中心_ 审批任务处理[AP_ApprovalAssignHandle],注册表单插件,保存元数据。
扩展:审批任务处理H5[AP_ApprovalAssignHandleH5],注册表单插件,保存元数据。
扩展:指定下一步处理人(驳回) [WF_SpecifyNextHandler_Reject],注册表单插件,保存元数据。
开发完毕。
【功能验证】
<1>登录业务站点,打开流程设计中心,新建一个三级审批的工作流,设置第三级审批节点的审批项和会签策略如下。
一人驳回就驳回=【确定票数=1票】
<2>新建采购订单,提交上图所配置的工作流,当流转到三级节点审批时,效果如下图,此时已支持选择驳回级次。
选择驳回到一级节点,点提交后,待办任务回到一级节点。
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.表单插件.工作流提交界面解锁下一步处理人
本文2024-09-23 03:57:56发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-162233.html