sqlx: wallet logic is implemented complete. WIP %55

r/paopao-ce-plus
Michael Li 2 years ago
parent 250fd0af15
commit fc8a33a14d
No known key found for this signature in database

@ -11,7 +11,6 @@ import (
"github.com/jmoiron/sqlx"
"github.com/rocboss/paopao-ce/internal/core"
"github.com/rocboss/paopao-ce/internal/core/ms"
"github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr"
"github.com/rocboss/paopao-ce/internal/dao/sakila/yesql/cc"
)

@ -5,12 +5,14 @@
package sakila
import (
"time"
"github.com/jmoiron/sqlx"
"github.com/rocboss/paopao-ce/internal/conf"
"github.com/rocboss/paopao-ce/internal/core"
"github.com/rocboss/paopao-ce/internal/core/ms"
"github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr"
"github.com/rocboss/paopao-ce/internal/dao/sakila/yesql/cc"
"github.com/rocboss/paopao-ce/pkg/debug"
)
var (
@ -22,14 +24,14 @@ type walletSrv struct {
q *cc.Wallet
}
func (s *walletSrv) GetRechargeByID(id int64) (*ms.WalletRecharge, error) {
res := &ms.WalletRecharge{}
err := s.q.GetRechargeById.Get(res, id)
return res, err
func (s *walletSrv) GetRechargeByID(id int64) (res *ms.WalletRecharge, err error) {
err = s.q.GetRechargeById.Get(res, id)
return
}
func (s *walletSrv) CreateRecharge(userId, amount int64) (*ms.WalletRecharge, error) {
res, err := s.q.CreateRecharge.Exec(userId, amount)
now := time.Now().Unix()
res, err := s.q.CreateRecharge.Exec(userId, amount, now)
if err != nil {
return nil, err
}
@ -39,17 +41,17 @@ func (s *walletSrv) CreateRecharge(userId, amount int64) (*ms.WalletRecharge, er
}
return &ms.WalletRecharge{
Model: &dbr.Model{
ID: id,
ID: id,
CreatedOn: now,
},
UserID: userId,
Amount: amount,
}, nil
}
func (s *walletSrv) GetUserWalletBills(userID int64, offset, limit int) ([]*ms.WalletStatement, error) {
res := []*ms.WalletStatement{}
err := s.q.GetUserWalletBills.Select(&res, userID, limit, offset)
return res, err
func (s *walletSrv) GetUserWalletBills(userID int64, offset, limit int) (res []*ms.WalletStatement, err error) {
err = s.q.GetUserWalletBills.Select(&res, userID, limit, offset)
return
}
func (s *walletSrv) GetUserWalletBillCount(userID int64) (res int64, err error) {
@ -57,16 +59,68 @@ func (s *walletSrv) GetUserWalletBillCount(userID int64) (res int64, err error)
return
}
func (s *walletSrv) HandleRechargeSuccess(recharge *ms.WalletRecharge, tradeNo string) error {
// TODO
debug.NotImplemented()
return nil
func (s *walletSrv) HandleRechargeSuccess(r *ms.WalletRecharge, tradeNo string) error {
return s.with(func(tx *sqlx.Tx) error {
var oldBalance int64
// 获取当前金额
err := tx.Stmtx(s.q.GetUserBalance).Get(&oldBalance, r.UserID)
if err != nil {
return err
}
now := time.Now().Unix()
// 更新金额
if _, err := tx.Stmtx(s.q.AddUserBalance).Exec(r.Amount, now, r.UserID); err != nil {
return err
}
// 新增账单
args := []any{r.UserID, r.Amount, oldBalance + r.Amount, "用户充值", now}
if _, err = tx.Stmtx(s.q.CreateWalletStatement).Exec(args...); err != nil {
return err
}
// 标记为已付款
if _, err = tx.Stmtx(s.q.MarkSuccessRecharge).Exec(tradeNo, now, r.ID); err != nil {
return err
}
return nil
})
}
func (s *walletSrv) HandlePostAttachmentBought(post *ms.Post, user *ms.User) error {
// TODO
debug.NotImplemented()
return nil
return s.with(func(tx *sqlx.Tx) error {
now := time.Now().Unix()
// 扣除金额
_, err := tx.Stmtx(s.q.MinusUserBalance).Exec(post.AttachmentPrice, now, user.ID)
if err != nil {
return err
}
// 新增账单
args := []any{post.ID, user.ID, -post.AttachmentPrice, user.Balance - post.AttachmentPrice, "购买附件支出", now}
if _, err = tx.Stmtx(s.q.NewPostBill).Exec(args...); err != nil {
return err
}
// 新增附件购买记录
args = []any{post.ID, user.ID, post.AttachmentPrice, now}
if _, err = tx.Stmtx(s.q.NewPostBill).Exec(args...); err != nil {
return err
}
// 对附件主新增账单
income := int64(float64(post.AttachmentPrice) * conf.AppSetting.AttachmentIncomeRate)
if income > 0 {
var oldBalance int64
if err = tx.Stmtx(s.q.GetUserBalance).Get(&oldBalance, post.UserID); err != nil {
return err
}
if _, err = tx.Stmtx(s.q.AddUserBalance).Exec(income, now, post.UserID); err != nil {
return err
}
// 新增账单
args = []any{post.ID, post.UserID, income, oldBalance + income, "出售附件收入", now}
if _, err = tx.Stmtx(s.q.NewPostBill).Exec(args...); err != nil {
return err
}
}
return nil
})
}
func newWalletService(db *sqlx.DB) core.WalletService {

@ -12,6 +12,7 @@ import (
)
const (
_NewPostAttachmentBill = `INSERT INTO @post_attachment_bill (post_id, user_id, paid_amount) VALUES (?, ?, ?)`
_AuthorizationManage_BeFriendIds = `SELECT user_id FROM @contact WHERE friend_id=? AND status=2 AND is_del=0`
_AuthorizationManage_IsFriend = `SELECT status FROM @contact WHERE user_id=? AND friend_id=? AND is_del=0`
_AuthorizationManage_MyFriendSet = `SELECT friend_id FROM @contact WHERE user_id=? AND status=2 AND is_del=0`
@ -123,14 +124,23 @@ const (
_UserManage_GetUsersByIds = `SELECT * FROM @user WHERE id IN ? AND is_del=0`
_UserManage_GetUsersByKeyword = `SELECT * FROM @user WHERE username LIKE ? AND is_del=0 limit 6`
_UserManage_UpdateUser = `UPDATE @user SET username=:username, nickname=:nickname, phone=:phone, password=:password, salt=:salt, status=:status, avatar=:avatar, balance=:balance, is_admin=:is_admin, modified_on=:modified_on WHERE id=? AND is_del=0`
_Wallet_CreateRecharge = `SELECT * FROM @user WHERE username=?`
_Wallet_GetRechargeById = `SELECT * FROM @user WHERE username=?`
_Wallet_GetUserWalletBillCount = `SELECT * FROM @user WHERE username=?`
_Wallet_GetUserWalletBills = `SELECT * FROM @user WHERE username=?`
_Wallet_HandlePostAttachementBought = `SELECT * FROM @user WHERE username=?`
_Wallet_HandleRechargeSuccess = `SELECT * FROM @user WHERE username=?`
_Wallet_AddUserBalance = `UPDATE @user SET balance=balance+?, modified_on=? WHERE id=? AND is_del=0`
_Wallet_CreateRecharge = `INSERT INTO @wallet_recharge (user_id, amount, created_on) VALUES (?, ?, ?)`
_Wallet_CreateWalletStatement = `INSERT INTO @wallet_statement (user_id, change_amount, balance_snapshot, reason, created_on) VALUES (?, ?, ?, ?, ?)`
_Wallet_GetRechargeById = `SELECT * FROM @wallet_recharge WHERE id=? AND is_del=?`
_Wallet_GetUserBalance = `SELECT balance FROM @user WHERE id=? AND is_del=0`
_Wallet_GetUserByUid = `SELECT * FROM @user WHERE id=? AND is_del=0`
_Wallet_GetUserWalletBillCount = `SELECT count(*) FROM @wallet_statement WHERE user_id=? AND is_del=0`
_Wallet_GetUserWalletBills = `SELECT * FROM @wallet_statement WHERE user_id=? AND is_del=0 ORDER BY id DESC LIMIT ? OFFSET ?`
_Wallet_MarkSuccessRecharge = `UPDATE @wallet_recharge SET trade_no=?, trade_status='TRADE_SUCCESS', modified_on=? WHERE id=? AND is_del=0`
_Wallet_MinusUserBalance = `UPDATE @user SET balance=balance-?, modified_on=? WHERE id=? AND is_del=0`
_Wallet_NewPostBill = `INSERT INTO @wallet_statement (post_id, user_id, change_amount, balance_snapshot, reason, created_on) VALUES (?, ?, ?, ?, ?, ?)`
)
type Yesql struct {
NewPostAttachmentBill *sqlx.Stmt `yesql:"new_post_attachment_bill"`
}
type AuthorizationManage struct {
yesql.Namespace `yesql:"authorization_manage"`
BeFriendIds *sqlx.Stmt `yesql:"be_friend_ids"`
@ -331,13 +341,32 @@ type UserManage struct {
}
type Wallet struct {
yesql.Namespace `yesql:"wallet"`
CreateRecharge *sqlx.Stmt `yesql:"create_recharge"`
GetRechargeById *sqlx.Stmt `yesql:"get_recharge_by_id"`
GetUserWalletBillCount *sqlx.Stmt `yesql:"get_user_wallet_bill_count"`
GetUserWalletBills *sqlx.Stmt `yesql:"get_user_wallet_bills"`
HandlePostAttachementBought *sqlx.Stmt `yesql:"handle_post_attachement_bought"`
HandleRechargeSuccess *sqlx.Stmt `yesql:"handle_recharge_success"`
yesql.Namespace `yesql:"wallet"`
AddUserBalance *sqlx.Stmt `yesql:"add_user_balance"`
CreateRecharge *sqlx.Stmt `yesql:"create_recharge"`
CreateWalletStatement *sqlx.Stmt `yesql:"create_wallet_statement"`
GetRechargeById *sqlx.Stmt `yesql:"get_recharge_by_id"`
GetUserBalance *sqlx.Stmt `yesql:"get_user_balance"`
GetUserByUid *sqlx.Stmt `yesql:"get_user_by_uid"`
GetUserWalletBillCount *sqlx.Stmt `yesql:"get_user_wallet_bill_count"`
GetUserWalletBills *sqlx.Stmt `yesql:"get_user_wallet_bills"`
MarkSuccessRecharge *sqlx.Stmt `yesql:"mark_success_recharge"`
MinusUserBalance *sqlx.Stmt `yesql:"minus_user_balance"`
NewPostBill *sqlx.Stmt `yesql:"new_post_bill"`
}
func BuildYesql(p yesql.PreparexBuilder, ctx ...context.Context) (obj *Yesql, err error) {
var c context.Context
if len(ctx) > 0 && ctx[0] != nil {
c = ctx[0]
} else {
c = context.Background()
}
obj = &Yesql{}
if obj.NewPostAttachmentBill, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_NewPostAttachmentBill))); err != nil {
return
}
return
}
func BuildAuthorizationManage(p yesql.PreparexBuilder, ctx ...context.Context) (obj *AuthorizationManage, err error) {
@ -896,22 +925,37 @@ func BuildWallet(p yesql.PreparexBuilder, ctx ...context.Context) (obj *Wallet,
c = context.Background()
}
obj = &Wallet{}
if obj.AddUserBalance, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_AddUserBalance))); err != nil {
return
}
if obj.CreateRecharge, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_CreateRecharge))); err != nil {
return
}
if obj.CreateWalletStatement, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_CreateWalletStatement))); err != nil {
return
}
if obj.GetRechargeById, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_GetRechargeById))); err != nil {
return
}
if obj.GetUserBalance, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_GetUserBalance))); err != nil {
return
}
if obj.GetUserByUid, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_GetUserByUid))); err != nil {
return
}
if obj.GetUserWalletBillCount, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_GetUserWalletBillCount))); err != nil {
return
}
if obj.GetUserWalletBills, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_GetUserWalletBills))); err != nil {
return
}
if obj.HandlePostAttachementBought, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_HandlePostAttachementBought))); err != nil {
if obj.MarkSuccessRecharge, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_MarkSuccessRecharge))); err != nil {
return
}
if obj.MinusUserBalance, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_MinusUserBalance))); err != nil {
return
}
if obj.HandleRechargeSuccess, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_HandleRechargeSuccess))); err != nil {
if obj.NewPostBill, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_NewPostBill))); err != nil {
return
}
return

@ -560,24 +560,48 @@ UPDATE @user SET username=:username, nickname=:nickname, phone=:phone,
-- name: get_user_wallet_bills@wallet
-- prepare: stmt
SELECT * FROM @user WHERE username=?
SELECT * FROM @wallet_statement WHERE user_id=? AND is_del=0 ORDER BY id DESC LIMIT ? OFFSET ?;
-- name: get_user_wallet_bill_count@wallet
-- prepare: stmt
SELECT * FROM @user WHERE username=?
SELECT count(*) FROM @wallet_statement WHERE user_id=? AND is_del=0;
-- name: get_recharge_by_id@wallet
-- prepare: stmt
SELECT * FROM @user WHERE username=?
SELECT * FROM @wallet_recharge WHERE id=? AND is_del=?;
-- name: create_recharge@wallet
-- prepare: stmt
SELECT * FROM @user WHERE username=?
INSERT INTO @wallet_recharge (user_id, amount, created_on) VALUES (?, ?, ?);
-- name: handle_recharge_success@wallet
-- name: get_user_by_uid@wallet
-- prepare: stmt
SELECT * FROM @user WHERE username=?
SELECT * FROM @user WHERE id=? AND is_del=0;
-- name: handle_post_attachement_bought@wallet
-- name: add_user_balance@wallet
-- prepare: stmt
SELECT * FROM @user WHERE username=?
UPDATE @user SET balance=balance+?, modified_on=? WHERE id=? AND is_del=0;
-- name: minus_user_balance@wallet
-- prepare: stmt
UPDATE @user SET balance=balance-?, modified_on=? WHERE id=? AND is_del=0;
-- name: create_wallet_statement@wallet
-- prepare: stmt
INSERT INTO @wallet_statement (user_id, change_amount, balance_snapshot, reason, created_on) VALUES (?, ?, ?, ?, ?);
-- name: get_user_balance@wallet
-- prepare: stmt
SELECT balance FROM @user WHERE id=? AND is_del=0;
-- name: mark_success_recharge@wallet
-- prepare: stmt
UPDATE @wallet_recharge SET trade_no=?, trade_status='TRADE_SUCCESS', modified_on=? WHERE id=? AND is_del=0;
-- name: new_post_attachment_bill
-- prepare: stmt
INSERT INTO @post_attachment_bill (post_id, user_id, paid_amount) VALUES (?, ?, ?);
-- name: new_post_bill@wallet
-- prepare: stmt
INSERT INTO @wallet_statement (post_id, user_id, change_amount, balance_snapshot, reason, created_on) VALUES (?, ?, ?, ?, ?, ?);

Loading…
Cancel
Save