update 解析扩展属性 JSON,构建 Node 扩展属性对象,增强代码可读性

dev
疯狂的狮子Li 4 months ago
parent 85160be7f7
commit 7c341548c4

@ -0,0 +1,45 @@
package org.dromara.workflow.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Node VO
* <p>
* JSON
*
* @author AprilWind
*/
@Data
public class NodeExtVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
* <p>
* ButtonPermissionEnum
*/
private List<ButtonPermissionVo> buttonPermissions;
/**
* ID
* <p>
* CopySettingEnum ID
*/
private Set<String> copySettings;
/**
* Map
* <p>
* VariablesEnum key=value
*/
private Map<String, String> variables;
}

@ -1,8 +1,6 @@
package org.dromara.workflow.service; package org.dromara.workflow.service;
import org.dromara.workflow.domain.vo.ButtonPermissionVo; import org.dromara.workflow.domain.vo.NodeExtVo;
import java.util.List;
/** /**
* *
@ -12,11 +10,23 @@ import java.util.List;
public interface IFlwNodeExtService { public interface IFlwNodeExtService {
/** /**
* ext * JSON Node
* <p>
* JSON
* 1. ButtonPermissionEnum
* 2. CopySettingEnum ID
* 3. VariablesEnum Map
*
* <p> JSON
* [
* {"code": "ButtonPermissionEnum", "value": "back,termination"},
* {"code": "CopySettingEnum", "value": "1"},
* {"code": "VariablesEnum", "value": "key1=value1,key2=value2"}
* ]
* *
* @param ext JSON * @param ext JSON
* @return VO * @return NodeExtVo Map
*/ */
List<ButtonPermissionVo> buildButtonPermissionsFromExt(String ext); NodeExtVo parseNodeExt(String ext);
} }

@ -1,8 +1,8 @@
package org.dromara.workflow.service.impl; package org.dromara.workflow.service.impl;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
@ -18,12 +18,12 @@ import org.dromara.workflow.common.enums.CopySettingEnum;
import org.dromara.workflow.common.enums.NodeExtEnum; import org.dromara.workflow.common.enums.NodeExtEnum;
import org.dromara.workflow.common.enums.VariablesEnum; import org.dromara.workflow.common.enums.VariablesEnum;
import org.dromara.workflow.domain.vo.ButtonPermissionVo; import org.dromara.workflow.domain.vo.ButtonPermissionVo;
import org.dromara.workflow.domain.vo.NodeExtVo;
import org.dromara.workflow.service.IFlwNodeExtService; import org.dromara.workflow.service.IFlwNodeExtService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* - * -
@ -163,7 +163,8 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService
* @return `ChildNode` * @return `ChildNode`
*/ */
private NodeExt.ChildNode buildChildNode(String dictType) { private NodeExt.ChildNode buildChildNode(String dictType) {
RemoteDictTypeVo dictTypeDTO = remoteDictService.selectDictTypeByType(dictType); if (ObjectUtil.isNull(dictTypeDTO)) { RemoteDictTypeVo dictTypeDTO = remoteDictService.selectDictTypeByType(dictType);
if (ObjectUtil.isNull(dictTypeDTO)) {
return null; return null;
} }
NodeExt.ChildNode childNode = new NodeExt.ChildNode(); NodeExt.ChildNode childNode = new NodeExt.ChildNode();
@ -188,73 +189,71 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService
} }
/** /**
* ext * JSON Node
* <p>
* JSON
* 1. ButtonPermissionEnum
* 2. CopySettingEnum ID
* 3. VariablesEnum Map
*
* <p> JSON
* [
* {"code": "ButtonPermissionEnum", "value": "back,termination"},
* {"code": "CopySettingEnum", "value": "1"},
* {"code": "VariablesEnum", "value": "key1=value1,key2=value2"}
* ]
* *
* @param ext JSON * @param ext JSON
* @return VO * @return NodeExtVo Map
*/ */
@Override @Override
public List<ButtonPermissionVo> buildButtonPermissionsFromExt(String ext) { public NodeExtVo parseNodeExt(String ext) {
// 解析 ext 为 Map<code, Set<value>>,用于标记权限 NodeExtVo nodeExtVo = new NodeExtVo();
Map<String, Set<String>> permissionMap = JsonUtils.parseArray(ext, ButtonPermissionVo.class)
.stream()
.collect(Collectors.toMap(
ButtonPermissionVo::getCode,
item -> StringUtils.splitList(item.getValue()).stream()
.map(String::trim)
.filter(StrUtil::isNotBlank)
.collect(Collectors.toSet()),
(a, b) -> b,
HashMap::new
));
// 构建按钮权限列表,标记哪些按钮在 permissionMap 中出现(表示已勾选) // 解析 JSON 为 Dict 列表
return buildPermissionsFromSources(permissionMap, List.of(ButtonPermissionEnum.class)); List<Dict> nodeExtMap = JsonUtils.parseArrayMap(ext);
}
/** for (Dict nodeExt : nodeExtMap) {
* String code = nodeExt.getStr("code");
* <p> String value = nodeExt.getStr("value");
* 使
* - sources NodeExtEnum dictType
* - sources
* <p>
*
* buildPermissionsFromSources(permissionMap, List.of(ButtonPermissionEnum.class, "custom_button_dict"));
*
* @param permissionMap
* @param sources
* @return
*/
@SuppressWarnings("unchecked cast")
private List<ButtonPermissionVo> buildPermissionsFromSources(Map<String, Set<String>> permissionMap, List<Object> sources) {
return sources.stream()
.flatMap(source -> {
if (source instanceof Class<?> clazz && NodeExtEnum.class.isAssignableFrom(clazz)) {
Set<String> selectedSet = permissionMap.getOrDefault(clazz.getSimpleName(), Collections.emptySet());
return extractDictItems(this.buildChildNode((Class<? extends NodeExtEnum>) clazz), selectedSet).stream();
} else if (source instanceof String dictType) {
Set<String> selectedSet = permissionMap.getOrDefault(dictType, Collections.emptySet());
return extractDictItems(this.buildChildNode(dictType), selectedSet).stream();
}
return Stream.empty();
}).toList();
}
/** if (ButtonPermissionEnum.class.getSimpleName().equals(code)) {
* // 解析按钮权限
* // 将 value 拆分为 Set<String>,便于精确匹配
* @param childNode Set<String> buttonSet = StringUtils.str2Set(value, StringUtils.SEPARATOR);
* @param selectedSet
* @return // 获取按钮字典配置
*/ NodeExt.ChildNode childNode = buildChildNode(ButtonPermissionEnum.class);
private List<ButtonPermissionVo> extractDictItems(NodeExt.ChildNode childNode, Set<String> selectedSet) {
return Optional.ofNullable(childNode) // 构建 ButtonPermissionVo 列表
List<ButtonPermissionVo> buttonList = Optional.ofNullable(childNode)
.map(NodeExt.ChildNode::getDict) .map(NodeExt.ChildNode::getDict)
.orElse(List.of()) .orElse(List.of())
.stream() .stream()
.map(dict -> new ButtonPermissionVo(dict.getValue(), selectedSet.contains(dict.getValue()))) .map(dict -> new ButtonPermissionVo(dict.getValue(), buttonSet.contains(dict.getValue())))
.toList(); .toList();
nodeExtVo.setButtonPermissions(buttonList);
} else if (CopySettingEnum.class.getSimpleName().equals(code)) {
// 解析抄送对象 ID 集合
nodeExtVo.setCopySettings(StringUtils.str2Set(value, StringUtils.SEPARATOR));
} else if (VariablesEnum.class.getSimpleName().equals(code)) {
// 解析自定义参数
// 将 key=value 字符串拆分为 Map
Map<String, String> variables = Arrays.stream(StringUtils.split(value, StringUtils.SEPARATOR))
.map(s -> StringUtils.split(s, "="))
.filter(arr -> arr.length == 2)
.collect(Collectors.toMap(arr -> arr[0], arr -> arr[1]));
nodeExtVo.setVariables(variables);
} else {
// 未知扩展类型,记录日志
log.warn("未知扩展类型code={}, value={}", code, value);
}
}
return nodeExtVo;
} }
} }

@ -49,6 +49,7 @@ import org.dromara.workflow.domain.FlowInstanceBizExt;
import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.bo.*;
import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowHisTaskVo;
import org.dromara.workflow.domain.vo.FlowTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo;
import org.dromara.workflow.domain.vo.NodeExtVo;
import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwCategoryMapper;
import org.dromara.workflow.mapper.FlwInstanceBizExtMapper; import org.dromara.workflow.mapper.FlwInstanceBizExtMapper;
import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.mapper.FlwTaskMapper;
@ -599,8 +600,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (ObjectUtil.isNull(flowNode)) { if (ObjectUtil.isNull(flowNode)) {
throw new NullPointerException("当前【" + flowTaskVo.getNodeCode() + "】节点编码不存在"); throw new NullPointerException("当前【" + flowTaskVo.getNodeCode() + "】节点编码不存在");
} }
NodeExtVo nodeExtVo = flwNodeExtService.parseNodeExt(flowNode.getExt());
//设置按钮权限 //设置按钮权限
flowTaskVo.setButtonList(flwNodeExtService.buildButtonPermissionsFromExt(flowNode.getExt())); flowTaskVo.setButtonList(nodeExtVo.getButtonPermissions());
flowTaskVo.setNodeRatio(flowNode.getNodeRatio()); flowTaskVo.setNodeRatio(flowNode.getNodeRatio());
flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(flwCommonService.applyNodeCode(task.getDefinitionId()))); flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(flwCommonService.applyNodeCode(task.getDefinitionId())));
return flowTaskVo; return flowTaskVo;

Loading…
Cancel
Save