66 lines
3.2 KiB
SQL
66 lines
3.2 KiB
SQL
DO $$
|
||
BEGIN
|
||
IF EXISTS (
|
||
SELECT 1
|
||
FROM tb_agent_wallet
|
||
WHERE deleted_at IS NULL
|
||
AND wallet_type = 'main'
|
||
AND frozen_balance > 0
|
||
) THEN
|
||
RAISE EXCEPTION '存在无法关联稳定业务引用的历史主钱包冻结金额,禁止自动切换统一冻结能力';
|
||
END IF;
|
||
IF EXISTS (
|
||
SELECT 1
|
||
FROM tb_order
|
||
WHERE deleted_at IS NULL
|
||
AND buyer_type = 'agent'
|
||
AND payment_method = 'wallet'
|
||
AND payment_status = 1
|
||
) THEN
|
||
RAISE EXCEPTION '存在缺少预占事实的历史待支付代理钱包订单,禁止自动切换统一冻结能力';
|
||
END IF;
|
||
END
|
||
$$;
|
||
|
||
CREATE TABLE tb_agent_wallet_reservation (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
agent_wallet_id BIGINT NOT NULL,
|
||
shop_id BIGINT NOT NULL,
|
||
amount BIGINT NOT NULL,
|
||
status INT NOT NULL DEFAULT 1,
|
||
reference_type VARCHAR(50) NOT NULL,
|
||
reference_id BIGINT NOT NULL,
|
||
creator BIGINT NOT NULL DEFAULT 0,
|
||
completed_at TIMESTAMPTZ,
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
shop_id_tag BIGINT NOT NULL,
|
||
enterprise_id_tag BIGINT,
|
||
CONSTRAINT ck_agent_wallet_reservation_amount CHECK (amount > 0),
|
||
CONSTRAINT ck_agent_wallet_reservation_status CHECK (status IN (1, 2, 3)),
|
||
CONSTRAINT uq_agent_wallet_reservation_reference UNIQUE (reference_type, reference_id)
|
||
);
|
||
|
||
COMMENT ON TABLE tb_agent_wallet_reservation IS '代理主钱包资金预占事实表';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.id IS '预占事实ID';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.agent_wallet_id IS '代理主钱包ID(无外键)';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.shop_id IS '钱包所属店铺ID';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.amount IS '预占金额(单位:分)';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.status IS '预占状态:1-已冻结 2-已释放 3-已完成扣除';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.reference_type IS '稳定业务引用类型';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.reference_id IS '稳定业务引用ID';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.creator IS '创建人账号ID';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.completed_at IS '释放或完成扣除时间';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.created_at IS '创建时间';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.updated_at IS '更新时间';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.shop_id_tag IS '店铺数据权限标签';
|
||
COMMENT ON COLUMN tb_agent_wallet_reservation.enterprise_id_tag IS '企业数据权限标签';
|
||
|
||
CREATE INDEX idx_agent_wallet_reservation_wallet ON tb_agent_wallet_reservation (agent_wallet_id, created_at DESC);
|
||
CREATE INDEX idx_agent_wallet_reservation_shop ON tb_agent_wallet_reservation (shop_id, created_at DESC);
|
||
CREATE INDEX idx_agent_wallet_reservation_status ON tb_agent_wallet_reservation (status, created_at ASC);
|
||
|
||
COMMENT ON INDEX idx_agent_wallet_reservation_wallet IS '按钱包查询预占事实';
|
||
COMMENT ON INDEX idx_agent_wallet_reservation_shop IS '按店铺查询预占事实';
|
||
COMMENT ON INDEX idx_agent_wallet_reservation_status IS '按预占状态扫描待处理事实';
|