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("导出失败");
}
}
}