需求背景

物流渠道 US_AMAZON_GROUND_MLW 已对接上线,此前对接“运成”系统的 Amazon Shipping 渠道场景下,面单上已支持展示 SKU、数量及订单号 等业务信息,便于仓库拣货、复核、装箱及异常排查,实际操作中使用效果较好。
但目前西邮系统直连 Amazon Shipping 后,Amazon 官方返回的原始面单 不支持直接透出 SKU、数量及订单号信息。
结合现有业务需求,需参考此前“运成”Amazon渠道的展示方式,在 Amazon 官方面单空白区域 由系统进行二次加工补充打印,将订单相关业务信息绘制到面单上,以满足仓库实际操作需要。

需求描述

针对物流产品 US_AMAZON_GROUND_MLW,在系统获取 Amazon Shipping 官方面单后,支持对面单进行二次加工,在面单空白区域补充打印业务字段信息。
具体要求如下:

  1. 适用范围
    适用于物流产品:US_AMAZON_GROUND_MLW

  2. 补充展示内容
    系统需在 Amazon 官方原始面单的空白区域,新增打印以下信息:

订单号
SKU
SKU 对应数量

如一个订单存在多个 SKU,则按可展示空间合理排版展示;避免影响原始面单核心信息识别及承运商扫码。

开发设计

  1. 标签模板ship_template新增亚马逊模板

    INSERT INTO `westernfulfill`.`ship_template` (`st_id`, `st_name`, `st_path`, `st_status`, `warehouse_id`, `st_create_date`, `st_last_update`, `st_code`, `st_config_type`, `st_label_preview`, `agreemen_customer_code`, `agreemen_customer_name`, `return_unit`, `return_address`, `return_zip`, `return_phone`, `customer_code`, `customer_sign`, `customer_service_code`, `salespeople_code`, `customer_sign_en`, `show_location`, `province`, `city`, `user_id`, `st_order_waiting_status`, `st_custom_tracking_number`, `st_width`, `st_height`, `st_print_mode`, `st_rotate`, `st_print_select`, `cut_start_x`, `cut_start_y`, `cut_width`, `cut_length`, `text_start_x`, `text_start_y`, `text2_start_x`, `text2_start_y`, `size_ratio`, `text3_start_x`, `text3_start_y`) VALUES (26, 'AMAZON标签', '', 1, 0, '2026-03-12 18:09:23', '2026-03-12 18:09:23', 'AMAZON', 0, '', '', '', '', '', '', '', '', '', '', '', '', 0, NULL, NULL, 0, 0, 0, '100', '150', 'pdf', 0, '', NULL, NULL, NULL, NULL, 4, 265, 4, 256, 1.0000, NULL, NULL);
  2. 亚马逊渠道保存标签时,新增工具方法:

    private static boolean saveLabelPDF(String orderCode, PackageInfo packageInfo, ShipTemplate shipTemplate, String fileName, String filePath, String labelBase64, String sourceFilePath) {
         try {
             byte[] pdfBytes = Base64.decodeBase64(labelBase64);
    
             // 水印文字
             String string1 = StringUtils.isNotBlank(packageInfo.getString1()) ? packageInfo.getString1() : "";
             String string2 = StringUtils.isBlank(orderCode) ? null : orderCode;
    
             // 判断是否需要二次加工
             if (shipTemplate != null && shipTemplate.getTextStartX() != null && shipTemplate.getTextStartY() != null) {
                 pdfBytes = appendTextToPdf(pdfBytes, string1, shipTemplate.getTextStartX(), shipTemplate.getTextStartY(), string2, shipTemplate.getTextTwoStartX(), shipTemplate.getTextTwoStartY());
             }
             // 存储文件
             Path dir = Paths.get(sourceFilePath, filePath);
             Files.createDirectories(dir);
             Path file = dir.resolve(fileName + ".pdf");
             Files.write(file, pdfBytes);
    
             return true;
         } catch (Exception e) {
             return false;
         }
     }
    
     private static byte[] appendTextToPdf(byte[] pdfBytes, String text1, Integer x1, Integer y1, String text2, Integer x2, Integer y2) throws IOException {
         try (PDDocument document = PDDocument.load(pdfBytes);
              ByteArrayOutputStream out = new ByteArrayOutputStream()) {
    
             PDPage page = document.getPage(0);
             try (PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true)) {
    
                 contentStream.setFont(PDType1Font.HELVETICA_BOLD, 8);
                 // 文本1
                 contentStream.beginText();
                 contentStream.newLineAtOffset(x1, y1);
                 contentStream.showText(text1);
                 contentStream.endText();
                 // 文本2
                 if (text2 != null && x2 != null && y2 != null) {
                     contentStream.beginText();
                     contentStream.newLineAtOffset(x2, y2);
                     contentStream.showText(text2);
                     contentStream.endText();
                 }
             }
    
             document.save(out);
             return out.toByteArray();
         }
     }
  3. 保存标签时,改用上述方法即可

作者:黄天文  创建时间:2026-03-12 18:02
最后编辑:黄天文  更新时间:2026-04-17 09:34