Commit 6d05aae88956d9d67c162011c8f09c17999903dc

Authored by 房远帅
1 parent 848c4710

发货单:导出pdf,记账联打印时增加“开票要求”

... ... @@ -61,6 +61,8 @@ import java.util.stream.Collectors;
61 61 import java.util.zip.ZipEntry;
62 62 import java.util.zip.ZipOutputStream;
63 63
  64 +import static com.lframework.xingyun.sc.utils.ExcelUtil.convertExcelToPdf;
  65 +
64 66 /**
65 67 * 发货单 Controller
66 68 *
... ... @@ -307,8 +309,8 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
307 309 // 按发货单ID分组明细数据
308 310 Map<String, List<ShipmentsPlanDetail>> shipmentsOrderDetailMap = detailList.stream()
309 311 .collect(Collectors.groupingBy(ShipmentsPlanDetail::getShipmentOrderId));
310   - // 为每个发货单生成Excel文件
311   - List<File> excelFiles = new ArrayList<>();
  312 + // 为每个发货单生成pdf文件
  313 + List<File> pdfFiles = new ArrayList<>();
312 314 for (ShipmentsOrderInfo orderInfo : orderInfoList) {
313 315 String id = orderInfo.getId();
314 316 List<ShipmentsPlanDetail> details = shipmentsOrderDetailMap.get(id);
... ... @@ -317,12 +319,37 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
317 319 }
318 320 // 生成单个Excel文件(使用模板引擎)
319 321 File excelFile = generateExcelWithTemplate(orderInfo, details, templatePath, tempDir, vo.getType());
320   - if (excelFile != null) {
321   - excelFiles.add(excelFile);
  322 + // === 5. 调用 LibreOffice 转 PDF ===
  323 + try {
  324 + // 2. 转换为 PDF
  325 + File pdfFile = convertExcelToPdf(excelFile, "/usr/bin/libreoffice --headless --convert-to pdf --outdir %s %s");
  326 +
  327 + // 【关键修改 2】严格检查:必须是 PDF 且存在,否则报错
  328 + if (pdfFile != null && pdfFile.exists() && pdfFile.getName().endsWith(".pdf")) {
  329 + pdfFiles.add(pdfFile); // 只添加 PDF
  330 +
  331 + // 【关键修改 3】立即删除临时 Excel,防止残留干扰
  332 + excelFile.delete();
  333 + log.info("发货单 [{}] 转换成功,已加入 PDF 列表,临时 Excel 已删除", id);
  334 + } else {
  335 + // 如果转换失败,直接抛异常,阻止生成包含错误文件的 ZIP
  336 + log.error("发货单 [{}] 转换 PDF 失败。文件存在: {}, 文件名: {}",
  337 + id, (pdfFile != null && pdfFile.exists()), (pdfFile != null ? pdfFile.getName() : "null"));
  338 + throw new DefaultClientException("发货单 [" + id + "] 生成 PDF 失败,请检查服务端 LibreOffice 状态。");
  339 + }
  340 + } catch (Exception e) {
  341 + // 发生异常时,尝试清理当前生成的 excelFile
  342 + if (excelFile != null && excelFile.exists()) {
  343 + excelFile.delete();
  344 + }
  345 + throw e;
322 346 }
323 347 }
  348 + if (pdfFiles.isEmpty()) {
  349 + throw new DefaultClientException("没有成功生成任何 PDF 文件。");
  350 + }
324 351 // 创建ZIP压缩包
325   - zipFile = createZipFile(excelFiles, tempDir);
  352 + zipFile = createZipFile(pdfFiles, tempDir);
326 353 // 将ZIP文件写入响应流
327 354 writeZipToResponse(zipFile, response);
328 355 } catch (FileNotFoundException e) {
... ... @@ -428,6 +455,14 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
428 455 }
429 456 // 准备模板数据
430 457 Map<String, Object> dataMap = JsonUtil.parseMap(JsonUtil.toJsonString(orderInfo), String.class, Object.class);
  458 + String orderId = detailList.get(0).getOrderId();
  459 + //开票要求
  460 + if (StringUtils.isNotEmpty(orderId)) {
  461 + PurchaseOrderInfo info = purchaseOrderInfoService.findById(orderId);
  462 + dataMap.put("invoicingStatus", info.getInvoicingStatus() == null ? "" : info.getInvoicingStatus());
  463 + } else {
  464 + dataMap.put("invoicingStatus", "");
  465 + }
431 466 dataMap.put("createDate", dateFormatter.format(orderInfo.getCreateTime()));
432 467 SysUser user = sysUserService.findById(orderInfo.getCreateById());
433 468 dataMap.put("createBy", user.getName());
... ...
... ... @@ -255,7 +255,7 @@ public class ExcelUtil {
255 255 if (!excelFile.exists()) {
256 256 throw new IllegalArgumentException("Excel 文件不存在: " + excelFile.getAbsolutePath());
257 257 }
258   - String pdfPath = excelFile.getAbsolutePath().replaceAll("\\.xls$", ".pdf");
  258 + String pdfPath = excelFile.getAbsolutePath().replaceAll("\\.xlsx?$", ".pdf");
259 259 File pdfFile = new File(pdfPath);
260 260 // 使用绝对路径 /usr/bin/libreoffice(CentOS 7 默认位置)
261 261 String command = String.format(
... ...