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.DeviceExaminePlanDetailsDto;
import com.yuanchu.mom.dto.DeviceExaminePlanDto;
import com.yuanchu.mom.excel.upload.DeviceExaminePlanUpload;
import com.yuanchu.mom.exception.ErrorException;
import com.yuanchu.mom.mapper.DeviceExaminePlanDetailsMapper;
import com.yuanchu.mom.mapper.DeviceExaminePlanMapper;
import com.yuanchu.mom.mapper.DeviceMapper;
import com.yuanchu.mom.mapper.UserMapper;
import com.yuanchu.mom.pojo.Device;
import com.yuanchu.mom.pojo.DeviceExaminePlan;
import com.yuanchu.mom.pojo.DeviceExaminePlanDetails;
import com.yuanchu.mom.pojo.User;
import com.yuanchu.mom.service.DeviceExaminePlanDetailsService;
import com.yuanchu.mom.service.DeviceExaminePlanService;
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.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
*
* 设备核查计划主表 服务实现类
*
*
* @author 江苏鵷雏网络科技有限公司
* @since 2024-12-16 07:14:04
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceExaminePlanServiceImpl extends ServiceImpl implements DeviceExaminePlanService {
@Resource
private DeviceExaminePlanDetailsMapper deviceExaminePlanDetailsMapper;
@Resource
private DeviceExaminePlanDetailsService deviceExaminePlanDetailsService;
@Resource
private DeviceMapper deviceMapper;
@Resource
private GetLook getLook;
@Resource
private UserMapper userMapper;
/**
* 新增设备核查计划
* @param examinePlanDto
* @return
*/
@Override
public boolean addDeviceExaminePlan(DeviceExaminePlanDto examinePlanDto) {
// 当前登录用户
Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
// 文件名称
examinePlanDto.setWriteUserId(userId);
examinePlanDto.setWriteTime(LocalDateTime.now());
baseMapper.insert(examinePlanDto);
// 添加详情
if (CollectionUtils.isNotEmpty(examinePlanDto.getExaminePlanDetailsList())) {
for (DeviceExaminePlanDetails deviceExaminePlanDetails : examinePlanDto.getExaminePlanDetailsList()) {
deviceExaminePlanDetails.setPlanId(examinePlanDto.getPlanId());
}
deviceExaminePlanDetailsService.saveBatch(examinePlanDto.getExaminePlanDetailsList());
}
return true;
}
/**
* 导入设备核查计划
* @param file
* @return
*/
@Override
public boolean importDeviceExaminePlan(MultipartFile file) {
// 当前登录用户
Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
// 文件名称
String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
DeviceExaminePlan examinePlan = new DeviceExaminePlan();
examinePlan.setPlanName(fileName);
examinePlan.setWriteUserId(userId);
examinePlan.setWriteTime(LocalDateTime.now());
baseMapper.insert(examinePlan);
List examinePlanDetails = new ArrayList<>();
// 导入附件内容
try {
// excel解析
EasyExcel.read(file.getInputStream(), DeviceExaminePlanUpload.class, new AnalysisEventListener() {
@Override
public void invoke(DeviceExaminePlanUpload detailsUpload, AnalysisContext analysisContext) {
// 判断是否为空
if (StringUtils.isNotBlank(detailsUpload.getDeviceName()) &&
StringUtils.isNotBlank(detailsUpload.getDeviceNumber())) {
// 对象复制
DeviceExaminePlanDetails planDetails = new DeviceExaminePlanDetails();
BeanUtils.copyProperties(detailsUpload, planDetails);
planDetails.setPlanId(examinePlan.getPlanId());
examinePlanDetails.add(planDetails);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}).sheet().doRead();
for (DeviceExaminePlanDetails examinePlanDetail : examinePlanDetails) {
Device device = deviceMapper.selectOne(Wrappers.lambdaQuery()
.eq(Device::getManagementNumber, examinePlanDetail.getDeviceNumber().trim()));
if (device == null) {
throw new ErrorException("设备编号" + examinePlanDetail.getDeviceNumber() + "未查询到设备, 请重新导入");
}
User user = userMapper.selectOne(Wrappers.lambdaQuery()
.eq(User::getName, examinePlanDetail.getCheckChargerUser()));
if (user == null) {
throw new ErrorException("设备编号" + examinePlanDetail.getDeviceNumber() + "未查询到核查人");
}
examinePlanDetail.setDeviceId(device.getId());
examinePlanDetail.setCheckChargerUserId(user.getId());
}
deviceExaminePlanDetailsService.saveBatch(examinePlanDetails);
} catch (IOException e) {
throw new RuntimeException(e);
}
return true;
}
/**
* 设备核查计划批准
* @param deviceExaminePlan
* @return
*/
@Override
public boolean ratifyDeviceExaminePlan(DeviceExaminePlan deviceExaminePlan) {
// 当前登录用户
Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
baseMapper.update(null, Wrappers.lambdaUpdate()
.eq(DeviceExaminePlan::getPlanId, deviceExaminePlan.getPlanId())
.set(DeviceExaminePlan::getRatifyUserId, userId)
.set(DeviceExaminePlan::getRatifyRemark, deviceExaminePlan.getRatifyRemark())
.set(DeviceExaminePlan::getRatifyStatus, deviceExaminePlan.getRatifyStatus())
.set(DeviceExaminePlan::getRatifyTime, LocalDateTime.now())
);
return true;
}
/**
* 设备核查计划列表
* @param page
* @param deviceExaminePlan
* @return
*/
@Override
public IPage pageDeviceExaminePlan(Page page, DeviceExaminePlan deviceExaminePlan) {
return baseMapper.deviceExaminePlanDetailsMapper(page, QueryWrappers.queryWrappers(deviceExaminePlan));
}
/**
* 设备核查计划详情列表
* @param page
* @param deviceExaminePlanDetails
* @return
*/
@Override
public IPage pageDeviceExaminePlanDetail(Page page, DeviceExaminePlanDetails deviceExaminePlanDetails) {
if (deviceExaminePlanDetails.getPlanId() == null) {
return new Page();
}
return deviceExaminePlanDetailsMapper.pageDeviceExaminePlanDetail(page, QueryWrappers.queryWrappers(deviceExaminePlanDetails));
}
/**
* 导出设备核查计划
* @param deviceExaminePlanId 设备核查计划id
* @param response 响应体
*/
@Override
public void exportDeviceExaminePlanDetail(Integer deviceExaminePlanId, HttpServletResponse response) {
// 查询设备核查计划
DeviceExaminePlanDto deviceExaminePlanDto = baseMapper.selectExamineExaminePlanDto(deviceExaminePlanId);
// 查询设备核查计划详情
List deviceExaminePlanDetailsList = deviceExaminePlanDetailsMapper.selectList(Wrappers.lambdaQuery().eq(DeviceExaminePlanDetails::getPlanId, deviceExaminePlanId));
// 设置序号
ArrayList deviceExaminePlanDetailsDtoList = new ArrayList<>();
deviceExaminePlanDetailsList.forEach(deviceExamineRecordContrastDetail -> {
DeviceExaminePlanDetailsDto deviceExaminePlanDetailsDto = new DeviceExaminePlanDetailsDto();
BeanUtils.copyProperties(deviceExamineRecordContrastDetail, deviceExaminePlanDetailsDto);
deviceExaminePlanDetailsDto.setIndex(deviceExaminePlanDetailsList.indexOf(deviceExamineRecordContrastDetail) + 1);
deviceExaminePlanDetailsDtoList.add(deviceExaminePlanDetailsDto);
});
// 获取路径
InputStream inputStream = this.getClass().getResourceAsStream("/static/word/examine-plan-detail.docx");
Configure configure = Configure.builder()
.bind("deviceExaminePlanDetailsDtoList", new HackLoopTableRenderPolicy())
.build();
XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
new HashMap() {{
put("deviceExaminePlan", deviceExaminePlanDto);
put("deviceExaminePlanDetailsDtoList", deviceExaminePlanDetailsDtoList);
//获取核查人的签名地址
put("writeUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExaminePlanDto.getWriteUserId()));
//获取审查人的签名地址
put("reviewUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExaminePlanDto.getRatifyUserId()));
}});
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("导出失败");
}
}
}