package com.yuanchu.mom.service.impl; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.Pictures; import com.yuanchu.mom.common.GetLook; import com.yuanchu.mom.dto.*; import com.yuanchu.mom.excel.PersonSupervisePlanDetailsUpload; import com.yuanchu.mom.excel.PersonTrainingDetailedListener; import com.yuanchu.mom.excel.PersonTrainingDetailedUpload; import com.yuanchu.mom.exception.ErrorException; import com.yuanchu.mom.mapper.PersonTrainingDetailedMapper; import com.yuanchu.mom.mapper.PersonTrainingMapper; import com.yuanchu.mom.mapper.UserMapper; import com.yuanchu.mom.mapper.PersonTrainingRecordMapper; import com.yuanchu.mom.mapper.UserMapper; import com.yuanchu.mom.pojo.PersonTraining; import com.yuanchu.mom.pojo.User; import com.yuanchu.mom.pojo.PersonTrainingDetailed; import com.yuanchu.mom.service.PersonTrainingDetailedService; import com.yuanchu.mom.service.PersonTrainingService; import com.yuanchu.mom.utils.HackLoopTableRenderPolicy; import com.yuanchu.mom.utils.XWPFDocumentUtils; import com.yuanchu.mom.utils.DateImageUtil; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.Optional; /** *

* 培训计划 服务实现类 *

* * @author * @since 2024-10-11 01:11:49 */ @Service @Transactional(rollbackFor = Exception.class) public class PersonTrainingServiceImpl extends ServiceImpl implements PersonTrainingService { @Autowired private GetLook getLook; @Autowired private PersonTrainingDetailedService personTrainingDetailedService; @Autowired private UserMapper userMapper; @Autowired private PersonTrainingDetailedMapper personTrainingDetailedMapper; @Autowired private PersonTrainingRecordMapper personTrainingRecordMapper; @Value("${file.path}") private String imgUrl; @Override public IPage personTrainingSelect(Page page, String compilerName, String departmentId) { Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); User user = Optional.ofNullable(userMapper.selectById(userId)).orElse(new User()); if(3==user.getRoleId()){ departmentId=null; } return baseMapper.personTrainingSelect(page, compilerName, departmentId); } @Override public void personTrainingImport(MultipartFile file) { Map map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter"); // 年度计划父级新增数据 PersonTraining personSupervisePlan = new PersonTraining(); String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf(".")); personSupervisePlan.setFileName(fileName); personSupervisePlan.setCompilerId(map1.get("userId")); personSupervisePlan.setCompilationDate(LocalDateTime.now()); baseMapper.insert(personSupervisePlan); // 年度计划详情 新增 try { PersonTrainingDetailedListener personSupervisePlanDetailsListener = new PersonTrainingDetailedListener(personTrainingDetailedService); personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId()); EasyExcel.read(file.getInputStream(), PersonTrainingDetailedUpload.class, personSupervisePlanDetailsListener).sheet().doRead(); } catch (IOException e) { e.printStackTrace(); } } @Override public void personTrainingDelete(Integer id) { personTrainingDetailedService.removeById(id); baseMapper.deleteById(id); } @Override public void reviewAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto) { Map map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter"); PersonTraining personTraining = new PersonTraining(); personTraining.setId(personTrainingUpdateDto.getId()); personTraining.setReviewerId(map1.get("userId")); personTraining.setAuditDate(LocalDateTime.now()); personTraining.setAuditRemarks(personTrainingUpdateDto.getRemarks()); personTraining.setReviewerStatus(personTrainingUpdateDto.getStatus()); baseMapper.updateById(personTraining); } @Override public void approveAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto) { Map map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter"); LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate() .eq(PersonTraining::getId, personTrainingUpdateDto.getId()) .set(PersonTraining::getApproverId, map1.get("userId")) .set(PersonTraining::getApprovalDate, LocalDateTime.now()) .set(PersonTraining::getApprovalRemarks, personTrainingUpdateDto.getRemarks()) .set(PersonTraining::getApprovalStatus, personTrainingUpdateDto.getStatus()); if (personTrainingUpdateDto.getStatus().equals(2)) { wrapper.set(PersonTraining::getReviewerStatus, null); } baseMapper.update(new PersonTraining(), wrapper); } /** * 导出人员培训计划 * @param id * @param response */ @Override public void exportPersonTraining(Integer id, HttpServletResponse response) { // 查询详情 PersonTraining personTraining = baseMapper.selectById(id); //获取提交人的签名地址 String writeUrl = userMapper.selectById(personTraining.getCompilerId()).getSignatureUrl(); if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) { throw new ErrorException("找不到检验人的签名"); } //获取复核人的签名地址 String examineUrl = null; if (personTraining.getReviewerId() != null) { examineUrl = userMapper.selectById(personTraining.getReviewerId()).getSignatureUrl(); if (StringUtils.isBlank(examineUrl)) { throw new ErrorException("找不到复核人的签名"); } } //获取批准人的签名地址 String ratifyUrl = null; if (personTraining.getApproverId() != null) { ratifyUrl = userMapper.selectById(personTraining.getApproverId()).getSignatureUrl(); if (StringUtils.isBlank(ratifyUrl)) { throw new ErrorException("找不到复核人的签名"); } } // 查询详情 List detailedDtos = personTrainingDetailedMapper.selectTrainingList(id); int index = 1; for (PersonTrainingDetailedDto detailedDto : detailedDtos) { if (detailedDto.getTrainingDate() != null) { SimpleDateFormat sdfWithoutTime = new SimpleDateFormat("yyyy-MM-dd"); detailedDto.setTrainingDateString(sdfWithoutTime.format(detailedDto.getTrainingDate())); } detailedDto.setIndex(index); index++; } // 获取路径 InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training.docx"); String finalExamineUrl = examineUrl; String finalRatifyUrl = ratifyUrl; Configure configure = Configure.builder() .bind("trainingDetailedList", new HackLoopTableRenderPolicy()) .build(); XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( new HashMap() {{ put("year", personTraining.getCreateTime().getYear()); put("trainingDetailedList", detailedDtos); put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null); put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null); put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null); put("writeDateUrl", personTraining.getCompilationDate() != null ? Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getCompilationDate())).create() : null); put("examineDateUrl", personTraining.getAuditDate() != null ? Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getAuditDate())).create() : null); put("ratifyDateUrl", personTraining.getApprovalDate() != null ? Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getApprovalDate())).create() : null); }}); try { response.setContentType("application/msword"); String fileName = URLEncoder.encode( "人员培训计划导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx"); OutputStream os = response.getOutputStream(); template.write(os); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("导出失败"); } } /** * 导出人员培训与考核记录 * @param id * @param response */ @Override public void exportPersonTrainingRecord(Integer id, HttpServletResponse response) { // 查询人员培训明细 PersonTrainingDetailedDto detailedDto = personTrainingDetailedMapper.selectTrainingDetail(id); // 查询培训的人员 List recordDtos = personTrainingRecordMapper.selectListByTrainingDetailedId(id); List exportDtoList = new ArrayList<>(); TrainingRecordExportDto exportDto = new TrainingRecordExportDto(); int count = 0; for (PersonTrainingRecordDto recordDto : recordDtos) { switch (count) { case 0: exportDto.setUserName1(recordDto.getUserName()); exportDto.setDepartment1(recordDto.getDepartment()); exportDto.setExaminationResults1(recordDto.getExaminationResults()); count ++; break; case 1: exportDto.setUserName2(recordDto.getUserName()); exportDto.setDepartment2(recordDto.getDepartment()); exportDto.setExaminationResults2(recordDto.getExaminationResults()); exportDtoList.add(exportDto); exportDto = new TrainingRecordExportDto(); count = 0; break; } } exportDtoList.add(exportDto); // 质量负责人 String assessmentUserUrl = null; if (detailedDto.getAssessmentUserId() != null) { assessmentUserUrl = userMapper.selectById(detailedDto.getAssessmentUserId()).getSignatureUrl(); if (StringUtils.isBlank(assessmentUserUrl)) { throw new ErrorException("找不到评价人的签名"); } } // 获取路径 InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training-record.docx"); Configure configure = Configure.builder() .bind("trainingRecordsList", new HackLoopTableRenderPolicy()) .build(); String finalAssessmentUserUrl = assessmentUserUrl; XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( new HashMap() {{ put("trainingDetail", detailedDto); put("trainingRecordsList", exportDtoList); put("assessmentUserUrl", StringUtils.isNotBlank(finalAssessmentUserUrl) ? Pictures.ofLocal(imgUrl + "/" + finalAssessmentUserUrl).create() : null); }}); try { response.setContentType("application/msword"); String fileName = URLEncoder.encode( "培训与考核记录导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx"); OutputStream os = response.getOutputStream(); template.write(os); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("导出失败"); } } }