package com.ruoyi.process.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
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.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsReport;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.InsReportService;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.process.dto.InspectionOrderDto;
import com.ruoyi.process.dto.InspectionOrderExportDto;
import com.ruoyi.process.mapper.InspectionOrderMapper;
import com.ruoyi.process.pojo.InspectionOrder;
import com.ruoyi.process.pojo.InspectionOrderDetail;
import com.ruoyi.process.pojo.ProcessReport;
import com.ruoyi.process.service.InspectionOrderDetailService;
import com.ruoyi.process.service.InspectionOrderService;
import com.ruoyi.process.service.ProcessReportService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
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.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
/**
*
* 检验委托单 服务实现类
*
*
* @author 江苏鵷雏网络科技有限公司
* @since 2024-12-09
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class InspectionOrderServiceImpl extends ServiceImpl implements InspectionOrderService {
@Resource
private InspectionOrderDetailService inspectionOrderDetailService;
@Resource
private InsOrderService insOrderService;
@Resource
private InsReportService insReportService;
@Value("${wordUrl}")
private String wordUrl;
@Resource
private ProcessReportService processReportService;
/**
* 检验委托单分页查询
* @param page
* @param InspectionOrder
* @return
*/
@Override
public IPage pageInspectionOrder(Page page, InspectionOrder InspectionOrder) {
return baseMapper.pageInspectionOrder(page, QueryWrappers.queryWrappers(InspectionOrder));
}
/**
* 检验委托单新增
* @param inspectionOrder
* @return
*/
@Override
public boolean addInspectionOrder(InspectionOrderDto inspectionOrder) {
if (inspectionOrder.getInsOrderId() == null) {
throw new ErrorException("缺少订单id");
}
// 复制报告
// 查询订单报告
InsReport insReport = insReportService.getOne(Wrappers.lambdaQuery()
.eq(InsReport::getInsOrderId, inspectionOrder.getInsOrderId()));
String path = wordUrl + insReport.getUrl().replaceFirst("/word", "");
String fileName =LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + "委托单报告.docx";
// 源文件路径
Path sourcePath = Paths.get(path);
// 目标文件路径
Path targetPath = Paths.get(wordUrl + "/" + fileName);
try {
// 复制文件,如果目标文件已存在,则覆盖
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
// 添加文件地址
inspectionOrder.setFileUrl("/word/" + fileName);
} catch (Exception e) {
e.printStackTrace();
}
baseMapper.insert(inspectionOrder);
// 新增详情
if (CollectionUtils.isNotEmpty(inspectionOrder.getOrderDetailList())) {
for (InspectionOrderDetail InspectionOrderDetail : inspectionOrder.getOrderDetailList()) {
InspectionOrderDetail.setInspectionOrderId(inspectionOrder.getInspectionOrderId());
}
inspectionOrderDetailService.saveBatch(inspectionOrder.getOrderDetailList());
}
//新增7.8报告结果
ProcessReport processReport = new ProcessReport();
processReport.setInspectionOrderId(inspectionOrder.getInsOrderId());
processReport.setInsReportCode(inspectionOrder.getEntrustCode());//报告编号=委托编号
//页数
try {
com.aspose.words.Document doc = new com.aspose.words.Document(path);
processReport.setPages(doc.getPageCount()+"");
} catch (Exception e) {
}
processReport.setNumber("1");//发送份数默认1
processReport.setSend(inspectionOrder.getCommissionUnit());//发往何处=委托单位
processReport.setMethod(inspectionOrder.getSend()==1?"自取":"其他");//发送方式
processReport.setSendTime(insReport.getRatifyTime().toLocalDate());//发送日期
processReport.setSendUser(64);//发送人固定
processReport.setSignatory(inspectionOrder.getCommissionUser());//签收人=委托人
processReportService.save(processReport);
return true;
}
/**
* 检验委托单修改
* @param InspectionOrder
* @return
*/
@Override
public boolean updateInspectionOrder(InspectionOrderDto InspectionOrder) {
baseMapper.updateById(InspectionOrder);
// 删除之前的详情
inspectionOrderDetailService.remove(Wrappers.lambdaQuery()
.eq(InspectionOrderDetail::getInspectionOrderId, InspectionOrder.getInspectionOrderId()));
// 新增详情
for (InspectionOrderDetail InspectionOrderDetail : InspectionOrder.getOrderDetailList()) {
InspectionOrderDetail.setInspectionOrderId(InspectionOrder.getInspectionOrderId());
}
inspectionOrderDetailService.saveBatch(InspectionOrder.getOrderDetailList());
//修改7.9报告结果
ProcessReport processReport = processReportService.getOne(Wrappers.lambdaQuery().eq(ProcessReport::getInspectionOrderId, InspectionOrder.getInspectionOrderId()));
processReport.setInsReportCode(InspectionOrder.getEntrustCode());//报告编号=委托编号
processReportService.updateById(processReport);
return true;
}
/**
* 检验委托单删除
* @param inspectionOrderId
* @return
*/
@Override
public boolean delInspectionOrder(Integer inspectionOrderId) {
inspectionOrderDetailService.remove(Wrappers.lambdaQuery()
.eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId));
baseMapper.deleteById(inspectionOrderId);
return true;
}
/**
* 检验委托单查看详情
* @param inspectionOrderId
* @return
*/
@Override
public InspectionOrderDto getInspectionOrderOne(Integer inspectionOrderId) {
InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId);
InspectionOrderDto inspectionOrderDto = new InspectionOrderDto();
BeanUtils.copyProperties(inspectionOrder, inspectionOrderDto);
// 查询详细信息
inspectionOrderDto.setOrderDetailList(inspectionOrderDetailService.list(Wrappers.lambdaQuery()
.eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId)));
return inspectionOrderDto;
}
/**
* 根据成品订单id查询委托单详情
* @param insOrderId
* @return
*/
@Override
public InspectionOrderDto getInspectionOrderByInsOderId(Integer insOrderId) {
InsOrder order = insOrderService.getById(insOrderId);
InspectionOrderDto inspectionOrderDto = new InspectionOrderDto();
inspectionOrderDto.setInsOrderId(order.getId());//成品订单id
inspectionOrderDto.setEntrustCode(order.getEntrustCode());//委托编号
inspectionOrderDto.setSampleName(order.getSample());//试样名称
inspectionOrderDto.setProduction(order.getProduction());//生产单位
inspectionOrderDto.setCommissionUnit(order.getCompany());//委托单位
inspectionOrderDto.setCommissionUser(order.getPrepareUser());//委托人
inspectionOrderDto.setSampleStatus("完好");//样品状态
inspectionOrderDto.setIsLeave(order.getIsLeave());//是否留样
inspectionOrderDto.setProcessing(order.getProcessing());//样品处理方式
inspectionOrderDto.setAppointed(order.getAppointed());//约定时间
inspectionOrderDto.setSend(order.getSend());//报告发送方式
inspectionOrderDto.setCommissionPhone(order.getPhone());//报告发送方式
return inspectionOrderDto;
}
/**
* 委托单查询成品订单
* @return
*/
@Override
public IPage getInsOrderOnInspection(Page page, InsOrder insOrder) {
return baseMapper.getInsOrderOnInspection(page, QueryWrappers.queryWrappers(insOrder));
}
/**
* 委托单成品报告上传
* @param file
* @param inspectionOrderId
* @return
*/
@Override
public boolean uploadInspectionOrderFile(MultipartFile file, Integer inspectionOrderId) {
String urlString;
String pathName;
try {
String path = wordUrl;
File realpath = new File(path);
if (!realpath.exists()) {
realpath.mkdirs();
}
pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
urlString = realpath + "/" + pathName;
file.transferTo(new File(urlString));
baseMapper.update(null, Wrappers.lambdaUpdate()
.eq(InspectionOrder::getInspectionOrderId, inspectionOrderId)
.set(InspectionOrder::getFileUrl, "/word/" + pathName));
} catch (Exception e) {
throw new ErrorException("文件上传失败");
}
return true;
}
@Override
public void exportInspectionOrder(Integer inspectionOrderId, HttpServletResponse response) {
InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId);
InspectionOrderExportDto inspectionOrderExportDto = extracted(inspectionOrder);
List list = inspectionOrderDetailService.list(Wrappers.lambdaQuery()
.eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId));
int index = 1;
for (InspectionOrderDetail inspectionOrderDetail : list) {
inspectionOrderDetail.setIndex(index);
index++;
}
// 获取路径
InputStream inputStream = this.getClass().getResourceAsStream("/static/inspection-order.docx");
Configure configure = Configure.builder()
.bind("inspectionOrderDetailList", new HackLoopTableRenderPolicy())
.build();
XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
new HashMap() {{
put("inspectionOrder", inspectionOrderExportDto);
put("inspectionOrderDetailList", list);
}});
try {
response.setContentType("application/msword");
String fileName = URLEncoder.encode(
inspectionOrderExportDto.getSampleName(), "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("导出失败");
}
}
private InspectionOrderExportDto extracted(InspectionOrder inspectionOrder) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
InspectionOrderExportDto inspectionOrderExportDto = new InspectionOrderExportDto();
BeanUtils.copyProperties(inspectionOrder, inspectionOrderExportDto);
if (inspectionOrder.getCommissionDate() != null) {
inspectionOrderExportDto.setCommissionDateString(inspectionOrder.getCommissionDate().format(formatter));
}
if (inspectionOrder.getReceiptData() != null) {
inspectionOrderExportDto.setReceiptDataString(inspectionOrder.getReceiptData().format(formatter));
}
if (inspectionOrder.getSampleData() != null) {
inspectionOrderExportDto.setSampleDataString(inspectionOrder.getSampleData().format(formatter));
}
if (inspectionOrder.getAppointed() != null) {
inspectionOrderExportDto.setAppointedString(inspectionOrder.getAppointed().format(formatter));
}
inspectionOrderExportDto.setIsLeave1(inspectionOrder.getIsLeave() != null && inspectionOrder.getIsLeave() == 1? "☑" : "□");
inspectionOrderExportDto.setIsLeave2(inspectionOrder.getIsLeave() != null && inspectionOrder.getIsLeave() == 0? "☑" : "□");
inspectionOrderExportDto.setSend0(inspectionOrder.getSend() != null && inspectionOrder.getSend() == 1? "☑" : "□");
inspectionOrderExportDto.setSend1(inspectionOrder.getSend() != null && inspectionOrder.getSend() == 0? "☑" : "□");
inspectionOrderExportDto.setProcessing0(inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 0? "☑" : "□");
inspectionOrderExportDto.setProcessing1(inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 1? "☑" : "□");
inspectionOrderExportDto.setCriterionRule0(inspectionOrder.getCriterionRule() != null && inspectionOrder.getCriterionRule() == 0? "☑" : "□");
inspectionOrderExportDto.setCriterionRule1(inspectionOrder.getCriterionRule() != null && inspectionOrder.getCriterionRule() == 1? "☑" : "□");
return inspectionOrderExportDto;
}
}