package cn.iocoder.yudao.module.hrm.controller.admin.training; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.hrm.controller.admin.training.vo.HrmTrainingPageReqVO; import cn.iocoder.yudao.module.hrm.controller.admin.training.vo.HrmTrainingParticipantRespVO; import cn.iocoder.yudao.module.hrm.controller.admin.training.vo.HrmTrainingRespVO; import cn.iocoder.yudao.module.hrm.controller.admin.training.vo.HrmTrainingSaveReqVO; import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; import cn.iocoder.yudao.module.hrm.dal.dataobject.training.HrmTrainingDO; import cn.iocoder.yudao.module.hrm.dal.dataobject.training.HrmTrainingParticipantDO; import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; import cn.iocoder.yudao.module.hrm.service.training.HrmTrainingService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.module.hrm.dal.dataobject.training.HrmTrainingDO.*; @Tag(name = "管理后台 - HRM 培训活动") @RestController @RequestMapping("/hrm/training") @Validated public class HrmTrainingController { @Resource private HrmTrainingService trainingService; @Resource private HrmEmployeeService employeeService; @PostMapping("/create") @Operation(summary = "创建培训活动(初始为草稿状态)") @PreAuthorize("@ss.hasPermission('hrm:training:create')") public CommonResult createTraining(@Valid @RequestBody HrmTrainingSaveReqVO createReqVO) { return success(trainingService.createTraining(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新培训活动(仅草稿/待开展可改,状态走 start/complete/cancel 流转)") @PreAuthorize("@ss.hasPermission('hrm:training:update')") public CommonResult updateTraining(@Valid @RequestBody HrmTrainingSaveReqVO updateReqVO) { trainingService.updateTraining(updateReqVO); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除培训活动(级联删除参训人员;已完成/已取消不可删)") @Parameter(name = "ids", description = "编号数组", required = true) @PreAuthorize("@ss.hasPermission('hrm:training:delete')") public CommonResult deleteTraining(@RequestParam("ids") List ids) { trainingService.deleteTraining(ids); return success(true); } @GetMapping("/get") @Operation(summary = "获得培训活动详情(含参训人员列表)") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('hrm:training:query')") public CommonResult getTraining(@RequestParam("id") Long id) { HrmTrainingDO training = trainingService.getTraining(id); if (training == null) { return success(null); } HrmTrainingRespVO respVO = BeanUtils.toBean(training, HrmTrainingRespVO.class); fillDisplayNames(respVO); respVO.setParticipants(buildParticipantList(trainingService.getParticipantsByTrainingId(id))); return success(respVO); } @GetMapping("/page") @Operation(summary = "获得培训活动分页(含参训人数)") @PreAuthorize("@ss.hasPermission('hrm:training:query')") public CommonResult> getTrainingPage(@Valid HrmTrainingPageReqVO pageReqVO) { PageResult pageResult = trainingService.getTrainingPage(pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return success(PageResult.empty(pageResult.getTotal())); } Map participantCountMap = trainingService.getParticipantCountMap( convertSet(pageResult.getList(), HrmTrainingDO::getId)); return success(BeanUtils.toBean(pageResult, HrmTrainingRespVO.class, vo -> { fillDisplayNames(vo); vo.setParticipantCount(participantCountMap.getOrDefault(vo.getId(), 0)); })); } @PostMapping("/start") @Operation(summary = "开始培训(草稿 → 待开展)") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('hrm:training:update')") public CommonResult startTraining(@RequestParam("id") Long id) { trainingService.startTraining(id); return success(true); } @PostMapping("/complete") @Operation(summary = "完成培训(草稿/待开展 → 已完成;开启自动发证时对合格人员联动发放证书)") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('hrm:training:update')") public CommonResult completeTraining(@RequestParam("id") Long id) { trainingService.completeTraining(id); return success(true); } @PostMapping("/cancel") @Operation(summary = "取消培训(草稿/待开展 → 已取消)") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('hrm:training:update')") public CommonResult cancelTraining(@RequestParam("id") Long id) { trainingService.cancelTraining(id); return success(true); } // ========== 私有方法 ========== private void fillDisplayNames(HrmTrainingRespVO respVO) { respVO.setTrainingTypeName(convertTrainingTypeName(respVO.getTrainingType())); respVO.setStatusName(convertStatusName(respVO.getStatus())); } private List buildParticipantList(List participants) { if (CollUtil.isEmpty(participants)) { return new ArrayList<>(); } Map employeeMap = employeeService.getEmployeeList( convertSet(participants, HrmTrainingParticipantDO::getEmployeeId)).stream() .collect(java.util.stream.Collectors.toMap(HrmEmployeeDO::getId, e -> e, (a, b) -> a)); List voList = BeanUtils.toBean(participants, HrmTrainingParticipantRespVO.class); for (HrmTrainingParticipantRespVO vo : voList) { HrmEmployeeDO employee = employeeMap.get(vo.getEmployeeId()); if (employee != null) { vo.setEmployeeName(employee.getName()); vo.setEmployeeNo(employee.getEmployeeNo()); } } return voList; } private String convertTrainingTypeName(Integer trainingType) { return switch (trainingType == null ? 0 : trainingType) { case TYPE_SAFETY -> "安全培训"; case TYPE_SKILL -> "技能培训"; case TYPE_MANAGE -> "管理培训"; case TYPE_OTHER -> "其他"; default -> ""; }; } private String convertStatusName(Integer status) { return switch (status == null ? -1 : status) { case STATUS_DRAFT -> "草稿"; case STATUS_PLANNED -> "待开展"; case STATUS_COMPLETED -> "已完成"; case STATUS_CANCELED -> "已取消"; default -> ""; }; } }