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;
|
|
/**
|
* <p>
|
* 安全生产--安全培训考核 服务实现类
|
* </p>
|
*
|
* @author 芯导软件(江苏)有限公司
|
* @since 2026-01-29 10:54:06
|
*/
|
@Service
|
public class SafeTrainingServiceImpl extends ServiceImpl<SafeTrainingMapper, SafeTraining> implements SafeTrainingService {
|
|
@Autowired
|
private SafeTrainingMapper safeTrainingMapper;
|
|
@Autowired
|
private SafeTrainingFileMapper safeTrainingFileMapper;
|
|
@Autowired
|
private SafeTrainingDetailsMapper safeTrainingDetailsMapper;
|
|
@Override
|
public IPage<SafeTrainingDto> 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<SafeTraining> 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<SafeTrainingFile> safeTrainingFiles = safeTrainingFileMapper.selectList(Wrappers.<SafeTrainingFile>lambdaQuery().eq(SafeTrainingFile::getSafeTrainingId, id));
|
if (safeTrainingFiles.size()>0){
|
safeTrainingDto.setSafeTrainingFileList(safeTrainingFiles);
|
}
|
//培训记录详情
|
List<SafeTrainingDetailsDto> 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<Integer> ids) {
|
//删除主表
|
safeTrainingMapper.deleteBatchIds(ids);
|
//删除附件
|
safeTrainingFileMapper.delete(Wrappers.<SafeTrainingFile>lambdaQuery().in(SafeTrainingFile::getSafeTrainingId, ids));
|
//删除培训记录
|
safeTrainingDetailsMapper.delete(Wrappers.<SafeTrainingDetails>lambdaQuery().in(SafeTrainingDetails::getSafeTrainingId, ids));
|
return 0;
|
}
|
|
@Override
|
public void export(HttpServletResponse response, Long id) {
|
SafeTrainingDto safeTrainingDto = safeTrainingMapper.getSafeTraining(id);
|
List<SafeTrainingDetailsDto> 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<String, Object>() {{
|
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("导出失败");
|
}
|
|
}
|
}
|