diff --git a/internal/dao/sakila/user.go b/internal/dao/sakila/user.go index 48e2b0d8..7fb64e07 100644 --- a/internal/dao/sakila/user.go +++ b/internal/dao/sakila/user.go @@ -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" ) diff --git a/internal/dao/sakila/wallet.go b/internal/dao/sakila/wallet.go index 3fff19fe..29ad1cd1 100644 --- a/internal/dao/sakila/wallet.go +++ b/internal/dao/sakila/wallet.go @@ -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 { diff --git a/internal/dao/sakila/yesql/cc/yesql.go b/internal/dao/sakila/yesql/cc/yesql.go index b181baee..fae1338f 100644 --- a/internal/dao/sakila/yesql/cc/yesql.go +++ b/internal/dao/sakila/yesql/cc/yesql.go @@ -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 diff --git a/internal/dao/sakila/yesql/yesql.sql b/internal/dao/sakila/yesql/yesql.sql index 71620aa2..5944830c 100644 --- a/internal/dao/sakila/yesql/yesql.sql +++ b/internal/dao/sakila/yesql/yesql.sql @@ -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 (?, ?, ?, ?, ?, ?);