现有渠道服务订单(biz_channel_service_order)为单次操作模型:一个订单 = 一次充值或一次购买,退款只能做一次。业务要求每个订单支持多次充值、多次退款、多次购买产品、按份数退订产品,且所有涉及金额的操作都需走财务确认流程。
渠道服务订单(运营手动创建,选渠道+协议,选类型 yfk/gmcp)
├── 充值型(yfk):独立充钱、独立退钱,走渠道账户余额
│ ├── 多次充值 → 每次独立金额 + 财务确认 → 余额增加
│ └── 多次退款 → 每次独立金额 + 财务确认 → 余额减少
│
└── 购买型(gmcp):独立买产品、独立退订,与余额无关
├── 多次购买 → 每次独立购买产品(份数) + 财务确认 → 持仓增加
└── 多次退订 → 按份数退订 + 财务确认 → 持仓减少
两种类型完全独立。充值管渠道余额,购买管产品份数。
核心思路:订单主表管汇总,新增操作流水表管明细,产品表管持仓。
biz_channel_service_order(改造)保留字段:
id, channel_id, channel_name, dept_name, order_type(yfk/gmcp), order_status(dsx/sxz/yzf), channel_agreement_idtenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag移除字段(迁移到流水表):
prepay_amount, purchase_total_amountfinance_submit_by, finance_submit_time, finance_submit_remark, finance_submit_attachmentsfinance_confirm_time, finance_confirm_attachments, finance_remarkrefund_apply_by, refund_apply_time, refund_amount, refund_remark, refund_attachmentsrefund_finance_confirm_time, refund_finance_confirm_attachments, refund_finance_remarkbalance_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),= 累计充值 - 累计退款 |
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='渠道服务订单操作流水';
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。
biz_channel_service_order(订单主表)
│
├── biz_channel_service_order_txn(操作流水)× N
│ 每条流水 = 一次充值/退款/购买/退订
│ 每条流水独立走财务确认流程
│
└── biz_channel_service_order_product(产品持仓)× N
购买时增加 current_qty,退订时减少
biz_channel_service_order_finance_confirm — 已有但未使用,保留不删,不再使用。
| 状态 | 含义 | 说明 |
|---|---|---|
dsx |
待生效 | 刚创建,尚无已确认的流水 |
sxz |
生效中 | 至少有一笔流水已确认 |
yzf |
已作废 | 手动作废,不再允许新操作 |
| 状态 | 含义 | 可转至 |
|---|---|---|
dsx |
待生效 | dqr(发起确认)、yzf(作废) |
dqr |
待财务确认 | yqr(财务确认) |
yqr |
已确认(终态) | — |
yzf |
已作废(终态) | — |
充值型(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
/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 | 新增 退订产品流水 | 新增 |
| 接口 | 方法 | 说明 |
|---|---|---|
/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 | 作废流水 |
| 接口 | 方法 | 说明 | 变更 |
|---|---|---|---|
/channel-service-order-txns |
GET | 查流水列表(按 status 筛选) | 改为查流水表 |
/channel-service-order-txns/{txn_id} |
GET | 流水详情 | 新增 |
| 确认 | POST | 复用 3.2 的 confirm 接口 | — |
channel-service-order/index.vue)操作按钮:
| 条件 | 按钮 |
|---|---|
| yfk + dsx | 编辑、删除、发起充值 |
| yfk + sxz | 发起充值、申请退款 |
| gmcp + dsx | 编辑、删除、购买产品 |
| gmcp + sxz | 购买产品、退订产品 |
| 任意 + yzf | 仅查看 |
详情弹窗改造:
新增弹窗:
channel-service-order-finance/index.vue)改为以流水为维度展示:
待处理 Tab(status=dqr):
已处理 Tab(status=yqr):
确认弹窗: