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/jmoiron/sqlx"
"github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core"
"github.com/rocboss/paopao-ce/internal/core/ms" "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/internal/dao/sakila/yesql/cc"
) )

@ -5,12 +5,14 @@
package sakila package sakila
import ( import (
"time"
"github.com/jmoiron/sqlx" "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"
"github.com/rocboss/paopao-ce/internal/core/ms" "github.com/rocboss/paopao-ce/internal/core/ms"
"github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr"
"github.com/rocboss/paopao-ce/internal/dao/sakila/yesql/cc" "github.com/rocboss/paopao-ce/internal/dao/sakila/yesql/cc"
"github.com/rocboss/paopao-ce/pkg/debug"
) )
var ( var (
@ -22,14 +24,14 @@ type walletSrv struct {
q *cc.Wallet q *cc.Wallet
} }
func (s *walletSrv) GetRechargeByID(id int64) (*ms.WalletRecharge, error) { func (s *walletSrv) GetRechargeByID(id int64) (res *ms.WalletRecharge, err error) {
res := &ms.WalletRecharge{} err = s.q.GetRechargeById.Get(res, id)
err := s.q.GetRechargeById.Get(res, id) return
return res, err
} }
func (s *walletSrv) CreateRecharge(userId, amount int64) (*ms.WalletRecharge, error) { 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 { if err != nil {
return nil, err return nil, err
} }
@ -40,16 +42,16 @@ func (s *walletSrv) CreateRecharge(userId, amount int64) (*ms.WalletRecharge, er
return &ms.WalletRecharge{ return &ms.WalletRecharge{
Model: &dbr.Model{ Model: &dbr.Model{
ID: id, ID: id,
CreatedOn: now,
}, },
UserID: userId, UserID: userId,
Amount: amount, Amount: amount,
}, nil }, nil
} }
func (s *walletSrv) GetUserWalletBills(userID int64, offset, limit int) ([]*ms.WalletStatement, error) { func (s *walletSrv) GetUserWalletBills(userID int64, offset, limit int) (res []*ms.WalletStatement, err error) {
res := []*ms.WalletStatement{} err = s.q.GetUserWalletBills.Select(&res, userID, limit, offset)
err := s.q.GetUserWalletBills.Select(&res, userID, limit, offset) return
return res, err
} }
func (s *walletSrv) GetUserWalletBillCount(userID int64) (res int64, err error) { 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 return
} }
func (s *walletSrv) HandleRechargeSuccess(recharge *ms.WalletRecharge, tradeNo string) error { func (s *walletSrv) HandleRechargeSuccess(r *ms.WalletRecharge, tradeNo string) error {
// TODO return s.with(func(tx *sqlx.Tx) error {
debug.NotImplemented() 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 return nil
})
} }
func (s *walletSrv) HandlePostAttachmentBought(post *ms.Post, user *ms.User) error { func (s *walletSrv) HandlePostAttachmentBought(post *ms.Post, user *ms.User) error {
// TODO return s.with(func(tx *sqlx.Tx) error {
debug.NotImplemented() 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 return nil
})
} }
func newWalletService(db *sqlx.DB) core.WalletService { func newWalletService(db *sqlx.DB) core.WalletService {

@ -12,6 +12,7 @@ import (
) )
const ( 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_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_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` _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_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_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` _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_AddUserBalance = `UPDATE @user SET balance=balance+?, modified_on=? WHERE id=? AND is_del=0`
_Wallet_GetRechargeById = `SELECT * FROM @user WHERE username=?` _Wallet_CreateRecharge = `INSERT INTO @wallet_recharge (user_id, amount, created_on) VALUES (?, ?, ?)`
_Wallet_GetUserWalletBillCount = `SELECT * FROM @user WHERE username=?` _Wallet_CreateWalletStatement = `INSERT INTO @wallet_statement (user_id, change_amount, balance_snapshot, reason, created_on) VALUES (?, ?, ?, ?, ?)`
_Wallet_GetUserWalletBills = `SELECT * FROM @user WHERE username=?` _Wallet_GetRechargeById = `SELECT * FROM @wallet_recharge WHERE id=? AND is_del=?`
_Wallet_HandlePostAttachementBought = `SELECT * FROM @user WHERE username=?` _Wallet_GetUserBalance = `SELECT balance FROM @user WHERE id=? AND is_del=0`
_Wallet_HandleRechargeSuccess = `SELECT * FROM @user WHERE username=?` _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 { type AuthorizationManage struct {
yesql.Namespace `yesql:"authorization_manage"` yesql.Namespace `yesql:"authorization_manage"`
BeFriendIds *sqlx.Stmt `yesql:"be_friend_ids"` BeFriendIds *sqlx.Stmt `yesql:"be_friend_ids"`
@ -332,12 +342,31 @@ type UserManage struct {
type Wallet struct { type Wallet struct {
yesql.Namespace `yesql:"wallet"` yesql.Namespace `yesql:"wallet"`
AddUserBalance *sqlx.Stmt `yesql:"add_user_balance"`
CreateRecharge *sqlx.Stmt `yesql:"create_recharge"` CreateRecharge *sqlx.Stmt `yesql:"create_recharge"`
CreateWalletStatement *sqlx.Stmt `yesql:"create_wallet_statement"`
GetRechargeById *sqlx.Stmt `yesql:"get_recharge_by_id"` 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"` GetUserWalletBillCount *sqlx.Stmt `yesql:"get_user_wallet_bill_count"`
GetUserWalletBills *sqlx.Stmt `yesql:"get_user_wallet_bills"` GetUserWalletBills *sqlx.Stmt `yesql:"get_user_wallet_bills"`
HandlePostAttachementBought *sqlx.Stmt `yesql:"handle_post_attachement_bought"` MarkSuccessRecharge *sqlx.Stmt `yesql:"mark_success_recharge"`
HandleRechargeSuccess *sqlx.Stmt `yesql:"handle_recharge_success"` 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) { 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() c = context.Background()
} }
obj = &Wallet{} 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 { if obj.CreateRecharge, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_CreateRecharge))); err != nil {
return 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 { if obj.GetRechargeById, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_GetRechargeById))); err != nil {
return 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 { if obj.GetUserWalletBillCount, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_GetUserWalletBillCount))); err != nil {
return return
} }
if obj.GetUserWalletBills, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_GetUserWalletBills))); err != nil { if obj.GetUserWalletBills, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_Wallet_GetUserWalletBills))); err != nil {
return 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 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
} }
return return

@ -560,24 +560,48 @@ UPDATE @user SET username=:username, nickname=:nickname, phone=:phone,
-- name: get_user_wallet_bills@wallet -- name: get_user_wallet_bills@wallet
-- prepare: stmt -- 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 -- name: get_user_wallet_bill_count@wallet
-- prepare: stmt -- 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 -- name: get_recharge_by_id@wallet
-- prepare: stmt -- prepare: stmt
SELECT * FROM @user WHERE username=? SELECT * FROM @wallet_recharge WHERE id=? AND is_del=?;
-- name: create_recharge@wallet -- name: create_recharge@wallet
-- prepare: stmt -- 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 -- 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 -- 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