mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	Merge remote-tracking branch 'yudao/develop' into develop
# Conflicts: # yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
This commit is contained in:
		| @@ -49,7 +49,7 @@ public class BpmProcessInstanceCopyController { | ||||
|     @PostMapping("/create") | ||||
|     @Operation(summary = "抄送流程") | ||||
|     @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:create')") | ||||
|     public CommonResult<Boolean> createProcessInstanceCC(@Valid @RequestBody BpmProcessInstanceCopyCreateReqVO createReqVO) { | ||||
|     public CommonResult<Boolean> createProcessInstanceCopy(@Valid @RequestBody BpmProcessInstanceCopyCreateReqVO createReqVO) { | ||||
|         processInstanceCopyService.createProcessInstanceCopy(getLoginUserId(), createReqVO); | ||||
|         return success(true); | ||||
|     } | ||||
| @@ -57,7 +57,7 @@ public class BpmProcessInstanceCopyController { | ||||
|     @GetMapping("/my-page") | ||||
|     @Operation(summary = "获得抄送流程分页列表") | ||||
|     @PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')") | ||||
|     public CommonResult<PageResult<BpmProcessInstanceCopyPageItemRespVO>> getProcessInstanceCCPage( | ||||
|     public CommonResult<PageResult<BpmProcessInstanceCopyPageItemRespVO>> getProcessInstanceCopyPage( | ||||
|             @Valid BpmProcessInstanceCopyMyPageReqVO pageReqVO) { | ||||
|         PageResult<BpmProcessInstanceCopyDO> pageResult = processInstanceCopyService.getMyProcessInstanceCopyPage(getLoginUserId(), pageReqVO); | ||||
|         if (CollUtil.isEmpty(pageResult.getList())) { | ||||
|   | ||||
| @@ -1,65 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
|  | ||||
| // TODO @kyle:1)明确是 Req 还是 Resp;2)注释可以合并到 swagger 里;3)example 写一下,这样一些 mock 接口平台可以读取 example | ||||
| /** | ||||
|  * 流程抄送视图对象 | ||||
|  */ | ||||
| @Data | ||||
| public class BpmProcessInstanceCopyVO { | ||||
|  | ||||
|     /** | ||||
|      * 编号 | ||||
|      */ | ||||
|     @Schema(description = "抄送主键") | ||||
|     private Long id; | ||||
|  | ||||
|     /** | ||||
|      * 发起人Id | ||||
|      */ | ||||
|     @Schema(description = "发起人Id") | ||||
|     private Long startUserId; | ||||
|  | ||||
|     @Schema(description = "发起人别名") | ||||
|     private String startUserNickname; | ||||
|  | ||||
|     /** | ||||
|      * 流程主键 | ||||
|      */ | ||||
|     @Schema(description = "流程实例的主键") | ||||
|     private String processInstanceId; | ||||
|  | ||||
|     @Schema(description = "流程实例的名字") | ||||
|     private String processInstanceName; | ||||
|  | ||||
|     /** | ||||
|      * 任务主键 | ||||
|      */ | ||||
|     @Schema(description = "发起抄送的任务编号") | ||||
|     private String taskId; | ||||
|  | ||||
|     @Schema(description = "发起抄送的任务名称") | ||||
|     private String taskName; | ||||
|     /** | ||||
|      * 用户主键 | ||||
|      */ | ||||
|     @Schema(description = "用户编号") | ||||
|     private Long userId; | ||||
|  | ||||
|     @Schema(description = "用户别名") | ||||
|     private Long userNickname; | ||||
|  | ||||
|     @Schema(description = "抄送原因") | ||||
|     private String reason; | ||||
|  | ||||
|     @Schema(description = "抄送人") | ||||
|     private String creator; | ||||
|  | ||||
|     @Schema(description = "抄送时间") | ||||
|     private LocalDateTime createTime; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,76 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.handler; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.ObjectUtil; | ||||
| import cn.iocoder.yudao.framework.flowable.core.enums.BpmnModelConstants; | ||||
| import cn.iocoder.yudao.module.system.api.permission.PermissionApi; | ||||
| import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||||
| import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | ||||
| import jakarta.annotation.Resource; | ||||
| import lombok.AllArgsConstructor; | ||||
| import org.flowable.bpmn.model.FlowElement; | ||||
| import org.flowable.bpmn.model.UserTask; | ||||
| import org.flowable.engine.delegate.DelegateExecution; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.LinkedHashSet; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | ||||
|  | ||||
| // TODO @芋艿:bpmn 分配人融合时,需要搞下这块; | ||||
| /** | ||||
|  * 多实例处理类 | ||||
|  */ | ||||
| @AllArgsConstructor | ||||
| @Component("multiInstanceHandler") | ||||
| public class MultiInstanceHandler { | ||||
|  | ||||
|     @Resource | ||||
|     private AdminUserApi userApi; | ||||
|  | ||||
|     @Resource | ||||
|     private PermissionApi permissionApi; | ||||
|  | ||||
|     /** | ||||
|      * 流程发起人那种情况不需要处理, | ||||
|      * 由 flowable 完成 | ||||
|      * | ||||
|      * @param execution flowable的执行对象 | ||||
|      * @return 用户ID | ||||
|      */ | ||||
|     public Set<String> getUserIds(DelegateExecution execution) { | ||||
|         Set<String> candidateUserIds = new LinkedHashSet<>(); | ||||
|         FlowElement flowElement = execution.getCurrentFlowElement(); | ||||
|         if (ObjectUtil.isNotEmpty(flowElement) && flowElement instanceof UserTask userTask) { | ||||
|             String dataType = userTask.getAttributeValue(BpmnModelConstants.NAMESPACE, BpmnModelConstants.PROCESS_CUSTOM_DATA_TYPE); | ||||
|             if ("USERS".equals(dataType) && CollUtil.isNotEmpty(userTask.getCandidateUsers())) { | ||||
|                 // 添加候选用户id | ||||
|                 candidateUserIds.addAll(userTask.getCandidateUsers()); | ||||
|             } else if (CollUtil.isNotEmpty(userTask.getCandidateGroups())) { | ||||
|                 // 获取组的ID,角色ID集合或部门ID集合 | ||||
|                 List<Long> groups = userTask.getCandidateGroups().stream() | ||||
|                         // 例如部门DEPT100,100才是部门id | ||||
|                         .map(item -> Long.parseLong(item.substring(4))) | ||||
|                         .collect(Collectors.toList()); | ||||
|                 List<Long> userIds = new ArrayList<>(); | ||||
|                 if ("ROLES".equals(dataType)) { | ||||
|                     // 通过角色id,获取所有用户id集合 | ||||
|                     Set<Long> userRoleIdListByRoleIds = permissionApi.getUserRoleIdListByRoleIds(groups); | ||||
|                     userIds = new ArrayList<>(userRoleIdListByRoleIds); | ||||
|                 } else if ("DEPTS".equals(dataType)) { | ||||
|                     // 通过部门id,获取所有用户id集合 | ||||
|                     List<AdminUserRespDTO> userListByDeptIds = userApi.getUserListByDeptIds(groups); | ||||
|                     userIds = convertList(userListByDeptIds, AdminUserRespDTO::getId); | ||||
|                 } | ||||
|                 // 添加候选用户id | ||||
|                 userIds.forEach(id -> candidateUserIds.add(String.valueOf(id))); | ||||
|             } | ||||
|         } | ||||
|         return candidateUserIds; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -5,8 +5,8 @@ import cn.hutool.core.util.ObjectUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.object.PageUtils; | ||||
| import cn.iocoder.yudao.framework.flowable.core.enums.BpmnModelConstants; | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils; | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; | ||||
| import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; | ||||
| import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; | ||||
| @@ -17,6 +17,8 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; | ||||
| import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; | ||||
| import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; | ||||
| import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.flowable.bpmn.converter.BpmnXMLConverter; | ||||
| import org.flowable.bpmn.model.BpmnModel; | ||||
| @@ -29,13 +31,10 @@ import org.flowable.engine.repository.ProcessDefinitionQuery; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.validation.Valid; | ||||
| import java.util.*; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; | ||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | ||||
| import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; | ||||
| import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; | ||||
| import static java.util.Collections.emptyList; | ||||
| @@ -53,8 +52,6 @@ import static java.util.Collections.emptyList; | ||||
| @Slf4j | ||||
| public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionService { | ||||
|  | ||||
|     private static final String BPMN_FILE_SUFFIX = ".bpmn"; | ||||
|  | ||||
|     @Resource | ||||
|     private RepositoryService repositoryService; | ||||
|  | ||||
| @@ -125,7 +122,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ | ||||
|         // 创建 Deployment 部署 | ||||
|         Deployment deploy = repositoryService.createDeployment() | ||||
|                 .key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory()) | ||||
|                 .addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes()) | ||||
|                 .addBytes(createReqDTO.getKey() + BpmnModelConstants.BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes()) | ||||
|                 .tenantId(TenantContextHolder.getTenantIdStr()) | ||||
|                 .deploy(); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 puhui999
					puhui999