Files
junhong_cmp_fiber/migrations/000062_create_tb_card_wallet.up.sql
huang 18daeae65a
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m17s
feat: 钱包系统分离 - 代理钱包与卡钱包完全隔离
## 变更概述
将统一钱包系统拆分为代理钱包和卡钱包两个独立系统,实现数据表和代码层面的完全隔离。

## 数据库变更
- 新增 6 张表:tb_agent_wallet、tb_agent_wallet_transaction、tb_agent_recharge_record、tb_card_wallet、tb_card_wallet_transaction、tb_card_recharge_record
- 删除 3 张旧表:tb_wallet、tb_wallet_transaction、tb_recharge_record
- 代理钱包:按 (shop_id, wallet_type) 唯一标识,支持主钱包和分佣钱包
- 卡钱包:按 (resource_type, resource_id) 唯一标识,支持物联网卡和设备

## 代码变更
- Model 层:新增 AgentWallet、AgentWalletTransaction、AgentRechargeRecord、CardWallet、CardWalletTransaction、CardRechargeRecord 模型
- Store 层:新增 6 个独立 Store,支持事务、乐观锁、Redis 缓存
- Service 层:重构 commission_calculation、commission_withdrawal、order、recharge 等 8 个服务
- Bootstrap 层:更新 Store 和 Service 依赖注入
- 常量层:按钱包类型重新组织常量和 Redis Key 生成函数

## 技术特性
- 乐观锁:使用 version 字段防止并发冲突
- 多租户:支持 shop_id_tag 和 enterprise_id_tag 过滤
- 事务管理:所有余额变动使用事务保证 ACID
- 缓存策略:Cache-Aside 模式,余额变动后删除缓存

## 业务影响
- 代理钱包和卡钱包业务完全隔离,互不影响
- 为独立监控、优化、扩展打下基础
- 提升代理钱包的稳定性和独立性

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-25 09:51:00 +08:00

49 lines
2.3 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 创建卡钱包主表
-- 用于管理物联网卡和设备级别的钱包
CREATE TABLE IF NOT EXISTS tb_card_wallet (
id BIGSERIAL PRIMARY KEY,
resource_type VARCHAR(20) NOT NULL,
resource_id BIGINT NOT NULL,
balance BIGINT NOT NULL DEFAULT 0,
frozen_balance BIGINT NOT NULL DEFAULT 0,
currency VARCHAR(10) NOT NULL DEFAULT 'CNY',
status INT NOT NULL DEFAULT 1,
version INT NOT NULL DEFAULT 0,
shop_id_tag BIGINT NOT NULL,
enterprise_id_tag BIGINT,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at TIMESTAMP,
-- 约束
CONSTRAINT chk_card_wallet_balance CHECK (balance >= 0),
CONSTRAINT chk_card_wallet_frozen_balance CHECK (frozen_balance >= 0 AND frozen_balance <= balance),
CONSTRAINT chk_card_wallet_status CHECK (status IN (1, 2, 3)),
CONSTRAINT chk_card_wallet_type CHECK (resource_type IN ('iot_card', 'device'))
);
-- 唯一索引resource_type + resource_id 在未删除时唯一
CREATE UNIQUE INDEX idx_card_wallet_resource ON tb_card_wallet (resource_type, resource_id) WHERE deleted_at IS NULL;
-- 状态索引
CREATE INDEX idx_card_wallet_status ON tb_card_wallet (status);
-- 多租户过滤索引
CREATE INDEX idx_card_wallet_shop_tag ON tb_card_wallet (shop_id_tag);
-- 企业标签索引
CREATE INDEX idx_card_wallet_enterprise_tag ON tb_card_wallet (enterprise_id_tag) WHERE enterprise_id_tag IS NOT NULL;
-- 添加注释
COMMENT ON TABLE tb_card_wallet IS '卡钱包主表';
COMMENT ON COLUMN tb_card_wallet.resource_type IS '资源类型iot_card-物联网卡 | device-设备';
COMMENT ON COLUMN tb_card_wallet.resource_id IS '资源 ID关联 tb_iot_card.id 或 tb_device.id';
COMMENT ON COLUMN tb_card_wallet.balance IS '余额(单位:分)';
COMMENT ON COLUMN tb_card_wallet.frozen_balance IS '冻结余额(单位:分)';
COMMENT ON COLUMN tb_card_wallet.currency IS '币种';
COMMENT ON COLUMN tb_card_wallet.status IS '钱包状态1-正常 2-冻结 3-关闭';
COMMENT ON COLUMN tb_card_wallet.version IS '版本号(乐观锁)';
COMMENT ON COLUMN tb_card_wallet.shop_id_tag IS '店铺 ID 标签(多租户过滤)';
COMMENT ON COLUMN tb_card_wallet.enterprise_id_tag IS '企业 ID 标签(多租户过滤)';