2026-05-24-channel-service-order-multi-txn-design.md 10 KB

渠道服务订单 — 多次操作流水模型设计

背景

现有渠道服务订单(biz_channel_service_order)为单次操作模型:一个订单 = 一次充值或一次购买,退款只能做一次。业务要求每个订单支持多次充值、多次退款、多次购买产品、按份数退订产品,且所有涉及金额的操作都需走财务确认流程。

业务模型

渠道服务订单(运营手动创建,选渠道+协议,选类型 yfk/gmcp)
├── 充值型(yfk):独立充钱、独立退钱,走渠道账户余额
│   ├── 多次充值 → 每次独立金额 + 财务确认 → 余额增加
│   └── 多次退款 → 每次独立金额 + 财务确认 → 余额减少
│
└── 购买型(gmcp):独立买产品、独立退订,与余额无关
    ├── 多次购买 → 每次独立购买产品(份数) + 财务确认 → 持仓增加
    └── 多次退订 → 按份数退订 + 财务确认 → 持仓减少

两种类型完全独立。充值管渠道余额,购买管产品份数。

方案:操作流水子表

核心思路:订单主表管汇总,新增操作流水表管明细,产品表管持仓。


1. 数据模型

1.1 订单主表 biz_channel_service_order(改造)

保留字段:

  • id, channel_id, channel_name, dept_name, order_type(yfk/gmcp), order_status(dsx/sxz/yzf), channel_agreement_id
  • 公共字段:tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag

移除字段(迁移到流水表):

  • prepay_amount, purchase_total_amount
  • finance_submit_by, finance_submit_time, finance_submit_remark, finance_submit_attachments
  • finance_confirm_time, finance_confirm_attachments, finance_remark
  • refund_apply_by, refund_apply_time, refund_amount, refund_remark, refund_attachments
  • refund_finance_confirm_time, refund_finance_confirm_attachments, refund_finance_remark
  • balance_before, balance_after

新增汇总字段:

字段 类型 说明
total_recharge_amount decimal(18,2) DEFAULT 0 累计充值总额(yfk)
total_refund_amount decimal(18,2) DEFAULT 0 累计退款总额(yfk)
current_balance decimal(18,2) DEFAULT 0 当前余额(yfk),= 累计充值 - 累计退款

1.2 操作流水表 biz_channel_service_order_txn(新增)

CREATE TABLE `biz_channel_service_order_txn` (
  `id` varchar(64) NOT NULL COMMENT '主键ID',
  `service_order_id` varchar(64) NOT NULL COMMENT '关联订单ID',
  `txn_type` varchar(16) NOT NULL COMMENT 'recharge/refund/purchase/unsubscribe',
  `amount` decimal(18,2) DEFAULT NULL COMMENT '本次操作金额',
  `txn_status` varchar(16) NOT NULL DEFAULT 'dsx' COMMENT 'dsx待生效 dqr待财务确认 yqr已确认 yzf已作废',
  `products_json` text COMMENT '产品明细JSON(purchase/unsubscribe类型)',
  `remark` varchar(512) DEFAULT NULL COMMENT '备注',
  -- 发起财务确认
  `finance_submit_by` varchar(64) DEFAULT NULL COMMENT '发起确认人ID',
  `finance_submit_time` datetime DEFAULT NULL COMMENT '发起确认时间',
  `finance_submit_remark` varchar(512) DEFAULT NULL COMMENT '发起确认备注',
  `finance_submit_attachments` text COMMENT '发起确认附件',
  -- 财务确认
  `finance_confirm_time` datetime DEFAULT NULL COMMENT '财务确认时间',
  `finance_confirm_attachments` text COMMENT '财务确认附件',
  `finance_remark` varchar(512) DEFAULT NULL COMMENT '财务确认备注',
  -- 余额快照(仅 yfk 类型)
  `balance_before` decimal(18,2) DEFAULT NULL COMMENT '操作前余额',
  `balance_after` decimal(18,2) DEFAULT NULL COMMENT '操作后余额',
  -- 公共字段
  `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
  `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记',
  PRIMARY KEY (`id`),
  KEY `idx_txn_order` (`service_order_id`, `del_flag`),
  KEY `idx_txn_status` (`txn_status`, `tenant_no`, `del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='渠道服务订单操作流水';

1.3 产品持仓表 biz_channel_service_order_product(改造)

在现有字段基础上新增:

字段 类型 说明
total_buy_qty decimal(18,4) DEFAULT 0 累计购买数量
total_unsubscribe_qty decimal(18,4) DEFAULT 0 累计退订数量
current_qty decimal(18,4) DEFAULT 0 当前持有数量
total_unsubscribe_amount decimal(18,2) DEFAULT 0 累计退订金额

保留现有字段:agreement_unit_price, buy_qty(首次购买), buy_amount。

1.4 关系图

biz_channel_service_order(订单主表)
  │
  ├── biz_channel_service_order_txn(操作流水)× N
  │     每条流水 = 一次充值/退款/购买/退订
  │     每条流水独立走财务确认流程
  │
  └── biz_channel_service_order_product(产品持仓)× N
        购买时增加 current_qty,退订时减少

1.5 废弃表

biz_channel_service_order_finance_confirm — 已有但未使用,保留不删,不再使用。


2. 状态机

2.1 订单主表状态

状态 含义 说明
dsx 待生效 刚创建,尚无已确认的流水
sxz 生效中 至少有一笔流水已确认
yzf 已作废 手动作废,不再允许新操作

2.2 流水状态

状态 含义 可转至
dsx 待生效 dqr(发起确认)、yzf(作废)
dqr 待财务确认 yqr(财务确认)
yqr 已确认(终态) —
yzf 已作废(终态) —

2.3 操作流转

充值型(yfk):

创建订单 → [dsx]
  ├─ 发起充值 → txn(recharge, dsx)
  │    └─ 发起确认 → txn(dqr) → 财务确认 → txn(yqr)
  │         └─ order.total_recharge_amount += amount
  │           order.current_balance += amount
  │           order.status → sxz (首次确认时)
  │
  └─ 申请退款 → txn(refund, dsx), amount ≤ current_balance
       └─ 发起确认 → txn(dqr) → 财务确认 → txn(yqr)
            └─ order.total_refund_amount += amount
              order.current_balance -= amount

购买型(gmcp):

创建订单 → [dsx]
  ├─ 购买产品 → txn(purchase, dsx) + 创建/更新 product 持仓
  │    └─ 发起确认 → txn(dqr) → 财务确认 → txn(yqr)
  │         └─ product.total_buy_qty += qty
  │           product.current_qty += qty
  │           order.status → sxz (首次确认时)
  │
  └─ 退订产品 → txn(unsubscribe, dsx), qty ≤ product.current_qty
       └─ 发起确认 → txn(dqr) → 财务确认 → txn(yqr)
            └─ product.total_unsubscribe_qty += qty
              product.current_qty -= qty
              product.total_unsubscribe_amount += qty × unit_price

3. API 设计

3.1 订单管理(/api/admin/channel-service-orders)

接口 方法 说明 变更
/ GET 订单列表 不变
/{order_id} GET 订单详情 + 流水列表 + 产品持仓 扩展返回
/ POST 创建订单 不变
/{order_id} PUT 编辑订单基本信息 不变
/{order_id} DELETE 删除 dsx 状态订单 不变
/{order_id}/void PUT 作废订单 不变
/{order_id}/recharge POST 新增 发起充值流水 新增
/{order_id}/refund POST 新增 申请退款流水 替代原退款
/{order_id}/purchase POST 新增 购买产品流水 新增
/{order_id}/unsubscribe POST 新增 退订产品流水 新增

3.2 流水操作

接口 方法 说明
/channel-service-order-txns/{txn_id}/submit-finance POST 发起财务确认
/channel-service-order-txns/{txn_id}/confirm POST 财务确认(收款/退付)
/channel-service-order-txns/{txn_id}/void PUT 作废流水

3.3 财务确认页

接口 方法 说明 变更
/channel-service-order-txns GET 查流水列表(按 status 筛选) 改为查流水表
/channel-service-order-txns/{txn_id} GET 流水详情 新增
确认 POST 复用 3.2 的 confirm 接口 —

4. 前端改造

4.1 订单管理页(channel-service-order/index.vue)

操作按钮:

条件 按钮
yfk + dsx 编辑、删除、发起充值
yfk + sxz 发起充值、申请退款
gmcp + dsx 编辑、删除、购买产品
gmcp + sxz 购买产品、退订产品
任意 + yzf 仅查看

详情弹窗改造:

  • Section 1:基本信息(含余额/汇总金额)
  • Section 2:操作记录(流水时间线列表)
  • Section 3:产品持仓(gmcp 类型,显示当前持有份数)

新增弹窗:

  • 发起充值:金额、备注、凭证上传
  • 申请退款:金额(≤余额)、备注、凭证上传
  • 购买产品:选项目/规格、输入份数、自动算金额
  • 退订产品:选已持有项目、输入退订份数(≤持有量)

4.2 财务确认页(channel-service-order-finance/index.vue)

改为以流水为维度展示:

待处理 Tab(status=dqr):

  • 显示:流水类型标签、渠道名称、金额、产品明细、提交人/时间
  • 操作:查看详情、确认收款/退付

已处理 Tab(status=yqr):

  • 显示同上,操作仅查看

确认弹窗:

  • 上半部分展示流水详情(发起确认信息)
  • 下半部分输入财务确认备注+凭证

4.3 废弃功能

  • 移除原订单级别的「发起财务确认」「申请退款」按钮和弹窗(改为流水级别操作)
  • 移除订单主表上平铺的 finance/refund 字段展示