调整交易和账单模型,完善支付与用户余额基础处理逻辑

This commit is contained in:
2025-04-09 16:34:41 +08:00
parent 4c47a71f30
commit 02897db890
10 changed files with 203 additions and 85 deletions

View File

@@ -22,6 +22,7 @@ type LoginResp struct {
RefreshToken string `json:"refresh_token"`
Expires int64 `json:"expires"`
Auth services.AuthContext `json:"auth"`
Profile *models.User `json:"profile"`
}
func Login(c *fiber.Ctx) error {
@@ -105,10 +106,12 @@ func loginByPhone(c *fiber.Ctx, req *LoginReq) error {
return err
}
user.Password = ""
return c.JSON(LoginResp{
AccessToken: token.AccessToken,
RefreshToken: token.RefreshToken,
Expires: token.AccessTokenExpires.Unix(),
Auth: auth,
Profile: user,
})
}

View File

@@ -44,12 +44,21 @@ func CreateResourceByBalance(c *fiber.Ctx) error {
}
// 计算价格
var amount = 0
var payment = 0
var amount = 100
var payment = 100
// 检查余额
if user.Balance < float64(req.Quota)/100 {
return errors.New("余额不足")
if user.Balance < float64(amount)/100 {
return fiber.NewError(fiber.StatusBadRequest, "余额不足")
}
// 更新用户余额
user.Balance -= float64(payment)
_, err = q.User.
Where(q.User.ID.Eq(authContext.Payload.Id)).
Update(q.User.Balance, user.Balance)
if err != nil {
return err
}
// 创建资源
@@ -73,26 +82,18 @@ func CreateResourceByBalance(c *fiber.Ctx) error {
return err
}
// 更新用户余额
user.Balance -= float64(payment)
_, err = q.User.
Where(q.User.ID.Eq(authContext.Payload.Id)).
Update(q.User.Balance, user.Balance)
if err != nil {
return err
}
// 生成账单
bill := m.Bill{
UserID: authContext.Payload.Id,
ResourceID: resource.ID,
BillNo: services.ID.GenReadable("bil"),
Type: 1,
Info: "购买套餐",
Amount: float64(amount),
Payment: float64(payment),
Type: 1,
Status: 1,
}
err = q.Bill.Save(&bill)
err = q.Bill.
Omit(q.Bill.TradeID, q.Bill.RefundID).
Create(&bill)
if err != nil {
return err
}
@@ -103,7 +104,7 @@ func CreateResourceByBalance(c *fiber.Ctx) error {
return err
}
return errors.New("not implemented")
return nil
}
// endregion

View File

@@ -13,6 +13,7 @@ import (
// region CreateTrade
type CreateTradeReq struct {
Type int `json:"type" validate:"required"` // 交易类型1.充值2.购买
Subject string `json:"subject" validate:"required"`
Remark string `json:"remark"`
Amount int `json:"amount" validate:"required"`
@@ -32,7 +33,9 @@ func CreateTrade(c *fiber.Ctx) error {
return err
}
// 创建交易订单
// 调用外部接口
// 保存交易订单
num, err := services.ID.GenSerial(c.Context())
if err != nil {
return err
@@ -45,15 +48,37 @@ func CreateTrade(c *fiber.Ctx) error {
Amount: float64(req.Amount) / 100,
Method: int32(req.Method),
}
// 调用外部接口
// 保存交易订单
err = q.Trade.Create(&trade)
if err != nil {
return err
}
// 保存用户帐单
var info string
var t int32
switch req.Type {
case 1:
info = "充值余额"
t = 0
case 2:
info = "购买产品"
t = 1
}
bill := m.Bill{
UserID: authContext.Payload.Id,
TradeID: trade.ID,
BillNo: services.ID.GenReadable("bil"),
Info: info,
Type: t,
Status: 0,
}
err = q.Bill.
Omit(q.Bill.ResourceID, q.Bill.RefundID).
Create(&bill)
if err != nil {
return err
}
// 返回结果,外部支付链接
return nil
}

49
web/handlers/user.go Normal file
View File

@@ -0,0 +1,49 @@
package handlers
import (
"errors"
q "platform/web/queries"
"platform/web/services"
"github.com/gofiber/fiber/v2"
"gorm.io/gorm"
)
// region GetUserByToken
type GetUserByTokenReq struct {
Token string `json:"token" validate:"required"`
}
// GetUserByToken 通过token获取用户信息
func GetUserByToken(c *fiber.Ctx) error {
// 解析请求参数
req := new(GetUserByTokenReq)
if err := c.BodyParser(req); err != nil {
return err
}
// 查询会话信息
session, err := services.Session.Find(c.Context(), req.Token)
if err != nil {
return err
}
// 查询用户信息
user, err := q.User.Debug().
Omit(q.User.Password, q.User.DeletedAt).
Where(q.User.ID.Eq(session.Payload.Id)).
Take()
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return fiber.NewError(fiber.StatusNotFound, "用户不存在")
}
return err
}
// 返回用户信息
return c.JSON(user)
}
// endregion