仿钉钉流程设计- 操作按钮权限设置

This commit is contained in:
jason 2024-07-13 14:34:07 +08:00
parent 053e03d068
commit 58e250c4eb
6 changed files with 100 additions and 3 deletions

View File

@ -65,11 +65,14 @@ public class BpmSimpleModelNodeVO {
@InEnum(BpmApproveMethodEnum.class) @InEnum(BpmApproveMethodEnum.class)
private Integer approveMethod; // 用于审批节点 private Integer approveMethod; // 用于审批节点
@Schema(description = "通过比例", example = "100")
private Integer approveRatio; // 通过比例当多人审批方式为多人会签(按通过比例) 需要设置
@Schema(description = "表单权限", example = "[]") @Schema(description = "表单权限", example = "[]")
private List<Map<String, String>> fieldsPermission; private List<Map<String, String>> fieldsPermission;
@Schema(description = "通过比例", example = "100") @Schema(description = "操作按钮设置", example = "[]")
private Integer approveRatio; // 通过比例当多人审批方式为多人会签(按通过比例) 需要设置 private List<OperationButtonSetting> buttonsSetting; // 用于审批节点
/** /**
* 审批节点拒绝处理 * 审批节点拒绝处理
@ -111,6 +114,19 @@ public class BpmSimpleModelNodeVO {
private Integer maxRemindCount; private Integer maxRemindCount;
} }
@Data
@Schema(description = "操作按钮设置")
public static class OperationButtonSetting {
@Schema(description = "按钮 Id", example = "1")
private Integer id;
@Schema(description = "显示名称", example = "审批")
private String displayName;
@Schema(description = "是否启用", example = "true")
private Boolean enable;
}
// Map<String, Integer> formPermissions; 表单权限仅发起审批抄送节点会使用 // Map<String, Integer> formPermissions; 表单权限仅发起审批抄送节点会使用
// Integer approveMethod; 审批方式仅审批节点会使用 // Integer approveMethod; 审批方式仅审批节点会使用

View File

@ -69,6 +69,8 @@ public class BpmTaskRespVO {
private Map<String, Object> formVariables; private Map<String, Object> formVariables;
@Schema(description = "表单字段权限值") @Schema(description = "表单字段权限值")
private Map<String,String> fieldsPermission; private Map<String,String> fieldsPermission;
@Schema(description = "操作按钮设置值")
private Map<Integer,OperationButtonSetting> buttonsSetting;
@Data @Data
@Schema(description = "流程实例") @Schema(description = "流程实例")
@ -93,4 +95,15 @@ public class BpmTaskRespVO {
} }
@Data
@Schema(description = "操作按钮设置")
public static class OperationButtonSetting {
@Schema(description = "显示名称", example = "审批")
private String displayName;
@Schema(description = "是否启用", example = "true")
private Boolean enable;
}
} }

View File

@ -114,6 +114,8 @@ public interface BpmTaskConvert {
if(BpmTaskStatusEnum.RUNNING.getStatus().equals(taskStatus)){ if(BpmTaskStatusEnum.RUNNING.getStatus().equals(taskStatus)){
// 设置表单权限 TODO @芋艿 是不是还要加一个全局的权限 基于 processInstance 的权限 // 设置表单权限 TODO @芋艿 是不是还要加一个全局的权限 基于 processInstance 的权限
taskVO.setFieldsPermission(BpmnModelUtils.parseFormFieldsPermission(bpmnModel, task.getTaskDefinitionKey())); taskVO.setFieldsPermission(BpmnModelUtils.parseFormFieldsPermission(bpmnModel, task.getTaskDefinitionKey()));
// 操作按钮设置
taskVO.setButtonsSetting(BpmnModelUtils.parseButtonsSetting(bpmnModel, task.getTaskDefinitionKey()));
} }
return taskVO; return taskVO;
}); });

View File

@ -71,6 +71,26 @@ public interface BpmnModelConstants {
*/ */
String FORM_FIELD_PERMISSION_ELEMENT_PERMISSION_ATTRIBUTE = "permission"; String FORM_FIELD_PERMISSION_ELEMENT_PERMISSION_ATTRIBUTE = "permission";
/**
* BPMN ExtensionElement 操作按钮设置元素, 用于审批节点操作按钮设置
*/
String BUTTON_SETTING_ELEMENT = "buttonsSettings";
/**
* BPMN ExtensionElement Attribute, 用于标记按钮编号
*/
String BUTTON_SETTING_ELEMENT_ID_ATTRIBUTE = "id";
/**
* BPMN ExtensionElement Attribute, 用于标记按钮显示名称
*/
String BUTTON_SETTING_ELEMENT_DISPLAY_NAME_ATTRIBUTE = "displayName";
/**
* BPMN ExtensionElement Attribute, 用于标记按钮是否启用
*/
String BUTTON_SETTING_ELEMENT_ENABLE_ATTRIBUTE = "enable";
// TODO @芋艿这里后面得关注下 // TODO @芋艿这里后面得关注下
/** /**
* BPMN End Event 节点 Id 用于后端生成 End Event 节点 * BPMN End Event 节点 Id 用于后端生成 End Event 节点

View File

@ -5,6 +5,7 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskRejectHandlerType; import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskRejectHandlerType;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.converter.BpmnXMLConverter;
@ -65,8 +66,11 @@ public class BpmnModelUtils {
if (flowElement == null) { if (flowElement == null) {
return null; return null;
} }
Map<String, String> fieldsPermission = MapUtil.newHashMap();
List<ExtensionElement> extensionElements = flowElement.getExtensionElements().get(FORM_FIELD_PERMISSION_ELEMENT); List<ExtensionElement> extensionElements = flowElement.getExtensionElements().get(FORM_FIELD_PERMISSION_ELEMENT);
if (CollUtil.isEmpty(extensionElements)) {
return null;
}
Map<String, String> fieldsPermission = MapUtil.newHashMap();
extensionElements.forEach(element -> { extensionElements.forEach(element -> {
String field = element.getAttributeValue(FLOWABLE_EXTENSIONS_NAMESPACE, FORM_FIELD_PERMISSION_ELEMENT_FIELD_ATTRIBUTE); String field = element.getAttributeValue(FLOWABLE_EXTENSIONS_NAMESPACE, FORM_FIELD_PERMISSION_ELEMENT_FIELD_ATTRIBUTE);
String permission = element.getAttributeValue(FLOWABLE_EXTENSIONS_NAMESPACE, FORM_FIELD_PERMISSION_ELEMENT_PERMISSION_ATTRIBUTE); String permission = element.getAttributeValue(FLOWABLE_EXTENSIONS_NAMESPACE, FORM_FIELD_PERMISSION_ELEMENT_PERMISSION_ATTRIBUTE);
@ -77,6 +81,28 @@ public class BpmnModelUtils {
return fieldsPermission; return fieldsPermission;
} }
public static Map<Integer, BpmTaskRespVO.OperationButtonSetting> parseButtonsSetting(BpmnModel bpmnModel, String flowElementId) {
FlowElement flowElement = getFlowElementById(bpmnModel, flowElementId);
if (flowElement == null) {
return null;
}
List<ExtensionElement> extensionElements = flowElement.getExtensionElements().get(BUTTON_SETTING_ELEMENT);
if (CollUtil.isEmpty(extensionElements)) {
return null;
}
Map<Integer, BpmTaskRespVO.OperationButtonSetting> buttonSettings = MapUtil.newHashMap(16);
extensionElements.forEach(element -> {
String id = element.getAttributeValue(FLOWABLE_EXTENSIONS_NAMESPACE, BUTTON_SETTING_ELEMENT_ID_ATTRIBUTE);
String displayName = element.getAttributeValue(FLOWABLE_EXTENSIONS_NAMESPACE, BUTTON_SETTING_ELEMENT_DISPLAY_NAME_ATTRIBUTE);
String enable = element.getAttributeValue(FLOWABLE_EXTENSIONS_NAMESPACE, BUTTON_SETTING_ELEMENT_ENABLE_ATTRIBUTE);
if (StrUtil.isNotEmpty(id)) {
BpmTaskRespVO.OperationButtonSetting setting = new BpmTaskRespVO.OperationButtonSetting();
buttonSettings.put(Integer.valueOf(id), setting.setDisplayName(displayName).setEnable(Boolean.parseBoolean(enable)));
}
});
return buttonSettings;
}
/** /**
* 根据节点获取入口连线 * 根据节点获取入口连线
* *

View File

@ -23,6 +23,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.OperationButtonSetting;
import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TimeoutHandler; import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TimeoutHandler;
import static cn.iocoder.yudao.module.bpm.enums.definition.BpmBoundaryEventType.USER_TASK_TIMEOUT; import static cn.iocoder.yudao.module.bpm.enums.definition.BpmBoundaryEventType.USER_TASK_TIMEOUT;
import static cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeType.*; import static cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeType.*;
@ -454,6 +455,8 @@ public class SimpleModelUtils {
addCandidateElements(node.getCandidateStrategy(), node.getCandidateParam(), userTask); addCandidateElements(node.getCandidateStrategy(), node.getCandidateParam(), userTask);
// 添加表单字段权限属性元素 // 添加表单字段权限属性元素
addFormFieldsPermission(node.getFieldsPermission(), userTask); addFormFieldsPermission(node.getFieldsPermission(), userTask);
// 添加操作按钮配置属性元素
addButtonsSetting(node.getButtonsSetting(), userTask);
// 处理多实例 // 处理多实例
processMultiInstanceLoopCharacteristics(node.getApproveMethod(), node.getApproveRatio(), userTask); processMultiInstanceLoopCharacteristics(node.getApproveMethod(), node.getApproveRatio(), userTask);
// 添加任务被拒绝的处理元素 // 添加任务被拒绝的处理元素
@ -461,6 +464,7 @@ public class SimpleModelUtils {
return userTask; return userTask;
} }
private static void addTaskRejectElements(RejectHandler rejectHandler, UserTask userTask) { private static void addTaskRejectElements(RejectHandler rejectHandler, UserTask userTask) {
if (rejectHandler == null) { if (rejectHandler == null) {
return; return;
@ -498,6 +502,22 @@ public class SimpleModelUtils {
userTask.setLoopCharacteristics(multiInstanceCharacteristics); userTask.setLoopCharacteristics(multiInstanceCharacteristics);
} }
/**
* 给节点添加操作按钮设置元素
*/
private static void addButtonsSetting(List<OperationButtonSetting> buttonsSetting, UserTask userTask) {
if (CollUtil.isNotEmpty(buttonsSetting)) {
List<Map<String, String>> list = CollectionUtils.convertList(buttonsSetting, item -> {
Map<String, String> settingMap = MapUtil.newHashMap(16);
settingMap.put(BUTTON_SETTING_ELEMENT_ID_ATTRIBUTE, String.valueOf(item.getId()));
settingMap.put(BUTTON_SETTING_ELEMENT_DISPLAY_NAME_ATTRIBUTE, item.getDisplayName());
settingMap.put(BUTTON_SETTING_ELEMENT_ENABLE_ATTRIBUTE, String.valueOf(item.getEnable()));
return settingMap;
});
list.forEach(item -> addExtensionElement(userTask, BUTTON_SETTING_ELEMENT, item));
}
}
/** /**
* 给节点添加表单字段权限元素 * 给节点添加表单字段权限元素
*/ */