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();