diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/MenuApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/MenuApiController.java index 9f94f762..a5ee52f1 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/MenuApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/MenuApiController.java @@ -6,6 +6,7 @@ import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.system.model.MenuDTO; import com.qqchen.deploy.backend.system.model.query.MenuQuery; import com.qqchen.deploy.backend.system.model.response.MenuResponse; +import com.qqchen.deploy.backend.system.model.response.MenuPermissionTreeResponse; import com.qqchen.deploy.backend.system.service.IMenuService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -42,6 +43,12 @@ public class MenuApiController extends BaseController> getPermissionTree() { + return Response.success(menuService.getPermissionTree()); + } + @Override protected void exportData(HttpServletResponse response, List data) { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java index 69f52898..a5bf9712 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java @@ -6,8 +6,6 @@ import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.system.model.PermissionDTO; import com.qqchen.deploy.backend.system.model.RoleDTO; import com.qqchen.deploy.backend.system.model.query.RoleQuery; -import com.qqchen.deploy.backend.system.model.response.MenuPermissionTreeResponse; -import com.qqchen.deploy.backend.system.service.IMenuService; import com.qqchen.deploy.backend.system.service.IRoleService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -27,9 +25,6 @@ public class RoleApiController extends BaseController create(RoleDTO dto) { return super.create(dto); @@ -70,12 +65,6 @@ public class RoleApiController extends BaseController> getPermissionTree() { - return Response.success(menuService.getPermissionTree()); - } - @Operation(summary = "分配标签") @PostMapping("/{id}/tags") public Response assignTags(@PathVariable Long id, @RequestBody List tagIds) { @@ -83,16 +72,6 @@ public class RoleApiController extends BaseController assignRoles( - @Parameter(description = "用户ID", required = true) @PathVariable Long userId, - @Parameter(description = "角色ID列表", required = true) @RequestBody List roleIds - ) { - roleService.assignRoles(userId, roleIds); - return Response.success(); - } - @Operation(summary = "获取角色权限") @GetMapping("/{id}/permissions") public Response> getRolePermissions( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/UserApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/UserApiController.java index 22821165..c24893aa 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/UserApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/UserApiController.java @@ -97,6 +97,13 @@ public class UserApiController extends BaseController assignRoles(@PathVariable Long id, @RequestBody List roleIds) { + userService.assignRoles(id, roleIds); + return Response.success(); + } + @Override protected void exportData(HttpServletResponse response, List data) { response.setContentType("application/vnd.ms-excel"); diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/service/IRoleService.java b/backend/src/main/java/com/qqchen/deploy/backend/system/service/IRoleService.java index a3569320..4706852a 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/service/IRoleService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/service/IRoleService.java @@ -30,11 +30,6 @@ public interface IRoleService extends IBaseService tagIds); - /** - * 分配角色 - */ - void assignRoles(Long userId, List roleIds); - /** * 获取角色的权限列表 */ diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/service/IUserService.java b/backend/src/main/java/com/qqchen/deploy/backend/system/service/IUserService.java index 38a8de6c..887a4162 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/service/IUserService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/service/IUserService.java @@ -52,6 +52,14 @@ public interface IUserService extends IBaseService roleIds); + /** * 获取用户角色代码列表 * @param userId 用户ID diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/RoleServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/RoleServiceImpl.java index 3ad1d771..90edd2e2 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/RoleServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/RoleServiceImpl.java @@ -6,7 +6,6 @@ import com.qqchen.deploy.backend.system.entity.Menu; import com.qqchen.deploy.backend.system.entity.Permission; import com.qqchen.deploy.backend.system.entity.Role; import com.qqchen.deploy.backend.system.entity.RoleTag; -import com.qqchen.deploy.backend.system.entity.User; import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.framework.exception.BusinessException; import com.qqchen.deploy.backend.framework.exception.UniqueConstraintException; @@ -19,7 +18,6 @@ import com.qqchen.deploy.backend.system.repository.IMenuRepository; import com.qqchen.deploy.backend.system.repository.IPermissionRepository; import com.qqchen.deploy.backend.system.repository.IRoleRepository; import com.qqchen.deploy.backend.system.repository.IRoleTagRepository; -import com.qqchen.deploy.backend.system.repository.IUserRepository; import com.qqchen.deploy.backend.system.service.IRoleService; import com.qqchen.deploy.backend.framework.annotation.ServiceType; import com.qqchen.deploy.backend.system.service.IPermissionService; @@ -47,9 +45,6 @@ public class RoleServiceImpl extends BaseServiceImpl roleIds) { - // 获取用户 - User user = userRepository.findById(userId) - .orElseThrow(() -> new BusinessException(ResponseCode.USER_NOT_FOUND)); - - // 不允许修改admin用户的角色 - if ("admin".equals(user.getUsername())) { - throw new BusinessException(ResponseCode.ROLE_ADMIN_CANNOT_UPDATE); - } - - // 获取角色列表 - List roles = roleRepository.findAllById(roleIds); - - // 验证所有角色ID是否都存在 - if (roles.size() != roleIds.size()) { - throw new BusinessException(ResponseCode.ROLE_NOT_FOUND); - } - - // 设置用���角色 - user.setRoles(new HashSet<>(roles)); - - // 保存更新 - userRepository.save(user); - } - @Override public List listRolePermissions(Long roleId) { Role role = roleRepository.findById(roleId) diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/UserServiceImpl.java index 08d902b1..b581b778 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/system/service/impl/UserServiceImpl.java @@ -21,7 +21,9 @@ import com.qqchen.deploy.backend.system.converter.RoleConverter; import com.qqchen.deploy.backend.system.model.UserDTO; import com.qqchen.deploy.backend.system.model.RoleDTO; import com.qqchen.deploy.backend.system.repository.IDepartmentRepository; +import com.qqchen.deploy.backend.system.repository.IRoleRepository; import com.qqchen.deploy.backend.system.entity.Department; +import com.qqchen.deploy.backend.system.entity.Role; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.hibernate.Hibernate; @@ -34,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.stream.Collectors; @@ -62,6 +65,9 @@ public class UserServiceImpl extends BaseServiceImpl roleIds) { + // 获取用户 + User user = findEntityById(userId); + + // 不允许修改admin用户的角色 + if ("admin".equals(user.getUsername())) { + throw new BusinessException(ResponseCode.ROLE_ADMIN_CANNOT_UPDATE); + } + + // 获取角色列表 + List roles = roleRepository.findAllById(roleIds); + + // 验证所有角色ID是否都存在 + if (roles.size() != roleIds.size()) { + throw new BusinessException(ResponseCode.ROLE_NOT_FOUND); + } + + // 设置用户角色 + user.setRoles(new HashSet<>(roles)); + + // 保存更新 + userRepository.save(user); + + log.info("用户 {} 已分配角色: {}", user.getUsername(), roles.stream().map(Role::getName).collect(Collectors.joining(", "))); + } + @Override protected void validateUniqueConstraints(UserDTO dto) { // 检查用户名唯一性(包括已删除的记录) diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java index af2838d6..55719163 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java @@ -40,8 +40,6 @@ public class WorkflowDefinitionApiController extends BaseController deployWorkflow(@RequestBody WorkflowDefinitionDTO dto) { -// return Response.success(workflowDefinitionService.deployWorkflow(dto)); -// } - - @Operation(summary = "挂起工作流实例") - @PostMapping("/{processInstanceId}/suspend") - public Response suspendWorkflow( - @Parameter(description = "流程实例ID", required = true) @PathVariable String processInstanceId - ) { - workflowDefinitionService.suspendWorkflow(processInstanceId); - return Response.success(); - } - - @Operation(summary = "恢复工作流实例") - @PostMapping("/{processInstanceId}/resume") - public Response resumeWorkflow( - @Parameter(description = "流程实例ID", required = true) @PathVariable String processInstanceId - ) { - workflowDefinitionService.resumeWorkflow(processInstanceId); - return Response.success(); - } - - @Operation(summary = "查询工作流实例") - @GetMapping("/instance/{processInstanceId}") - public Response getWorkflowInstance( - @Parameter(description = "流程实例ID", required = true) @PathVariable String processInstanceId - ) { - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(processInstanceId) - .includeProcessVariables() - .singleResult(); - - if (historicProcessInstance == null) { - return Response.error(ResponseCode.WORKFLOW_NOT_FOUND); - } - - WorkflowInstanceDTO instanceDTO = new WorkflowInstanceDTO(); -// instanceDTO.setId(historicProcessInstance.getId()); -// instanceDTO.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId()); -// instanceDTO.setBusinessKey(historicProcessInstance.getBusinessKey()); -// instanceDTO.setStartTime(historicProcessInstance.getStartTime()); -// instanceDTO.setEndTime(historicProcessInstance.getEndTime()); -// instanceDTO.setDurationInMillis(historicProcessInstance.getDurationInMillis()); -// instanceDTO.setStartUserId(historicProcessInstance.getStartUserId()); -// instanceDTO.setStatus(historicProcessInstance.getEndTime() != null ? WorkflowInstanceStatusEnums.COMPLETED : WorkflowInstanceStatusEnums.RUNNING); -// instanceDTO.setVariables(historicProcessInstance.getProcessVariables()); -// -// // 查询活动节点历史 -// List activities = historyService.createHistoricActivityInstanceQuery() -// .processInstanceId(processInstanceId) -// .orderByHistoricActivityInstanceStartTime() -// .asc() -// .list(); -// -// List activityInstances = activities.stream() -// .map(activity -> { -// WorkflowInstanceDTO.ActivityInstance activityInstance = new WorkflowInstanceDTO.ActivityInstance(); -// activityInstance.setId(activity.getId()); -// activityInstance.setActivityId(activity.getActivityId()); -// activityInstance.setActivityName(activity.getActivityName()); -// activityInstance.setActivityType(activity.getActivityType()); -// activityInstance.setStartTime(activity.getStartTime()); -// activityInstance.setEndTime(activity.getEndTime()); -// activityInstance.setDurationInMillis(activity.getDurationInMillis()); -// -// // 如果是Shell任务,获取Shell相关变量 -// if ("serviceTask".equals(activity.getActivityType())) { -// Map variables = historicProcessInstance.getProcessVariables(); -// activityInstance.setShellOutput((String) variables.get("shellOutput")); -// activityInstance.setShellError((String) variables.get("shellError")); -// activityInstance.setShellExitCode((Integer) variables.get("shellExitCode")); -// } -// -// return activityInstance; -// }) -// .collect(Collectors.toList()); -// -// instanceDTO.setActivities(activityInstances); -// -// return Response.success(instanceDTO);' - return Response.success(); - } - - @Operation(summary = "获取工作流执行状态") - @GetMapping("/instance/{processInstanceId}/execution") - public ResponseEntity getWorkflowExecution(@PathVariable String processInstanceId) { - return ResponseEntity.ok(workflowDefinitionService.getWorkflowExecution(processInstanceId)); - } - - @Operation(summary = "查询工作流实例列表") - @GetMapping("/instances") - public Response> listWorkflowInstances( - @Parameter(description = "流程标识") @RequestParam(required = false) String processKey, - @Parameter(description = "业务标识") @RequestParam(required = false) String businessKey - ) { - List historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .processDefinitionKey(processKey) - .processInstanceBusinessKey(businessKey) - .includeProcessVariables() - .orderByProcessInstanceStartTime() - .desc() - .list(); - -// List instanceDTOs = historicProcessInstances.stream() -// .map(historicProcessInstance -> { -// WorkflowInstanceDTO instanceDTO = new WorkflowInstanceDTO(); -//// instanceDTO.setId(historicProcessInstance.getId()); -// instanceDTO.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId()); -// instanceDTO.setBusinessKey(historicProcessInstance.getBusinessKey()); -// instanceDTO.setStartTime(historicProcessInstance.getStartTime()); -// instanceDTO.setEndTime(historicProcessInstance.getEndTime()); -// instanceDTO.setDurationInMillis(historicProcessInstance.getDurationInMillis()); -// instanceDTO.setStartUserId(historicProcessInstance.getStartUserId()); -// instanceDTO.setStatus(historicProcessInstance.getEndTime() != null ? WorkflowInstanceStatusEnums.COMPLETED : WorkflowInstanceStatusEnums.RUNNING); -// instanceDTO.setVariables(historicProcessInstance.getProcessVariables()); -// return instanceDTO; -// }) -// .collect(Collectors.toList()); - -// return Response.success(instanceDTOs); - return Response.success(); - } - - @Operation(summary = "获取节点实时日志") - @GetMapping("/instance/{processInstanceId}/node/{nodeId}/logs") - public Response> getNodeLogs( - @Parameter(description = "流程实例ID", required = true) @PathVariable String processInstanceId, - @Parameter(description = "节点ID", required = true) @PathVariable String nodeId - ) { - Map result = new HashMap<>(); - - // 获取历史活动实例 - HistoricActivityInstance activity = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId) - .activityId(nodeId) - .singleResult(); - - if (activity == null) { - return Response.error(ResponseCode.WORKFLOW_NODE_NOT_FOUND); - } - - // 获取执行ID - String executionId = activity.getExecutionId(); - - // 获取节点相关的变量 - List variables = historyService.createHistoricVariableInstanceQuery() - .processInstanceId(processInstanceId) - .list(); - - // 收集日志信息 - variables.forEach(variable -> { - String variableName = variable.getVariableName(); - if (variableName.startsWith(executionId)) { - // 移除executionId前缀 - String key = variableName.substring(executionId.length() + 1); // +1 for the underscore - result.put(key, variable.getValue()); - } - }); - - // 添加节点基本信息 - result.put("nodeId", nodeId); - result.put("nodeName", activity.getActivityName()); - result.put("nodeType", activity.getActivityType()); - result.put("startTime", activity.getStartTime()); - result.put("endTime", activity.getEndTime()); - result.put("status", activity.getEndTime() == null ? "RUNNING" : "COMPLETED"); - - return Response.success(result); - } - @Operation(summary = "禁用工作流") @PostMapping("/{id}/disable")