From 55a66e4915932253cfcb5fc9c87c9e6e06bace41 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Mon, 8 Jun 2026 16:28:44 +0800 Subject: [PATCH] =?UTF-8?q?yxk-20260608-=E6=94=B9=E9=80=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=BC=95=E6=93=8E=20=E5=AF=B9=E5=85=B1=E7=94=A8?= =?UTF-8?q?=E7=9D=A3=E5=8A=9E=E6=B5=81=E7=A8=8B=E7=9A=84=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=9C=BA=E5=88=B6=E5=81=9A=E4=BA=86=E6=94=B9?= =?UTF-8?q?=E9=80=A0=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=A4=9A=E4=B8=AA=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=85=B1=E7=94=A8=E5=90=8C=E4=B8=80=E4=B8=AA=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=20dev=5Ftask=5Ftask=5F001=20?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=8A=9E=E7=90=86=E9=A1=B5=E5=8F=AA=E8=83=BD?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=8A=82=E7=82=B9=E9=85=8D=E7=BD=AE=E4=B8=AD?= =?UTF-8?q?=E5=8D=95=E4=B8=80=20PC=20=E8=A1=A8=E5=8D=95=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前端发起流程时仍由各业务传入自己的 FORM_URL,例如党委会事项使用 BgPartymatterBPMForm,我为四所把把脉使用 BgTakepulseBPMForm。后端办理节点解析时新增了表单地址优先级规则:如果节点只配置 ?addfeedback=1 这类参数,则从流程实例变量 BPM_FORM_CONTENT_URL 读取业务表单路径,并追加节点参数;如果节点配置完整表单路径,则以节点配置为准,支持特殊节点强制使用指定表单。 改造后,一个流程定义可以服务多个业务表单,共用节点只需要配置公共办理参数,例如 ?addfeedback=1,不同业务进入办理页时仍打开各自业务表单,同时都能继承反馈等节点参数。这样既保留了节点配置能力,也避免了党委会事项和把脉业务互相覆盖表单的问题。 --- .../ExtActProcessNodeController.java | 90 +++++++++++++++++-- 1 file changed, 83 insertions(+), 7 deletions(-) diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java index 966df5b..f711f9d 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java @@ -257,12 +257,10 @@ public class ExtActProcessNodeController { queryWrapper.eq(ExtActProcessNodeDeployment::getDeploymentId, processDefinition.getDeploymentId()); ExtActProcessNodeDeployment node = extActProcessNodeDeploymentService.getOne(queryWrapper); if(node!=null&&oConvertUtils.isNotEmpty(node.getModelAndView())) { - //节点地址表达式解析 - defautformUrl = BpmUtil.getNodeUrl(variablesMap, node.getModelAndView(), dataId); + defautformUrl = resolveNodeFormUrl(defautformUrl, node.getModelAndView(), variablesMap, dataId); } if(node!=null&&oConvertUtils.isNotEmpty(node.getModelAndViewMobile())) { - //节点地址表达式解析 - defautformUrlMobile = BpmUtil.getNodeUrl(variablesMap, node.getModelAndViewMobile(), dataId); + defautformUrlMobile = resolveNodeFormUrl(defautformUrlMobile, node.getModelAndViewMobile(), variablesMap, dataId); } //b.获取节点权限配置 @@ -480,9 +478,7 @@ public class ExtActProcessNodeController { ExtActProcessNodeDeployment node = extActProcessNodeDeploymentService.getOne(queryWrapper); if(node!=null&&oConvertUtils.isNotEmpty(node.getModelAndView())) { formUrl = node.getModelAndView(); - //节点地址表达式解析 - formUrl = BpmUtil.getNodeUrl(variablesMap, formUrl, dataId); - defautformUrl = formUrl; + defautformUrl = resolveNodeFormUrl(defautformUrl, formUrl, variablesMap, dataId); } List> permissionList = new ArrayList>(); @@ -519,6 +515,86 @@ public class ExtActProcessNodeController { return result; } + + private String resolveNodeFormUrl(String instanceFormUrl, String nodeFormConfig, Map variablesMap, String dataId) { + String resolvedNodeFormUrl = BpmUtil.getNodeUrl(variablesMap, nodeFormConfig, dataId); + if (oConvertUtils.isEmpty(resolvedNodeFormUrl)) { + return instanceFormUrl; + } + String trimmedNodeFormUrl = resolvedNodeFormUrl.trim(); + if (!isQueryOnlyFormConfig(trimmedNodeFormUrl)) { + return trimmedNodeFormUrl; + } + if (oConvertUtils.isEmpty(instanceFormUrl)) { + return instanceFormUrl; + } + // 共用节点只配置办理参数时,保留业务发起时的表单组件路径,节点参数只补充缺失项。 + return appendMissingQueryParams(instanceFormUrl, stripQueryPrefix(trimmedNodeFormUrl)); + } + + private boolean isQueryOnlyFormConfig(String formUrl) { + return formUrl.startsWith("?") || formUrl.startsWith("&"); + } + + private String stripQueryPrefix(String query) { + String result = query; + while (result.startsWith("?") || result.startsWith("&")) { + result = result.substring(1); + } + return result; + } + + private String appendMissingQueryParams(String formUrl, String appendQuery) { + if (oConvertUtils.isEmpty(appendQuery)) { + return formUrl; + } + String existQuery = getQueryString(formUrl); + String filteredQuery = filterNewQueryParams(existQuery, appendQuery); + if (oConvertUtils.isEmpty(filteredQuery)) { + return formUrl; + } + return formUrl + getQueryJoiner(formUrl) + filteredQuery; + } + + private String getQueryJoiner(String formUrl) { + if (formUrl.endsWith("?") || formUrl.endsWith("&")) { + return ""; + } + return formUrl.contains("?") ? "&" : "?"; + } + + private String getQueryString(String url) { + int queryIndex = url == null ? -1 : url.indexOf("?"); + if (queryIndex < 0 || queryIndex == url.length() - 1) { + return ""; + } + return url.substring(queryIndex + 1); + } + + private String filterNewQueryParams(String existQuery, String appendQuery) { + Set existKeys = new HashSet<>(); + if (oConvertUtils.isNotEmpty(existQuery)) { + for (String param : existQuery.split("&")) { + if (oConvertUtils.isEmpty(param)) { + continue; + } + int eqIndex = param.indexOf("="); + existKeys.add(eqIndex >= 0 ? param.substring(0, eqIndex) : param); + } + } + List appendParams = new ArrayList<>(); + for (String param : appendQuery.split("&")) { + if (oConvertUtils.isEmpty(param)) { + continue; + } + int eqIndex = param.indexOf("="); + String key = eqIndex >= 0 ? param.substring(0, eqIndex) : param; + if (!existKeys.contains(key)) { + appendParams.add(param); + } + } + return String.join("&", appendParams); + } private List getBizTaskDTOs(List userTaskList,List groupTaskList,ProcessInstance processInstance){ List bizTaskList = new ArrayList();