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));
safeTrainingDto.setSafeTrainingFileList(safeTrainingFiles);
//培训记录详情
List safeTrainingDetailsDto = safeTrainingDetailsMapper.getSafeTraining(id);
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("导出失败");
}
}
}