【需求背景】

WMS 打单使用 FedEx 返回的官方面单,面单上会展示尺寸、重量等信息。
为降低成本,我们在预报给 FedEx时,可能会对尺寸/重量做向下取整/压低预报值;若 FedEx 未过机复核,账单可能按预报尺重结算。
但对客户计费口径是向上取整(计费尺寸/计费重通常更高)。
结果:客户在 OMS 看到(或下载到)FedEx 官方面单上的尺寸重量偏低,与我司对客户计费值不一致,容易引发对账争议/质疑计费放大。

目标:

  1. OMS端 订单管理 及API接口 FedEx 渠道:对客户展示/下载的面单改为“自画面单”。
  2. WMS 不变:仓库操作仍用 FedEx 官方面单,确保正常揽收/扫描。
  3. 自画面单上尺寸信息优先展示计费尺寸/计费重(与客户物流渠道计费规则一致);若取不到物流渠道计费尺寸,则按固定规则向上取整生成展示值。
  4. 兼容个别客户 PO、REF 字段有单独规则的展示需求。

开发设计

表设计

  1. 新增表

    CREATE TABLE `order_attached_custom_label` (
    `label_id` int NOT NULL AUTO_INCREMENT COMMENT '标签类型',
    `oat_id` int NOT NULL DEFAULT '0' COMMENT '订单附件ID',
    `label_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0不可用 1可用',
    `label_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '标签类型:png jpg pdf',
    `label_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '标签路径',
    `label_note` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '标签说明(名称)',
    `label_source` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '标签来源',
    `label_error_msg` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '异常原因',
    `create_time` datetime NOT NULL COMMENT '创建时间',
    PRIMARY KEY (`label_id`),
    KEY `idx_oat_id` (`oat_id`),
    KEY `idx_create_time` (`create_time`),
    KEY `idx_label_status` (`label_status`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='订单附件自定义标签表';
  2. 物流产品表添加自定义模板ID字段

  3. wms物流产品页面添加关联模板

核心思路

  1. 一根据系统配置customLabelCustomerCodes,判断哪些客户需要处理
  2. 二看订单使用的物流产品是否有关联自定义模板
  3. 三看订单标签(跟踪号)是否有计算物流收入logistics_fee_attribute中的尺寸重量(in/lb)
  4. 在toC订单下载标签的入口,先判断是否已生成过自定义标签(order_attached_custom_label是否有数据)有则直接返回,不再重复生成
  5. 接着判断是否满足前面1、2、3点,满足则生成自定义标签
  6. 生成自定义标签,返回并保存到order_attached_custom_label,下次直接返回,不再生成

下载toC订单入口

  1. toC下载标签接口(getOrderLabel)
  2. oms-toC订单列表-标签下载(批量)
  3. oms-toC订单详情(单个标签下载)

代码核心

osm项目-OrderAttachedCustomLabelService 接口,后续直接点击引用地方即可看出哪些地方已经调整

DEMO 代码(初版)

类似fedex 获取pod一样,只有用户在oms/api调用获取面单的时候在改面单上面的信息,下面是实现先遮掩对应的信息,在重新写标签信息的demo例子代码

package com.wpglb.logistics.utils;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;

public class printLabelUtil {

    public static String overlayWeightAndDims(
            String pdfBase64,
            String displayWeight,
            String displayDims
    ) throws IOException {

        byte[] pdfBytes = Base64.getDecoder().decode(pdfBase64);

        try (PDDocument document = PDDocument.load(pdfBytes)) {

            PDPage page = document.getPage(0);
            PDRectangle box = page.getMediaBox();
            float pageHeight = box.getHeight();

            // ===== 1. 覆盖 ACTWGT / DIMS 两行 =====
            try (PDPageContentStream cover = new PDPageContentStream(
                    document, page,
                    PDPageContentStream.AppendMode.APPEND,
                    true, true
            )) {
                cover.setNonStrokingColor(Color.WHITE);
                //pageHeight - 65 被减数越大越往下,越小越往上
                // DIMS
                cover.addRect(200, pageHeight - 63, 200, 7);
                // ACTWGT
                cover.addRect(200, pageHeight - 49, 200, 7);

                cover.fill();
            }

            // ===== 2. 重写 OMS 展示值 =====
            try (PDPageContentStream writer = new PDPageContentStream(
                    document, page,
                    PDPageContentStream.AppendMode.APPEND,
                    true, true
            )) {
                writer.beginText();
                writer.setFont(PDType1Font.HELVETICA, 7);
                writer.setNonStrokingColor(Color.BLACK);

                writer.newLineAtOffset(203, pageHeight - 48f);
                writer.showText("ACTWGT: " + displayWeight);
                writer.newLineAtOffset(0, -9);
                writer.endText();



                // 显示 DIMS
                writer.beginText();
                writer.setFont(PDType1Font.HELVETICA, 7);
                writer.setNonStrokingColor(Color.BLACK);
                //pageHeight - 65 被减数越大越往下,越小越往上
                writer.newLineAtOffset(203, pageHeight - 63);
                writer.showText("DIMS: " + displayDims);
                writer.endText();
            }
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            document.save(out);
            return Base64.getEncoder().encodeToString(out.toByteArray());
        }
    }

}

详细设计

作者:伍儒普  创建时间:2026-01-19 15:09
最后编辑:黄天文  更新时间:2026-03-03 10:08