package com.ruoyi.safe.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.ruoyi.common.utils.HackLoopTableRenderPolicy; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.project.system.domain.SysNotice; import com.ruoyi.safe.dto.SafeTrainingDetailsDto; import com.ruoyi.safe.dto.SafeTrainingDto; import com.ruoyi.safe.mapper.SafeTrainingDetailsMapper; import com.ruoyi.safe.mapper.SafeTrainingFileMapper; import com.ruoyi.safe.pojo.SafeTraining; import com.ruoyi.safe.mapper.SafeTrainingMapper; import com.ruoyi.safe.pojo.SafeTrainingDetails; import com.ruoyi.safe.pojo.SafeTrainingFile; import com.ruoyi.safe.service.SafeTrainingService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.List; /** *

* 安全生产--安全培训考核 服务实现类 *

* * @author 芯导软件(江苏)有限公司 * @since 2026-01-29 10:54:06 */ @Service public class SafeTrainingServiceImpl extends ServiceImpl implements SafeTrainingService { @Autowired private SafeTrainingMapper safeTrainingMapper; @Autowired private SafeTrainingFileMapper safeTrainingFileMapper; @Autowired private SafeTrainingDetailsMapper safeTrainingDetailsMapper; @Override public IPage pageSafeTraining(Page page, SafeTrainingDto safeTrainingDto) { return safeTrainingMapper.pageSafeTraining(page, safeTrainingDto); } @Override public int addOrUpdate(SafeTraining safeTraining) { if (ObjectUtils.isNull(safeTraining.getId())) { String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd")); // 查询今日已存在的最大课程编号 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("course_code", datePrefix) .orderByDesc("course_code") .last("LIMIT 1"); SafeTraining lastSafeTraining = safeTrainingMapper.selectOne(queryWrapper); int sequenceNumber = 1; // 默认序号 if (lastSafeTraining != null && lastSafeTraining.getCourseCode() != null) { String lastNo = lastSafeTraining.getCourseCode().toString(); if (lastNo.startsWith(datePrefix)) { String seqStr = lastNo.substring(datePrefix.length()); try { sequenceNumber = Integer.parseInt(seqStr) + 1; } catch (NumberFormatException e) { sequenceNumber = 1; } } } // 生成完整的课程编号 String no = "KC-" + String.format("%s%03d", datePrefix, sequenceNumber); safeTraining.setCourseCode(no); } //根据时间判断培训状态 String trainingDate = safeTraining.getTrainingDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); LocalDateTime openingTime = LocalDateTime.parse((trainingDate + safeTraining.getOpeningTime()), DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss")); LocalDateTime endTime = LocalDateTime.parse((trainingDate + safeTraining.getEndTime()), DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss")); if (LocalDateTime.now().isBefore(openingTime)) { //未开始 safeTraining.setState(0); } else if (LocalDateTime.now().isAfter(endTime)) { //已结束 safeTraining.setState(2); } else { //进行中 safeTraining.setState(1); } //新增或更新 saveOrUpdate(safeTraining); return 0; } @Override public SafeTrainingDto getSafeTraining(Long id) { //主表数据 SafeTrainingDto safeTrainingDto = safeTrainingMapper.getSafeTraining(id); //附件 List safeTrainingFiles = safeTrainingFileMapper.selectList(Wrappers.lambdaQuery().eq(SafeTrainingFile::getSafeTrainingId, id)); if (safeTrainingFiles.size()>0){ safeTrainingDto.setSafeTrainingFileList(safeTrainingFiles); } //培训记录详情 List safeTrainingDetailsDto = safeTrainingDetailsMapper.getSafeTraining(id); if (safeTrainingDetailsDto.size()>0) { safeTrainingDto.setSafeTrainingDetailsDtoList(safeTrainingDetailsDto); } return safeTrainingDto; } @Override public int saveSafeTraining(SafeTrainingDto safeTrainingDto) { //更新主表 safeTrainingMapper.updateById(safeTrainingDto); //更新培训记录详情 safeTrainingDto.getSafeTrainingDetailsDtoList().forEach(safeTrainingDetailsDto -> { safeTrainingDetailsMapper.updateById(safeTrainingDetailsDto); }); return 0; } @Override public int delSafeTraining(List ids) { //删除主表 safeTrainingMapper.deleteBatchIds(ids); //删除附件 safeTrainingFileMapper.delete(Wrappers.lambdaQuery().in(SafeTrainingFile::getSafeTrainingId, ids)); //删除培训记录 safeTrainingDetailsMapper.delete(Wrappers.lambdaQuery().in(SafeTrainingDetails::getSafeTrainingId, ids)); return 0; } @Override public void export(HttpServletResponse response, Long id) { SafeTrainingDto safeTrainingDto = safeTrainingMapper.getSafeTraining(id); List safeTrainingDetailsDtoList = safeTrainingDetailsMapper.getSafeTraining(id); InputStream inputStream = this.getClass().getResourceAsStream("/static/safe-training.docx"); Configure configure = Configure.builder() .bind("safeTrainingDetailsDtoList", new HackLoopTableRenderPolicy()) .build(); XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( new HashMap() {{ put("safeTrainingDto", safeTrainingDto); put("safeTrainingDetailsDtoList", safeTrainingDetailsDtoList); }}); try { response.setContentType("application/msword"); String fileName = URLEncoder.encode( safeTrainingDto.getCourseCode() + "培训与考核计划", "UTF-8"); response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx"); OutputStream os = response.getOutputStream(); template.write(os); os.flush(); os.close(); inputStream.close(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("导出失败"); } } }