仿钉钉流程设计- 新增获取流程表单字段权限接口,需要分离开

This commit is contained in:
jason 2024-08-24 22:57:23 +08:00
parent 764a242d07
commit da690a2b1c
11 changed files with 69 additions and 19 deletions

View File

@ -30,7 +30,7 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable {
CONDITION_NODE(50, "条件节点"), // 用于构建流转条件的表达式 CONDITION_NODE(50, "条件节点"), // 用于构建流转条件的表达式
CONDITION_BRANCH_NODE(51, "条件分支节点"), // TODO @jason是不是改成叫 条件分支 CONDITION_BRANCH_NODE(51, "条件分支节点"), // TODO @jason是不是改成叫 条件分支
PARALLEL_BRANCH_NODE(52, "并行分支节点"), // TODO @jason是不是一个 并行分支 就可以啦 后面是否去掉并行网关只用包容网关 PARALLEL_BRANCH_NODE(52, "并行分支节点"), // TODO @jason是不是一个 并行分支 就可以啦 后面是否去掉并行网关只用包容网关
INCLUSIVE_BRANCH_NODE(53, "包容分节点"), INCLUSIVE_BRANCH_NODE(53, "包容分节点"),
// TODO @jason建议整合 join最终只有 条件分支并行分支包容分支三种~ // TODO @jason建议整合 join最终只有 条件分支并行分支包容分支三种~
// TODO @芋艿 感觉还是分开好理解一点,也好处理一点前端结构中把聚合节点显示并传过来 // TODO @芋艿 感觉还是分开好理解一点,也好处理一点前端结构中把聚合节点显示并传过来
; ;

View File

@ -4,10 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
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.instance.BpmProcessInstanceCancelReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
@ -160,4 +157,12 @@ public class BpmProcessInstanceController {
return success(true); return success(true);
} }
@GetMapping("/form-fields-permission")
@Operation(summary = "获得流程实例表单字段权限", description = "在【我的流程】菜单中,进行调用")
@PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
public CommonResult<Map<String, String>> getProcessInstanceFormFieldsPermission(
@Valid BpmProcessInstanceFormFieldsPermissionReqVO reqVO){
return success(processInstanceService.getProcessInstanceFormFieldsPermission(reqVO));
}
} }

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
/**
* @author jason
*/
@Schema(description = "管理后台 - 流程实例表单字段权限 Request VO")
@Data
public class BpmProcessInstanceFormFieldsPermissionReqVO {
@Schema(description = "流程实例的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotEmpty(message = "流程实例的编号不能为空")
private String id;
@Schema(description = "流程活动编号", example = "StartUserNode")
private String activityId; // 对应 BPMN XML 节点 Id
@Schema(description = "流程任务的编号", example = "95f2f08b-621b-11ef-bf39-00ff4722db8b")
private String taskId; // UserTask 对应的Id
}

View File

@ -67,10 +67,9 @@ public class BpmTaskRespVO {
private List<String> formFields; private List<String> formFields;
@Schema(description = "提交的表单值", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "提交的表单值", requiredMode = Schema.RequiredMode.REQUIRED)
private Map<String, Object> formVariables; private Map<String, Object> formVariables;
// TODO @jasonfieldsPermissions // @芋艿 都改成了 fieldsPermission buttonsSetting BpmSimpleModelNodeVO 统一
@Schema(description = "表单字段权限值") @Schema(description = "表单字段权限值")
private Map<String, String> fieldsPermission; private Map<String, String> fieldsPermission;
// TODO @jasonbuttonsSettings
@Schema(description = "操作按钮设置值") @Schema(description = "操作按钮设置值")
private Map<Integer, OperationButtonSetting> buttonsSetting; private Map<Integer, OperationButtonSetting> buttonsSetting;

View File

@ -114,6 +114,7 @@ public interface BpmTaskConvert {
if (BpmTaskStatusEnum.RUNNING.getStatus().equals(taskStatus)){ if (BpmTaskStatusEnum.RUNNING.getStatus().equals(taskStatus)){
// 设置表单权限 TODO @芋艿 是不是还要加一个全局的权限 基于 processInstance 的权限回复可能不需要但是发起人需要有个权限配置 // 设置表单权限 TODO @芋艿 是不是还要加一个全局的权限 基于 processInstance 的权限回复可能不需要但是发起人需要有个权限配置
// TODO @jason貌似这么返回主要解决当前审批 task 的表单权限但是不同抄送人的表单权限可能不太对例如说 A 抄送人是隐藏某个字段 // TODO @jason貌似这么返回主要解决当前审批 task 的表单权限但是不同抄送人的表单权限可能不太对例如说 A 抄送人是隐藏某个字段
// @芋艿 表单权限需要分离开单独的接口来获取了 BpmProcessInstanceService.getProcessInstanceFormFieldsPermission
taskVO.setFieldsPermission(BpmnModelUtils.parseFormFieldsPermission(bpmnModel, task.getTaskDefinitionKey())); taskVO.setFieldsPermission(BpmnModelUtils.parseFormFieldsPermission(bpmnModel, task.getTaskDefinitionKey()));
// 操作按钮设置 // 操作按钮设置
taskVO.setButtonsSetting(BpmnModelUtils.parseButtonsSetting(bpmnModel, task.getTaskDefinitionKey())); taskVO.setButtonsSetting(BpmnModelUtils.parseButtonsSetting(bpmnModel, task.getTaskDefinitionKey()));

View File

@ -80,15 +80,16 @@ public interface BpmnModelConstants {
*/ */
String FORM_FIELD_PERMISSION_ELEMENT_PERMISSION_ATTRIBUTE = "permission"; String FORM_FIELD_PERMISSION_ELEMENT_PERMISSION_ATTRIBUTE = "permission";
// TODO @jason上面是 fieldsPermission然后这里是 buttonsSettings感觉有点不统一然后 BpmSimpleModelNodeVO 里面是 fieldsPermissionbuttonsSetting
/** /**
* BPMN ExtensionElement 操作按钮设置元素, 用于审批节点操作按钮设置 * BPMN ExtensionElement 操作按钮设置元素, 用于审批节点操作按钮设置
*/ */
String BUTTON_SETTING_ELEMENT = "buttonsSettings"; String BUTTON_SETTING_ELEMENT = "buttonsSetting";
/** /**
* BPMN ExtensionElement Attribute, 用于标记按钮编号 * BPMN ExtensionElement Attribute, 用于标记按钮编号
*/ */
String BUTTON_SETTING_ELEMENT_ID_ATTRIBUTE = "id"; String BUTTON_SETTING_ELEMENT_ID_ATTRIBUTE = "id";
/** /**
* BPMN ExtensionElement Attribute, 用于标记按钮显示名称 * BPMN ExtensionElement Attribute, 用于标记按钮显示名称
*/ */

View File

@ -79,6 +79,9 @@ public class BpmnModelUtils {
} }
public static Map<String, String> parseFormFieldsPermission(BpmnModel bpmnModel, String flowElementId) { public static Map<String, String> parseFormFieldsPermission(BpmnModel bpmnModel, String flowElementId) {
if (bpmnModel == null || StrUtil.isEmpty(flowElementId)) {
return null;
}
FlowElement flowElement = getFlowElementById(bpmnModel, flowElementId); FlowElement flowElement = getFlowElementById(bpmnModel, flowElementId);
if (flowElement == null) { if (flowElement == null) {
return null; return null;

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCancelReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCancelReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceFormFieldsPermissionReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageReqVO;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstance;
@ -76,8 +77,6 @@ public interface BpmProcessInstanceService {
return convertMap(getHistoricProcessInstances(ids), HistoricProcessInstance::getId); return convertMap(getHistoricProcessInstances(ids), HistoricProcessInstance::getId);
} }
// ========== Update 写入相关方法 ==========
/** /**
* 获得流程实例的分页 * 获得流程实例的分页
* *
@ -88,6 +87,16 @@ public interface BpmProcessInstanceService {
PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId, PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId,
@Valid BpmProcessInstancePageReqVO pageReqVO); @Valid BpmProcessInstancePageReqVO pageReqVO);
/**
* 获得流程实例表单字段权限
*
* @param reqVO 请求消息
* @return 表单字段权限
*/
Map<String, String> getProcessInstanceFormFieldsPermission(@Valid BpmProcessInstanceFormFieldsPermissionReqVO reqVO);
// ========== Update 写入相关方法 ==========
/** /**
* 创建流程实例提供给前端 * 创建流程实例提供给前端
* *

View File

@ -85,6 +85,14 @@ public interface BpmTaskService {
*/ */
Task getTask(String id); Task getTask(String id);
/**
* 获取历史任务
*
* @param id 任务编号
* @return 历史任务
*/
HistoricTaskInstance getHistoricTask(String id);
/** /**
* 根据条件查询正在进行中的任务 * 根据条件查询正在进行中的任务
* *

View File

@ -214,6 +214,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
return taskService.createTaskQuery().taskId(id).includeTaskLocalVariables().singleResult(); return taskService.createTaskQuery().taskId(id).includeTaskLocalVariables().singleResult();
} }
@Override
public HistoricTaskInstance getHistoricTask(String id) {
return historyService.createHistoricTaskInstanceQuery().taskId(id).includeTaskLocalVariables().singleResult();
}
@Override @Override
public List<Task> getRunningTaskListByProcessInstanceId(String processInstanceId, Boolean assigned, String defineKey) { public List<Task> getRunningTaskListByProcessInstanceId(String processInstanceId, Boolean assigned, String defineKey) {
Assert.notNull(processInstanceId, "processInstanceId 不能为空"); Assert.notNull(processInstanceId, "processInstanceId 不能为空");
@ -230,10 +235,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
return taskQuery.list(); return taskQuery.list();
} }
private HistoricTaskInstance getHistoricTask(String id) {
return historyService.createHistoricTaskInstanceQuery().taskId(id).includeTaskLocalVariables().singleResult();
}
@Override @Override
public List<UserTask> getUserTaskListByReturn(String id) { public List<UserTask> getUserTaskListByReturn(String id) {
// 1.1 校验当前任务 task 存在 // 1.1 校验当前任务 task 存在