依据《农作物种子标签二维码编码规则》与《农作物种子标签通则》(GB 20464-2024),
每个二维码对应唯一的最小销售单元种子且不得重复使用,二维码必须包含四项信息并按顺序排列:
本次改造将「生产经营者名称」与「追溯网址」收敛为后端统一数据源,并让已作废的追溯码对外失效。
trace.html(已完成改造,无需前端另行处理)mes/pro/bagCode/index,前端工程中**当前缺失**,需新建)| 方法 | 路径 | 说明 | 鉴权 |
|---|---|---|---|
| GET | /public/mes/trace/config |
新增:获得溯源页配置(生产经营者名称、追溯网址) | 免登录 |
| GET | /public/mes/trace/query |
追溯查询,**响应新增 3 个字段** | 免登录 |
| GET | /admin-api/mes/pro/bag-code/export-qr |
导出二维码标签 ZIP,**新增校验与拒绝逻辑** | mes:pro-bag-code:export |
| GET | /admin-api/mes/pro/bag-code/export-excel |
导出袋码 Excel | mes:pro-bag-code:export |
GET /public/mes/trace/config
请求参数: 无
响应示例:
{
"code": 0,
"data": {
"operatorName": "新疆塔里木河种业股份有限公司",
"traceUrl": "http://1.95.78.124:9008/prod/trace.html",
"imported": false
},
"msg": ""
}
响应字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| operatorName | String | 生产经营者名称;imported=true 时为进口商名称 |
| traceUrl | String | 追溯网址,与二维码内容前缀完全一致(不含 code 参数) |
| imported | Boolean | 是否进口种子场景;为 true 时页面字段名应显示「进口商名称」 |
GET /public/mes/trace/query?code=xxx
响应字段新增:
| 字段 | 类型 | 说明 |
|---|---|---|
| codeStatus | String | VALID-有效 / CANCELED-已作废 |
| operatorName | String | 生产经营者名称(与标签印刷内容同源) |
| traceUrl | String | 追溯网址(与标签印刷内容同源) |
响应示例:
{
"code": 0,
"data": {
"sourceType": "BAG",
"requestCode": "0286267849370923",
"codeStatus": "VALID",
"operatorName": "新疆塔里木河种业股份有限公司",
"traceUrl": "http://1.95.78.124:9008/prod/trace.html",
"batchBound": false,
"itemCode": "xxx",
"itemName": "塔河4号",
"itemUnitMeasureName": "48千克"
}
}
四要素必须按国标顺序展示,其余信息排列其后:
| 顺序 | 字段 | 取值来源 | 说明 |
|---|---|---|---|
| 1 | 品种名称 | itemName + itemSpecification |
国标要素① |
| 2 | 生产经营者 / 进口商名称 | operatorName,退回 /config 的 operatorName |
国标要素②;imported=true 时标签改为「进口商名称」 |
| 3 | 单元识别代码 | requestCode 去 URL 后的码值 |
国标要素③。**仅袋码(sourceType=BAG)使用此名称**;托盘码/批次码展示为「托盘码(非最小销售单元)」「批次码(非最小销售单元)」,避免误导 |
| 4 | 追溯网址 | traceUrl,退回 /config 的 traceUrl |
国标要素④,可点击跳转 |
| 5+ | 计量单位、追溯类型、批次号、生产日期、产线 | 各自字段 | 辅助信息 |
国标要求追溯网址应可查询「种子加工批次」及「物流销售信息」,因此以下区块**对外展示**(默认折叠不展开):
| 区块 | 数据来源 | 说明 |
|---|---|---|
| 生产批次信息 | batchCode、batchStatusName、produceDate、lineName、planQuantity 等 |
对应国标「种子加工批次」;batchBound=false(未录入批次)时**不展示该区块**,避免暗示无加工批次 |
| 种子流向信息 | seedFlows(销售出库 bizType=119)或 salesTargets |
对应国标「物流销售信息」,含来源单号、客户、数量、仓库/库区 |
| 加工流转 | processTraces |
加工节点流转记录 |
以下区块**仅内部可见,不对外展示**(如需一并展示,将 detailSections(d, false) 改为 detailSections(d, true)):
| 区块 | 不展示原因 |
|---|---|
| 生产人员 | 涉及个人信息 |
| 质检信息、托盘信息、袋码列表、采购来源 | 内部明细,非消费者关切 |
| 字段 | 展示位置 | 说明 |
|---|---|---|
| 品种名称 | 列表、详情 | 袋码绑定的品种 |
| 单元识别代码 | 列表、详情 | 即袋码 code |
| 状态 | 列表 | 已生成 / 已导出印刷 / 已作废 |
| 场景 | 规则 |
|---|---|
| 导出二维码标签 | 四要素任一缺失则**拒绝导出并报错**,不再静默跳过空字段 |
| 四要素缺失提示 | 缺少品种名称 → 1040750021;缺少生产经营者 → 1040750022;缺少单元识别代码 → 1040750023;未配置追溯网址 → 1040750020 |
| 单元识别代码格式 | 必须为 1~20 位数字或字母数字组合,含连字符等符号时报 1040750024 |
| 扫码命中已作废袋码 | 返回 codeStatus=CANCELED,页面显示「该追溯码已作废,非本公司有效产品,谨防假冒」,且不再展示溯源详情 |
| 已作废码被扫描 | 仍记录扫码事件(作废码被扫是重要防伪信号),不计为查询失败 |
| 未配置追溯网址 | 非 local 环境启动时直接失败;local 环境可通过 mes.allow-plain-qr-code=true 兼容历史码 |
| 导出二维码标签 | 已作废的袋码不再导出(按批次/生成组导出时均排除)。作废码标签若印出并贴到产品上,消费者扫码会被提示「该追溯码已作废,谨防假冒」,导致真品被误判为假货 |
后端配置项(application-*.yaml 的 mes 前缀):
| 配置项 | 必填 | 说明 |
|---|---|---|
mes.trace-base-url |
是 | 追溯网址,必须为公众可访问地址。非 local 环境若为内网 IP / localhost / 占位符将**拒绝启动** |
mes.operator-name |
是 | 生产经营者名称。未配置则无法导出标签(启动时告警) |
mes.importer-name |
否 | 进口商名称,进口种子场景填写 |
mes.imported |
否 | 是否进口种子场景,默认 false |
mes.allow-plain-qr-code |
否 | 是否允许二维码编码纯码值,仅供本地兼容历史码,默认 false |
/public/mes/trace/config 获取,否则会与二维码内容不一致。mes.trace-base-url 一个真值源,前端展示时不要自行拼接 /prod 等路径。mes/pro/bagCode/index)在前端工程中缺失,业务人员目前无法自助查看/导出二维码,建议补充。