结论
入库包裹页面在 cn-oms-backend-service 单模块内闭环:5 个 REST 端点、通用异步导出/导入配置和菜单权限脚本已全部落地,后端测试通过。前端 Vue 页面与本地调试代理就绪;剩余工作是目标环境部署 SQL 执行与真实数据验收。
- 查询、命令、RFID 子资源全部集中在 backend-service,readonly 模块零改动。1
- 导出走
misc.data_export_config*(24 列),导入走misc.data_import_config*(6 列映射到 PATCH 批量端点)。 - 无主包裹按发货 RFID 关系匹配最近渠道订单,不占用
method_type='inbound_record'。 - 页面仅菜单权限控制,不做渠道/仓库数据权限过滤。
适用于OMS 售后域入库包裹列表页已实现待部署
请求如何流经各层?
图的结构
- Vue 页面
fe - 网关 /backend
gw - InboundRecord 控制器
ctl - QueryService
qry - CommandService
cmd - 主表 + RFID 子表
db fe→gw· GET /v1/inbound-recordsgw→ctl· Pageable 绑定ctl→qry· getPage(filter)qry→db· Specification + 子查询db→fe· Page data.contentfe→gw· GET /{id}/rfidsgw→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} 错误行清单
- 前端入口
src/oms/views/order/inboundRecord/index.vue,API 定义在src/oms/api/inboundRecord.js,注册为$oms.$api.inboundRecord。 - 路径前缀
开发模式
request.js把/backend/v1/...前缀为/api/backend/v1/...;vue-static/config/index.js专用代理只剥/api,保留 context path。可用OMS_BACKEND_PROXY_TARGET覆盖后端地址。 - 单一控制器
InboundRecordController承载 GET 列表、GET RFID 明细、PATCH 修改、PATCH 批量处理、PATCH 导入五个端点;readonly 模块不再新增代码。 - 查询服务
InboundRecordQueryServiceImpl:文本包含、多值逗号 OR、精确枚举;排序白名单id/inboundTime/inboundNo/inboundType/processStatus,默认inbound_time DESC, id DESC。 - 命令服务
InboundRecordCommandServiceImpl:白名单更新、待处理→已处理条件更新、导入重复编码后值覆盖;写update_userid/update_username/update_time。 - 数据边界
主表一行一条商品明细;RFID 经
detail_id=wms_inbound_record.id且method_type='inbound_record'关联;全链路company_id=30431、is_deleted=0。
两张表怎么支撑 26 列列表?
图的结构
- 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)。
无主包裹的渠道订单号从哪来?
图的结构
- 订单号为空的无主记录
noowner - 汇总本页所有 EPC
epccol - 查发货 RFID 关系
sendrel - 已发货签收或完成?
elig - 每 EPC 取最新订单
latest - 去重拼接进 DTO
join elig→join· 否:留空elig→latest· 是epccol→sendrellatest→joinnoowner→epccolsendrel→elig
- 候选资格:发货单状态 ∈ {部分发货 2020, 已发货 2030, 已签收 2040},或销售订单
orderCompleteDate非空。 - 时间取
COALESCE(rfid.operation_time, do.do_logistics_time);同一时刻按订单号升序保证确定性。 - 用户行内修改保存过
out_order_code后,以人工值优先,派生逻辑不再覆盖。 - 筛选「渠道订单号」对无主记录同样命中派生结果(SQL 相关子查询复刻内存规则)。
导出与导入如何配置?
| 维度 | 通用导出 | 通用导入 |
|---|---|---|
| pool / type | oms / wmsInboundRecordExport | oms / wmsInboundRecordImport |
| handler | commonExportHandler | CommonImportHandler |
| 配置表 | 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 匹配;不存在报「导入入库编码不存在」;重复行后值覆盖 |
现在做到哪一步,还差什么?
- 后端测试
- 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 安装失败阻塞) | 受阻 |