升鲜宝供应链管理系统box_周转物功能设计模块详细开发文档(一)---升鲜宝生鲜配送供应链管理系统源代码服务

升鲜宝供应链管理系统

box_周转物功能设计模块详细开发文档

|-----------|--------------------------------------------|
| 文档版本 | V1.0 |
| 适用系统 | 升鲜宝供应链管理系统 / 订单式物流配送模块 / 周转物管理 |
| 技术栈建议 | Spring Boot + MyBatis-Plus + MySQL + Redis |
| 数据来源 | 义乌供应链管理系统数据库SQL.txt 中 tms_box_* 周转物相关表 |
| 输出日期 | 2020-01-18 |
| 文档定位 | 研发设计、数据库建模、接口开发、业务联调、测试验收依据 |

说明:本文档在现有 tms_box_* 表结构基础上,整理周转物模块的完整业务闭环,并给出建议升级为独立 box_ 模块的数据库结构、作业流程、接口与落地方案。

修订记录

|--------|------------|-----------------------------------------|--------|
| 版本 | 日期 | 说明 | 作者 |
| V1.0 | 2020-01-18 | 首次整理:基于 tms_box_* 表分析并补齐 box_ 周转物模块设计。 | 升鲜宝 |

1. 文档目标与范围

本文档用于指导升鲜宝供应链管理系统中 box_ 周转物模块的功能设计、数据库建模、接口开发、库存与押金联动、配送签收回收联调及测试验收。

• 覆盖周转物基础资料、库存、购入、发出、归还、报损、押金、客户余额、司机暂存、库存流水。

• 兼容现有义乌供应链 SQL 中的 tms_box_* 表,并给出后续统一为 box_ 模块的重构表结构。

• 重点适配订单式物流配送:按客户配送点聚合订单、装箱、司机配送、客户签收、旧箱回收。

• 不把周转物作为普通商品库存处理,周转物是物流资产库存,不能混入 wms_goods_inventory 商品库存。

2. 现状表识别与模块边界

当前 SQL 中周转物相关表使用 tms_box_* 前缀,说明该能力原先放在配送 TMS 模块下。实际业务上,周转物需要同时服务订单、仓库、配送、司机、客户、财务押金,因此建议升级为独立 box_ 业务域。

|-----------------------|----------|-----------------------------|----------------------------------|
| 当前表 | 当前含义 | 建议新表 | 优化说明 |
| tms_box_type | 周转物类型表 | box_type | 保留分类能力,补充类型编码。 |
| tms_box | 周转物定义表 | box_item | 将长宽高重量改为 decimal,支持体积和装载计算。 |
| tms_box_inventory | 周转物库存表 | box_inventory | 补充 workhouse_id、可用、锁定、客户占用、司机暂存。 |
| tms_box_operation | 购入/报损操作表 | box_operation_bill + detail | 从单表升级为主从单据,支持一单多箱型。 |
| tms_box_out_record | 发出表 | box_out_bill + detail | 关联订单、配送任务、司机、车辆、客户配送点。 |
| tms_box_return_record | 归还表 | box_return_bill + detail | 支持原发出明细回收、损坏、丢失、赔偿。 |
| tms_box_record_log | 周转物日志表 | box_inventory_flow | 升级为统一库存流水,支持幂等与审计。 |

模块边界定义如下:

|----------|------------------|----------------------------------|
| 业务域 | 是否属于 box_ 模块 | 说明 |
| 周转物资料 | 是 | 类型、编码、名称、押金、规格、审核。 |
| 周转物库存 | 是 | 公司仓库周转物库存、客户占用、司机暂存。 |
| 商品库存 | 否 | 商品库存属于 wms_/hwms_,周转物不能作为商品库存核算。 |
| 配送任务 | 联动 | 配送任务生成周转物发出/归还,但任务本身属于物流配送模块。 |
| 客户押金/赔偿 | 联动 | 押金占用、释放、扣罚需要与财务/客户余额联动。 |
| 订单商品体积重量 | 联动 | 用于推荐周转箱数量和类型,来源订单明细/商品资料。 |

3. 业务角色与核心对象

|-----------|---------------------------------|-----------------------------------------------------|
| 角色/对象 | 职责 | 关联数据 |
| 仓库管理员 | 维护周转物资料、购入、装箱、发出审核、归还入库、盘点报损。 | box_item、box_inventory、box_out_bill、box_return_bill |
| 物流调度员 | 根据订单和线路安排车辆、司机、客户配送点,生成周转物发出计划。 | 配送任务、线路、客户点、box_out_bill |
| 司机 | 配送时携带周转物,到客户处交付、回收、拍照登记,回仓交接。 | box_driver_balance、box_return_bill |
| 客户 | 接收周转物、归还旧箱、承担押金或赔偿责任。 | box_customer_balance、押金/赔偿记录 |
| 财务/客服 | 处理押金释放、赔偿扣款、客户对账。 | 客户余额、应收、赔偿金额 |
| 系统任务 | 自动根据配送任务生成发出单、更新库存流水、生成预警。 | box_inventory_flow、box_customer_balance |

4. 核心业务口径

|--------|------------------------------|-------------------------------------------|
| 口径 | 定义 | 实现要点 |
| 周转模式 | 长期客户/固定线路客户只记录借出与归还,不立即收取押金。 | opt_type=1,客户余额记录未还数量。 |
| 押金模式 | 对新客户、临时客户或高价值周转物收取押金。 | opt_type=2,发出占用押金,归还释放押金,损坏/丢失扣押金。 |
| 公司库存 | 仓库可用周转物数量。 | box_inventory.stock_qty / available_qty。 |
| 客户占用 | 客户已收到但未归还的周转物数量。 | box_customer_balance.unreturn_qty。 |
| 司机暂存 | 司机装车带出、回收后尚未交回仓库的周转物。 | box_driver_balance.hold_qty。 |
| 库存流水 | 每一次审核、反审核、冲销都必须落库记录。 | box_inventory_flow,使用 idempotent_key 防重复。 |

5. 总体作业流程图

图 5-1 周转物模块总体作业流程图

5.1 订单配送发出流程

图 5-2 订单配送发出流程图

5.2 司机回收归还流程

图 5-3 司机回收归还流程图

6. 详细作业流程说明

6.1 周转物资料建档流程

|--------|--------------------------------------------|
| 步骤 | 说明 |
| 1 | 新增周转物类型,如周转箱、保温箱、托盘、冰袋、筐盖。 |
| 2 | 新增周转物资料,录入编码、名称、押金单价、资产价值、长宽高、重量、单位。 |
| 3 | 审核周转物资料。只有已审核且启用的周转物允许购入、发出、归还。 |
| 4 | 资料修改时如果已经被库存或历史单据引用,限制修改关键字段,例如编码、类型、押金单价。 |

6.2 期初/购入流程

|--------|------------------------------------------------|
| 步骤 | 说明 |
| 1 | 仓库管理员录入购入或期初单,选择仓库和周转物明细。 |
| 2 | 保存时不影响库存,单据状态为待审核。 |
| 3 | 审核时增加 box_inventory.stock_qty 与 available_qty。 |
| 4 | 写入 box_inventory_flow,biz_type=3购入或6盘盈。 |
| 5 | 反审核时必须按原流水冲销,不能直接删除历史记录。 |

6.3 配送装箱与发出流程

|--------|-----------------------------------------|
| 步骤 | 说明 |
| 1 | OMS订单审核后进入配送池。 |
| 2 | 系统按客户固定线路自动归线,未配置固定线路的订单进入未排线池。 |
| 3 | 配送排线按客户配送点聚合订单,计算该客户点下订单商品总体积、总重量、温控要求。 |
| 4 | 系统根据周转物体积、重量、类型推荐周转箱数量,仓库可人工调整。 |
| 5 | 生成 box_out_bill 与 box_out_bill_detail。 |
| 6 | 审核发出单后扣减库存、增加客户未还数量、增加司机暂存或配送任务携带数量。 |
| 7 | 押金模式下生成押金占用金额,后续归还或赔偿时释放/扣减。 |

6.4 客户签收与旧箱回收流程

|--------|---------------------------------|
| 步骤 | 说明 |
| 1 | 司机到达客户配送点,客户签收订单。 |
| 2 | 司机端显示本客户点:本次发出箱数、历史未还箱数、建议回收箱数。 |
| 3 | 司机录入归还周转物类型、数量,支持扫码、拍照、备注。 |
| 4 | 完好归还进入正常归还单;损坏或丢失进入异常归还/报损待处理。 |
| 5 | 客户确认后,后台或司机回仓交接时审核归还单。 |
| 6 | 审核后增加公司库存,减少客户未还,释放押金。 |

6.5 损坏、丢失、赔偿流程

|--------|------------------------------------|
| 步骤 | 说明 |
| 1 | 司机或仓库发现周转物损坏、丢失时登记异常。 |
| 2 | 客服/仓库确认责任方:客户原因、司机原因、公司自然损耗。 |
| 3 | 客户原因时,可按押金单价或资产价值生成赔偿金额。 |
| 4 | 押金模式下优先用押金抵扣;周转模式下生成客户赔偿/应收。 |
| 5 | 公司原因或自然损耗时,生成报损单,审核后减少公司资产库存或记录损耗。 |

6.6 盘点与调整流程

|--------|-----------------------------------------------|
| 步骤 | 说明 |
| 1 | 仓库定期对周转物进行盘点,系统带出账面库存。 |
| 2 | 录入实盘数量,自动计算盘盈/盘亏。 |
| 3 | 确认差异原因后生成调整单。 |
| 4 | 审核调整单后更新 box_inventory 并写 box_inventory_flow。 |
| 5 | 盘亏涉及客户/司机责任时,可转赔偿流程。 |

7. 单据状态机与审核规则

图 7-1 周转物单据通用状态机

|------------|----------------------|--------------|------------|
| 状态 | 含义 | 可执行动作 | 是否影响库存 |
| 0 待审核 | 单据已保存但未生效。 | 修改、删除、审核、作废 | 否 |
| 1 已审核 | 单据生效,已经更新库存/客户余额/流水。 | 查看、打印、反审核/冲销 | 是 |
| -1 已作废 | 单据无效,不再参与业务。 | 查看 | 否 |
| 2 已反审核/已冲销 | 原审核影响已通过反向流水冲销。 | 修改后重新审核或关闭 | 反向影响 |

审核与反审核必须遵循幂等原则:同一单据同一动作只能影响库存一次。建议每次写入 box_inventory_flow 时生成 idempotent_key,例如:BOX_OUT_AUDIT:{outCode}:{detailId}。

8. 数据模型 E-R 关系

图 8-1 box_ 周转物模块建议 E-R 关系图

E-R 设计重点:box_item 是基础资料,box_inventory 是公司仓库库存汇总;box_out_bill/detail 和 box_return_bill/detail 是作业单据;box_customer_balance 与 box_driver_balance 是高频查询余额表;box_inventory_flow 是所有库存变化的事实流水。

9. 当前 tms_box_* 表结构数据字典

|-----------------------|---------|------------------------------|
| 表名 | 表说明 | 用途说明 |
| tms_box_type | 周转物类型表 | 维护周转物分类,如周转箱、保温箱、托盘、冰袋等。 |
| tms_box | 周转物定义表 | 维护周转物编码、名称、价值、长宽高重量、审核状态。 |
| tms_box_inventory | 周转物库存表 | 维护周转物库存、借出总数、归还总数、购入数量、销毁数量。 |
| tms_box_operation | 周转物操作表 | 记录购入、报损等操作,当前为单表设计。 |
| tms_box_out_record | 周转物发出表 | 记录订单/客户维度的周转物借出、押金发出。 |
| tms_box_return_record | 周转物归还表 | 记录客户或司机归还周转物。 |
| tms_box_record_log | 周转物日志表 | 记录借出、归还、购入、销毁、报损等异动流水。 |

9.x tms_box_type

|-------------|--------------|--------------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键ID |
| type_name | varchar(100) | 类型名称 |
| enabled | int | 状态:1启用,0禁用 |
| del_flag | int | 删除标记:0正常,1删除 |
| sort_code | int | 排序码 |
| creator | bigint | 创建人ID |
| create_date | bigint | 创建时间 |
| updater | bigint | 修改人ID |
| update_date | bigint | 修改时间 |
| remark | varchar(250) | 备注 |
| use_count | int | 引用次数 |
| dept_id | bigint | 机构ID |

9.x tms_box

|-------------|---------------|----------------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键ID |
| box_type_id | bigint | 周转物类型ID |
| box_code | varchar(100) | 周转物编码 |
| box_name | varchar(100) | 周转物名称 |
| box_amount | decimal(10,3) | 周转物价值 |
| box_long | varchar(100) | 长,建议改 decimal |
| box_wide | varchar(100) | 宽,建议改 decimal |
| box_high | varchar(100) | 高,建议改 decimal |
| box_weight | varchar(100) | 重量,建议改 decimal |
| audit_state | int | 审核状态:0待审核,1已审核 |
| audit_id | bigint | 审核人 |
| audit_date | bigint | 审核时间 |
| use_count | int | 引用次数 |
| enabled | int | 状态 |
| del_flag | int | 删除标记 |
| sort_code | int | 排序码 |
| creator | bigint | 创建人 |
| create_date | bigint | 创建时间 |
| updater | bigint | 修改人 |
| update_date | bigint | 修改时间 |
| remark | varchar(250) | 备注 |
| dept_id | bigint | 机构ID |

9.x tms_box_inventory

|---------------|--------------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键ID |
| box_id | bigint | 周转物ID |
| inventory | int | 当前库存数 |
| return_total | int | 累计归还数量 |
| out_total | int | 累计借出数量 |
| buy_count | int | 购入数量 |
| destroy_count | int | 销毁数量 |
| version | int | 版本号 |
| enabled | int | 状态 |
| del_flag | int | 删除标记 |
| sort_code | int | 排序码 |
| creator | bigint | 创建人 |
| create_date | bigint | 创建时间 |
| updater | bigint | 修改人 |
| update_date | bigint | 修改时间 |
| remark | varchar(250) | 备注 |
| dept_id | bigint | 机构ID |

9.x tms_box_operation

|---------------|---------------|----------------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键ID |
| box_id | bigint | 周转物ID |
| move_count | int | 变动数量 |
| box_amount | decimal(12,3) | 周转物价值 |
| turnover_type | int | 类型:1购入,2报损 |
| audit_state | int | 审核状态:0待审核,1已审核 |
| audit_id | bigint | 审核人 |
| audit_date | bigint | 审核时间 |
| enabled | int | 状态 |
| del_flag | int | 删除标记 |
| sort_code | int | 排序码 |
| creator | bigint | 创建人 |
| create_date | bigint | 创建时间 |
| updater | bigint | 修改人 |
| update_date | bigint | 修改时间 |
| remark | varchar(250) | 备注 |

9.x tms_box_out_record

|-----------------|---------------|------------------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键ID |
| box_id | bigint | 周转物ID |
| order_code | varchar(100) | 订单编码 |
| shop_id | bigint | 客户ID |
| shop_account_id | bigint | 客户子账号ID,现注释为不用 |
| opt_type | int | 操作类型:1周转司机,2押金客户 |
| box_order_type | int | 单据类型:1手动,2自动 |
| order_type | int | 订单类型 |
| out_count | int | 发出数量 |
| out_time | bigint | 发出时间 |
| out_amount | decimal(12,3) | 借出金额/押金金额 |
| out_status | int | 借出状态:0未发出,1已发出 |
| audit_state | int | 审核状态:0待审核,1已审核 |
| audit_id | bigint | 审核人 |
| audit_date | bigint | 审核时间 |
| enabled | int | 状态 |
| del_flag | int | 删除标记 |
| sort_code | int | 排序码 |
| creator | bigint | 创建人 |
| create_date | bigint | 创建时间 |
| updater | bigint | 修改人 |
| update_date | bigint | 修改时间 |
| remark | varchar(250) | 备注 |

9.x tms_box_return_record

|-----------------|---------------|------------------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键ID |
| box_id | bigint | 周转物ID |
| order_code | varchar(100) | 订单编码 |
| shop_id | bigint | 客户ID |
| shop_account_id | bigint | 客户账号ID |
| opt_type | int | 操作类型:1周转司机,2押金客户 |
| box_order_type | int | 单据类型:1手动,2自动 |
| order_type | int | 订单类型 |
| return_count | int | 归还数量 |
| return_time | bigint | 归还时间 |
| return_amount | decimal(12,3) | 归还金额/押金释放金额 |
| return_status | int | 归还状态:0未归还,1已归还 |
| audit_state | int | 审核状态:0待审核,1已审核 |
| audit_id | bigint | 审核人 |
| audit_date | bigint | 审核时间 |
| enabled | int | 状态 |
| del_flag | int | 删除标记 |
| sort_code | int | 排序码 |
| creator | bigint | 创建人 |
| create_date | bigint | 创建时间 |
| updater | bigint | 修改人 |
| update_date | bigint | 修改时间 |
| remark | varchar(250) | 备注 |

9.x tms_box_record_log

|---------------|---------------|------------------------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键ID |
| box_id | bigint | 周转物ID |
| order_code | varchar(100) | 订单编码,现注释建议去掉 |
| order_type | int | 单号类型,现注释建议去掉 |
| move_count | int | 异动数量 |
| move_time | bigint | 异动时间 |
| box_amount | decimal(12,3) | 周转物价值 |
| turnover_type | int | 类型:1借出,2归还,3购入,4销毁,5报损 |
| enabled | int | 状态 |
| del_flag | int | 删除标记 |
| sort_code | int | 排序码 |
| creator | bigint | 创建人 |
| create_date | bigint | 创建时间 |
| updater | bigint | 修改人 |
| update_date | bigint | 修改时间 |
| remark | varchar(250) | 备注 |

10. 建议正式落地的 box_ 表结构设计

建议把周转物能力从 tms_box_* 下沉为独立 box_ 模块。以下表结构可分阶段落地:第一阶段补余额表和流水表;第二阶段重构发出/归还为主从表;第三阶段补盘点、押金、赔偿与财务联动。

|---------------------------|----------|---------------------------------|
| 建议表 | 表说明 | 核心用途 |
| box_type | 周转物类型表 | 类型编码、类型名称、启停状态。 |
| box_item | 周转物资料表 | 编码、名称、押金单价、资产价值、长宽高、体积、重量、审核状态。 |
| box_inventory | 周转物库存汇总表 | 按机构、仓库、周转物汇总库存、可用、锁定、客户占用、司机暂存。 |
| box_operation_bill | 周转物操作主表 | 购入、报损、销毁、盘盈、盘亏、调整等操作单据主表。 |
| box_operation_bill_detail | 周转物操作明细表 | 一张操作单可包含多种周转物。 |
| box_out_bill | 周转物发出主表 | 关联配送任务、线路、司机、车辆、客户、仓库。 |
| box_out_bill_detail | 周转物发出明细表 | 记录各周转物发出数量、押金金额、已还/未还数量。 |
| box_return_bill | 周转物归还主表 | 司机回收、客户主动归还、手工归还。 |
| box_return_bill_detail | 周转物归还明细表 | 正常、损坏、丢失、赔偿、原发出明细关联。 |
| box_customer_balance | 客户周转物余额表 | 客户维度未还数量、押金占用、赔偿累计。 |
| box_driver_balance | 司机周转物暂存表 | 司机配送任务维度的装车、回收、回仓交接。 |
| box_inventory_flow | 周转物库存流水表 | 所有审核动作写流水,支持审计、幂等和追溯。 |

10.x box_type(周转物类型表)

|-----------------------------------------|--------------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| type_code | varchar(64) | 类型编码 |
| type_name | varchar(100) | 类型名称 |
| sort_code | int | 排序 |
| enabled | tinyint | 启用状态 |
| del_flag | tinyint | 删除标记 |
| dept_id | bigint | 机构ID |
| creator/create_date/updater/update_date | bigint | 审计字段 |
| remark | varchar(255) | 备注 |

10.x box_item(周转物资料表)

|--------------------------|----------------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| box_type_id | bigint | 周转物类型ID |
| box_code | varchar(64) | 周转物编码 |
| box_name | varchar(100) | 周转物名称 |
| deposit_price | decimal(12,3) | 押金单价 |
| asset_price | decimal(12,3) | 资产价值 |
| length/width/height | decimal(12,3) | 长宽高 |
| volume | decimal(18,6) | 体积 |
| weight | decimal(12,3) | 重量 |
| unit_name | varchar(20) | 单位 |
| audit_state | tinyint | 审核状态 |
| audit_id/audit_date | bigint | 审核信息 |
| enabled/del_flag/dept_id | tinyint/bigint | 公共字段 |

10.x box_inventory(周转物库存汇总表)

|---------------------|----------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| dept_id | bigint | 机构ID |
| workhouse_id | bigint | 仓库ID |
| box_id | bigint | 周转物ID |
| stock_qty | int | 当前库存 |
| available_qty | int | 可用数量 |
| locked_qty | int | 锁定数量 |
| out_total_qty | int | 累计发出 |
| return_total_qty | int | 累计归还 |
| buy_total_qty | int | 累计购入 |
| damage_total_qty | int | 累计报损 |
| destroy_total_qty | int | 累计销毁 |
| customer_occupy_qty | int | 客户占用 |
| driver_hold_qty | int | 司机暂存 |
| version | int | 乐观锁 |

10.x box_out_bill(周转物发出主表)

|---------------------|---------------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| out_code | varchar(64) | 发出单号 |
| out_date | bigint | 发出日期 |
| source_type | tinyint | 来源类型 |
| source_code | varchar(64) | 来源单号 |
| delivery_task_id | bigint | 配送任务ID |
| route_id | bigint | 线路ID |
| driver_id | bigint | 司机ID |
| vehicle_id | bigint | 车辆ID |
| shop_id | bigint | 客户ID |
| workhouse_id | bigint | 发出仓库 |
| opt_type | tinyint | 周转/押金 |
| total_qty | int | 总数量 |
| total_amount | decimal(12,3) | 总金额 |
| bill_state | tinyint | 单据状态 |
| audit_id/audit_date | bigint | 审核信息 |

10.x box_out_bill_detail(周转物发出明细表)

|----------------------|---------------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| out_code | varchar(64) | 发出单号 |
| box_id | bigint | 周转物ID |
| out_qty | int | 发出数量 |
| deposit_price | decimal(12,3) | 押金单价 |
| out_amount | decimal(12,3) | 发出金额 |
| source_order_id | bigint | 来源订单ID |
| source_order_code | varchar(64) | 来源订单号 |
| source_order_info_id | bigint | 来源订单明细ID |
| customer_point_id | bigint | 客户配送点ID |
| return_qty | int | 已归还 |
| unreturn_qty | int | 未归还 |
| damage_qty/lost_qty | int | 损坏/丢失 |

10.x box_return_bill(周转物归还主表)

|------------------|---------------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| return_code | varchar(64) | 归还单号 |
| return_date | bigint | 归还日期 |
| source_type | tinyint | 来源类型 |
| source_code | varchar(64) | 来源单号 |
| delivery_task_id | bigint | 配送任务ID |
| route_id | bigint | 线路ID |
| driver_id | bigint | 司机ID |
| vehicle_id | bigint | 车辆ID |
| shop_id | bigint | 客户ID |
| workhouse_id | bigint | 归还仓库 |
| opt_type | tinyint | 周转/押金 |
| total_qty | int | 总数量 |
| total_amount | decimal(12,3) | 释放/退还金额 |
| bill_state | tinyint | 单据状态 |

10.x box_return_bill_detail(周转物归还明细表)

|---------------|---------------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| return_code | varchar(64) | 归还单号 |
| out_code | varchar(64) | 原发出单号 |
| out_detail_id | bigint | 原发出明细ID |
| box_id | bigint | 周转物ID |
| return_qty | int | 归还数量 |
| normal_qty | int | 完好数量 |
| damage_qty | int | 损坏数量 |
| lost_qty | int | 丢失数量 |
| deposit_price | decimal(12,3) | 押金单价 |
| return_amount | decimal(12,3) | 释放押金金额 |
| damage_amount | decimal(12,3) | 赔偿金额 |
| image_url | varchar(500) | 图片附件 |

10.x box_customer_balance(客户周转物余额表)

|--------------------------------|---------------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| dept_id | bigint | 机构ID |
| shop_id | bigint | 客户ID |
| box_id | bigint | 周转物ID |
| out_qty | int | 累计借出 |
| return_qty | int | 累计归还 |
| unreturn_qty | int | 当前未还 |
| damage_qty | int | 损坏 |
| lost_qty | int | 丢失 |
| deposit_amount | decimal(12,3) | 押金占用 |
| compensate_amount | decimal(12,3) | 赔偿累计 |
| last_out_date/last_return_date | bigint | 最近借出/归还 |
| version | int | 乐观锁 |

10.x box_driver_balance(司机周转物暂存表)

|------------------------|----------|----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| dept_id | bigint | 机构ID |
| driver_id | bigint | 司机ID |
| vehicle_id | bigint | 车辆ID |
| delivery_task_id | bigint | 配送任务ID |
| box_id | bigint | 周转物ID |
| load_qty | int | 装车数量 |
| delivered_qty | int | 已交付客户 |
| recovered_qty | int | 回收数量 |
| returned_warehouse_qty | int | 回仓交回 |
| hold_qty | int | 司机暂存 |

10.x box_inventory_flow(周转物库存流水表)

|-----------------------------|---------------|-----------|
| 字段名 | 字段类型 | 字段说明 |
| id | bigint | 主键 |
| flow_code | varchar(64) | 流水号 |
| dept_id/workhouse_id/box_id | bigint | 机构/仓库/周转物 |
| biz_type | tinyint | 业务类型 |
| source_code | varchar(64) | 来源单号 |
| source_detail_id | bigint | 来源明细ID |
| shop_id | bigint | 客户ID |
| driver_id | bigint | 司机ID |
| before_qty | int | 变动前数量 |
| change_qty | int | 变动数量 |
| after_qty | int | 变动后数量 |
| unit_amount | decimal(12,3) | 单价/押金 |
| change_amount | decimal(12,3) | 变动金额 |
| biz_date | bigint | 业务时间 |
| idempotent_key | varchar(128) | 幂等键 |

11. 库存与押金核心规则

|--------|--------------------------------------------------------------------------------------------|---------------------------|
| 规则 | 公式/处理 | 说明 |
| 当前可用库存 | available_qty = stock_qty - locked_qty | 发出审核前必须校验可用库存。 |
| 发出审核 | stock_qty -= out_qty;out_total_qty += out_qty;customer.unreturn_qty += out_qty | 押金模式下同时增加 deposit_amount。 |
| 归还审核 | stock_qty += normal_qty;return_total_qty += return_qty;customer.unreturn_qty -= return_qty | 损坏/丢失数量不直接进入正常库存。 |
| 押金占用 | deposit_amount += out_qty × deposit_price | 仅 opt_type=2 时执行。 |
| 押金释放 | deposit_amount -= normal_return_qty × deposit_price | 归还完好数量释放。 |
| 损坏赔偿 | damage_amount = damage_qty × compensation_price | 赔偿价格可取押金单价或资产价值。 |
| 流水幂等 | 同一来源单据+明细+动作只能写一条 flow | 唯一索引 idempotent_key 保证。 |

注意:周转物库存不参与商品成本核算,不走 product_sku_id + unit_id 商品库存主口径;它是物流资产数量管理。

12. 后端接口设计

接口命名遵循升鲜宝后端对象命名规范:请求对象使用 Req 前缀,返回对象使用 Resp 前缀;Service 接口不返回 Result,Controller 层再统一包装 Result。

|--------|---------------------------------|----------------------------|----------------------------|-----------------|
| 方法 | 接口地址 | 请求对象 | 返回对象 | 说明 |
| POST | /admin/box/type/page | ReqBoxTypePage | RespBoxTypePage | 周转物类型分页查询 |
| POST | /admin/box/type/save | ReqBoxTypeSave | RespId | 新增/修改周转物类型 |
| POST | /admin/box/item/page | ReqBoxItemPage | RespBoxItemPage | 周转物资料分页查询 |
| POST | /admin/box/item/save | ReqBoxItemSave | RespId | 保存周转物资料 |
| POST | /admin/box/item/audit | ReqBoxItemAudit | RespBoolean | 审核/反审核周转物资料 |
| POST | /admin/box/inventory/page | ReqBoxInventoryPage | RespBoxInventoryPage | 周转物库存查询 |
| POST | /admin/box/out/createByDelivery | ReqBoxOutCreateByDelivery | RespBoxOutBill | 按配送任务生成发出单 |
| POST | /admin/box/out/save | ReqBoxOutSave | RespId | 手工保存发出单 |
| POST | /admin/box/out/audit | ReqBoxOutAudit | RespBoolean | 审核发出单,扣库存、增客户占用 |
| POST | /admin/box/return/save | ReqBoxReturnSave | RespId | 保存归还单 |
| POST | /admin/box/return/audit | ReqBoxReturnAudit | RespBoolean | 审核归还单,增库存、减客户占用 |
| POST | /admin/box/customerBalance/page | ReqBoxCustomerBalancePage | RespBoxCustomerBalancePage | 客户周转物余额查询 |
| POST | /admin/box/flow/page | ReqBoxFlowPage | RespBoxFlowPage | 周转物流水查询 |
| POST | /b2bmall/box/customer/balance | ReqBoxCustomerBalanceQuery | RespBoxCustomerBalance | 客户订货端查看未还/押金 |
| POST | /driver/box/recycle/save | ReqDriverBoxRecycleSave | RespId | 司机端配送签收时登记回收 |

12.1 关键请求对象字段建议

|---------------------------|-------------------------------------------------------------------------------------------------------------------------|
| 请求对象 | 核心字段 |
| ReqBoxOutCreateByDelivery | deliveryTaskId, routeId, driverId, vehicleId, workhouseId, shopIdList, autoRecommendFlag |
| ReqBoxOutSave | outCode, sourceType, sourceCode, deliveryTaskId, routeId, driverId, vehicleId, shopId, workhouseId, optType, detailList |
| ReqBoxOutAudit | outCode, auditFlag, auditRemark, idempotentToken |
| ReqBoxReturnSave | returnCode, sourceType, deliveryTaskId, driverId, vehicleId, shopId, workhouseId, optType, detailList |
| ReqDriverBoxRecycleSave | deliveryTaskId, customerPointId, shopId, driverId, boxList, imageList, signRemark |
| ReqBoxCustomerBalancePage | shopId, boxId, unreturnOnlyFlag, optType, beginDate, endDate, page, limit |

13. Service 与领域服务设计

|----------------------|---------------|----------------------------------------------------------------------------|
| 服务类 | 职责 | 关键方法 |
| BoxItemService | 周转物资料管理。 | saveBoxItem, auditBoxItem, disableBoxItem, pageBoxItem |
| BoxInventoryService | 库存汇总查询与安全更新。 | getOrCreateInventory, increaseStock, decreaseStock, lockStock, unlockStock |
| BoxOutBillService | 发出单主流程。 | createByDeliveryTask, saveOutBill, auditOutBill, reverseAuditOutBill |
| BoxReturnBillService | 归还单主流程。 | saveReturnBill, auditReturnBill, reverseAuditReturnBill |
| BoxBalanceService | 客户余额与司机暂存。 | increaseCustomerOccupy, decreaseCustomerOccupy, updateDriverHold |
| BoxFlowService | 统一流水落库与幂等校验。 | writeFlowOnce, buildIdempotentKey, listFlow |
| BoxRecommendService | 按订单体积重量推荐周转物。 | recommendByOrder, recommendByCustomerPoint, recommendByDeliveryTask |

审核流程建议通过一个领域编排服务完成,例如 BoxPostingService,避免库存、客户余额、司机暂存、押金、流水散落在多个 Controller 或 ServiceImpl 中。

public interface BoxPostingService {

void auditOutBill(String outCode, Long auditUserId);

void reverseAuditOutBill(String outCode, Long auditUserId);

void auditReturnBill(String returnCode, Long auditUserId);

void reverseAuditReturnBill(String returnCode, Long auditUserId);

void postOperationBill(String operationCode, Long auditUserId);

}

14. 幂等、并发与数据一致性

• 发出审核、归还审核、购入审核、报损审核都必须使用事务。

• 库存更新使用 where version = oldVersion 或 MyBatis-Plus 乐观锁,避免并发扣成负数。

• 审核前校验 bill_state,只有待审核单据允许审核。

• 审核动作写入 box_inventory_flow,幂等键唯一,重复请求直接返回成功或提示已处理。

• 所有余额表都是汇总表,最终以 box_inventory_flow 作为审计依据。

• 反审核不删除原流水,而是写反向流水,保证审计链完整。

• 发出审核时,如果 available_qty 小于 out_qty,应阻止审核或进入人工确认流程。

15. 与配送、订单、财务模块联动

|---------|--------------------------------|-----------------------------------------------------------------|
| 模块 | 联动点 | 实现建议 |
| OMS订单 | 订单进入配送池后,按客户配送点聚合商品体积、重量、温控要求。 | 订单明细提供 sku_unit_id、数量、体积、重量,供 BoxRecommendService 推荐周转物。 |
| 物流配送 | 配送任务生成周转物发出单,司机端签收时登记归还。 | box_out_bill 关联 delivery_task_id、route_id、driver_id、vehicle_id。 |
| 客户资料 | 客户可配置默认周转模式/押金模式、是否必须回收、押金规则。 | 可在客户扩展配置或新增 box_customer_policy 表。 |
| 财务/客户余额 | 押金占用、释放、赔偿扣款。 | 押金流水可单独落财务表,box 表保存业务依据。 |
| 打印/小票 | 配送单打印显示本次发出箱数、历史未还箱数、应回收箱数。 | 配送打印模板增加 boxList。 |
| 消息提醒 | 客户长期未归还、司机未交回、库存不足触发提醒。 | 接入统一消息组件。 |

16. 后台页面与司机端功能

|-------|-----------|-----------------------------------|
| | 页面/功能 | 主要字段/操作 |
| 后台 | 周转物类型 | 类型编码、类型名称、排序、启用/禁用。 |
| 后台 | 周转物资料 | 编码、名称、类型、押金单价、资产价值、长宽高、体积、重量、审核。 |
| 后台 | 周转物库存 | 仓库、周转物、当前库存、可用、客户占用、司机暂存、累计发出/归还。 |
| 后台 | 周转物发出 | 来源单号、配送任务、客户、司机、车辆、周转物明细、审核、打印。 |
| 后台 | 周转物归还 | 客户、司机、归还明细、完好/损坏/丢失、照片、审核。 |
| 后台 | 客户周转物账本 | 客户、周转物、累计发出、累计归还、当前未还、押金占用、赔偿。 |
| 后台 | 周转物流水 | 业务类型、来源单号、变动前、变动数、变动后、操作人。 |
| 司机端 | 配送签收回收 | 展示应送/应回,录入回收数量,拍照,客户确认。 |
| 客户端 | 我的周转物 | 查看未归还数量、押金占用、历史发出/归还。 |

17. 分阶段落地计划

|--------|------------------------|---------------------------------------------------------|---------------------|
| 阶段 | 目标 | 开发内容 | 风险控制 |
| 第一阶段 | 在现有 tms_box_* 基础上补齐闭环 | 补客户余额、司机暂存、流水;发出归还继续兼容老表。 | 不大改原业务,先解决对账和追溯。 |
| 第二阶段 | 发出/归还单据主从化 | 新增 box_out_bill/detail、box_return_bill/detail,兼容迁移历史数据。 | 通过适配层读取新旧表,逐步切换。 |
| 第三阶段 | 配送深度集成 | 配送任务生成发出单,司机端签收回收,配送单打印箱数。 | 先在部分线路试点,校验客户未还准确性。 |
| 第四阶段 | 押金与财务闭环 | 押金占用、释放、扣罚、客户对账。 | 明确财务入账口径,避免重复应收。 |
| 第五阶段 | 盘点和预警 | 周转物盘点、盘盈盘亏、超期未还提醒、库存不足预警。 | 以流水为准,余额表可重算。 |

18. 测试用例清单

|----------|----------------------|-------------------|----------------------|
| 测试场景 | 前置条件 | 操作 | 期望结果 |
| 购入审核 | 周转物资料已审核 | 新增购入单并审核 | 库存增加,流水 biz_type=3。 |
| 发出审核 | 库存充足,客户存在 | 按配送任务生成发出单并审核 | 库存减少,客户未还增加,押金占用增加。 |
| 库存不足发出 | available_qty 小于发出数量 | 审核发出单 | 系统阻止审核并提示库存不足。 |
| 正常归还 | 客户存在未还数量 | 录入归还并审核 | 库存增加,客户未还减少,押金释放。 |
| 损坏归还 | 客户归还损坏箱 | 录入 damage_qty 并审核 | 正常库存不增加损坏数量,生成赔偿/报损。 |
| 重复审核 | 同一单据重复点击审核 | 连续提交审核请求 | 只影响库存一次,幂等键拦截重复流水。 |
| 反审核 | 已审核发出单 | 执行反审核 | 写反向流水,恢复库存和客户余额。 |
| 司机回仓交接 | 司机回收多个客户周转物 | 回仓确认 | 司机暂存减少,仓库库存增加。 |

附录 A:建议 box_ 核心表 MySQL 8.0 DDL

以下 DDL 为建议核心表,实际落地时可结合现有统一字段、租户字段、审计字段、数据权限字段进行微调。

CREATE TABLE `box_type` (

`id` bigint NOT NULL COMMENT '主键ID',

`type_code` varchar(64) NOT NULL COMMENT '类型编码',

`type_name` varchar(100) NOT NULL COMMENT '类型名称',

`sort_code` int NOT NULL DEFAULT 1 COMMENT '排序码',

`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',

`del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '0正常 1删除',

`dept_id` bigint DEFAULT 0 COMMENT '机构ID',

`creator` bigint DEFAULT 0 COMMENT '创建人ID',

`create_date` bigint DEFAULT NULL COMMENT '创建时间',

`updater` bigint DEFAULT 0 COMMENT '修改人ID',

`update_date` bigint DEFAULT NULL COMMENT '修改时间',

`remark` varchar(255) DEFAULT NULL COMMENT '备注',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_dept_type_code` (`dept_id`,`type_code`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周转物类型表';

CREATE TABLE `box_item` (

`id` bigint NOT NULL COMMENT '主键ID',

`box_type_id` bigint NOT NULL COMMENT '周转物类型ID',

`box_code` varchar(64) NOT NULL COMMENT '周转物编码',

`box_name` varchar(100) NOT NULL COMMENT '周转物名称',

`deposit_price` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '押金单价',

`asset_price` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '资产价值',

`length` decimal(12,3) DEFAULT 0.000 COMMENT '长',

`width` decimal(12,3) DEFAULT 0.000 COMMENT '宽',

`height` decimal(12,3) DEFAULT 0.000 COMMENT '高',

`volume` decimal(18,6) DEFAULT 0.000000 COMMENT '体积',

`weight` decimal(12,3) DEFAULT 0.000 COMMENT '重量',

`unit_name` varchar(20) DEFAULT '个' COMMENT '单位名称',

`audit_state` tinyint NOT NULL DEFAULT 0 COMMENT '0待审核 1已审核 -1作废',

`audit_id` bigint DEFAULT 0 COMMENT '审核人ID',

`audit_date` bigint DEFAULT NULL COMMENT '审核时间',

`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',

`del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '0正常 1删除',

`dept_id` bigint DEFAULT 0 COMMENT '机构ID',

`creator` bigint DEFAULT 0 COMMENT '创建人ID',

`create_date` bigint DEFAULT NULL COMMENT '创建时间',

`updater` bigint DEFAULT 0 COMMENT '修改人ID',

`update_date` bigint DEFAULT NULL COMMENT '修改时间',

`remark` varchar(255) DEFAULT NULL COMMENT '备注',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_dept_box_code` (`dept_id`,`box_code`),

KEY `idx_box_type_id` (`box_type_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周转物资料表';

CREATE TABLE `box_inventory` (

`id` bigint NOT NULL COMMENT '主键ID',

`dept_id` bigint NOT NULL DEFAULT 0 COMMENT '机构ID',

`workhouse_id` bigint NOT NULL DEFAULT 0 COMMENT '仓库ID',

`box_id` bigint NOT NULL COMMENT '周转物ID',

`stock_qty` int NOT NULL DEFAULT 0 COMMENT '当前库存',

`available_qty` int NOT NULL DEFAULT 0 COMMENT '可用数量',

`locked_qty` int NOT NULL DEFAULT 0 COMMENT '锁定数量',

`out_total_qty` int NOT NULL DEFAULT 0 COMMENT '累计发出数量',

`return_total_qty` int NOT NULL DEFAULT 0 COMMENT '累计归还数量',

`buy_total_qty` int NOT NULL DEFAULT 0 COMMENT '累计购入数量',

`damage_total_qty` int NOT NULL DEFAULT 0 COMMENT '累计报损数量',

`destroy_total_qty` int NOT NULL DEFAULT 0 COMMENT '累计销毁数量',

`customer_occupy_qty` int NOT NULL DEFAULT 0 COMMENT '客户占用数量',

`driver_hold_qty` int NOT NULL DEFAULT 0 COMMENT '司机暂存数量',

`version` int NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',

`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',

`del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '0正常 1删除',

`creator` bigint DEFAULT 0 COMMENT '创建人ID',

`create_date` bigint DEFAULT NULL COMMENT '创建时间',

`updater` bigint DEFAULT 0 COMMENT '修改人ID',

`update_date` bigint DEFAULT NULL COMMENT '修改时间',

`remark` varchar(255) DEFAULT NULL COMMENT '备注',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_dept_wh_box` (`dept_id`,`workhouse_id`,`box_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周转物库存汇总表';

CREATE TABLE `box_out_bill` (

`id` bigint NOT NULL COMMENT '主键ID',

`out_code` varchar(64) NOT NULL COMMENT '发出单号',

`out_date` bigint DEFAULT NULL COMMENT '发出日期',

`source_type` tinyint NOT NULL DEFAULT 3 COMMENT '来源类型 1订单 2配送任务 3手工',

`source_code` varchar(64) DEFAULT NULL COMMENT '来源单号',

`delivery_task_id` bigint DEFAULT NULL COMMENT '配送任务ID',

`route_id` bigint DEFAULT NULL COMMENT '线路ID',

`driver_id` bigint DEFAULT NULL COMMENT '司机ID',

`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',

`shop_id` bigint DEFAULT NULL COMMENT '客户ID',

`workhouse_id` bigint NOT NULL DEFAULT 0 COMMENT '发出仓库ID',

`opt_type` tinyint NOT NULL DEFAULT 1 COMMENT '1周转 2押金',

`total_qty` int NOT NULL DEFAULT 0 COMMENT '发出总数量',

`total_amount` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '押金/借出金额',

`bill_state` tinyint NOT NULL DEFAULT 0 COMMENT '0待审核 1已审核 -1作废',

`audit_id` bigint DEFAULT 0 COMMENT '审核人ID',

`audit_date` bigint DEFAULT NULL COMMENT '审核时间',

`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',

`del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '0正常 1删除',

`dept_id` bigint DEFAULT 0 COMMENT '机构ID',

`creator` bigint DEFAULT 0 COMMENT '创建人ID',

`create_date` bigint DEFAULT NULL COMMENT '创建时间',

`updater` bigint DEFAULT 0 COMMENT '修改人ID',

`update_date` bigint DEFAULT NULL COMMENT '修改时间',

`remark` varchar(255) DEFAULT NULL COMMENT '备注',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_out_code` (`out_code`),

KEY `idx_shop_date` (`shop_id`,`out_date`),

KEY `idx_delivery_task` (`delivery_task_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周转物发出主表';

CREATE TABLE `box_out_bill_detail` (

`id` bigint NOT NULL COMMENT '主键ID',

`out_code` varchar(64) NOT NULL COMMENT '发出单号',

`box_id` bigint NOT NULL COMMENT '周转物ID',

`out_qty` int NOT NULL DEFAULT 0 COMMENT '发出数量',

`deposit_price` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '押金单价',

`out_amount` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '发出金额',

`source_order_id` bigint DEFAULT NULL COMMENT '来源订单ID',

`source_order_code` varchar(64) DEFAULT NULL COMMENT '来源订单号',

`source_order_info_id` bigint DEFAULT NULL COMMENT '来源订单明细ID',

`customer_point_id` bigint DEFAULT NULL COMMENT '客户配送点ID',

`return_qty` int NOT NULL DEFAULT 0 COMMENT '已归还数量',

`unreturn_qty` int NOT NULL DEFAULT 0 COMMENT '未归还数量',

`damage_qty` int NOT NULL DEFAULT 0 COMMENT '损坏数量',

`lost_qty` int NOT NULL DEFAULT 0 COMMENT '丢失数量',

`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',

`del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '0正常 1删除',

`creator` bigint DEFAULT 0 COMMENT '创建人ID',

`create_date` bigint DEFAULT NULL COMMENT '创建时间',

`updater` bigint DEFAULT 0 COMMENT '修改人ID',

`update_date` bigint DEFAULT NULL COMMENT '修改时间',

`remark` varchar(255) DEFAULT NULL COMMENT '备注',

PRIMARY KEY (`id`),

KEY `idx_out_code` (`out_code`),

KEY `idx_box_id` (`box_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周转物发出明细表';

CREATE TABLE `box_return_bill` (

`id` bigint NOT NULL COMMENT '主键ID',

`return_code` varchar(64) NOT NULL COMMENT '归还单号',

`return_date` bigint DEFAULT NULL COMMENT '归还日期',

`source_type` tinyint NOT NULL DEFAULT 1 COMMENT '来源类型 1司机回收 2客户主动归还 3手工',

`source_code` varchar(64) DEFAULT NULL COMMENT '来源单号',

`delivery_task_id` bigint DEFAULT NULL COMMENT '配送任务ID',

`route_id` bigint DEFAULT NULL COMMENT '线路ID',

`driver_id` bigint DEFAULT NULL COMMENT '司机ID',

`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',

`shop_id` bigint DEFAULT NULL COMMENT '客户ID',

`workhouse_id` bigint NOT NULL DEFAULT 0 COMMENT '归还仓库ID',

`opt_type` tinyint NOT NULL DEFAULT 1 COMMENT '1周转 2押金',

`total_qty` int NOT NULL DEFAULT 0 COMMENT '归还总数量',

`total_amount` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '释放/退还押金金额',

`bill_state` tinyint NOT NULL DEFAULT 0 COMMENT '0待审核 1已审核 -1作废',

`audit_id` bigint DEFAULT 0 COMMENT '审核人ID',

`audit_date` bigint DEFAULT NULL COMMENT '审核时间',

`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',

`del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '0正常 1删除',

`dept_id` bigint DEFAULT 0 COMMENT '机构ID',

`creator` bigint DEFAULT 0 COMMENT '创建人ID',

`create_date` bigint DEFAULT NULL COMMENT '创建时间',

`updater` bigint DEFAULT 0 COMMENT '修改人ID',

`update_date` bigint DEFAULT NULL COMMENT '修改时间',

`remark` varchar(255) DEFAULT NULL COMMENT '备注',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_return_code` (`return_code`),

KEY `idx_shop_date` (`shop_id`,`return_date`),

KEY `idx_delivery_task` (`delivery_task_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周转物归还主表';

CREATE TABLE `box_return_bill_detail` (

`id` bigint NOT NULL COMMENT '主键ID',

`return_code` varchar(64) NOT NULL COMMENT '归还单号',

`out_code` varchar(64) DEFAULT NULL COMMENT '原发出单号',

`out_detail_id` bigint DEFAULT NULL COMMENT '原发出明细ID',

`box_id` bigint NOT NULL COMMENT '周转物ID',

`return_qty` int NOT NULL DEFAULT 0 COMMENT '归还数量',

`normal_qty` int NOT NULL DEFAULT 0 COMMENT '完好数量',

`damage_qty` int NOT NULL DEFAULT 0 COMMENT '损坏数量',

`lost_qty` int NOT NULL DEFAULT 0 COMMENT '丢失数量',

`deposit_price` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '押金单价',

`return_amount` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '释放押金金额',

`damage_amount` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '损坏赔偿金额',

`image_url` varchar(500) DEFAULT NULL COMMENT '图片附件',

`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',

`del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '0正常 1删除',

`creator` bigint DEFAULT 0 COMMENT '创建人ID',

`create_date` bigint DEFAULT NULL COMMENT '创建时间',

`updater` bigint DEFAULT 0 COMMENT '修改人ID',

`update_date` bigint DEFAULT NULL COMMENT '修改时间',

`remark` varchar(255) DEFAULT NULL COMMENT '备注',

PRIMARY KEY (`id`),

KEY `idx_return_code` (`return_code`),

KEY `idx_out_detail` (`out_detail_id`),

KEY `idx_box_id` (`box_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周转物归还明细表';

CREATE TABLE `box_customer_balance` (

`id` bigint NOT NULL COMMENT '主键ID',

`dept_id` bigint NOT NULL DEFAULT 0 COMMENT '机构ID',

`shop_id` bigint NOT NULL COMMENT '客户ID',

`box_id` bigint NOT NULL COMMENT '周转物ID',

`out_qty` int NOT NULL DEFAULT 0 COMMENT '累计借出数量',

`return_qty` int NOT NULL DEFAULT 0 COMMENT '累计归还数量',

`unreturn_qty` int NOT NULL DEFAULT 0 COMMENT '当前未还数量',

`damage_qty` int NOT NULL DEFAULT 0 COMMENT '损坏数量',

`lost_qty` int NOT NULL DEFAULT 0 COMMENT '丢失数量',

`deposit_amount` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '当前押金占用金额',

`compensate_amount` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '累计赔偿金额',

`last_out_date` bigint DEFAULT NULL COMMENT '最近借出时间',

`last_return_date` bigint DEFAULT NULL COMMENT '最近归还时间',

`version` int NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',

`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',

`del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '0正常 1删除',

`creator` bigint DEFAULT 0 COMMENT '创建人ID',

`create_date` bigint DEFAULT NULL COMMENT '创建时间',

`updater` bigint DEFAULT 0 COMMENT '修改人ID',

`update_date` bigint DEFAULT NULL COMMENT '修改时间',

`remark` varchar(255) DEFAULT NULL COMMENT '备注',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_shop_box` (`dept_id`,`shop_id`,`box_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户周转物余额表';

CREATE TABLE `box_inventory_flow` (

`id` bigint NOT NULL COMMENT '主键ID',

`flow_code` varchar(64) NOT NULL COMMENT '流水号',

`dept_id` bigint NOT NULL DEFAULT 0 COMMENT '机构ID',

`workhouse_id` bigint NOT NULL DEFAULT 0 COMMENT '仓库ID',

`box_id` bigint NOT NULL COMMENT '周转物ID',

`biz_type` tinyint NOT NULL COMMENT '1借出 2归还 3购入 4销毁 5报损 6盘盈 7盘亏 8调整',

`source_code` varchar(64) DEFAULT NULL COMMENT '来源单号',

`source_detail_id` bigint DEFAULT NULL COMMENT '来源明细ID',

`shop_id` bigint DEFAULT NULL COMMENT '客户ID',

`driver_id` bigint DEFAULT NULL COMMENT '司机ID',

`before_qty` int NOT NULL DEFAULT 0 COMMENT '变动前数量',

`change_qty` int NOT NULL DEFAULT 0 COMMENT '变动数量,出库为负,入库为正',

`after_qty` int NOT NULL DEFAULT 0 COMMENT '变动后数量',

`unit_amount` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '单个价值或押金',

`change_amount` decimal(12,3) NOT NULL DEFAULT 0.000 COMMENT '变动金额',

`biz_date` bigint DEFAULT NULL COMMENT '业务时间',

`idempotent_key` varchar(128) NOT NULL COMMENT '幂等键',

`creator` bigint DEFAULT 0 COMMENT '创建人ID',

`create_date` bigint DEFAULT NULL COMMENT '创建时间',

`remark` varchar(255) DEFAULT NULL COMMENT '备注',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_idempotent_key` (`idempotent_key`),

KEY `idx_box_biz_date` (`box_id`,`biz_date`),

KEY `idx_source_code` (`source_code`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周转物库存流水表';

附录 B:术语表

|--------|-------------------------------|
| 术语 | 说明 |
| 周转物 | 可重复使用的物流包装/容器资产,如周转箱、保温箱、托盘等。 |
| 客户占用 | 客户已收到但未归还的周转物数量。 |
| 司机暂存 | 司机配送或回收后尚未交回仓库的周转物数量。 |
| 押金占用 | 押金模式下客户未归还周转物对应的押金金额。 |
| 发出单 | 从公司仓库或配送任务发出周转物的业务单据。 |
| 归还单 | 客户或司机归还周转物的业务单据。 |
| 库存流水 | 记录周转物库存每一次变动的审计流水。 |

相关推荐
红石程序员5 小时前
破解MyEclipse
java·ide·myeclipse
信码由缰5 小时前
Maven 4 核心亮点
java
玛卡巴卡ldf5 小时前
【LeetCode 手撕算法】(多维动态规划)不同路径、最小路径和、最长回文子串、最长公共子序列、编辑距离
java·数据结构·算法·leetcode·动态规划·力扣
春天的菠菜6 小时前
【私服】一步部署 Docker 私服
java·docker·容器
有味道的男人6 小时前
1688 跨境 API:多语言、跨境代采、独立站商品同步方案
java·服务器·前端
兩尛6 小时前
C++多线程,并发
java·开发语言
逆境不可逃6 小时前
Hello-Agents 第二部分-第六章:框架开发实践
java·人工智能·分布式·学习·架构·rabbitmq
我不是8神6 小时前
面试题:Gorutine泄露的条件有哪些?
java·开发语言
爱好物理的一名程序员XiaoK6 小时前
搭建网站时遇到的只显示空白界面
java