入库包裹需求实现文档

结论

入库包裹页面在 cn-oms-backend-service 单模块内闭环:5 个 REST 端点、通用异步导出/导入配置和菜单权限脚本已全部落地,后端测试通过。前端 Vue 页面与本地调试代理就绪;剩余工作是目标环境部署 SQL 执行与真实数据验收。

  1. 查询、命令、RFID 子资源全部集中在 backend-service,readonly 模块零改动。1
  2. 导出走 misc.data_export_config*(24 列),导入走 misc.data_import_config*(6 列映射到 PATCH 批量端点)。
  3. 无主包裹按发货 RFID 关系匹配最近渠道订单,不占用 method_type='inbound_record'。
  4. 页面仅菜单权限控制,不做渠道/仓库数据权限过滤。

适用于OMS 售后域入库包裹列表页已实现待部署

1

请求如何流经各层?

入库包裹页面调用链
图的结构
  • Vue 页面 fe
  • 网关 /backend gw
  • InboundRecord 控制器 ctl
  • QueryService qry
  • CommandService cmd
  • 主表 + RFID 子表 db
  • fe → gw · GET /v1/inbound-records
  • gw → ctl · Pageable 绑定
  • ctl → qry · getPage(filter)
  • qry → db · Specification + 子查询
  • db → fe · Page data.content
  • fe → gw · GET /{id}/rfids
  • gw → ctl · detail_id 关联查询
  • ctl → db · RfidItemDto 列表
  • fe → gw · PATCH /{id}(行内白名单字段)
  • gw → cmd · 租户校验 + 审计字段
  • cmd → db · 更新单条
  • fe → gw · PATCH /process-status(仅待处理→已处理)
  • fe → gw · PATCH 批量(通用导入目标)
  • gw → cmd · importRows 按 inbound_no 匹配
  • cmd → fe · {row,msg} 错误行清单
  1. 前端入口

    src/oms/views/order/inboundRecord/index.vue,API 定义在 src/oms/api/inboundRecord.js,注册为 $oms.$api.inboundRecord。

  2. 路径前缀

    开发模式 request.js 把 /backend/v1/... 前缀为 /api/backend/v1/...;vue-static/config/index.js 专用代理只剥 /api,保留 context path。可用 OMS_BACKEND_PROXY_TARGET 覆盖后端地址。

  3. 单一控制器

    InboundRecordController 承载 GET 列表、GET RFID 明细、PATCH 修改、PATCH 批量处理、PATCH 导入五个端点;readonly 模块不再新增代码。

  4. 查询服务

    InboundRecordQueryServiceImpl:文本包含、多值逗号 OR、精确枚举;排序白名单 id/inboundTime/inboundNo/inboundType/processStatus,默认 inbound_time DESC, id DESC。

  5. 命令服务

    InboundRecordCommandServiceImpl:白名单更新、待处理→已处理 条件更新、导入重复编码后值覆盖;写 update_userid/update_username/update_time。

  6. 数据边界

    主表一行一条商品明细;RFID 经 detail_id=wms_inbound_record.id 且 method_type='inbound_record' 关联;全链路 company_id=30431、is_deleted=0。

2

两张表怎么支撑 26 列列表?

入库包裹主表与 RFID 子表(关键列)
图的结构
  • oms.wms_inbound_record ir
  • oms.rfid_relation_v2 rfid
  • 主表同时存包裹头与行明细字段:同一 inbound_no 多行 = 一个逻辑包裹多条明细;更新包裹头字段时同步该包裹全部明细行。
  • 列表「货品条形码」「RFID」两列来自子表聚合:条码去重中文逗号拼接,EPC 保序去重拼接,同条码多 EPC 不丢失。
  • DDL 缺 detail_id 索引,上线前补 KEY idx_method_type_detail_id (method_type, detail_id)。
3

无主包裹的渠道订单号从哪来?

无主包裹发货订单匹配
图的结构
  • 订单号为空的无主记录 noowner
  • 汇总本页所有 EPC epccol
  • 查发货 RFID 关系 sendrel
  • 已发货签收或完成? elig
  • 每 EPC 取最新订单 latest
  • 去重拼接进 DTO join
  • elig → join · 否:留空
  • elig → latest · 是
  • epccol → sendrel
  • latest → join
  • noowner → epccol
  • sendrel → elig
  • 候选资格:发货单状态 ∈ {部分发货 2020, 已发货 2030, 已签收 2040},或销售订单 orderCompleteDate 非空。
  • 时间取 COALESCE(rfid.operation_time, do.do_logistics_time);同一时刻按订单号升序保证确定性。
  • 用户行内修改保存过 out_order_code 后,以人工值优先,派生逻辑不再覆盖。
  • 筛选「渠道订单号」对无主记录同样命中派生结果(SQL 相关子查询复刻内存规则)。
4

导出与导入如何配置?

维度通用导出通用导入
pool / typeoms / wmsInboundRecordExportoms / wmsInboundRecordImport
handlercommonExportHandlerCommonImportHandler
配置表misc.data_export_config + _ext + _item(24 列)misc.data_import_config + _api + _item(6 列)
数据入口GET 列表 URL,list_key=data.content目标 API PATCH /backend/v1/inbound-records
前端组件ody-batch-export-button + ody-export-task-button公共导入弹窗 importCommonForAll
行为导出当前筛选全集,跨页,不含复选框/操作列按 inbound_no 匹配;不存在报「导入入库编码不存在」;重复行后值覆盖
5

现在做到哪一步,还差什么?

后端测试
Command 4/4、Query 1/1 通过(surefire)
编译装配
application 全 reactor compile 通过
前端构建
vue 生产构建完成;portal-static 依赖安装失败
接口契约
YApi Swagger 2.0 四个路径已发布
事项状态
后端查询/命令/RFID 五端点(backend-service 单模块)完成
临时实体 WmsInboundRecordTempEntity(EWMS 共享实体提交后需替换)临时
前端页面/API 模块/导入模板/本地代理完成
目标环境菜单、导出/导入配置 SQL 执行未执行
真实环境功能验收(8 项场景)待做
portal-static 运行时 UI 冒烟(@vue/composition-api 安装失败阻塞)受阻

正在打开交互图…