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<Long> 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<Boolean> 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<Boolean> deleteTraining(@RequestParam("ids") List<Long> 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<HrmTrainingRespVO> 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<PageResult<HrmTrainingRespVO>> getTrainingPage(@Valid HrmTrainingPageReqVO pageReqVO) {
|
PageResult<HrmTrainingDO> pageResult = trainingService.getTrainingPage(pageReqVO);
|
if (CollUtil.isEmpty(pageResult.getList())) {
|
return success(PageResult.empty(pageResult.getTotal()));
|
}
|
Map<Long, Integer> 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<Boolean> 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<Boolean> 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<Boolean> 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<HrmTrainingParticipantRespVO> buildParticipantList(List<HrmTrainingParticipantDO> participants) {
|
if (CollUtil.isEmpty(participants)) {
|
return new ArrayList<>();
|
}
|
Map<Long, HrmEmployeeDO> employeeMap = employeeService.getEmployeeList(
|
convertSet(participants, HrmTrainingParticipantDO::getEmployeeId)).stream()
|
.collect(java.util.stream.Collectors.toMap(HrmEmployeeDO::getId, e -> e, (a, b) -> a));
|
List<HrmTrainingParticipantRespVO> 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 -> "";
|
};
|
}
|
|
}
|