mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 02:38:43 +08:00 
			
		
		
		
	【功能优化】 流程发起人,展示抄送节点,用于选择抄送人
This commit is contained in:
		| @@ -35,8 +35,8 @@ public interface ErrorCodeConstants { | |||||||
|     ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1_009_004_000, "流程实例不存在"); |     ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1_009_004_000, "流程实例不存在"); | ||||||
|     ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS = new ErrorCode(1_009_004_001, "流程取消失败,流程不处于运行中"); |     ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS = new ErrorCode(1_009_004_001, "流程取消失败,流程不处于运行中"); | ||||||
|     ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF = new ErrorCode(1_009_004_002, "流程取消失败,该流程不是你发起的"); |     ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF = new ErrorCode(1_009_004_002, "流程取消失败,该流程不是你发起的"); | ||||||
|     ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_003, "审批任务({})的审批人未配置"); |     ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_003, "任务({})的候选人未配置"); | ||||||
|     ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS = new ErrorCode(1_009_004_004, "审批任务({})的审批人({})不存在"); |     ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS = new ErrorCode(1_009_004_004, "任务({})的候选人({})不存在"); | ||||||
|     ErrorCode PROCESS_INSTANCE_START_USER_CAN_START = new ErrorCode(1_009_004_005, "发起流程失败,你没有权限发起该流程"); |     ErrorCode PROCESS_INSTANCE_START_USER_CAN_START = new ErrorCode(1_009_004_005, "发起流程失败,你没有权限发起该流程"); | ||||||
|  |  | ||||||
|     // ========== 流程任务 1-009-005-000 ========== |     // ========== 流程任务 1-009-005-000 ========== | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ import io.swagger.v3.oas.annotations.Parameter; | |||||||
| import io.swagger.v3.oas.annotations.tags.Tag; | import io.swagger.v3.oas.annotations.tags.Tag; | ||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
| import org.flowable.bpmn.model.BpmnModel; | import org.flowable.bpmn.model.BpmnModel; | ||||||
|  | import org.flowable.bpmn.model.Task; | ||||||
| import org.flowable.bpmn.model.UserTask; | import org.flowable.bpmn.model.UserTask; | ||||||
| import org.flowable.engine.repository.Deployment; | import org.flowable.engine.repository.Deployment; | ||||||
| import org.flowable.engine.repository.ProcessDefinition; | import org.flowable.engine.repository.ProcessDefinition; | ||||||
| @@ -115,9 +116,8 @@ public class BpmProcessDefinitionController { | |||||||
|         } |         } | ||||||
|         BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(processDefinition.getId()); |         BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(processDefinition.getId()); | ||||||
|         BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(processDefinition.getId()); |         BpmnModel bpmnModel = processDefinitionService.getProcessDefinitionBpmnModel(processDefinition.getId()); | ||||||
|         List<UserTask> userTaskList = BpmTaskCandidateStartUserSelectStrategy.getStartUserSelectUserTaskList(bpmnModel); |  | ||||||
|         return success(BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinition( |         return success(BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinition( | ||||||
|                 processDefinition, null, processDefinitionInfo, null, null, bpmnModel, userTaskList)); |                 processDefinition, null, processDefinitionInfo, null, null, bpmnModel)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -54,6 +54,9 @@ public class BpmApprovalDetailRespVO { | |||||||
|         @Schema(description = "节点状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |         @Schema(description = "节点状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | ||||||
|         private Integer status; // 参见 BpmTaskStatusEnum 枚举 |         private Integer status; // 参见 BpmTaskStatusEnum 枚举 | ||||||
|  |  | ||||||
|  |         @Schema(description = "候选人策略", example = "35") | ||||||
|  |         private Integer candidateStrategy; // 用于审批,抄送节点 | ||||||
|  |  | ||||||
|         @Schema(description = "节点的开始时间") |         @Schema(description = "节点的开始时间") | ||||||
|         private LocalDateTime startTime; |         private LocalDateTime startTime; | ||||||
|         @Schema(description = "节点的结束时间") |         @Schema(description = "节点的结束时间") | ||||||
|   | |||||||
| @@ -11,7 +11,6 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; | |||||||
| import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; | ||||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; | import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; | ||||||
| import org.flowable.bpmn.model.BpmnModel; | import org.flowable.bpmn.model.BpmnModel; | ||||||
| import org.flowable.bpmn.model.UserTask; |  | ||||||
| import org.flowable.common.engine.impl.db.SuspensionState; | import org.flowable.common.engine.impl.db.SuspensionState; | ||||||
| import org.flowable.engine.repository.Deployment; | import org.flowable.engine.repository.Deployment; | ||||||
| import org.flowable.engine.repository.ProcessDefinition; | import org.flowable.engine.repository.ProcessDefinition; | ||||||
| @@ -56,7 +55,7 @@ public interface BpmProcessDefinitionConvert { | |||||||
|                 form = MapUtil.get(formMap, processDefinitionInfo.getFormId(), BpmFormDO.class); |                 form = MapUtil.get(formMap, processDefinitionInfo.getFormId(), BpmFormDO.class); | ||||||
|             } |             } | ||||||
|             BpmCategoryDO category = MapUtil.get(categoryMap, definition.getCategory(), BpmCategoryDO.class); |             BpmCategoryDO category = MapUtil.get(categoryMap, definition.getCategory(), BpmCategoryDO.class); | ||||||
|             return buildProcessDefinition(definition, deployment, processDefinitionInfo, form, category, null, null); |             return buildProcessDefinition(definition, deployment, processDefinitionInfo, form, category, null); | ||||||
|         }); |         }); | ||||||
|         // 排序 |         // 排序 | ||||||
|         result.sort(Comparator.comparing(BpmProcessDefinitionRespVO::getSort)); |         result.sort(Comparator.comparing(BpmProcessDefinitionRespVO::getSort)); | ||||||
| @@ -68,8 +67,7 @@ public interface BpmProcessDefinitionConvert { | |||||||
|                                                               BpmProcessDefinitionInfoDO processDefinitionInfo, |                                                               BpmProcessDefinitionInfoDO processDefinitionInfo, | ||||||
|                                                               BpmFormDO form, |                                                               BpmFormDO form, | ||||||
|                                                               BpmCategoryDO category, |                                                               BpmCategoryDO category, | ||||||
|                                                               BpmnModel bpmnModel, |                                                               BpmnModel bpmnModel) { | ||||||
|                                                               List<UserTask> startUserSelectUserTaskList) { |  | ||||||
|         BpmProcessDefinitionRespVO respVO = BeanUtils.toBean(definition, BpmProcessDefinitionRespVO.class); |         BpmProcessDefinitionRespVO respVO = BeanUtils.toBean(definition, BpmProcessDefinitionRespVO.class); | ||||||
|         respVO.setSuspensionState(definition.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); |         respVO.setSuspensionState(definition.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); | ||||||
|         // Deployment |         // Deployment | ||||||
| @@ -91,7 +89,6 @@ public interface BpmProcessDefinitionConvert { | |||||||
|         // BpmnModel |         // BpmnModel | ||||||
|         if (bpmnModel != null) { |         if (bpmnModel != null) { | ||||||
|             respVO.setBpmnXml(BpmnModelUtils.getBpmnXml(bpmnModel)); |             respVO.setBpmnXml(BpmnModelUtils.getBpmnXml(bpmnModel)); | ||||||
|             respVO.setStartUserSelectTasks(BeanUtils.toBean(startUserSelectUserTaskList, BpmProcessDefinitionRespVO.UserTask.class)); |  | ||||||
|         } |         } | ||||||
|         return respVO; |         return respVO; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -26,7 +26,6 @@ import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcess | |||||||
| import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; | ||||||
| import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | ||||||
| import org.flowable.bpmn.model.BpmnModel; | import org.flowable.bpmn.model.BpmnModel; | ||||||
| import org.flowable.bpmn.model.UserTask; |  | ||||||
| import org.flowable.engine.history.HistoricProcessInstance; | import org.flowable.engine.history.HistoricProcessInstance; | ||||||
| import org.flowable.engine.repository.ProcessDefinition; | import org.flowable.engine.repository.ProcessDefinition; | ||||||
| import org.flowable.engine.runtime.ProcessInstance; | import org.flowable.engine.runtime.ProcessInstance; | ||||||
| @@ -243,9 +242,8 @@ public interface BpmProcessInstanceConvert { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // 1.2 流程定义 |         // 1.2 流程定义 | ||||||
|         List<UserTask> userTaskList = BpmTaskCandidateStartUserSelectStrategy.getStartUserSelectUserTaskList(bpmnModel); |  | ||||||
|         BpmProcessDefinitionRespVO definitionResp = BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinition( |         BpmProcessDefinitionRespVO definitionResp = BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinition( | ||||||
|                 processDefinition, null, processDefinitionInfo, null, null, bpmnModel, userTaskList); |                 processDefinition, null, processDefinitionInfo, null, null, bpmnModel); | ||||||
|  |  | ||||||
|         // 1.3 流程节点 |         // 1.3 流程节点 | ||||||
|         activityNodes.forEach(approveNode -> { |         activityNodes.forEach(approveNode -> { | ||||||
|   | |||||||
| @@ -10,13 +10,16 @@ import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; | |||||||
| import com.google.common.collect.Sets; | import com.google.common.collect.Sets; | ||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
| import org.flowable.bpmn.model.BpmnModel; | import org.flowable.bpmn.model.BpmnModel; | ||||||
| import org.flowable.bpmn.model.UserTask; | import org.flowable.bpmn.model.Task; | ||||||
| import org.flowable.engine.delegate.DelegateExecution; | import org.flowable.engine.delegate.DelegateExecution; | ||||||
| import org.flowable.engine.runtime.ProcessInstance; | import org.flowable.engine.runtime.ProcessInstance; | ||||||
| import org.springframework.context.annotation.Lazy; | import org.springframework.context.annotation.Lazy; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
|  |  | ||||||
| import java.util.*; | import java.util.LinkedHashSet; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Objects; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 发起人自选 {@link BpmTaskCandidateUserStrategy} 实现类 |  * 发起人自选 {@link BpmTaskCandidateUserStrategy} 实现类 | ||||||
| @@ -71,22 +74,22 @@ public class BpmTaskCandidateStartUserSelectStrategy extends AbstractBpmTaskCand | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 获得发起人自选审批人的 UserTask 列表 |      * 获得发起人自选审批人或抄送人的 Task 列表 | ||||||
|      * |      * | ||||||
|      * @param bpmnModel BPMN 模型 |      * @param bpmnModel BPMN 模型 | ||||||
|      * @return UserTask 列表 |      * @return Task 列表 | ||||||
|      */ |      */ | ||||||
|     public static List<UserTask> getStartUserSelectUserTaskList(BpmnModel bpmnModel) { |     public static <T extends Task> List<T> getStartUserSelectUserTaskList(BpmnModel bpmnModel, Class<T> TaskClass ) { | ||||||
|         if (bpmnModel == null) { |         if (bpmnModel == null) { | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|         List<UserTask> userTaskList = BpmnModelUtils.getBpmnModelElements(bpmnModel, UserTask.class); |         List<T> tasks = BpmnModelUtils.getBpmnModelElements(bpmnModel, TaskClass); | ||||||
|         if (CollUtil.isEmpty(userTaskList)) { |         if (CollUtil.isEmpty(tasks)) { | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|         userTaskList.removeIf(userTask -> !Objects.equals(BpmnModelUtils.parseCandidateStrategy(userTask), |         tasks.removeIf(serviceTask -> !Objects.equals(BpmnModelUtils.parseCandidateStrategy(serviceTask), | ||||||
|                 BpmTaskCandidateStrategyEnum.START_USER_SELECT.getStrategy())); |                 BpmTaskCandidateStrategyEnum.START_USER_SELECT.getStrategy())); | ||||||
|         return userTaskList; |         return tasks; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -628,10 +628,11 @@ public class SimpleModelUtils { | |||||||
|         BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(currentNode.getType()); |         BpmSimpleModelNodeType nodeType = BpmSimpleModelNodeType.valueOf(currentNode.getType()); | ||||||
|         Assert.notNull(nodeType, "模型节点类型不支持"); |         Assert.notNull(nodeType, "模型节点类型不支持"); | ||||||
|  |  | ||||||
|         // 情况:START_NODE/START_USER_NODE/APPROVE_NODE/END_NODE |         // 情况:START_NODE/START_USER_NODE/APPROVE_NODE/COPY_NODE/END_NODE | ||||||
|         if (nodeType == BpmSimpleModelNodeType.START_NODE |         if (nodeType == BpmSimpleModelNodeType.START_NODE | ||||||
|             || nodeType == BpmSimpleModelNodeType.START_USER_NODE |             || nodeType == BpmSimpleModelNodeType.START_USER_NODE | ||||||
|             || nodeType == BpmSimpleModelNodeType.APPROVE_NODE |             || nodeType == BpmSimpleModelNodeType.APPROVE_NODE | ||||||
|  |             || nodeType == BpmSimpleModelNodeType.COPY_NODE | ||||||
|             || nodeType == BpmSimpleModelNodeType.END_NODE) { |             || nodeType == BpmSimpleModelNodeType.END_NODE) { | ||||||
|             // 添加元素 |             // 添加元素 | ||||||
|             resultNodes.add(currentNode); |             resultNodes.add(currentNode); | ||||||
|   | |||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user
	 jason
					jason