结算管理方案.md 9.2 KB

订单结算管理方案(客户结算 + 商家结算)

1. 目标与范围

本方案用于落地 Web 端两个新页面:

  • 客户结算管理
  • 商家(供应商)结算管理

两页面保持统一风格,统一操作模式,重点保证:

  • 金额展示清晰(总金额、待结算金额、已结算金额、当前勾选金额)
  • 支持客户/供应商检索 + 日期区间检索
  • 支持检索结果跨分页快速全选并批量结算
  • 结算凭证、备注、审计信息可追溯

2. 业务规则

2.1 客户结算规则

  • 线上支付订单:默认视为已与客户结算完成,不允许再次进入客户结算批次。
  • 线下支付订单:可参与客户结算批量操作。
  • 批量结算时上传结算凭证(建议一批次可多文件),并填写结算备注(可选)。
  • 结算提交后,关联订单更新为客户已结算。

2.2 商家结算规则

  • 商家结算独立于客户结算。
  • 可按供应商、日期区间等检索待结算订单。
  • 批量结算时上传结算凭证并填写备注,提交后更新为商家已结算。

2.3 结算颗粒度

  • 当前按“整单结算”设计,不做部分金额结算。
  • 一笔订单可同时具有两个维度状态:客户结算状态、商家结算状态(互不影响)。

3. 数据模型设计

建议采用“结算主表 + 结算明细表 + 订单状态字段”组合,既便于业务操作,也便于后续审计与追溯。

3.1 订单表扩展(biz_order)

建议新增字段:

  • client_settlement_status:客户结算状态(pending/settled),默认 pending
  • supplier_settlement_status:商家结算状态(pending/settled),默认 pending
  • client_settlement_at:客户结算时间(最后一次)
  • supplier_settlement_at:商家结算时间(最后一次)

说明:

  • 线上支付订单在写入或补数时直接置 client_settlement_status = settled。
  • 查询待结算列表时按对应状态过滤。

3.2 客户结算主表(ord_client_settlement)

核心业务字段建议:

  • settlement_no:结算单号(唯一)
  • client_id:客户 ID
  • client_name:客户名称
  • order_count:订单数量
  • total_amount:结算总金额(DECIMAL(12,2))
  • voucher_urls:结算凭证(JSON 字符串或逗号分隔 URL)
  • remark:结算备注
  • settlement_at:结算时间
  • status:结算单状态(建议先保留 done,后续可扩展)

按项目规范必备字段:

  • id, is_del, create_at, create_by, create_name, update_at, update_by

3.3 客户结算明细表(ord_client_settlement_item)

核心字段建议:

  • settlement_id:结算主表 ID
  • order_id:订单 ID
  • order_no:订单号(冗余便于查询)
  • order_amount:该订单结算金额(DECIMAL(12,2))
  • client_id:客户 ID(冗余)

按项目规范必备字段:

  • id, is_del, create_at, create_by, create_name, update_at, update_by

3.4 商家结算主表(ord_supplier_settlement)

核心业务字段建议:

  • settlement_no:结算单号(唯一)
  • supplier_id:供应商 ID
  • supplier_name:供应商名称
  • order_count:订单数量
  • total_amount:结算总金额(DECIMAL(12,2))
  • voucher_urls:结算凭证
  • remark:结算备注
  • settlement_at:结算时间
  • status:结算单状态

按项目规范必备字段:

  • id, is_del, create_at, create_by, create_name, update_at, update_by

3.5 商家结算明细表(ord_supplier_settlement_item)

核心字段建议:

  • settlement_id:结算主表 ID
  • order_id:订单 ID
  • order_no:订单号
  • order_amount:该订单结算金额(DECIMAL(12,2))
  • supplier_id:供应商 ID(冗余)

按项目规范必备字段:

  • id, is_del, create_at, create_by, create_name, update_at, update_by

3.6 历史表(按规范必须)

每个业务表建立历史表并在 UPDATE 前写入旧值:

  • ord_client_settlement_his
  • ord_client_settlement_item_his
  • ord_supplier_settlement_his
  • ord_supplier_settlement_item_his

历史表规则:

  • 与主表结构一致
  • 不建索引
  • id 不要求唯一
  • 不需要 is_del

4. 索引与查询建议

4.1 订单列表检索索引(biz_order)

建议索引:

  • (is_del, client_settlement_status, payment_method, create_at)
  • (is_del, supplier_settlement_status, supplier_id, create_at)
  • (is_del, client_id, create_at)
  • (is_del, supplier_id, create_at)

4.2 明细表索引

  • ord_client_settlement_item: (settlement_id), (order_id), (client_id)
  • ord_supplier_settlement_item: (settlement_id), (order_id), (supplier_id)

5. 页面交互设计(统一风格)

5.1 页面结构

两页面统一采用:

  1. 检索区
  2. 金额统计卡片区
  3. 订单表格区(可勾选)
  4. 底部批量操作栏(显示已选条数与已选金额)

5.2 检索项

客户结算管理建议检索项:

  • 客户(支持模糊)
  • 日期区间(下单时间或完成时间,需统一)
  • 订单号
  • 结算状态(默认“待结算”)

商家结算管理建议检索项:

  • 供应商(支持模糊)
  • 日期区间
  • 订单号
  • 结算状态(默认“待结算”)

5.3 金额展示(重点)

统计区建议至少包含:

  • 检索结果订单总金额
  • 待结算金额
  • 已结算金额
  • 当前勾选结算金额

金额统一规则:

  • 后端存分,前端显示元(保留 2 位)
  • 对负值、空值、异常值统一兜底显示 0.00
  • 千分位格式化,强化可读性

5.4 跨分页全选方案(重点)

推荐交互:

  1. 用户先检索得到结果集(例如 2,356 条)
  2. 点击“全选当前页”后,提示“是否全选本次检索结果 2,356 条?”
  3. 用户确认后进入“全结果集选中”模式,并可手动排除个别不需要结算的订单
  4. 底部栏实时显示:
    • 已选总条数(跨页)
    • 已选总金额
    • 已排除条数
  5. 提交时传“筛选条件快照 + 排除 ID 列表”或“明确选中 ID 列表(数量较小时)”

推荐技术实现:

  • 维护 selectMode:
    • page:仅当前页勾选
    • allFiltered:全检索结果选中 + exclusion
  • 维护 excludedOrderIds 集合
  • 金额统计接口支持按“筛选条件 + exclusion”返回实时合计

6. API 设计建议

路由前缀按现有规范:Web 端 /api/web/

6.1 客户结算管理

  • GET /api/web/client-settlements/orders
    • 查询客户结算候选订单(支持分页、检索、统计)
  • POST /api/web/client-settlements/preview
    • 预计算本次结算金额(支持 allFiltered + exclusion)
  • POST /api/web/client-settlements
    • 创建客户结算单并落明细,批量更新订单客户结算状态
  • GET /api/web/client-settlements
    • 结算单列表
  • GET /api/web/client-settlements/{id}
    • 结算单详情(含明细)

6.2 商家结算管理

  • GET /api/web/supplier-settlements/orders
  • POST /api/web/supplier-settlements/preview
  • POST /api/web/supplier-settlements
  • GET /api/web/supplier-settlements
  • GET /api/web/supplier-settlements/{id}

6.3 创建结算请求体建议

通用字段:

  • selectionMode: ids | allFiltered
  • orderIds: string[](ids 模式下必填)
  • filters: object(allFiltered 模式下必填)
  • excludedOrderIds: string[]
  • voucherUrls: string[]
  • remark: string

服务端处理要点:

  • 使用事务:写结算主表 -> 写明细 -> 更新订单状态
  • 并发幂等:同一订单不可被重复结算(状态校验 + 行锁)
  • 返回结算单号和结算结果汇总

7. 状态流转建议

7.1 客户结算状态(订单维度)

  • pending:待客户结算
  • settled:已客户结算

特殊规则:

  • payment_method = online 的订单,初始化为 settled

7.2 商家结算状态(订单维度)

  • pending:待商家结算
  • settled:已商家结算

8. 风险与控制

  • 重复结算风险:提交前后二次校验订单状态,事务内最终校验
  • 金额一致性风险:结算金额以服务端重新聚合为准,前端金额仅展示
  • 跨分页误操作风险:全选结果集时必须二次确认并展示影响条数/金额
  • 凭证缺失风险:可配置“上传凭证必填”校验

9. 分阶段落地建议

第一阶段(必做):

  • 订单表新增双结算状态字段
  • 新增客户/商家结算主表与明细表
  • 新增两结算管理页面(检索、勾选、上传凭证、批量结算)
  • 支持跨分页全选(allFiltered + exclusion)

第二阶段(增强):

  • 结算单详情页与导出
  • 结算操作日志与权限细化
  • 结算凭证文件归档策略(对象存储生命周期)

10. 结论

本需求建议采用“两个结算业务域 + 订单双状态字段”的方案:

  • 客户结算域:ord_client_settlement + ord_client_settlement_item
  • 商家结算域:ord_supplier_settlement + ord_supplier_settlement_item
  • 订单保留 client_settlement_status / supplier_settlement_status 快速筛选能力

该方案可同时满足:

  • 批量结算效率
  • 凭证与备注留痕
  • 金额统计准确
  • 跨分页全选可用性
  • 后续审计与追溯能力