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());
|
queryWrapper.eq(ExtActProcessNodeDeployment::getDeploymentId, processDefinition.getDeploymentId());
|
||||||
ExtActProcessNodeDeployment node = extActProcessNodeDeploymentService.getOne(queryWrapper);
|
ExtActProcessNodeDeployment node = extActProcessNodeDeploymentService.getOne(queryWrapper);
|
||||||
if(node!=null&&oConvertUtils.isNotEmpty(node.getModelAndView())) {
|
if(node!=null&&oConvertUtils.isNotEmpty(node.getModelAndView())) {
|
||||||
//节点地址表达式解析
|
defautformUrl = resolveNodeFormUrl(defautformUrl, node.getModelAndView(), variablesMap, dataId);
|
||||||
defautformUrl = BpmUtil.getNodeUrl(variablesMap, node.getModelAndView(), dataId);
|
|
||||||
}
|
}
|
||||||
if(node!=null&&oConvertUtils.isNotEmpty(node.getModelAndViewMobile())) {
|
if(node!=null&&oConvertUtils.isNotEmpty(node.getModelAndViewMobile())) {
|
||||||
//节点地址表达式解析
|
defautformUrlMobile = resolveNodeFormUrl(defautformUrlMobile, node.getModelAndViewMobile(), variablesMap, dataId);
|
||||||
defautformUrlMobile = BpmUtil.getNodeUrl(variablesMap, node.getModelAndViewMobile(), dataId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//b.获取节点权限配置
|
//b.获取节点权限配置
|
||||||
@@ -480,9 +478,7 @@ public class ExtActProcessNodeController {
|
|||||||
ExtActProcessNodeDeployment node = extActProcessNodeDeploymentService.getOne(queryWrapper);
|
ExtActProcessNodeDeployment node = extActProcessNodeDeploymentService.getOne(queryWrapper);
|
||||||
if(node!=null&&oConvertUtils.isNotEmpty(node.getModelAndView())) {
|
if(node!=null&&oConvertUtils.isNotEmpty(node.getModelAndView())) {
|
||||||
formUrl = node.getModelAndView();
|
formUrl = node.getModelAndView();
|
||||||
//节点地址表达式解析
|
defautformUrl = resolveNodeFormUrl(defautformUrl, formUrl, variablesMap, dataId);
|
||||||
formUrl = BpmUtil.getNodeUrl(variablesMap, formUrl, dataId);
|
|
||||||
defautformUrl = formUrl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Map<String,Object>> permissionList = new ArrayList<Map<String,Object>>();
|
List<Map<String,Object>> permissionList = new ArrayList<Map<String,Object>>();
|
||||||
@@ -520,6 +516,86 @@ public class ExtActProcessNodeController {
|
|||||||
return result;
|
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){
|
private List<BizTaskDTO> getBizTaskDTOs(List<Task> userTaskList,List<Task> groupTaskList,ProcessInstance processInstance){
|
||||||
List<BizTaskDTO> bizTaskList = new ArrayList<BizTaskDTO>();
|
List<BizTaskDTO> bizTaskList = new ArrayList<BizTaskDTO>();
|
||||||
BizTaskDTO bizTask = null;
|
BizTaskDTO bizTask = null;
|
||||||
|
|||||||
Reference in New Issue
Block a user