yxk-20260608-改造流程引擎
对共用督办流程的表单加载机制做了改造,解决多个业务共用同一个流程定义 dev_task_task_001 时,办理页只能使用节点配置中单一 PC 表单地址的问题。 前端发起流程时仍由各业务传入自己的 FORM_URL,例如党委会事项使用 BgPartymatterBPMForm,我为四所把把脉使用 BgTakepulseBPMForm。后端办理节点解析时新增了表单地址优先级规则:如果节点只配置 ?addfeedback=1 这类参数,则从流程实例变量 BPM_FORM_CONTENT_URL 读取业务表单路径,并追加节点参数;如果节点配置完整表单路径,则以节点配置为准,支持特殊节点强制使用指定表单。 改造后,一个流程定义可以服务多个业务表单,共用节点只需要配置公共办理参数,例如 ?addfeedback=1,不同业务进入办理页时仍打开各自业务表单,同时都能继承反馈等节点参数。这样既保留了节点配置能力,也避免了党委会事项和把脉业务互相覆盖表单的问题。
This commit is contained in:
+83
-7
@@ -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<Map<String,Object>> permissionList = new ArrayList<Map<String,Object>>();
|
||||
@@ -519,6 +515,86 @@ public class ExtActProcessNodeController {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private String resolveNodeFormUrl(String instanceFormUrl, String nodeFormConfig, Map<String, Object> 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<String> 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<String> 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<BizTaskDTO> getBizTaskDTOs(List<Task> userTaskList,List<Task> groupTaskList,ProcessInstance processInstance){
|
||||
List<BizTaskDTO> bizTaskList = new ArrayList<BizTaskDTO>();
|
||||
|
||||
Reference in New Issue
Block a user