package com.ruoyi.process.service.impl;
import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
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.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.framework.util.HackLoopTableRenderPolicy;
import com.ruoyi.framework.util.XWPFDocumentUtils;
import com.ruoyi.process.dto.InspectionOrderDetail;
import com.ruoyi.process.dto.InspectionOrderExportDto;
import com.ruoyi.process.dto.ProcessOrderDto;
import com.ruoyi.process.dto.SampleItemDto;
import com.ruoyi.process.mapper.ProcessOrderMapper;
import com.ruoyi.process.mapper.ProcessSampleNewMapper;
import com.ruoyi.process.pojo.ProcessOrder;
import com.ruoyi.process.pojo.ProcessSampleNew;
import com.ruoyi.process.service.ProcessOrderService;
import com.ruoyi.system.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
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.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
/**
*
* 要求、标书和合同评审 服务实现类
*
*
* @author 芯导软件(江苏)有限公司
* @since 2024-11-05 03:06:20
*/
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class ProcessOrderServiceImpl extends ServiceImpl implements ProcessOrderService {
@Resource
private ProcessSampleNewMapper processSampleNewMapper;
@Resource
private ProcessOrderMapper processOrderMapper;
@Resource
private UserMapper userMapper;
@Override
public IPage pageProcessOrder(Page page, ProcessOrderDto processOrderDto) {
return processOrderMapper.pageProcessOrder(page, QueryWrappers.queryWrappers(processOrderDto));
}
@Override
public void uploadFile(MultipartFile file, Integer id) {
ProcessOrder processOrder = processOrderMapper.selectById(id);
ArrayList list = new ArrayList<>();
try (InputStream inputStream = file.getInputStream()) {
XWPFDocument xwpfDocument = new XWPFDocument(inputStream);
// 获取所有表格
List tables = xwpfDocument.getTables();
for (XWPFTable table : tables) {
// 获取表格的行
List rows = table.getRows();
for (int i = 0; i < rows.size(); i++) {
// 获取每一行
List tableCells = rows.get(i).getTableCells();
for (int j = 0; j < tableCells.size(); j++) {
// 获取每一单元格
String text = rows.get(i).getCell(j).getText();
log.info("读取的内容:{}", text);
list.add(text);
}
}
}
// 根据获取到的内容进行赋值
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
processOrder.setIsUpload(1); // 是否上传
processOrder.setSampleS(list.get(1)); // 试样名称
processOrder.setEntrustmentTimeS(list.get(3)); // 委托时间
processOrder.setSampleTypeS(list.get(5)); // 型号
processOrder.setCompanyS(list.get(7)); // 委托单位
processOrder.setProductionS(list.get(9)); // 生产单位
processOrder.setPrepareUserS(list.get(11)); // 委托人
if (NumberUtil.isNumber(list.get(13))) {
processOrder.setSampleNumS(Integer.parseInt(list.get(13))); // 样品数量
}
// 样品状态
switch (list.get(15)) {
case "待审核":
processOrder.setInsStateS(0);
break;
case "待检验":
processOrder.setInsStateS(1);
break;
case "已检验":
processOrder.setInsStateS(4);
break;
case "退回":
processOrder.setInsStateS(2);
break;
case "撤销":
processOrder.setInsStateS(3);
break;
}
if (list.get(17).contains("☑是Yes")) {
processOrder.setIsLeaveS(1); // 是否留样
} else {
processOrder.setIsLeaveS(0); // 是否留样
}
if (list.get(19).contains("☑委托单位取回")) {
processOrder.setProcessingS(0); // 样品处理方式
}
if(list.get(19).contains("☑实验室处理")){
processOrder.setProcessingS(1); // 样品处理方式
}
processOrder.setAppointedS(list.get(21)); // 约定时间
if (list.get(23).contains("☑自取")) {
processOrder.setSendS(1); // 是否自取
}
if(list.get(23).contains("☑其它")) {
processOrder.setSendS(0); // 是否自取
}
// 从30开始是样品表格数据 到 值为判定规则结束
ArrayList sampleList = new ArrayList<>();
for (int i = 29; i < list.size(); i++) {
if (list.get(i).contains("判定规则")) {
break;
}
sampleList.add(list.get(i));
}
// 样品表格数据
// 根据orderId 将原本的删除
processSampleNewMapper.delete(new LambdaQueryWrapper().eq(ProcessSampleNew::getCnasOrderId, id));
for (int i = 0; i < sampleList.size(); i += 5) {
ProcessSampleNew processSampleNew = new ProcessSampleNew();
processSampleNew.setCnasOrderId(id);
processSampleNew.setSampleCode(sampleList.get(i + 1));
processSampleNew.setInspectionItem(sampleList.get(i + 2));
processSampleNew.setMethod(sampleList.get(i + 3));
processSampleNew.setRemark(sampleList.get(i + 4));
processSampleNewMapper.insert(processSampleNew);
}
int len = sampleList.size() + 28;
// 判定规则
processOrder.setPrepareUserUrlS(list.get(len + 4)); // 委托人签名
if (StringUtils.isNotEmpty(list.get(len + 6))) {
String date = list.get(len + 6).substring(0, list.get(len + 6).indexOf("日") + 1);
processOrder.setCreateTimeTwoS(date); // 委托日期
}
processOrder.setPhoneS(list.get(len + 8)); // 联系方式
Integer comprehensiveUser = null;
if (StringUtils.isNotEmpty(list.get(len + 10))) {
List users = userMapper.selectList(new LambdaQueryWrapper().like(User::getName, list.get(len + 10)));
comprehensiveUser = users.get(0).getId();
}
processOrder.setComprehensiveUser(comprehensiveUser); // 综合室签名
if (StringUtils.isNotEmpty(list.get(len + 12))) {
String date = list.get(len + 12).substring(0, list.get(len + 12).indexOf("日") + 1);
if (StringUtils.isNotEmpty(date)) {
LocalDate parse = LocalDate.parse(date, formatter);
processOrder.setComprehensiveTime(parse); // 接收日期
}
}
if (StringUtils.isNotEmpty(list.get(len + 14))) {
List users = userMapper.selectList(new LambdaQueryWrapper().like(User::getName, list.get(len + 14)));
processOrder.setIssueUser(users.get(0).getId()); // 领样员
}
if (StringUtils.isNotEmpty(list.get(len + 16))) {
String date = list.get(len + 16).substring(0, list.get(len + 16).indexOf("日") + 1);
if (StringUtils.isNotEmpty(date)) {
LocalDate parse = LocalDate.parse(date, formatter);
processOrder.setIssueTime(parse); // 领样日期
}
}
processOrderMapper.updateById(processOrder);
} catch (Exception e) {
e.printStackTrace();
throw new ErrorException("上传失败");
}
}
@Override
public ProcessOrderDto getProcessOrder(Integer id) {
ProcessOrderDto a = processOrderMapper.getProcessOrder(id);
// 如果上传了则采用上传了的字段
if (Objects.nonNull(a.getIsUpload()) && a.getIsUpload().equals(1)) {
a = getNewValue(a);
}
return a;
}
public ProcessOrderDto getNewValue(ProcessOrderDto a) {
List processSampleNews = processSampleNewMapper.selectList(new LambdaQueryWrapper()
.eq(ProcessSampleNew::getCnasOrderId, a.getId()));
a.setSample(a.getSampleS()); // 试样名称
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
if (StringUtils.isNotEmpty(a.getEntrustmentTimeS())) {
LocalDate parse = LocalDate.parse(a.getEntrustmentTimeS(), dateTimeFormatter);
LocalDateTime localDateTime = LocalDateTime.of(parse, LocalTime.MIDNIGHT);
a.setCreateTime(localDateTime); // 委托时间
}
a.setSampleType(a.getSampleTypeS()); // 型号
a.setCompany(a.getCompanyS()); // 委托单位
a.setProduction(a.getProductionS()); // 生产单位
a.setPrepareUser(a.getPrepareUserS()); // 委托人
a.setSampleNum(a.getSampleNumS() + ""); // 样品数量
a.setInsState(a.getInsStateS()); // 样品状态
a.setIsLeave(a.getIsLeaveS()); // 是否留样
a.setProcessing(a.getProcessingS()); // 样品处理方式
a.setPhone(a.getPhoneS()); // 联系方式
if (StringUtils.isNotEmpty(a.getAppointedS())) {
LocalDate parse = LocalDate.parse(a.getAppointedS(), dateTimeFormatter);
a.setAppointed(parse); // 约定时间
}
a.setSend(a.getSendS()); // 报告发送方式
ArrayList sampleItemDtos = new ArrayList<>();
for (ProcessSampleNew b : processSampleNews) {
SampleItemDto sampleItemDto = new SampleItemDto();
sampleItemDto.setCode(b.getSampleCode());
sampleItemDto.setProduct(b.getInspectionItem());
sampleItemDto.setStandardMethodList(b.getMethod());
sampleItemDto.setRemark(b.getRemark());
sampleItemDtos.add(sampleItemDto);
}
a.setSampleItems(sampleItemDtos);
return a;
}
@Override
public int doProcessOrder(ProcessOrder processOrder) {
if (ObjectUtils.isNotEmpty(processOrder.getComprehensiveUser())) {
User user = userMapper.selectById(processOrder.getComprehensiveUser());
if (ObjectUtils.isEmpty(user.getSignatureUrl())) throw new ErrorException("未找到综合室签名人的电子签名,请上传电子签名!");
}
if (ObjectUtils.isNotEmpty(processOrder.getIssueUser())) {
User user = userMapper.selectById(processOrder.getIssueUser());
if (ObjectUtils.isEmpty(user.getSignatureUrl())) throw new ErrorException("未找到领样员的电子签名,请上传电子签名!");
}
return processOrderMapper.updateById(processOrder);
}
@Override
public void exportInspectionOrder(Integer id, HttpServletResponse response) {
ProcessOrder processOrder = baseMapper.selectById(id);
InspectionOrderExportDto inspectionOrderExportDto = extracted(processOrder);
final List list;
// 如果该数据上传了文件 就使用上传的数据
if(Objects.nonNull(processOrder.getIsUpload()) && processOrder.getIsUpload().equals(1)) {
list = new ArrayList<>();
List processSampleNews = processSampleNewMapper.selectList(new LambdaQueryWrapper()
.eq(ProcessSampleNew::getCnasOrderId, id));
inspectionOrderExportDto.setSample(processOrder.getSampleS()); // 试样名称
inspectionOrderExportDto.setCommissionDateString(processOrder.getEntrustmentTimeS()); // 委托时间
inspectionOrderExportDto.setSampleType(processOrder.getSampleTypeS()); // 型号
inspectionOrderExportDto.setCompany(processOrder.getCompanyS()); // 委托单位
inspectionOrderExportDto.setProduction(processOrder.getProductionS()); // 生产单位
inspectionOrderExportDto.setPrepareUser(processOrder.getPrepareUserS()); // 委托人
inspectionOrderExportDto.setSampleNum(processOrder.getSampleNumS() + ""); // 样品数量
inspectionOrderExportDto.setInsState(processOrder.getInsStateS()); // 样品状态
// 是否留样
inspectionOrderExportDto.setIsLeave1(processOrder.getIsLeaveS() == 1 ? "☑" : "□");
inspectionOrderExportDto.setIsLeave2(processOrder.getIsLeaveS() == 0 ? "☑" : "□");
// 样品处理方式
inspectionOrderExportDto.setProcessing0(processOrder.getProcessingS() == 0 ? "☑" : "□");
inspectionOrderExportDto.setProcessing1(processOrder.getProcessingS() == 1 ? "☑" : "□");
// 约定时间
inspectionOrderExportDto.setAppointedString(processOrder.getAppointedS());
// 是否自取
inspectionOrderExportDto.setSend0(processOrder.getSendS() == 0 ? "☑" : "□");
inspectionOrderExportDto.setSend1(processOrder.getSendS() == 1 ? "☑" : "□");
int i = 1;
for(ProcessSampleNew a : processSampleNews) {
InspectionOrderDetail inspectionOrderDetail = new InspectionOrderDetail();
inspectionOrderDetail.setSampleNumber(a.getSampleCode());
inspectionOrderDetail.setTestItem(a.getInspectionItem());
inspectionOrderDetail.setTestStandard(a.getMethod());
inspectionOrderDetail.setRemark(a.getRemark());
inspectionOrderDetail.setIndex(i);
list.add(inspectionOrderDetail);
i++;
}
// 委托人签名
inspectionOrderExportDto.setPrepareUser(processOrder.getPrepareUserS());
// 委托日期
inspectionOrderExportDto.setCommissionDateString(processOrder.getEntrustmentTimeS());
// 联系方式
inspectionOrderExportDto.setPhone(processOrder.getPhoneS());
}else {
list = baseMapper.selectInsOrder(processOrder.getInsOrderId());
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);
}});
// 处理换行问题
XWPFDocumentUtils.updateMergeByDocument(template.getXWPFDocument());
try {
response.setContentType("application/msword");
String fileName = URLEncoder.encode(
inspectionOrderExportDto.getSample(), "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(ProcessOrder processOrder) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
InspectionOrderExportDto inspectionOrderExportDto = new InspectionOrderExportDto();
ProcessOrderDto processOrderDto = getProcessOrder(processOrder.getId());
BeanUtils.copyProperties(processOrderDto, inspectionOrderExportDto);
if (processOrderDto.getCreateTime() != null) {
inspectionOrderExportDto.setCommissionDateString(processOrderDto.getCreateTime().format(formatter));
}
if (processOrder.getComprehensiveTime() != null) {
inspectionOrderExportDto.setReceiptDataString(processOrder.getComprehensiveTime().format(formatter));
}
if (processOrder.getIssueTime() != null) {
inspectionOrderExportDto.setSampleDataString(processOrder.getIssueTime().format(formatter));
}
if (processOrderDto.getAppointed() != null) {
inspectionOrderExportDto.setAppointedString(processOrderDto.getAppointed().format(formatter));
}
inspectionOrderExportDto.setIsLeave1(processOrderDto.getIsLeave() != null && processOrderDto.getIsLeave() == 1 ? "☑" : "□");
inspectionOrderExportDto.setIsLeave2(processOrderDto.getIsLeave() != null && processOrderDto.getIsLeave() == 0 ? "☑" : "□");
inspectionOrderExportDto.setSend0(processOrderDto.getSend() != null && processOrderDto.getSend() == 0 ? "☑" : "□");
inspectionOrderExportDto.setSend1(processOrderDto.getSend() != null && processOrderDto.getSend() == 1 ? "☑" : "□");
inspectionOrderExportDto.setProcessing0(processOrderDto.getProcessing() != null && processOrderDto.getProcessing() == 0 ? "☑" : "□");
inspectionOrderExportDto.setProcessing1(processOrderDto.getProcessing() != null && processOrderDto.getProcessing() == 1 ? "☑" : "□");
if (ObjectUtils.isNotEmpty(processOrder.getRule())) {
inspectionOrderExportDto.setCriterionRule0(processOrder.getRule().equals("不考虑不确定度") ? "☑" : "□");
inspectionOrderExportDto.setCriterionRule1(processOrder.getRule().contains("-") ? "☑" : "□");
inspectionOrderExportDto.setCriterionRuleRemark(processOrder.getRule().contains("-") ? processOrder.getRule().split("-")[1] : "");
}
return inspectionOrderExportDto;
}
}