打印了JENKINS节点日志

This commit is contained in:
dengqichen 2025-11-10 17:56:18 +08:00
parent d9f084908a
commit d9d9f2968d
8 changed files with 57 additions and 232 deletions

View File

@ -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.MenuDTO;
import com.qqchen.deploy.backend.system.model.query.MenuQuery; 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.MenuResponse;
import com.qqchen.deploy.backend.system.model.response.MenuPermissionTreeResponse;
import com.qqchen.deploy.backend.system.service.IMenuService; import com.qqchen.deploy.backend.system.service.IMenuService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -42,6 +43,12 @@ public class MenuApiController extends BaseController<Menu, MenuDTO, Long, MenuQ
return Response.success(menuService.getMenuTree()); return Response.success(menuService.getMenuTree());
} }
@Operation(summary = "获取菜单权限树")
@GetMapping("/permission-tree")
public Response<List<MenuPermissionTreeResponse>> getPermissionTree() {
return Response.success(menuService.getPermissionTree());
}
@Override @Override
protected void exportData(HttpServletResponse response, List<MenuDTO> data) { protected void exportData(HttpServletResponse response, List<MenuDTO> data) {

View File

@ -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.PermissionDTO;
import com.qqchen.deploy.backend.system.model.RoleDTO; import com.qqchen.deploy.backend.system.model.RoleDTO;
import com.qqchen.deploy.backend.system.model.query.RoleQuery; 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 com.qqchen.deploy.backend.system.service.IRoleService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@ -27,9 +25,6 @@ public class RoleApiController extends BaseController<Role, RoleDTO, Long, RoleQ
@Resource @Resource
private IRoleService roleService; private IRoleService roleService;
@Resource
private IMenuService menuService;
@Override @Override
public Response<RoleDTO> create(RoleDTO dto) { public Response<RoleDTO> create(RoleDTO dto) {
return super.create(dto); return super.create(dto);
@ -70,12 +65,6 @@ public class RoleApiController extends BaseController<Role, RoleDTO, Long, RoleQ
return super.batchProcess(dtos); return super.batchProcess(dtos);
} }
@Operation(summary = "获取菜单权限树")
@GetMapping("/permission-tree")
public Response<List<MenuPermissionTreeResponse>> getPermissionTree() {
return Response.success(menuService.getPermissionTree());
}
@Operation(summary = "分配标签") @Operation(summary = "分配标签")
@PostMapping("/{id}/tags") @PostMapping("/{id}/tags")
public Response<Void> assignTags(@PathVariable Long id, @RequestBody List<Long> tagIds) { public Response<Void> assignTags(@PathVariable Long id, @RequestBody List<Long> tagIds) {
@ -83,16 +72,6 @@ public class RoleApiController extends BaseController<Role, RoleDTO, Long, RoleQ
return Response.success(); return Response.success();
} }
@Operation(summary = "分配角色")
@PostMapping("/{userId}/assignRoles")
public Response<Void> assignRoles(
@Parameter(description = "用户ID", required = true) @PathVariable Long userId,
@Parameter(description = "角色ID列表", required = true) @RequestBody List<Long> roleIds
) {
roleService.assignRoles(userId, roleIds);
return Response.success();
}
@Operation(summary = "获取角色权限") @Operation(summary = "获取角色权限")
@GetMapping("/{id}/permissions") @GetMapping("/{id}/permissions")
public Response<List<PermissionDTO>> getRolePermissions( public Response<List<PermissionDTO>> getRolePermissions(

View File

@ -97,6 +97,13 @@ public class UserApiController extends BaseController<User, UserDTO, Long, UserQ
return Response.success(); return Response.success();
} }
@PostMapping("/{id}/roles")
@Operation(summary = "分配用户角色")
public Response<Void> assignRoles(@PathVariable Long id, @RequestBody List<Long> roleIds) {
userService.assignRoles(id, roleIds);
return Response.success();
}
@Override @Override
protected void exportData(HttpServletResponse response, List<UserDTO> data) { protected void exportData(HttpServletResponse response, List<UserDTO> data) {
response.setContentType("application/vnd.ms-excel"); response.setContentType("application/vnd.ms-excel");

View File

@ -30,11 +30,6 @@ public interface IRoleService extends IBaseService<Role, RoleDTO, RoleQuery, Lon
*/ */
void assignTags(Long roleId, List<Long> tagIds); void assignTags(Long roleId, List<Long> tagIds);
/**
* 分配角色
*/
void assignRoles(Long userId, List<Long> roleIds);
/** /**
* 获取角色的权限列表 * 获取角色的权限列表
*/ */

View File

@ -52,6 +52,14 @@ public interface IUserService extends IBaseService<User, UserDTO, UserQuery, Lon
@Transactional(readOnly = false) @Transactional(readOnly = false)
void assignDepartment(Long userId, Long departmentId); void assignDepartment(Long userId, Long departmentId);
/**
* 分配用户角色
* @param userId 用户ID
* @param roleIds 角色ID列表
*/
@Transactional(readOnly = false)
void assignRoles(Long userId, List<Long> roleIds);
/** /**
* 获取用户角色代码列表 * 获取用户角色代码列表
* @param userId 用户ID * @param userId 用户ID

View File

@ -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.Permission;
import com.qqchen.deploy.backend.system.entity.Role; import com.qqchen.deploy.backend.system.entity.Role;
import com.qqchen.deploy.backend.system.entity.RoleTag; 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.enums.ResponseCode;
import com.qqchen.deploy.backend.framework.exception.BusinessException; import com.qqchen.deploy.backend.framework.exception.BusinessException;
import com.qqchen.deploy.backend.framework.exception.UniqueConstraintException; 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.IPermissionRepository;
import com.qqchen.deploy.backend.system.repository.IRoleRepository; import com.qqchen.deploy.backend.system.repository.IRoleRepository;
import com.qqchen.deploy.backend.system.repository.IRoleTagRepository; 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.system.service.IRoleService;
import com.qqchen.deploy.backend.framework.annotation.ServiceType; import com.qqchen.deploy.backend.framework.annotation.ServiceType;
import com.qqchen.deploy.backend.system.service.IPermissionService; import com.qqchen.deploy.backend.system.service.IPermissionService;
@ -47,9 +45,6 @@ public class RoleServiceImpl extends BaseServiceImpl<Role, RoleDTO, RoleQuery, L
@Resource @Resource
private IRoleTagRepository roleTagRepository; private IRoleTagRepository roleTagRepository;
@Resource
private IUserRepository userRepository;
@Resource @Resource
private IPermissionService permissionService; private IPermissionService permissionService;
@ -126,33 +121,6 @@ public class RoleServiceImpl extends BaseServiceImpl<Role, RoleDTO, RoleQuery, L
roleRepository.save(role); roleRepository.save(role);
} }
@Override
@Transactional
public void assignRoles(Long userId, List<Long> 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<Role> roles = roleRepository.findAllById(roleIds);
// 验证所有角色ID是否都存在
if (roles.size() != roleIds.size()) {
throw new BusinessException(ResponseCode.ROLE_NOT_FOUND);
}
// 设置用<EFBFBD><EFBFBD><EFBFBD>角色
user.setRoles(new HashSet<>(roles));
// 保存更新
userRepository.save(user);
}
@Override @Override
public List<PermissionDTO> listRolePermissions(Long roleId) { public List<PermissionDTO> listRolePermissions(Long roleId) {
Role role = roleRepository.findById(roleId) Role role = roleRepository.findById(roleId)

View File

@ -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.UserDTO;
import com.qqchen.deploy.backend.system.model.RoleDTO; import com.qqchen.deploy.backend.system.model.RoleDTO;
import com.qqchen.deploy.backend.system.repository.IDepartmentRepository; 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.Department;
import com.qqchen.deploy.backend.system.entity.Role;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.hibernate.Hibernate; import org.hibernate.Hibernate;
@ -34,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -62,6 +65,9 @@ public class UserServiceImpl extends BaseServiceImpl<User, UserDTO, UserQuery, L
@Resource @Resource
private IDepartmentRepository departmentRepository; private IDepartmentRepository departmentRepository;
@Resource
private IRoleRepository roleRepository;
@Override @Override
@Transactional @Transactional
public UserDTO create(UserDTO dto) { public UserDTO create(UserDTO dto) {
@ -220,6 +226,35 @@ public class UserServiceImpl extends BaseServiceImpl<User, UserDTO, UserQuery, L
log.info("用户 {} 已分配到部门 {}", user.getUsername(), department.getName()); log.info("用户 {} 已分配到部门 {}", user.getUsername(), department.getName());
} }
@Override
@Transactional
@Audited(action = "ASSIGN_ROLES", detail = "分配角色")
public void assignRoles(Long userId, List<Long> roleIds) {
// 获取用户
User user = findEntityById(userId);
// 不允许修改admin用户的角色
if ("admin".equals(user.getUsername())) {
throw new BusinessException(ResponseCode.ROLE_ADMIN_CANNOT_UPDATE);
}
// 获取角色列表
List<Role> 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 @Override
protected void validateUniqueConstraints(UserDTO dto) { protected void validateUniqueConstraints(UserDTO dto) {
// 检查用户名唯一性包括已删除的记录 // 检查用户名唯一性包括已删除的记录

View File

@ -40,8 +40,6 @@ public class WorkflowDefinitionApiController extends BaseController<WorkflowDefi
@Resource @Resource
private IWorkflowDefinitionService workflowDefinitionService; private IWorkflowDefinitionService workflowDefinitionService;
@Resource
private HistoryService historyService;
@Operation(summary = "保存工作流设计") @Operation(summary = "保存工作流设计")
@PostMapping("/design") @PostMapping("/design")
@ -60,178 +58,6 @@ public class WorkflowDefinitionApiController extends BaseController<WorkflowDefi
return Response.success(); return Response.success();
} }
// @Operation(summary = "部署工作流")
// @PostMapping("/deploy")
// public Response<WorkflowDefinitionDTO> deployWorkflow(@RequestBody WorkflowDefinitionDTO dto) {
// return Response.success(workflowDefinitionService.deployWorkflow(dto));
// }
@Operation(summary = "挂起工作流实例")
@PostMapping("/{processInstanceId}/suspend")
public Response<Void> suspendWorkflow(
@Parameter(description = "流程实例ID", required = true) @PathVariable String processInstanceId
) {
workflowDefinitionService.suspendWorkflow(processInstanceId);
return Response.success();
}
@Operation(summary = "恢复工作流实例")
@PostMapping("/{processInstanceId}/resume")
public Response<Void> resumeWorkflow(
@Parameter(description = "流程实例ID", required = true) @PathVariable String processInstanceId
) {
workflowDefinitionService.resumeWorkflow(processInstanceId);
return Response.success();
}
@Operation(summary = "查询工作流实例")
@GetMapping("/instance/{processInstanceId}")
public Response<WorkflowInstanceDTO> 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<HistoricActivityInstance> activities = historyService.createHistoricActivityInstanceQuery()
// .processInstanceId(processInstanceId)
// .orderByHistoricActivityInstanceStartTime()
// .asc()
// .list();
//
// List<WorkflowInstanceDTO.ActivityInstance> 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<String, Object> 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<WorkflowExecutionDTO> getWorkflowExecution(@PathVariable String processInstanceId) {
return ResponseEntity.ok(workflowDefinitionService.getWorkflowExecution(processInstanceId));
}
@Operation(summary = "查询工作流实例列表")
@GetMapping("/instances")
public Response<List<WorkflowInstanceDTO>> listWorkflowInstances(
@Parameter(description = "流程标识") @RequestParam(required = false) String processKey,
@Parameter(description = "业务标识") @RequestParam(required = false) String businessKey
) {
List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery()
.processDefinitionKey(processKey)
.processInstanceBusinessKey(businessKey)
.includeProcessVariables()
.orderByProcessInstanceStartTime()
.desc()
.list();
// List<WorkflowInstanceDTO> 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<Map<String, Object>> getNodeLogs(
@Parameter(description = "流程实例ID", required = true) @PathVariable String processInstanceId,
@Parameter(description = "节点ID", required = true) @PathVariable String nodeId
) {
Map<String, Object> 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<HistoricVariableInstance> 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 = "禁用工作流") @Operation(summary = "禁用工作流")
@PostMapping("/{id}/disable") @PostMapping("/{id}/disable")