| | |
| | | package cn.iocoder.yudao.module.mes.service.safety; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | |
| | | @Resource |
| | | private SafetyWorkPermitMapper permitMapper; |
| | | @Resource |
| | | private SafetyRefResolver refResolver; |
| | | @Resource |
| | | private SafetyWorkPermitMonitorMapper monitorMapper; |
| | | |
| | | /** |
| | |
| | | SafetyWorkPermitDO permit = BeanUtils.toBean(reqVO, SafetyWorkPermitDO.class); |
| | | permit.setCode(permitMapper.selectNextCode("WP" + LocalDate.now().format(CODE_DATE))); |
| | | permit.setTitle(StrUtil.trim(reqVO.getTitle())); |
| | | permit.setApplicant(StrUtil.trim(reqVO.getApplicant())); |
| | | applyPermitRefs(permit, reqVO); |
| | | permit.setApplyTime(reqVO.getApplyTime() == null ? LocalDateTime.now() : reqVO.getApplyTime()); |
| | | permit.setRiskLevel(StrUtil.blankToDefault(reqVO.getRiskLevel(), SafetyRiskLevelEnum.NORMAL.getLevel())); |
| | | permit.setStatus(SafetyPermitStatusEnum.PENDING.getStatus()); |
| | |
| | | SafetyWorkPermitDO update = BeanUtils.toBean(reqVO, SafetyWorkPermitDO.class); |
| | | update.setCode(null); |
| | | update.setStatus(null); |
| | | applyPermitRefs(update, reqVO); |
| | | permitMapper.updateById(update); |
| | | } |
| | | |
| | | /** |
| | | * 作业票的主数据引用:作业车间 + 申请人 + 监护人,从主数据带出名称落快照 |
| | | */ |
| | | private void applyPermitRefs(SafetyWorkPermitDO permit, SafetyWorkPermitSaveReqVO reqVO) { |
| | | permit.setWorkshopId(reqVO.getWorkshopId()); |
| | | permit.setWorkshopName(reqVO.getWorkshopId() == null ? "" |
| | | : refResolver.requireWorkshop(reqVO.getWorkshopId()).getName()); |
| | | var applicant = refResolver.requireEmployee(reqVO.getApplicantId(), SAFETY_EMPLOYEE_REQUIRED); |
| | | permit.setApplicantId(applicant.getId()); |
| | | permit.setApplicant(applicant.getName()); |
| | | permit.setGuardianId(reqVO.getGuardianId()); |
| | | permit.setGuardian(reqVO.getGuardianId() == null ? "" |
| | | : refResolver.requireEmployee(reqVO.getGuardianId(), SAFETY_EMPLOYEE_REQUIRED).getName()); |
| | | } |
| | | |
| | | /** |
| | |
| | | public void approvePermit(SafetyWorkPermitApproveReqVO reqVO) { |
| | | SafetyWorkPermitDO permit = validatePermitExists(reqVO.getId()); |
| | | ensureStatus(permit, SafetyPermitStatusEnum.PENDING); |
| | | String approver = StrUtil.trim(reqVO.getApprover()); |
| | | // 申请人不能审批自己的作业票 |
| | | if (approver.equals(permit.getApplicant())) { |
| | | throw exception(SAFETY_PERMIT_STATUS_ERROR); |
| | | var approver = refResolver.requireEmployee(reqVO.getApproverId(), SAFETY_EMPLOYEE_REQUIRED); |
| | | // 申请人不能审批自己的作业票(按员工编号比较,避免同名误判) |
| | | if (permit.getApplicantId() != null && permit.getApplicantId().equals(approver.getId())) { |
| | | throw exception(SAFETY_PERMIT_SELF_APPROVE); |
| | | } |
| | | boolean approved = "APPROVED".equals(reqVO.getDecision()); |
| | | if (approved && SafetyPermitTypeEnum.requiresGuardian(permit.getPermitType()) |
| | | && StrUtil.isBlank(permit.getGuardian())) { |
| | | && permit.getGuardianId() == null) { |
| | | throw exception(SAFETY_PERMIT_GUARDIAN_REQUIRED); |
| | | } |
| | | SafetyWorkPermitDO update = new SafetyWorkPermitDO(); |
| | | update.setId(permit.getId()); |
| | | update.setApprover(approver); |
| | | update.setApproverId(approver.getId()); |
| | | update.setApprover(approver.getName()); |
| | | update.setApproveTime(LocalDateTime.now()); |
| | | update.setApproveComment(reqVO.getApproveComment()); |
| | | update.setStatus(approved ? SafetyPermitStatusEnum.APPROVED.getStatus() |
| | |
| | | } |
| | | SafetyWorkPermitMonitorDO monitor = BeanUtils.toBean(reqVO, SafetyWorkPermitMonitorDO.class); |
| | | monitor.setId(null); |
| | | monitor.setGuardian(StrUtil.trim(reqVO.getGuardian())); |
| | | var guardian = refResolver.requireEmployee(reqVO.getGuardianId(), SAFETY_EMPLOYEE_REQUIRED); |
| | | monitor.setGuardianId(guardian.getId()); |
| | | monitor.setGuardian(guardian.getName()); |
| | | monitor.setMonitorTime(reqVO.getMonitorTime() == null ? LocalDateTime.now() : reqVO.getMonitorTime()); |
| | | monitorMapper.insert(monitor); |
| | | return monitor.getId(); |
| | |
| | | |
| | | // ==================== 展示字段 ==================== |
| | | |
| | | /** |
| | | * 批量回填作业票的车间名与三个人员姓名(申请人/审批人/监护人) |
| | | */ |
| | | public void fillPermitRefs(List<SafetyWorkPermitDO> permits) { |
| | | if (CollUtil.isEmpty(permits)) { |
| | | return; |
| | | } |
| | | var workshopMap = refResolver.workshopMap(permits.stream().map(SafetyWorkPermitDO::getWorkshopId).toList()); |
| | | var ids = new java.util.ArrayList<Long>(permits.size() * 3); |
| | | permits.forEach(p -> { ids.add(p.getApplicantId()); ids.add(p.getApproverId()); ids.add(p.getGuardianId()); }); |
| | | var employeeMap = refResolver.employeeMap(ids); |
| | | permits.forEach(permit -> { |
| | | var workshop = workshopMap.get(permit.getWorkshopId()); |
| | | if (workshop != null) permit.setWorkshopName(workshop.getName()); |
| | | var applicant = employeeMap.get(permit.getApplicantId()); |
| | | if (applicant != null) permit.setApplicant(applicant.getName()); |
| | | var approver = employeeMap.get(permit.getApproverId()); |
| | | if (approver != null) permit.setApprover(approver.getName()); |
| | | var guardian = employeeMap.get(permit.getGuardianId()); |
| | | if (guardian != null) permit.setGuardian(guardian.getName()); |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 批量回填监护记录的监护人最新姓名 |
| | | */ |
| | | public void fillMonitorGuardians(List<SafetyWorkPermitMonitorDO> monitors) { |
| | | if (CollUtil.isEmpty(monitors)) { |
| | | return; |
| | | } |
| | | var employeeMap = refResolver.employeeMap( |
| | | monitors.stream().map(SafetyWorkPermitMonitorDO::getGuardianId).toList()); |
| | | monitors.forEach(monitor -> { |
| | | var employee = employeeMap.get(monitor.getGuardianId()); |
| | | if (employee != null) monitor.setGuardian(employee.getName()); |
| | | }); |
| | | } |
| | | |
| | | public static void fillPermitDisplay(SafetyWorkPermitDO permit, SafetyWorkPermitRespVO respVO) { |
| | | respVO.setPermitTypeName(SafetyPermitTypeEnum.getNameByType(permit.getPermitType())); |
| | | respVO.setRiskLevelName(SafetyRiskLevelEnum.getNameByLevel(permit.getRiskLevel())); |