package com.ruoyi.process.service.impl; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; 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.numgen.NumberGenerator; import com.ruoyi.common.core.domain.entity.Custom; import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.utils.QueryWrappers; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.inspect.dto.InsPlaceOrderDto; 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.InspectionOrderBindingDto; import com.ruoyi.process.dto.InspectionOrderExportDto; import com.ruoyi.process.mapper.InspectionOrderBindLogMapper; import com.ruoyi.process.mapper.InspectionOrderMapper; import com.ruoyi.process.mapper.InspectionOrderAttachmentMapper; import com.ruoyi.process.mapper.InspectionOrderBindingMapper; import com.ruoyi.process.pojo.InspectionOrder; import com.ruoyi.process.pojo.InspectionOrderAttachment; import com.ruoyi.process.pojo.InspectionOrderBinding; import com.ruoyi.process.pojo.InspectionOrderBindLog; import com.ruoyi.process.pojo.InspectionOrderDetail; import com.ruoyi.process.service.*; import com.ruoyi.system.mapper.UserMapper; import com.ruoyi.system.mapper.CustomMapper; 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.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.time.LocalDateTime; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; import java.util.LinkedHashMap; import java.util.Objects; import java.util.UUID; /** *

* 检验委托单 服务实现类 *

* * @author 江苏鵷雏网络科技有限公司 * @since 2024-12-09 */ @Service @Transactional(rollbackFor = Exception.class) public class InspectionOrderServiceImpl extends ServiceImpl implements InspectionOrderService { @Resource private InspectionOrderBindLogMapper inspectionOrderBindLogMapper; @Resource private InspectionOrderBindingMapper inspectionOrderBindingMapper; @Resource private InspectionOrderAttachmentMapper inspectionOrderAttachmentMapper; @Resource private InspectionOrderDetailService inspectionOrderDetailService; @Resource private InsOrderService insOrderService; @Resource private InsReportService insReportService; @Value("${wordUrl}") private String wordUrl; @Resource private UserMapper userMapper; @Resource private CustomMapper customMapper; @Resource private NumberGenerator numberGenerator; /** * 检验委托单分页查询 * * @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 InspectionOrderDto addInspectionOrder(InspectionOrderDto inspectionOrder) { if (inspectionOrder.getInsOrderId() != null) { throw new ErrorException("新增检验委托单不允许直接绑定成品下单,请在成品下单页面选择委托单"); } normalizeCommissionParty(inspectionOrder); inspectionOrder.setInspectionOrderCode(numberGenerator.generateNumberWithPrefix(4, "WTD" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")), InspectionOrder::getInspectionOrderCode)); // 委托编号由成品下单流程生成,委托单新增阶段不得手工填写。 inspectionOrder.setEntrustCode(null); inspectionOrder.setFileUrl(null); baseMapper.insert(inspectionOrder); // 新增详情 if (CollectionUtils.isNotEmpty(inspectionOrder.getOrderDetailList())) { for (InspectionOrderDetail InspectionOrderDetail : inspectionOrder.getOrderDetailList()) { InspectionOrderDetail.setInspectionOrderId(inspectionOrder.getInspectionOrderId()); } inspectionOrderDetailService.saveBatch(inspectionOrder.getOrderDetailList()); } return inspectionOrder; } /** * 检验委托单修改 * * @param InspectionOrder * @return */ @Override public boolean updateInspectionOrder(InspectionOrderDto InspectionOrder) { InspectionOrder oldInspectionOrder = baseMapper.selectByIdForUpdate(InspectionOrder.getInspectionOrderId()); if (oldInspectionOrder == null) { throw new ErrorException("检验委托单不存在"); } Long bindingHistoryCount = inspectionOrderBindingMapper.selectCount(Wrappers.lambdaQuery() .eq(InspectionOrderBinding::getInspectionOrderId, InspectionOrder.getInspectionOrderId())); if (bindingHistoryCount > 0 && !Objects.equals(oldInspectionOrder.getCommissionUnitId(), InspectionOrder.getCommissionUnitId())) { throw new ErrorException("已有下单记录,不允许修改委托单位"); } normalizeCommissionParty(InspectionOrder); // 编号、关联关系、正式委托编号和报告地址只能由专用流程维护。 InspectionOrder.setInspectionOrderCode(null); InspectionOrder.setInsOrderId(null); InspectionOrder.setEntrustCode(null); InspectionOrder.setFileUrl(null); InspectionOrder.setSampleTakerUserId(null); InspectionOrder.setSampleTakerUser(null); baseMapper.updateById(InspectionOrder); // 删除之前的详情 inspectionOrderDetailService.remove(Wrappers.lambdaQuery() .eq(InspectionOrderDetail::getInspectionOrderId, InspectionOrder.getInspectionOrderId())); // 新增详情 if (CollectionUtils.isNotEmpty(InspectionOrder.getOrderDetailList())) { for (InspectionOrderDetail InspectionOrderDetail : InspectionOrder.getOrderDetailList()) { InspectionOrderDetail.setInspectionOrderId(InspectionOrder.getInspectionOrderId()); } inspectionOrderDetailService.saveBatch(InspectionOrder.getOrderDetailList()); } return true; } /** * 检验委托单删除 * * @param inspectionOrderId * @return */ @Override public boolean delInspectionOrder(Integer inspectionOrderId) { InspectionOrder inspectionOrder = baseMapper.selectByIdForUpdate(inspectionOrderId); if (inspectionOrder == null) { throw new ErrorException("检验委托单不存在"); } Long bindingHistoryCount = inspectionOrderBindingMapper.selectCount(Wrappers.lambdaQuery() .eq(InspectionOrderBinding::getInspectionOrderId, inspectionOrderId)); Long bindLogCount = inspectionOrderBindLogMapper.selectCount(Wrappers.lambdaQuery() .and(wrapper -> wrapper.eq(InspectionOrderBindLog::getOldInspectionOrderId, inspectionOrderId) .or().eq(InspectionOrderBindLog::getNewInspectionOrderId, inspectionOrderId))); Long attachmentCount = inspectionOrderAttachmentMapper.selectCount(Wrappers.lambdaQuery() .eq(InspectionOrderAttachment::getInspectionOrderId, inspectionOrderId)); if (bindingHistoryCount > 0 || bindLogCount > 0 || attachmentCount > 0) { throw new ErrorException("该检验委托单已有下单或附件历史,不允许删除"); } 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); if (inspectionOrder == null) { throw new ErrorException("检验委托单不存在"); } InspectionOrderDto inspectionOrderDto = new InspectionOrderDto(); BeanUtils.copyProperties(inspectionOrder, inspectionOrderDto); // 查询详细信息 inspectionOrderDto.setOrderDetailList(inspectionOrderDetailService.list(Wrappers.lambdaQuery() .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId))); return inspectionOrderDto; } @Override public IPage pageUnboundInspectionOrder(Page page, InspectionOrder inspectionOrder) { return baseMapper.pageUnboundInspectionOrder(page, QueryWrappers.queryWrappers(inspectionOrder)); } @Override public IPage pageInspectionOrderBindings(Page page, Integer inspectionOrderId, Boolean includeDeleted) { if (inspectionOrderId == null || baseMapper.selectById(inspectionOrderId) == null) { throw new ErrorException("检验委托单不存在"); } return inspectionOrderBindingMapper.pageBindings(page, inspectionOrderId, includeDeleted); } @Override public List listInspectionOrderAttachments(Integer inspectionOrderId, Long bindingId) { if (inspectionOrderId == null || baseMapper.selectById(inspectionOrderId) == null) { throw new ErrorException("检验委托单不存在"); } if (bindingId != null) { InspectionOrderBinding binding = inspectionOrderBindingMapper.selectById(bindingId); if (binding == null || !Objects.equals(binding.getInspectionOrderId(), inspectionOrderId)) { throw new ErrorException("下单记录不属于该检验委托单"); } } return inspectionOrderAttachmentMapper.selectVisibleAttachments(inspectionOrderId, bindingId); } @Override public InspectionOrderDto getInspectionOrderForPlaceOrder(Integer inspectionOrderId) { InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId); if (inspectionOrder == null) { throw new ErrorException("检验委托单不存在"); } return getInspectionOrderOne(inspectionOrderId); } @Override public Integer addInsOrderWithInspectionOrder(InsPlaceOrderDto insPlaceOrderDto) { if (insPlaceOrderDto == null || insPlaceOrderDto.getInspectionOrderId() == null) { throw new ErrorException("请选择检验委托单"); } if (insPlaceOrderDto.getInsOrder() == null) { throw new ErrorException("缺少成品下单信息"); } if (CollectionUtils.isEmpty(insPlaceOrderDto.getSampleList())) { throw new ErrorException("请填写本次样品"); } String requestId = normalizeRequestId(insPlaceOrderDto.getRequestId()); Integer requestUserId = SecurityUtils.getUserId().intValue(); String requestHash = calculateRequestHash(insPlaceOrderDto); if (inspectionOrderBindingMapper.lockRequestUser(requestUserId) == null) { throw new ErrorException("当前操作人不存在"); } InspectionOrderBinding existing = inspectionOrderBindingMapper.selectByRequest(requestUserId, requestId); if (existing != null) { return resolveIdempotentRequest(existing, requestHash); } InspectionOrder inspectionOrder = baseMapper.selectByIdForUpdate(insPlaceOrderDto.getInspectionOrderId()); if (inspectionOrder == null) { throw new ErrorException("检验委托单不存在"); } existing = inspectionOrderBindingMapper.selectByRequest(requestUserId, requestId); if (existing != null) { return resolveIdempotentRequest(existing, requestHash); } if (inspectionOrder.getCommissionUnitId() == null) { throw new ErrorException("请先完善委托单位"); } if (inspectionOrder.getCommissionUserId() == null) { throw new ErrorException("请先完善委托人"); } fillInsOrderFromInspectionOrder(inspectionOrder, insPlaceOrderDto.getInsOrder()); Integer insOrderId = insOrderService.addInsOrder(insPlaceOrderDto.getSampleList(), insPlaceOrderDto.getInsOrder()); Long sampleTakerUserId = SecurityUtils.getUserId(); User sampleTaker = sampleTakerUserId == null ? null : userMapper.selectById(sampleTakerUserId); InspectionOrderBinding binding = new InspectionOrderBinding(); binding.setInspectionOrderId(inspectionOrder.getInspectionOrderId()); binding.setInsOrderId(insOrderId); binding.setSourceType("NEW"); binding.setRequestId(requestId); binding.setRequestHash(requestHash); binding.setRequestUserId(requestUserId); binding.setSampleTakerUserId(sampleTakerUserId == null ? null : sampleTakerUserId.intValue()); binding.setSampleTakerUser(sampleTaker == null ? null : sampleTaker.getName()); binding.setSampleData(LocalDate.now()); binding.setOrderDeleted(0); binding.setCreateUser(requestUserId); binding.setCreateTime(LocalDateTime.now()); inspectionOrderBindingMapper.insert(binding); return insOrderId; } private String normalizeRequestId(String requestId) { if (StrUtil.isBlank(requestId)) { throw new ErrorException("缺少下单请求号,请刷新页面后重试"); } try { return UUID.fromString(requestId.trim()).toString(); } catch (IllegalArgumentException e) { throw new ErrorException("下单请求号格式错误,请刷新页面后重试"); } } private Integer resolveIdempotentRequest(InspectionOrderBinding existing, String requestHash) { if (!Objects.equals(existing.getRequestHash(), requestHash)) { throw new ErrorException("请求号已被其他下单内容使用,请重新发起下单"); } if (Integer.valueOf(1).equals(existing.getOrderDeleted())) { throw new ErrorException("原订单已删除,请重新发起下单"); } return existing.getInsOrderId(); } private String calculateRequestHash(InsPlaceOrderDto dto) { LinkedHashMap content = new LinkedHashMap<>(); content.put("inspectionOrderId", dto.getInspectionOrderId()); content.put("insOrder", dto.getInsOrder()); content.put("sampleList", dto.getSampleList()); try { byte[] digest = MessageDigest.getInstance("SHA-256") .digest(JSON.toJSONString(content).getBytes(StandardCharsets.UTF_8)); StringBuilder result = new StringBuilder(64); for (byte value : digest) { result.append(String.format("%02x", value & 0xff)); } return result.toString(); } catch (Exception e) { throw new ErrorException("下单请求校验失败"); } } private void fillInsOrderFromInspectionOrder(InspectionOrder inspectionOrder, InsOrder insOrder) { insOrder.setEntrustCode(null); insOrder.setSample(inspectionOrder.getSampleName()); insOrder.setCompany(inspectionOrder.getCommissionUnit()); insOrder.setCompanyId(inspectionOrder.getCommissionUnitId()); insOrder.setProduction(inspectionOrder.getProduction()); insOrder.setPrepareUser(inspectionOrder.getCommissionUser()); insOrder.setPhone(inspectionOrder.getCommissionPhone()); insOrder.setSampleStatus(inspectionOrder.getSampleStatus()); insOrder.setIsLeave(inspectionOrder.getIsLeave()); insOrder.setProcessing(inspectionOrder.getProcessing()); insOrder.setAppointed(inspectionOrder.getAppointed()); insOrder.setSend(inspectionOrder.getSend()); } /** 仅信任客户和人员主数据,名称与电话均以主数据快照为准。 */ private void normalizeCommissionParty(InspectionOrder inspectionOrder) { if (inspectionOrder.getCommissionUnitId() == null) { throw new ErrorException("请选择委托单位"); } Custom custom = customMapper.selectById(inspectionOrder.getCommissionUnitId()); if (custom == null) { throw new ErrorException("委托单位不存在或已停用"); } inspectionOrder.setCommissionUnit(custom.getCompany()); if (inspectionOrder.getCommissionUserId() == null) { throw new ErrorException("请选择委托人"); } User commissionUser = userMapper.selectById(inspectionOrder.getCommissionUserId()); if (commissionUser == null) { throw new ErrorException("委托人不存在或已停用"); } inspectionOrder.setCommissionUser(commissionUser.getName()); inspectionOrder.setCommissionPhone(commissionUser.getPhone()); } @Override public void syncEntrustCode(Integer insOrderId) { // 委托编号属于具体成品订单,页面通过绑定关系实时读取,不再回写委托单主表。 } @Override public void syncReportFile(Integer insReportId) { if (insReportId == null) { return; } InsReport insReport = insReportService.getById(insReportId); if (insReport == null || !Integer.valueOf(1).equals(insReport.getIsRatify())) { return; } InspectionOrderBinding binding = inspectionOrderBindingMapper.selectOne(Wrappers.lambdaQuery() .eq(InspectionOrderBinding::getInsOrderId, insReport.getInsOrderId()) .eq(InspectionOrderBinding::getOrderDeleted, 0) .last("limit 1")); if (binding == null) { return; } InspectionOrder inspectionOrder = baseMapper.selectById(binding.getInspectionOrderId()); if (inspectionOrder == null) return; String sourceUrl = StrUtil.isBlank(insReport.getUrlS()) ? insReport.getUrl() : insReport.getUrlS(); if (StrUtil.isBlank(sourceUrl)) { throw new ErrorException("正式报告文件不存在,无法同步到检验委托单"); } String sourceFileName = sourceUrl.substring(sourceUrl.lastIndexOf('/') + 1); String extension = sourceFileName.lastIndexOf('.') >= 0 ? sourceFileName.substring(sourceFileName.lastIndexOf('.')) : ".docx"; String fileName = inspectionOrder.getInspectionOrderCode() + "_order_" + insReport.getInsOrderId() + "_report_" + insReportId + "_" + UUID.randomUUID() + extension; Path sourcePath = Paths.get(wordUrl + sourceUrl.replaceFirst("/word", "")); Path targetPath = Paths.get(wordUrl, fileName); try { if (!Files.exists(sourcePath)) { throw new ErrorException("正式报告文件不存在,无法同步到检验委托单"); } Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING); InspectionOrderAttachment attachment = inspectionOrderAttachmentMapper.selectOne( Wrappers.lambdaQuery() .eq(InspectionOrderAttachment::getInsReportId, insReportId).last("limit 1")); if (attachment == null) { attachment = new InspectionOrderAttachment(); attachment.setInsReportId(insReportId); attachment.setSourceType("REPORT"); attachment.setCreateUser(SecurityUtils.getUserId().intValue()); attachment.setCreateTime(LocalDateTime.now()); } attachment.setInspectionOrderId(binding.getInspectionOrderId()); attachment.setBindingId(binding.getId()); attachment.setFileName(fileName); attachment.setFileUrl("/word/" + fileName); attachment.setUpdateTime(LocalDateTime.now()); if (attachment.getId() == null) { inspectionOrderAttachmentMapper.insert(attachment); } else { inspectionOrderAttachmentMapper.updateById(attachment); } } catch (ErrorException e) { throw e; } catch (Exception e) { throw new ErrorException("报告同步失败"); } } @Override public boolean changeBinding(Integer insOrderId, Integer inspectionOrderId, String reason) { if (insOrderId == null || inspectionOrderId == null || StrUtil.isBlank(reason)) { throw new ErrorException("缺少变更关联所需参数"); } InsOrder insOrder = insOrderService.getById(insOrderId); if (insOrder == null) { throw new ErrorException("成品下单不存在"); } if (!(Integer.valueOf(0).equals(insOrder.getState()) || Integer.valueOf(2).equals(insOrder.getState())) || StrUtil.isNotBlank(insOrder.getEntrustCode())) { throw new ErrorException("当前下单已进入检验流程或已生成委托编号,不允许变更关联"); } InspectionOrderBinding binding = inspectionOrderBindingMapper.selectByOrderIdForUpdate(insOrderId); if (binding == null || Integer.valueOf(1).equals(binding.getOrderDeleted())) { throw new ErrorException("成品下单未绑定有效检验委托单"); } InspectionOrder target = baseMapper.selectByIdForUpdate(inspectionOrderId); if (target == null) { throw new ErrorException("目标检验委托单不存在"); } if (Objects.equals(binding.getInspectionOrderId(), inspectionOrderId)) { throw new ErrorException("目标检验委托单与当前委托单相同"); } if (!Objects.equals(target.getCommissionUnitId(), insOrder.getCompanyId())) { throw new ErrorException("目标检验委托单与成品订单的委托单位不一致"); } Integer oldInspectionOrderId = binding.getInspectionOrderId(); binding.setInspectionOrderId(inspectionOrderId); binding.setUpdateUser(SecurityUtils.getUserId().intValue()); binding.setUpdateTime(LocalDateTime.now()); inspectionOrderBindingMapper.updateById(binding); inspectionOrderAttachmentMapper.update(null, Wrappers.lambdaUpdate() .eq(InspectionOrderAttachment::getBindingId, binding.getId()) .set(InspectionOrderAttachment::getInspectionOrderId, inspectionOrderId) .set(InspectionOrderAttachment::getUpdateTime, LocalDateTime.now())); InspectionOrderBindLog bindLog = new InspectionOrderBindLog(); bindLog.setInsOrderId(insOrderId); bindLog.setOldInspectionOrderId(oldInspectionOrderId); bindLog.setNewInspectionOrderId(inspectionOrderId); bindLog.setChangeReason(reason.trim()); bindLog.setCreateUser(SecurityUtils.getUserId().intValue()); bindLog.setCreateTime(LocalDateTime.now()); inspectionOrderBindLogMapper.insert(bindLog); return true; } /** * 委托单成品报告上传 * * @param file * @param inspectionOrderId * @return */ @Override public boolean uploadInspectionOrderFile(MultipartFile file, Integer inspectionOrderId) { throw new ErrorException("请在下单记录中选择具体订单后上传附件"); } @Override public boolean uploadInspectionOrderBindingFile(MultipartFile file, Long bindingId) { if (file == null || file.isEmpty() || bindingId == null) { throw new ErrorException("请选择下单记录和上传文件"); } InspectionOrderBinding binding = inspectionOrderBindingMapper.selectById(bindingId); if (binding == null || Integer.valueOf(1).equals(binding.getOrderDeleted())) { throw new ErrorException("下单记录不存在或订单已删除"); } try { File realpath = new File(wordUrl); if (!realpath.exists() && !realpath.mkdirs()) { throw new ErrorException("文件目录创建失败"); } String originalName = new File(file.getOriginalFilename() == null ? "attachment" : file.getOriginalFilename()).getName(); String pathName = "binding_" + bindingId + "_" + UUID.randomUUID() + "_" + originalName; file.transferTo(new File(realpath, pathName)); InspectionOrderAttachment attachment = new InspectionOrderAttachment(); attachment.setInspectionOrderId(binding.getInspectionOrderId()); attachment.setBindingId(bindingId); attachment.setSourceType("MANUAL"); attachment.setFileName(originalName); attachment.setFileUrl("/word/" + pathName); attachment.setCreateUser(SecurityUtils.getUserId().intValue()); attachment.setCreateTime(LocalDateTime.now()); inspectionOrderAttachmentMapper.insert(attachment); return true; } catch (ErrorException e) { throw e; } catch (Exception e) { throw new ErrorException("文件上传失败"); } } @Override public void exportInspectionOrder(Integer inspectionOrderId, Long bindingId, HttpServletResponse response) { InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId); if (inspectionOrder == null) { throw new ErrorException("检验委托单不存在"); } InspectionOrderExportDto inspectionOrderExportDto = extracted(inspectionOrder); if (bindingId == null) { inspectionOrderExportDto.setEntrustCode(null); inspectionOrderExportDto.setSampleTakerUser(null); inspectionOrderExportDto.setSampleTakerUserId(null); inspectionOrderExportDto.setSampleData(null); inspectionOrderExportDto.setSampleDataString(null); } else { InspectionOrderBinding binding = inspectionOrderBindingMapper.selectById(bindingId); if (binding == null || !Objects.equals(binding.getInspectionOrderId(), inspectionOrderId)) { throw new ErrorException("下单记录不属于该检验委托单"); } InsOrder insOrder = insOrderService.getById(binding.getInsOrderId()); inspectionOrderExportDto.setEntrustCode(insOrder == null ? null : insOrder.getEntrustCode()); inspectionOrderExportDto.setSampleTakerUser(binding.getSampleTakerUser()); inspectionOrderExportDto.setSampleTakerUserId(binding.getSampleTakerUserId()); inspectionOrderExportDto.setSampleData(binding.getSampleData()); if (binding.getSampleData() != null) { inspectionOrderExportDto.setSampleDataString(binding.getSampleData() .format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); } } 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(); inputStream.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; } }