【需求背景】
WMS 打单使用 FedEx 返回的官方面单,面单上会展示尺寸、重量等信息。
为降低成本,我们在预报给 FedEx时,可能会对尺寸/重量做向下取整/压低预报值;若 FedEx 未过机复核,账单可能按预报尺重结算。
但对客户计费口径是向上取整(计费尺寸/计费重通常更高)。
结果:客户在 OMS 看到(或下载到)FedEx 官方面单上的尺寸重量偏低,与我司对客户计费值不一致,容易引发对账争议/质疑计费放大。
目标:
- OMS端 订单管理 及API接口 FedEx 渠道:对客户展示/下载的面单改为“自画面单”。
- WMS 不变:仓库操作仍用 FedEx 官方面单,确保正常揽收/扫描。
- 自画面单上尺寸信息优先展示计费尺寸/计费重(与客户物流渠道计费规则一致);若取不到物流渠道计费尺寸,则按固定规则向上取整生成展示值。
- 兼容个别客户 PO、REF 字段有单独规则的展示需求。
开发设计
表设计
新增表
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='订单附件自定义标签表';物流产品表添加自定义模板ID字段

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

核心思路
- 一根据系统配置
customLabelCustomerCodes,判断哪些客户需要处理 - 二看订单使用的物流产品是否有关联自定义模板
- 三看订单标签(跟踪号)是否有计算物流收入
logistics_fee_attribute中的尺寸重量(in/lb) - 在toC订单下载标签的入口,先判断是否已生成过自定义标签(order_attached_custom_label是否有数据)有则直接返回,不再重复生成
- 接着判断是否满足前面1、2、3点,满足则生成自定义标签
- 生成自定义标签,返回并保存到order_attached_custom_label,下次直接返回,不再生成
下载toC订单入口
- toC下载标签接口(getOrderLabel)
- oms-toC订单列表-标签下载(批量)
- 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
最后编辑:黄天文 更新时间:2026-03-03 10:08