87 lines
2.5 KiB
PL/PgSQL
87 lines
2.5 KiB
PL/PgSQL
-- 钱包相关存储过程
|
|
|
|
-- 1. 充值函数
|
|
create or replace function recharge_wallet(
|
|
p_user_id uuid,
|
|
p_amount decimal
|
|
)
|
|
returns json
|
|
language plpgsql
|
|
security definer
|
|
as $$
|
|
declare
|
|
v_new_balance decimal;
|
|
v_wallet_exists boolean;
|
|
begin
|
|
if p_amount <= 0 then
|
|
return json_build_object('success', false, 'message', '充值金额必须大于0');
|
|
end if;
|
|
|
|
-- 检查并锁定用户钱包行
|
|
select exists(select 1 from ml_user_wallets where user_id = p_user_id for update) into v_wallet_exists;
|
|
|
|
if not v_wallet_exists then
|
|
-- 如果钱包不存在,创建它
|
|
insert into ml_user_wallets (user_id, balance) values (p_user_id, 0);
|
|
end if;
|
|
|
|
-- 更新余额
|
|
update ml_user_wallets
|
|
set balance = balance + p_amount, updated_at = now()
|
|
where user_id = p_user_id
|
|
returning balance into v_new_balance;
|
|
|
|
-- 插入交易记录
|
|
insert into ml_wallet_transactions (user_id, amount, balance_after, type, description)
|
|
values (p_user_id, p_amount, v_new_balance, 'recharge', '账户在线充值');
|
|
|
|
return json_build_object('success', true, 'message', '充值成功', 'new_balance', v_new_balance);
|
|
exception when others then
|
|
return json_build_object('success', false, 'message', SQLERRM);
|
|
end;
|
|
$$;
|
|
|
|
-- 2. 提现函数
|
|
create or replace function withdraw_wallet(
|
|
p_user_id uuid,
|
|
p_amount decimal
|
|
)
|
|
returns json
|
|
language plpgsql
|
|
security definer
|
|
as $$
|
|
declare
|
|
v_current_balance decimal;
|
|
v_new_balance decimal;
|
|
begin
|
|
if p_amount <= 0 then
|
|
return json_build_object('success', false, 'message', '提现金额必须大于0');
|
|
end if;
|
|
|
|
-- 检查并锁定用户钱包
|
|
select balance into v_current_balance from ml_user_wallets where user_id = p_user_id for update;
|
|
|
|
if not found then
|
|
return json_build_object('success', false, 'message', '钱包不存在');
|
|
end if;
|
|
|
|
if v_current_balance < p_amount then
|
|
return json_build_object('success', false, 'message', '余额不足');
|
|
end if;
|
|
|
|
-- 扣除余额
|
|
update ml_user_wallets
|
|
set balance = balance - p_amount, updated_at = now()
|
|
where user_id = p_user_id
|
|
returning balance into v_new_balance;
|
|
|
|
-- 插入交易记录
|
|
insert into ml_wallet_transactions (user_id, amount, balance_after, type, description)
|
|
values (p_user_id, -p_amount, v_new_balance, 'withdraw', '余额提现');
|
|
|
|
return json_build_object('success', true, 'message', '提现申请提交成功', 'new_balance', v_new_balance);
|
|
exception when others then
|
|
return json_build_object('success', false, 'message', SQLERRM);
|
|
end;
|
|
$$;
|