mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 10:48:43 +08:00 
			
		
		
		
	仿钉钉流程设计- code review 部分修改
This commit is contained in:
		| @@ -7,15 +7,14 @@ import lombok.Getter; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| 
 | ||||
| // TODO @jason:BpmUserTaskTimeoutHandlerTypeEnum 会不会更匹配哈 | ||||
| /** | ||||
|  * 用户任务超时处理执行动作枚举 | ||||
|  * 用户任务超时处理类型枚举 | ||||
|  * | ||||
|  * @author jason | ||||
|  */ | ||||
| @Getter | ||||
| @AllArgsConstructor | ||||
| public enum BpmUserTaskTimeoutActionEnum implements IntArrayValuable { | ||||
| public enum BpmUserTaskTimeoutHandlerType implements IntArrayValuable { | ||||
| 
 | ||||
|     REMINDER(1,"自动提醒"), | ||||
|     APPROVE(2, "自动同意"), | ||||
| @@ -24,10 +23,10 @@ public enum BpmUserTaskTimeoutActionEnum implements IntArrayValuable { | ||||
|     private final Integer action; | ||||
|     private final String name; | ||||
| 
 | ||||
|     public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskTimeoutActionEnum::getAction).toArray(); | ||||
|     public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskTimeoutHandlerType::getAction).toArray(); | ||||
| 
 | ||||
|     public static BpmUserTaskTimeoutActionEnum actionOf(Integer action) { | ||||
|         return ArrayUtil.firstMatch(item -> item.getAction().equals(action), values()); | ||||
|     public static BpmUserTaskTimeoutHandlerType typeOf(Integer type) { | ||||
|         return ArrayUtil.firstMatch(item -> item.getAction().equals(type), values()); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.validation.InEnum; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmApproveMethodEnum; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeType; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskRejectHandlerType; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutActionEnum; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerType; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; | ||||
| import com.fasterxml.jackson.annotation.JsonIgnore; | ||||
| import com.fasterxml.jackson.annotation.JsonInclude; | ||||
| @@ -104,7 +104,7 @@ public class BpmSimpleModelNodeVO { | ||||
|         private Boolean enable; | ||||
|  | ||||
|         @Schema(description = "任务超时未处理的行为", example = "1") | ||||
|         @InEnum(BpmUserTaskTimeoutActionEnum.class) | ||||
|         @InEnum(BpmUserTaskTimeoutHandlerType.class) | ||||
|         private Integer action; | ||||
|  | ||||
|         @Schema(description = "超时时间", example = "PT6H") | ||||
|   | ||||
| @@ -1,12 +1,5 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.enums; | ||||
|  | ||||
| import com.google.common.collect.ImmutableSet; | ||||
| import org.flowable.bpmn.model.EndEvent; | ||||
| import org.flowable.bpmn.model.FlowNode; | ||||
| import org.flowable.bpmn.model.UserTask; | ||||
|  | ||||
| import java.util.Set; | ||||
|  | ||||
| /** | ||||
|  * BPMN XML 常量信息 | ||||
|  * | ||||
| @@ -89,16 +82,4 @@ public interface BpmnModelConstants { | ||||
|      */ | ||||
|     String BUTTON_SETTING_ELEMENT_ENABLE_ATTRIBUTE = "enable"; | ||||
|  | ||||
|     // TODO @jason:这个是不是可以删除啦 | ||||
|     /** | ||||
|      * BPMN End Event 节点 Id, 用于后端生成 End Event 节点 | ||||
|      */ | ||||
|     String END_EVENT_ID = "EndEvent_1"; | ||||
|  | ||||
|     // TODO @jason:这个是不是可以删除啦 | ||||
|     /** | ||||
|      * 支持转仿钉钉设计模型的 Bpmn 节点 | ||||
|      */ | ||||
|     Set<Class<? extends FlowNode>> SUPPORT_CONVERT_SIMPLE_FlOW_NODES = ImmutableSet.of(UserTask.class, EndEvent.class); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -58,7 +58,6 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { | ||||
|  | ||||
|     @Override | ||||
|     protected void activityCancelled(FlowableActivityCancelledEvent event) { | ||||
|         // TODO @jason:如果用户主动取消,可能需要考虑这个 | ||||
|         List<HistoricActivityInstance> activityList = activityService.getHistoricActivityListByExecutionId(event.getExecutionId()); | ||||
|         if (CollUtil.isEmpty(activityList)) { | ||||
|             log.error("[activityCancelled][使用 executionId({}) 查找不到对应的活动实例]", event.getExecutionId()); | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; | ||||
| import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO; | ||||
| import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRejectReqVO; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmBoundaryEventType; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutActionEnum; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerType; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.mq.message.task.TodoTaskReminderMessage; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.mq.producer.task.TodoTaskReminderProducer; | ||||
| @@ -78,20 +78,20 @@ public class BpmTimerFiredEventListener extends AbstractFlowableEngineEventListe | ||||
|     } | ||||
|  | ||||
|     private void userTaskTimeoutHandler(String processInstanceId, String taskDefKey, Integer timeoutAction) { | ||||
|         BpmUserTaskTimeoutActionEnum userTaskTimeoutAction = BpmUserTaskTimeoutActionEnum.actionOf(timeoutAction); | ||||
|         BpmUserTaskTimeoutHandlerType userTaskTimeoutAction = BpmUserTaskTimeoutHandlerType.typeOf(timeoutAction); | ||||
|         if (userTaskTimeoutAction != null) { | ||||
|             // 查询超时未处理的任务 TODO 加签的情况会不会有问题 ??? | ||||
|             List<Task> taskList = bpmTaskService.getRunningTaskListByProcessInstanceId(processInstanceId, true, | ||||
|                     null, taskDefKey); | ||||
|             taskList.forEach(task -> { | ||||
|                 // 自动提醒 | ||||
|                 if (userTaskTimeoutAction == BpmUserTaskTimeoutActionEnum.REMINDER) { | ||||
|                 if (userTaskTimeoutAction == BpmUserTaskTimeoutHandlerType.REMINDER) { | ||||
|                     TodoTaskReminderMessage message = new TodoTaskReminderMessage().setTenantId(Long.parseLong(task.getTenantId())) | ||||
|                             .setUserId(Long.parseLong(task.getAssignee())).setTaskName(task.getName()); | ||||
|                     todoTaskReminderProducer.sendReminderMessage(message); | ||||
|                 } | ||||
|                 // 自动同意 | ||||
|                 if (userTaskTimeoutAction == BpmUserTaskTimeoutActionEnum.APPROVE) { | ||||
|                 if (userTaskTimeoutAction == BpmUserTaskTimeoutHandlerType.APPROVE) { | ||||
|                     // TODO @芋艿 这个上下文如何清除呢? 任务通过后, BpmProcessInstanceEventListener 会有回调 | ||||
|                     TenantContextHolder.setTenantId(Long.parseLong(task.getTenantId())); | ||||
|                     TenantContextHolder.setIgnore(false); | ||||
| @@ -100,7 +100,7 @@ public class BpmTimerFiredEventListener extends AbstractFlowableEngineEventListe | ||||
|                     bpmTaskService.approveTask(Long.parseLong(task.getAssignee()), req); | ||||
|                 } | ||||
|                 // 自动拒绝 | ||||
|                 if (userTaskTimeoutAction == BpmUserTaskTimeoutActionEnum.REJECT) { | ||||
|                 if (userTaskTimeoutAction == BpmUserTaskTimeoutHandlerType.REJECT) { | ||||
|                     // TODO  @芋艿 这个上下文如何清除呢? 任务拒绝后, BpmProcessInstanceEventListener 会有回调 | ||||
|                     TenantContextHolder.setTenantId(Long.parseLong(task.getTenantId())); | ||||
|                     TenantContextHolder.setIgnore(false); | ||||
|   | ||||
| @@ -1,90 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.simplemodel; | ||||
|  | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmApproveMethodEnum; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskRejectHandlerType; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| // TODO @jason:这个貌似没用到,是不是可以删除啦 | ||||
| /** | ||||
|  * 仿钉钉流程设计器审批节点配置 Model | ||||
|  * | ||||
|  * @author jason | ||||
|  */ | ||||
| @Data | ||||
| public class SimpleModelUserTaskConfig { | ||||
|  | ||||
|     /** | ||||
|      * 候选人策略 | ||||
|      */ | ||||
|     private Integer candidateStrategy; | ||||
|     /** | ||||
|      * 候选人参数 | ||||
|      */ | ||||
|     private String candidateParam; | ||||
|  | ||||
|     /** | ||||
|      * 字段权限 | ||||
|      */ | ||||
|     private List<Map<String,String>> fieldsPermission; | ||||
|  | ||||
|     /** | ||||
|      * 审批方式 {@link BpmApproveMethodEnum } | ||||
|      */ | ||||
|     private  Integer approveMethod; | ||||
|     /** | ||||
|      * 通过比例  当审批方式为 多人会签(按通过比例) 需设置 | ||||
|      */ | ||||
|     private Integer approveRatio; | ||||
|  | ||||
|     /** | ||||
|      * 超时处理 | ||||
|      */ | ||||
|     private TimeoutHandler timeoutHandler; | ||||
|  | ||||
|     /** | ||||
|      * 用户任务拒绝处理 | ||||
|      */ | ||||
|     private RejectHandler rejectHandler; | ||||
|  | ||||
|     @Data | ||||
|     public static class TimeoutHandler { | ||||
|  | ||||
|         /** | ||||
|          * 是否开启超时处理 | ||||
|          */ | ||||
|         private Boolean enable; | ||||
|  | ||||
|         /** | ||||
|          * 超时执行的动作 | ||||
|          */ | ||||
|         private Integer action; | ||||
|  | ||||
|         /** | ||||
|          * 超时时间设置 | ||||
|          */ | ||||
|         private String timeDuration; | ||||
|  | ||||
|         /** | ||||
|          * 如果执行动作是自动提醒, 最大提醒次数 | ||||
|          */ | ||||
|         private Integer maxRemindCount; | ||||
|     } | ||||
|  | ||||
|     @Data | ||||
|     public static class RejectHandler { | ||||
|  | ||||
|         /** | ||||
|          * 用户任务拒绝处理类型 {@link BpmUserTaskRejectHandlerType} | ||||
|          */ | ||||
|         private Integer type; | ||||
|  | ||||
|         /** | ||||
|          * 用户任务拒绝后驳回的节点 Id | ||||
|          */ | ||||
|         private String  returnNodeId; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,73 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.util; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.lang.Assert; | ||||
| import cn.hutool.core.map.MapUtil; | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||||
| import cn.iocoder.yudao.module.bpm.enums.definition.BpmFieldPermissionEnum; | ||||
| import com.fasterxml.jackson.core.type.TypeReference; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.FORM_FIELD_PERMISSION_ELEMENT_FIELD_ATTRIBUTE; | ||||
|  | ||||
| // TODO @芋艿:这块去研究下! | ||||
| /** | ||||
|  *  Bpmn 流程表单相关工具方法 | ||||
|  * | ||||
|  * @author jason | ||||
|  */ | ||||
| public class BpmnFormUtils { | ||||
|  | ||||
|     private static final String CREATE_FORM_DISPLAY_ATTRIBUTE = "display"; | ||||
|     private static final String CREATE_FORM_DISABLED_ATTRIBUTE = "disabled"; | ||||
|  | ||||
|     // TODO @jason:这个方法,还要哇? | ||||
|     /** | ||||
|      * 修改 form-create 表单组件字段权限规则: 包括可编辑、只读、隐藏规则 | ||||
|      * | ||||
|      * @param fields 字段规则 | ||||
|      * @param fieldsPermission 字段权限 | ||||
|      * @return 修改权限后的字段规则 | ||||
|      */ | ||||
|     public static List<String> changeCreateFormFiledPermissionRule(List<String> fields, Map<String,Integer> fieldsPermission) { | ||||
|         if ( CollUtil.isEmpty(fields)  || MapUtil.isEmpty(fieldsPermission)) { | ||||
|             return fields; | ||||
|         } | ||||
|         List<String> afterChangedFields = new ArrayList<>(fields.size()); | ||||
|         fields.forEach( f-> { | ||||
|             Map<String, Object> fieldMap = JsonUtils.parseObject(f, new TypeReference<>() {}); | ||||
|             String field = ObjUtil.defaultIfNull(fieldMap.get(FORM_FIELD_PERMISSION_ELEMENT_FIELD_ATTRIBUTE), Object::toString, ""); | ||||
|             if (StrUtil.isEmpty(field) || !fieldsPermission.containsKey(field)) { | ||||
|                 afterChangedFields.add(f); | ||||
|                 return; | ||||
|             } | ||||
|             BpmFieldPermissionEnum fieldPermission = BpmFieldPermissionEnum.valueOf(fieldsPermission.get(field)); | ||||
|             Assert.notNull(fieldPermission, "字段权限不匹配"); | ||||
|             if (BpmFieldPermissionEnum.NONE == fieldPermission) { | ||||
|                 fieldMap.put(CREATE_FORM_DISPLAY_ATTRIBUTE, Boolean.FALSE); | ||||
|             } else if (BpmFieldPermissionEnum.WRITE == fieldPermission){ | ||||
|                 Map<String, Object> props =  MapUtil.get(fieldMap, "props", new cn.hutool.core.lang.TypeReference<>() {}); | ||||
|                 if (props == null) { | ||||
|                     props = MapUtil.newHashMap(); | ||||
|                     fieldMap.put("props", props); | ||||
|                 } | ||||
|                 props.put(CREATE_FORM_DISABLED_ATTRIBUTE, Boolean.FALSE); | ||||
|             } else if (BpmFieldPermissionEnum.READ == fieldPermission) { | ||||
|                 Map<String, Object> props =  MapUtil.get(fieldMap, "props", new cn.hutool.core.lang.TypeReference<>() {}); | ||||
|                 if (props == null) { | ||||
|                     props = MapUtil.newHashMap(); | ||||
|                     fieldMap.put("props", props); | ||||
|                 } | ||||
|                 props.put(CREATE_FORM_DISABLED_ATTRIBUTE, Boolean.TRUE); | ||||
|             } | ||||
|             afterChangedFields.add(JsonUtils.toJsonString(fieldMap)); | ||||
|         }); | ||||
|         return afterChangedFields; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -27,7 +27,7 @@ import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.s | ||||
| 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.BpmSimpleModelNodeType.*; | ||||
| import static cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutActionEnum.REMINDER; | ||||
| import static cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerType.REMINDER; | ||||
| import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.*; | ||||
| import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.SimpleModelConstants.*; | ||||
| import static org.flowable.bpmn.constants.BpmnXMLConstants.*; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 jason
					jason