package com.yuanchu.mom.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 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.yuanchu.mom.common.GetLook; import com.yuanchu.mom.dto.DeviceCalibrationPlanDetailDto; import com.yuanchu.mom.dto.DeviceCalibrationPlanDto; import com.yuanchu.mom.excel.upload.DeviceCalibrationPlanDetailUpload; import com.yuanchu.mom.mapper.DeviceCalibrationPlanDetailMapper; import com.yuanchu.mom.mapper.DeviceCalibrationPlanMapper; import com.yuanchu.mom.mapper.UserMapper; import com.yuanchu.mom.pojo.DeviceCalibrationPlan; import com.yuanchu.mom.pojo.DeviceCalibrationPlanDetail; import com.yuanchu.mom.service.DeviceCalibrationPlanDetailService; import com.yuanchu.mom.service.DeviceCalibrationPlanService; import com.yuanchu.mom.utils.HackLoopTableRenderPolicy; import com.yuanchu.mom.utils.UserUtils; import com.yuanchu.mom.utils.QueryWrappers; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** *

* 设备校准计划主表 服务实现类 *

* * @author 江苏鵷雏网络科技有限公司 * @since 2024-12-16 03:58:17 */ @Service @Transactional(rollbackFor = Exception.class) public class DeviceCalibrationPlanServiceImpl extends ServiceImpl implements DeviceCalibrationPlanService { @Resource private DeviceCalibrationPlanDetailMapper deviceCalibrationPlanDetailMapper; @Resource private DeviceCalibrationPlanDetailService deviceCalibrationPlanDetailService; @Resource private UserMapper userMapper; @Resource private GetLook getLook; /** * 新增设备校准计划 * @param calibrationPlanDto * @return */ @Override public boolean addDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto) { // 当前登录用户 Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); // 编制日期 calibrationPlanDto.setWriteUserId(userId); calibrationPlanDto.setWriteTime(LocalDateTime.now()); baseMapper.insert(calibrationPlanDto); // 添加详情 if (CollectionUtils.isNotEmpty(calibrationPlanDto.getCalibrationPlanDetailList())) { for (DeviceCalibrationPlanDetail calibrationPlanDetail : calibrationPlanDto.getCalibrationPlanDetailList()) { calibrationPlanDetail.setPlanId(calibrationPlanDto.getPlanId()); } deviceCalibrationPlanDetailService.saveBatch(calibrationPlanDto.getCalibrationPlanDetailList()); } return true; } /** * 导入设备校准计划 * @param file * @return */ @Override public boolean importDeviceCalibrationPlan(MultipartFile file, String planYear) { // 当前登录用户 Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); // 文件名称 String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf(".")); DeviceCalibrationPlan calibrationPlan = new DeviceCalibrationPlan(); calibrationPlan.setPlanName(fileName); calibrationPlan.setPlanYear(planYear); calibrationPlan.setWriteUserId(userId); calibrationPlan.setWriteTime(LocalDateTime.now()); baseMapper.insert(calibrationPlan); List detailsUploadList = new ArrayList<>(); // 导入附件内容 try { // excel解析 EasyExcel.read(file.getInputStream(), DeviceCalibrationPlanDetailUpload.class, new AnalysisEventListener() { @Override public void invoke(DeviceCalibrationPlanDetailUpload detailsUpload, AnalysisContext analysisContext) { // 判断是否为空 if (StringUtils.isNotBlank(detailsUpload.getDeviceName()) && StringUtils.isNotBlank(detailsUpload.getDeviceNumber())) { // 对象复制 DeviceCalibrationPlanDetail calibrationPlanDetail = new DeviceCalibrationPlanDetail(); BeanUtils.copyProperties(detailsUpload, calibrationPlanDetail); // 格式话最近检定时间和本年计划校准时间 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); calibrationPlanDetail.setLastDate(LocalDate.parse(detailsUpload.getLastDate(), formatter)); calibrationPlanDetail.setPlanDate(LocalDate.parse(detailsUpload.getLastDate(), formatter)); calibrationPlanDetail.setPlanId(calibrationPlan.getPlanId()); detailsUploadList.add(calibrationPlanDetail); } } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }).sheet().doRead(); deviceCalibrationPlanDetailService.saveBatch(detailsUploadList); } catch (IOException e) { throw new RuntimeException(e); } return true; } /** * 设备校准计划批准 * @param deviceCalibrationPlan * @return */ @Override public boolean ratifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan) { // 当前登录用户 Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); baseMapper.update(null, Wrappers.lambdaUpdate() .eq(DeviceCalibrationPlan::getPlanId, deviceCalibrationPlan.getPlanId()) .set(DeviceCalibrationPlan::getRatifyUserId, userId) .set(DeviceCalibrationPlan::getRatifyRemark, deviceCalibrationPlan.getRatifyRemark()) .set(DeviceCalibrationPlan::getRatifyStatus, deviceCalibrationPlan.getRatifyStatus()) .set(DeviceCalibrationPlan::getRatifyTime, LocalDateTime.now()) ); return true; } /** * 设备校准计划列表 * @param page * @param deviceCalibrationPlan * @return */ @Override public IPage pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan deviceCalibrationPlan) { return baseMapper.pageDeviceCalibrationPlan(page, QueryWrappers.queryWrappers(deviceCalibrationPlan)); } /** * 设备校准计划详情列表 * @param page * @param deviceCalibrationPlanDetails * @return */ @Override public IPage pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails) { if (deviceCalibrationPlanDetails.getPlanId() == null) { return new Page(); } return deviceCalibrationPlanDetailMapper.pageDeviceCalibrationPlanDetail(page, QueryWrappers.queryWrappers(deviceCalibrationPlanDetails)); } /** * 导出设备校准计划 * @param deviceCalibrationPlanId * @param response */ @Override public void exportDeviceCalibrationPlanDetail(Integer deviceCalibrationPlanId, HttpServletResponse response) { // 查询设备校准计划 DeviceCalibrationPlan deviceCalibrationPlan = baseMapper.selectById(deviceCalibrationPlanId); DeviceCalibrationPlanDto deviceCalibrationPlanDto = new DeviceCalibrationPlanDto(); BeanUtils.copyProperties(deviceCalibrationPlan, deviceCalibrationPlanDto); // 设置编制和批准时间格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); deviceCalibrationPlanDto.setWriteTimeStr(deviceCalibrationPlan.getWriteTime() == null ? null : deviceCalibrationPlan.getWriteTime().format(formatter)); deviceCalibrationPlanDto.setRatifyTimeStr(deviceCalibrationPlan.getRatifyTime() == null ? null : deviceCalibrationPlan.getRatifyTime().format(formatter)); // 查询设备校准计划详情 List deviceCalibrationPlanDetailList = deviceCalibrationPlanDetailMapper.selectList(Wrappers.lambdaQuery().eq(DeviceCalibrationPlanDetail::getPlanId, deviceCalibrationPlanId)); // 设置序号 和 时间 ArrayList deviceCalibrationPlanDetailDtoList = new ArrayList<>(); deviceCalibrationPlanDetailList.forEach(deviceCalibrationPlanDetail -> { DeviceCalibrationPlanDetailDto deviceCalibrationPlanDetailDto = new DeviceCalibrationPlanDetailDto(); BeanUtils.copyProperties(deviceCalibrationPlanDetail, deviceCalibrationPlanDetailDto); deviceCalibrationPlanDetailDto.setIndex(deviceCalibrationPlanDetailList.indexOf(deviceCalibrationPlanDetail) + 1); deviceCalibrationPlanDetailDto.setLastDateStr((deviceCalibrationPlanDetail.getLastDate().format(formatter))); deviceCalibrationPlanDetailDto.setPlanDateStr((deviceCalibrationPlanDetail.getPlanDate().format(formatter))); deviceCalibrationPlanDetailDtoList.add(deviceCalibrationPlanDetailDto); }); // 获取路径 InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-calibration-plan.docx"); Configure configure = Configure.builder() .bind("deviceCalibrationPlanDetailDtoList", new HackLoopTableRenderPolicy()) .build(); XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( new HashMap() {{ put("deviceCalibrationPlan", deviceCalibrationPlanDto); put("deviceCalibrationPlanDetailDtoList", deviceCalibrationPlanDetailDtoList); //获取编制人的签名地址 put("organizationUrl", UserUtils.getFinalUserSignatureUrl(deviceCalibrationPlan.getRatifyUserId())); //获取批准人的签名地址 put("approvedUrl", UserUtils.getFinalUserSignatureUrl(deviceCalibrationPlan.getWriteUserId())); }}); 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("导出失败"); } } }