package cn.iocoder.yudao.module.mes.controller.admin.safety; 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.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.ticket.MesSafetyWorkTicketApproveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.ticket.MesSafetyWorkTicketCloseReqVO; import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.ticket.MesSafetyWorkTicketPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.ticket.MesSafetyWorkTicketRespVO; import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.ticket.MesSafetyWorkTicketSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkshopDO; import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyRiskUnitDO; import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyWorkTicketDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkshopMapper; import cn.iocoder.yudao.module.mes.service.safety.MesSafetyRiskUnitService; import cn.iocoder.yudao.module.mes.service.safety.MesSafetyWorkTicketService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 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.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; /** * 安全生产 - 特种作业票证 Controller * * @author 超级管理员 */ @Tag(name = "管理后台 - 安全生产-特种作业票证") @RestController @RequestMapping("/mes/safety/work-ticket") @Validated public class MesSafetyWorkTicketController { @Resource private MesSafetyWorkTicketService ticketService; @Resource private MesSafetyRiskUnitService riskUnitService; @Resource private MesMdWorkshopMapper workshopMapper; @Resource private AdminUserApi adminUserApi; @PostMapping("/create") @Operation(summary = "申请作业票") @PreAuthorize("@ss.hasPermission('mes:safety-ticket:create')") public CommonResult createTicket(@Valid @RequestBody MesSafetyWorkTicketSaveReqVO createReqVO) { return success(ticketService.createTicket(createReqVO)); } @PutMapping("/update") @Operation(summary = "修改作业票") @PreAuthorize("@ss.hasPermission('mes:safety-ticket:update')") public CommonResult updateTicket(@Valid @RequestBody MesSafetyWorkTicketSaveReqVO updateReqVO) { ticketService.updateTicket(updateReqVO); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除作业票") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:safety-ticket:delete')") public CommonResult deleteTicket(@RequestParam("id") Long id) { ticketService.deleteTicket(id); return success(true); } @PutMapping("/approve") @Operation(summary = "审批作业票") @PreAuthorize("@ss.hasPermission('mes:safety-ticket:approve')") public CommonResult approveTicket(@Valid @RequestBody MesSafetyWorkTicketApproveReqVO reqVO) { ticketService.approveTicket(SecurityFrameworkUtils.getLoginUserId(), reqVO); return success(true); } @PutMapping("/close") @Operation(summary = "完工登记 / 归档") @PreAuthorize("@ss.hasPermission('mes:safety-ticket:close')") public CommonResult closeTicket(@Valid @RequestBody MesSafetyWorkTicketCloseReqVO reqVO) { ticketService.closeTicket(SecurityFrameworkUtils.getLoginUserId(), reqVO); return success(true); } @GetMapping("/get") @Operation(summary = "获得作业票") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('mes:safety-ticket:query')") public CommonResult getTicket(@RequestParam("id") Long id) { MesSafetyWorkTicketDO ticket = ticketService.getTicket(id); if (ticket == null) { return success(null); } List list = buildRespList(Collections.singletonList(ticket)); return success(list.isEmpty() ? null : list.get(0)); } @GetMapping("/page") @Operation(summary = "获得作业票分页") @PreAuthorize("@ss.hasPermission('mes:safety-ticket:query')") public CommonResult> getTicketPage(@Valid MesSafetyWorkTicketPageReqVO pageReqVO) { PageResult pageResult = ticketService.getTicketPage(pageReqVO); List list = buildRespList(pageResult.getList()); return success(new PageResult<>(list, pageResult.getTotal())); } /** * 转换为 VO 并填充车间、人员、风险单元名称、超期标记 */ private List buildRespList(List list) { if (list == null || list.isEmpty()) { return Collections.emptyList(); } List respList = BeanUtils.toBean(list, MesSafetyWorkTicketRespVO.class); // 车间名称 Set workshopIds = list.stream().map(MesSafetyWorkTicketDO::getWorkshopId) .filter(Objects::nonNull).collect(Collectors.toSet()); Map workshopNameMap = new HashMap<>(); if (!workshopIds.isEmpty()) { List workshops = workshopMapper.selectByIds(workshopIds); workshops.forEach(w -> workshopNameMap.put(w.getId(), w.getName())); } // 人员姓名 Set userIds = new HashSet<>(); list.forEach(t -> { if (t.getApplicantUserId() != null) userIds.add(t.getApplicantUserId()); if (t.getGuardianUserId() != null) userIds.add(t.getGuardianUserId()); if (t.getApproverUserId() != null) userIds.add(t.getApproverUserId()); }); Map userMap = userIds.isEmpty() ? Collections.emptyMap() : adminUserApi.getUserMap(userIds); // 风险单元名称 Set unitIds = list.stream().map(MesSafetyWorkTicketDO::getUnitId) .filter(Objects::nonNull).collect(Collectors.toSet()); Map unitMap = riskUnitService.getRiskUnitMap(unitIds); LocalDateTime now = LocalDateTime.now(); for (MesSafetyWorkTicketRespVO vo : respList) { vo.setWorkshopName(workshopNameMap.get(vo.getWorkshopId())); vo.setApplicantUserName(nickname(userMap, vo.getApplicantUserId())); vo.setGuardianUserName(nickname(userMap, vo.getGuardianUserId())); vo.setApproverUserName(nickname(userMap, vo.getApproverUserId())); MesSafetyRiskUnitDO unit = unitMap.get(vo.getUnitId()); if (unit != null) { vo.setUnitName(unit.getName()); } // 超期:已批准但计划结束时间已过 vo.setOverdue(MesSafetyWorkTicketDO.STATUS_APPROVED.equals(vo.getStatus()) && vo.getPlanEndTime() != null && vo.getPlanEndTime().isBefore(now)); } return respList; } private String nickname(Map userMap, Long userId) { if (userId == null) { return null; } AdminUserRespDTO user = userMap.get(userId); return user != null ? user.getNickname() : null; } }