813 lines
21 KiB
Go
813 lines
21 KiB
Go
package service
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"time"
|
||
|
||
"github.com/gogf/gf/v2/errors/gerror"
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
"github.com/gogf/gf/v2/net/ghttp"
|
||
"github.com/gogf/gf/v2/os/gtime"
|
||
"github.com/gogf/gf/v2/util/gconv"
|
||
|
||
"nl-video-api/internal/dao"
|
||
"nl-video-api/internal/model/entity"
|
||
"nl-video-api/utility/response"
|
||
)
|
||
|
||
// PaymentOrderService 支付订单服务
|
||
type PaymentOrderService struct{}
|
||
|
||
// NewPaymentOrderService 创建支付订单服务实例
|
||
func NewPaymentOrderService() *PaymentOrderService {
|
||
return &PaymentOrderService{}
|
||
}
|
||
|
||
// Create 创建支付订单
|
||
func (s *PaymentOrderService) Create(r *ghttp.Request) {
|
||
// 获取请求参数
|
||
vipLevelId := r.Get("vip_level_id").Uint()
|
||
paymentMethod := r.Get("payment_method").String()
|
||
amount := r.Get("amount").Float64()
|
||
|
||
// 参数验证
|
||
if vipLevelId == 0 {
|
||
response.Error(r, response.CodeInvalidParam, "VIP等级ID不能为空")
|
||
return
|
||
}
|
||
if paymentMethod == "" {
|
||
response.Error(r, response.CodeInvalidParam, "支付方式不能为空")
|
||
return
|
||
}
|
||
if amount <= 0 {
|
||
response.Error(r, response.CodeInvalidParam, "支付金额必须大于0")
|
||
return
|
||
}
|
||
|
||
// 获取当前用户ID(临时设置)
|
||
userId := uint(1)
|
||
|
||
// 生成订单号
|
||
orderNo := "PAY" + gtime.Now().Format("YmdHis") + g.NewVar(userId).String()
|
||
|
||
// 创建支付订单
|
||
data := &entity.PaymentOrder{
|
||
OrderNo: orderNo,
|
||
UserId: int(userId),
|
||
VipLevelId: int(vipLevelId),
|
||
Amount: amount,
|
||
PaymentMethod: paymentMethod,
|
||
PaymentStatus: 0, // 待支付
|
||
ExpireTime: gtime.Now().Add(time.Hour * 24), // 24小时后过期
|
||
CreatedAt: gtime.Now(),
|
||
UpdatedAt: gtime.Now(),
|
||
}
|
||
|
||
id, err := dao.PaymentOrder.Ctx(r.Context()).Data(data).InsertAndGetId()
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "创建支付订单失败")
|
||
return
|
||
}
|
||
|
||
response.Success(r, g.Map{
|
||
"id": uint(id),
|
||
"order_no": orderNo,
|
||
})
|
||
}
|
||
|
||
// GetList 获取支付订单列表
|
||
func (s *PaymentOrderService) GetList(r *ghttp.Request) {
|
||
// 获取请求参数
|
||
page := r.Get("page", 1).Int()
|
||
size := r.Get("size", 10).Int()
|
||
status := r.Get("status", -1).Int()
|
||
|
||
// 获取当前用户ID(临时设置)
|
||
userId := uint(1)
|
||
|
||
// 构建查询条件
|
||
query := dao.PaymentOrder.Ctx(r.Context()).Where("user_id", userId)
|
||
|
||
// 状态筛选
|
||
if status >= 0 {
|
||
query = query.Where("payment_status", status)
|
||
}
|
||
|
||
// 获取总数
|
||
total, err := query.Count()
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "获取订单总数失败")
|
||
return
|
||
}
|
||
|
||
// 获取列表数据
|
||
var orders []entity.PaymentOrder
|
||
err = query.Order("created_at DESC").
|
||
Limit((page-1)*size, size).
|
||
Scan(&orders)
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "获取订单列表失败")
|
||
return
|
||
}
|
||
|
||
response.Success(r, g.Map{
|
||
"list": orders,
|
||
"total": total,
|
||
"page": page,
|
||
"size": size,
|
||
})
|
||
}
|
||
|
||
// GetDetail 获取支付订单详情
|
||
func (s *PaymentOrderService) GetDetail(r *ghttp.Request) {
|
||
// 获取请求参数
|
||
id := r.Get("id").Uint()
|
||
|
||
// 参数验证
|
||
if id == 0 {
|
||
response.Error(r, response.CodeInvalidParam, "订单ID不能为空")
|
||
return
|
||
}
|
||
|
||
// 获取当前用户ID(临时设置)
|
||
userId := uint(1)
|
||
|
||
// 获取订单信息
|
||
var order entity.PaymentOrder
|
||
err := dao.PaymentOrder.Ctx(r.Context()).Where("id", id).Where("user_id", userId).Scan(&order)
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "获取订单信息失败")
|
||
return
|
||
}
|
||
if order.Id == 0 {
|
||
response.Error(r, response.CodeNotFound, "订单不存在")
|
||
return
|
||
}
|
||
|
||
response.Success(r, order)
|
||
}
|
||
|
||
// Pay 支付订单
|
||
func (s *PaymentOrderService) Pay(r *ghttp.Request) {
|
||
// 获取请求参数
|
||
id := r.Get("id").Uint()
|
||
|
||
// 参数验证
|
||
if id == 0 {
|
||
response.Error(r, response.CodeInvalidParam, "订单ID不能为空")
|
||
return
|
||
}
|
||
|
||
// 获取当前用户ID(临时设置)
|
||
userId := uint(1)
|
||
|
||
// 获取订单信息
|
||
var order entity.PaymentOrder
|
||
err := dao.PaymentOrder.Ctx(r.Context()).Where("id", id).Where("user_id", userId).Scan(&order)
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "获取订单信息失败")
|
||
return
|
||
}
|
||
if order.Id == 0 {
|
||
response.Error(r, response.CodeNotFound, "订单不存在")
|
||
return
|
||
}
|
||
|
||
// 检查订单状态
|
||
if order.PaymentStatus != 0 {
|
||
response.Error(r, response.CodeInvalidParam, "订单状态不正确")
|
||
return
|
||
}
|
||
|
||
// 更新订单状态为已支付
|
||
_, err = dao.PaymentOrder.Ctx(r.Context()).Where("id", id).Data(g.Map{
|
||
"payment_status": 1,
|
||
"payment_time": gtime.Now(),
|
||
"updated_at": gtime.Now(),
|
||
}).Update()
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "更新订单状态失败")
|
||
return
|
||
}
|
||
|
||
response.Success(r, "支付成功")
|
||
}
|
||
|
||
// Cancel 取消订单
|
||
func (s *PaymentOrderService) Cancel(r *ghttp.Request) {
|
||
// 获取请求参数
|
||
id := r.Get("id").Uint()
|
||
|
||
// 参数验证
|
||
if id == 0 {
|
||
response.Error(r, response.CodeInvalidParam, "订单ID不能为空")
|
||
return
|
||
}
|
||
|
||
// 获取当前用户ID(临时设置)
|
||
userId := uint(1)
|
||
|
||
// 获取订单信息
|
||
var order entity.PaymentOrder
|
||
err := dao.PaymentOrder.Ctx(r.Context()).Where("id", id).Where("user_id", userId).Scan(&order)
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "获取订单信息失败")
|
||
return
|
||
}
|
||
if order.Id == 0 {
|
||
response.Error(r, response.CodeNotFound, "订单不存在")
|
||
return
|
||
}
|
||
|
||
// 检查订单状态
|
||
if order.PaymentStatus != 0 {
|
||
response.Error(r, response.CodeInvalidParam, "只能取消待支付的订单")
|
||
return
|
||
}
|
||
|
||
// 更新订单状态为已取消
|
||
_, err = dao.PaymentOrder.Ctx(r.Context()).Where("id", id).Data(g.Map{
|
||
"payment_status": 2,
|
||
"updated_at": gtime.Now(),
|
||
}).Update()
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "取消订单失败")
|
||
return
|
||
}
|
||
|
||
response.Success(r, "取消成功")
|
||
}
|
||
|
||
// 定义请求和响应结构体
|
||
type PaymentOrderCreateReq struct {
|
||
VipLevelId uint `json:"vip_level_id"`
|
||
PaymentMethod string `json:"payment_method"`
|
||
Amount float64 `json:"amount"`
|
||
}
|
||
|
||
type PaymentOrderCreateRes struct {
|
||
OrderNo string `json:"order_no"`
|
||
Amount float64 `json:"amount"`
|
||
}
|
||
|
||
type PaymentOrderListReq struct {
|
||
Page int `json:"page"`
|
||
Size int `json:"size"`
|
||
PaymentStatus int `json:"payment_status"`
|
||
StartDate string `json:"start_date"`
|
||
EndDate string `json:"end_date"`
|
||
UserId uint `json:"user_id"`
|
||
}
|
||
|
||
type PaymentOrderListRes struct {
|
||
List []PaymentOrderItem `json:"list"`
|
||
Total int `json:"total"`
|
||
Page int `json:"page"`
|
||
Size int `json:"size"`
|
||
}
|
||
|
||
type PaymentOrderItem struct {
|
||
Id uint `json:"id"`
|
||
OrderNo string `json:"order_no"`
|
||
UserId uint `json:"user_id"`
|
||
Username string `json:"username"`
|
||
VipLevelId uint `json:"vip_level_id"`
|
||
VipLevelName string `json:"vip_level_name"`
|
||
Amount float64 `json:"amount"`
|
||
PaymentMethod string `json:"payment_method"`
|
||
PaymentStatus int `json:"payment_status"`
|
||
PaymentTime int64 `json:"payment_time"`
|
||
ExpireTime int64 `json:"expire_time"`
|
||
CreatedAt int64 `json:"created_at"`
|
||
}
|
||
|
||
type PaymentOrderDetailReq struct {
|
||
Id uint `json:"id"`
|
||
}
|
||
|
||
type PaymentOrderDetailRes struct {
|
||
Order PaymentOrderDetail `json:"order"`
|
||
}
|
||
|
||
type PaymentOrderDetail struct {
|
||
Id uint `json:"id"`
|
||
OrderNo string `json:"order_no"`
|
||
UserId uint `json:"user_id"`
|
||
Username string `json:"username"`
|
||
VipLevelId uint `json:"vip_level_id"`
|
||
VipLevelName string `json:"vip_level_name"`
|
||
Amount float64 `json:"amount"`
|
||
PaymentMethod string `json:"payment_method"`
|
||
PaymentStatus int `json:"payment_status"`
|
||
PaymentTime int64 `json:"payment_time"`
|
||
ExpireTime int64 `json:"expire_time"`
|
||
Remark string `json:"remark"`
|
||
CreatedAt int64 `json:"created_at"`
|
||
UpdatedAt int64 `json:"updated_at"`
|
||
}
|
||
|
||
type PaymentOrderPayReq struct {
|
||
OrderNo string `json:"order_no"`
|
||
PaymentMethod string `json:"payment_method"`
|
||
}
|
||
|
||
type PaymentOrderCancelReq struct {
|
||
Id uint `json:"id"`
|
||
}
|
||
|
||
type PaymentOrderRefundReq struct {
|
||
Id uint `json:"id"`
|
||
Reason string `json:"reason"`
|
||
}
|
||
|
||
// UserCreate 用户创建支付订单
|
||
func (s *PaymentOrderService) UserCreate(r *ghttp.Request) {
|
||
// 获取请求参数
|
||
vipLevelId := r.Get("vip_level_id").Uint()
|
||
paymentMethod := r.Get("payment_method").String()
|
||
amount := r.Get("amount").Float64()
|
||
|
||
if vipLevelId == 0 {
|
||
response.Error(r, response.CodeInvalidParam, "VIP等级ID不能为空")
|
||
return
|
||
}
|
||
if paymentMethod == "" {
|
||
response.Error(r, response.CodeInvalidParam, "支付方式不能为空")
|
||
return
|
||
}
|
||
if amount <= 0 {
|
||
response.Error(r, response.CodeInvalidParam, "支付金额必须大于0")
|
||
return
|
||
}
|
||
|
||
// 获取当前用户ID
|
||
userId := uint(1) // 临时设置,实际应该从JWT中获取
|
||
if userId == 0 {
|
||
response.Error(r, response.CodeUnauthorized, "用户未登录")
|
||
return
|
||
}
|
||
|
||
// 生成订单号
|
||
orderNo := fmt.Sprintf("PAY%d%d", time.Now().Unix(), userId)
|
||
|
||
// 创建订单
|
||
data := &entity.PaymentOrder{
|
||
OrderNo: orderNo,
|
||
UserId: int(userId),
|
||
VipLevelId: int(vipLevelId),
|
||
Amount: amount,
|
||
PaymentMethod: paymentMethod,
|
||
PaymentStatus: 0, // 待支付
|
||
ExpireTime: gtime.NewFromTime(time.Now().Add(30 * time.Minute)), // 30分钟后过期
|
||
CreatedAt: gtime.Now(),
|
||
UpdatedAt: gtime.Now(),
|
||
}
|
||
|
||
id, err := dao.PaymentOrder.Ctx(r.Context()).Data(data).InsertAndGetId()
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "创建订单失败")
|
||
return
|
||
}
|
||
|
||
response.Success(r, g.Map{
|
||
"id": uint(id),
|
||
"order_no": orderNo,
|
||
"amount": amount,
|
||
})
|
||
}
|
||
|
||
// UserList 用户获取支付订单列表
|
||
func (s *PaymentOrderService) UserList(r *ghttp.Request) {
|
||
// 获取请求参数
|
||
page := r.Get("page", 1).Int()
|
||
size := r.Get("size", 10).Int()
|
||
paymentStatus := r.Get("payment_status", -1).Int()
|
||
|
||
if page <= 0 {
|
||
page = 1
|
||
}
|
||
if size <= 0 {
|
||
size = 10
|
||
}
|
||
|
||
// 获取当前用户ID
|
||
userId := uint(1) // 临时设置,实际应该从JWT中获取
|
||
if userId == 0 {
|
||
response.Error(r, response.CodeUnauthorized, "用户未登录")
|
||
return
|
||
}
|
||
|
||
// 构建查询条件
|
||
query := dao.PaymentOrder.Ctx(r.Context()).Where("user_id", userId)
|
||
|
||
// 支付状态筛选
|
||
if paymentStatus >= 0 {
|
||
query = query.Where("payment_status", paymentStatus)
|
||
}
|
||
|
||
// 获取总数
|
||
total, err := query.Count()
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "获取订单总数失败")
|
||
return
|
||
}
|
||
|
||
// 获取列表数据
|
||
var orders []entity.PaymentOrder
|
||
err = query.Order("id DESC").
|
||
Limit((page-1)*size, size).
|
||
Scan(&orders)
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, "获取订单列表失败")
|
||
return
|
||
}
|
||
|
||
// 转换为响应格式
|
||
list := make([]PaymentOrderItem, 0, len(orders))
|
||
for _, order := range orders {
|
||
var paymentTime int64
|
||
if order.PaymentTime != nil {
|
||
paymentTime = order.PaymentTime.Unix()
|
||
}
|
||
|
||
list = append(list, PaymentOrderItem{
|
||
Id: order.Id,
|
||
OrderNo: order.OrderNo,
|
||
UserId: uint(order.UserId),
|
||
Username: "", // 用户自己的订单,不需要显示用户名
|
||
VipLevelId: uint(order.VipLevelId),
|
||
VipLevelName: "", // 可以后续关联查询
|
||
Amount: order.Amount,
|
||
PaymentMethod: order.PaymentMethod,
|
||
PaymentStatus: order.PaymentStatus,
|
||
PaymentTime: paymentTime,
|
||
ExpireTime: order.ExpireTime.Unix(),
|
||
CreatedAt: order.CreatedAt.Unix(),
|
||
})
|
||
}
|
||
|
||
response.Success(r, g.Map{
|
||
"list": list,
|
||
"total": total,
|
||
"page": page,
|
||
"size": size,
|
||
})
|
||
}
|
||
|
||
// UserDetail 用户获取支付订单详情
|
||
func (s *PaymentOrderService) UserDetail(ctx context.Context, req *PaymentOrderDetailReq) (*PaymentOrderDetailRes, error) {
|
||
// 获取订单信息
|
||
var order entity.PaymentOrder
|
||
err := dao.PaymentOrder.Ctx(ctx).Where("id", req.Id).Scan(&order)
|
||
if err != nil {
|
||
return nil, gerror.New("获取订单详情失败")
|
||
}
|
||
if order.Id == 0 {
|
||
return nil, gerror.New("订单不存在")
|
||
}
|
||
|
||
// 获取用户信息
|
||
var user entity.NlUser
|
||
g.DB().Model("nl_user").Where("id", order.UserId).Fields("username").Scan(&user)
|
||
|
||
var paymentTime int64
|
||
if order.PaymentTime != nil {
|
||
paymentTime = order.PaymentTime.Unix()
|
||
}
|
||
|
||
return &PaymentOrderDetailRes{
|
||
Order: PaymentOrderDetail{
|
||
Id: order.Id,
|
||
OrderNo: order.OrderNo,
|
||
UserId: uint(order.UserId),
|
||
Username: user.Username,
|
||
VipLevelId: uint(order.VipLevelId),
|
||
VipLevelName: "", // 可以后续关联查询
|
||
Amount: order.Amount,
|
||
PaymentMethod: order.PaymentMethod,
|
||
PaymentStatus: order.PaymentStatus,
|
||
PaymentTime: paymentTime,
|
||
ExpireTime: order.ExpireTime.Unix(),
|
||
Remark: order.Remark,
|
||
CreatedAt: order.CreatedAt.Unix(),
|
||
UpdatedAt: order.UpdatedAt.Unix(),
|
||
},
|
||
}, nil
|
||
}
|
||
|
||
// UserPay 用户支付订单
|
||
func (s *PaymentOrderService) UserPay(ctx context.Context, req *PaymentOrderPayReq) error {
|
||
// 获取订单信息
|
||
var order entity.PaymentOrder
|
||
err := dao.PaymentOrder.Ctx(ctx).Where("order_no", req.OrderNo).Scan(&order)
|
||
if err != nil {
|
||
return gerror.New("获取订单信息失败")
|
||
}
|
||
if order.Id == 0 {
|
||
return gerror.New("订单不存在")
|
||
}
|
||
|
||
// 检查订单状态
|
||
if order.PaymentStatus != 0 {
|
||
return gerror.New("订单状态不正确")
|
||
}
|
||
|
||
// 检查订单是否过期
|
||
if order.ExpireTime.Before(gtime.Now()) {
|
||
return gerror.New("订单已过期")
|
||
}
|
||
|
||
// 这里应该调用第三方支付接口
|
||
// 模拟支付成功
|
||
|
||
// 更新订单状态
|
||
_, err = dao.PaymentOrder.Ctx(ctx).Where("id", order.Id).Data(g.Map{
|
||
"payment_status": 1, // 已支付
|
||
"payment_method": req.PaymentMethod,
|
||
"payment_time": gtime.Now(),
|
||
"updated_at": gtime.Now(),
|
||
}).Update()
|
||
if err != nil {
|
||
return gerror.New("更新订单状态失败")
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// UserCancel 用户取消订单
|
||
func (s *PaymentOrderService) UserCancel(ctx context.Context, req *PaymentOrderCancelReq) error {
|
||
// 获取订单信息
|
||
var order entity.PaymentOrder
|
||
err := dao.PaymentOrder.Ctx(ctx).Where("id", req.Id).Scan(&order)
|
||
if err != nil {
|
||
return gerror.New("获取订单信息失败")
|
||
}
|
||
if order.Id == 0 {
|
||
return gerror.New("订单不存在")
|
||
}
|
||
|
||
// 检查订单状态
|
||
if order.PaymentStatus != 0 {
|
||
return gerror.New("只能取消待支付的订单")
|
||
}
|
||
|
||
// 更新订单状态
|
||
_, err = dao.PaymentOrder.Ctx(ctx).Where("id", req.Id).Data(g.Map{
|
||
"payment_status": 2, // 已取消
|
||
"updated_at": gtime.Now(),
|
||
}).Update()
|
||
if err != nil {
|
||
return gerror.New("取消订单失败")
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// AdminList 管理员获取支付订单列表
|
||
func (s *PaymentOrderService) AdminList(ctx context.Context, req *PaymentOrderListReq) (*PaymentOrderListRes, error) {
|
||
// 设置默认值
|
||
if req.Page <= 0 {
|
||
req.Page = 1
|
||
}
|
||
if req.Size <= 0 {
|
||
req.Size = 10
|
||
}
|
||
|
||
// 构建查询条件
|
||
query := dao.PaymentOrder.Ctx(ctx)
|
||
|
||
// 支付状态筛选
|
||
if req.PaymentStatus >= 0 {
|
||
query = query.Where("payment_status", req.PaymentStatus)
|
||
}
|
||
|
||
// 用户筛选
|
||
if req.UserId > 0 {
|
||
query = query.Where("user_id", req.UserId)
|
||
}
|
||
|
||
// 日期范围筛选
|
||
if req.StartDate != "" {
|
||
query = query.Where("created_at >= ?", req.StartDate+" 00:00:00")
|
||
}
|
||
if req.EndDate != "" {
|
||
query = query.Where("created_at <= ?", req.EndDate+" 23:59:59")
|
||
}
|
||
|
||
// 获取总数
|
||
total, err := query.Count()
|
||
if err != nil {
|
||
return nil, gerror.New("获取订单总数失败")
|
||
}
|
||
|
||
// 获取列表数据
|
||
var orders []entity.PaymentOrder
|
||
err = query.Order("id DESC").
|
||
Limit((req.Page-1)*req.Size, req.Size).
|
||
Scan(&orders)
|
||
if err != nil {
|
||
return nil, gerror.New("获取订单列表失败")
|
||
}
|
||
|
||
// 获取用户信息
|
||
userIds := make([]int, 0, len(orders))
|
||
for _, order := range orders {
|
||
userIds = append(userIds, order.UserId)
|
||
}
|
||
|
||
userMap := make(map[int]string)
|
||
if len(userIds) > 0 {
|
||
var users []entity.NlUser
|
||
g.DB().Model("nl_user").WhereIn("id", userIds).Fields("id, username").Scan(&users)
|
||
for _, user := range users {
|
||
userMap[int(user.Id)] = user.Username
|
||
}
|
||
}
|
||
|
||
// 转换为响应格式
|
||
list := make([]PaymentOrderItem, 0, len(orders))
|
||
for _, order := range orders {
|
||
username := userMap[order.UserId]
|
||
var paymentTime int64
|
||
if order.PaymentTime != nil {
|
||
paymentTime = order.PaymentTime.Unix()
|
||
}
|
||
|
||
list = append(list, PaymentOrderItem{
|
||
Id: order.Id,
|
||
OrderNo: order.OrderNo,
|
||
UserId: uint(order.UserId),
|
||
Username: username,
|
||
VipLevelId: uint(order.VipLevelId),
|
||
VipLevelName: "", // 可以后续关联查询
|
||
Amount: order.Amount,
|
||
PaymentMethod: order.PaymentMethod,
|
||
PaymentStatus: order.PaymentStatus,
|
||
PaymentTime: paymentTime,
|
||
ExpireTime: order.ExpireTime.Unix(),
|
||
CreatedAt: order.CreatedAt.Unix(),
|
||
})
|
||
}
|
||
|
||
return &PaymentOrderListRes{
|
||
List: list,
|
||
Total: total,
|
||
Page: req.Page,
|
||
Size: req.Size,
|
||
}, nil
|
||
}
|
||
|
||
// AdminDetail 管理员获取支付订单详情
|
||
func (s *PaymentOrderService) AdminDetail(ctx context.Context, req *PaymentOrderDetailReq) (*PaymentOrderDetailRes, error) {
|
||
// 获取订单信息
|
||
var order entity.PaymentOrder
|
||
err := dao.PaymentOrder.Ctx(ctx).Where("id", req.Id).Scan(&order)
|
||
if err != nil {
|
||
return nil, gerror.New("获取订单详情失败")
|
||
}
|
||
if order.Id == 0 {
|
||
return nil, gerror.New("订单不存在")
|
||
}
|
||
|
||
// 获取用户信息
|
||
var user entity.NlUser
|
||
g.DB().Model("nl_user").Where("id", order.UserId).Fields("username").Scan(&user)
|
||
|
||
var paymentTime int64
|
||
if order.PaymentTime != nil {
|
||
paymentTime = order.PaymentTime.Unix()
|
||
}
|
||
|
||
return &PaymentOrderDetailRes{
|
||
Order: PaymentOrderDetail{
|
||
Id: order.Id,
|
||
OrderNo: order.OrderNo,
|
||
UserId: uint(order.UserId),
|
||
Username: user.Username,
|
||
VipLevelId: uint(order.VipLevelId),
|
||
VipLevelName: "", // 可以后续关联查询
|
||
Amount: order.Amount,
|
||
PaymentMethod: order.PaymentMethod,
|
||
PaymentStatus: order.PaymentStatus,
|
||
PaymentTime: paymentTime,
|
||
ExpireTime: order.ExpireTime.Unix(),
|
||
Remark: order.Remark,
|
||
CreatedAt: order.CreatedAt.Unix(),
|
||
UpdatedAt: order.UpdatedAt.Unix(),
|
||
},
|
||
}, nil
|
||
}
|
||
|
||
// AdminRefund 管理员退款订单
|
||
func (s *PaymentOrderService) AdminRefund(ctx context.Context, req *PaymentOrderRefundReq) error {
|
||
// 获取订单信息
|
||
var order entity.PaymentOrder
|
||
err := dao.PaymentOrder.Ctx(ctx).Where("id", req.Id).Scan(&order)
|
||
if err != nil {
|
||
return gerror.New("获取订单信息失败")
|
||
}
|
||
if order.Id == 0 {
|
||
return gerror.New("订单不存在")
|
||
}
|
||
|
||
// 检查订单状态
|
||
if order.PaymentStatus != 1 {
|
||
return gerror.New("只能退款已支付的订单")
|
||
}
|
||
|
||
// 这里应该调用第三方支付接口进行退款
|
||
// 模拟退款成功
|
||
|
||
// 更新订单状态
|
||
_, err = dao.PaymentOrder.Ctx(ctx).Where("id", req.Id).Data(g.Map{
|
||
"payment_status": 3, // 已退款
|
||
"remark": req.Reason,
|
||
"updated_at": gtime.Now(),
|
||
}).Update()
|
||
if err != nil {
|
||
return gerror.New("更新订单状态失败")
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// GetStatistics 获取支付统计
|
||
func (s *PaymentOrderService) GetStatistics(ctx context.Context, startDate, endDate string) (g.Map, error) {
|
||
// 构建查询条件
|
||
query := dao.PaymentOrder.Ctx(ctx)
|
||
if startDate != "" {
|
||
query = query.Where("created_at >= ?", startDate+" 00:00:00")
|
||
}
|
||
if endDate != "" {
|
||
query = query.Where("created_at <= ?", endDate+" 23:59:59")
|
||
}
|
||
|
||
// 获取基础统计
|
||
var stats g.Map
|
||
query.Fields("COUNT(*) as total_orders, COALESCE(SUM(CASE WHEN payment_status = 1 THEN amount ELSE 0 END), 0) as total_amount, COUNT(CASE WHEN payment_status = 1 THEN 1 END) as paid_orders").
|
||
Scan(&stats)
|
||
|
||
// 获取状态统计
|
||
var statusStats []g.Map
|
||
dao.PaymentOrder.Ctx(ctx).Fields("payment_status, COUNT(*) as count").
|
||
Group("payment_status").Scan(&statusStats)
|
||
|
||
return g.Map{
|
||
"total_orders": gconv.Int(stats["total_orders"]),
|
||
"total_amount": gconv.Float64(stats["total_amount"]),
|
||
"paid_orders": gconv.Int(stats["paid_orders"]),
|
||
"status_stats": statusStats,
|
||
}, nil
|
||
}
|
||
|
||
// AdminGetList 管理员获取支付订单列表(HTTP接口)
|
||
func (s *PaymentOrderService) AdminGetList(r *ghttp.Request) {
|
||
// 获取请求参数
|
||
page := r.Get("page", 1).Int()
|
||
size := r.Get("size", 10).Int()
|
||
paymentStatus := r.Get("payment_status", -1).Int()
|
||
userId := r.Get("user_id", 0).Uint()
|
||
startDate := r.Get("start_date").String()
|
||
endDate := r.Get("end_date").String()
|
||
|
||
req := &PaymentOrderListReq{
|
||
Page: page,
|
||
Size: size,
|
||
PaymentStatus: paymentStatus,
|
||
UserId: userId,
|
||
StartDate: startDate,
|
||
EndDate: endDate,
|
||
}
|
||
|
||
res, err := s.AdminList(r.Context(), req)
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, err.Error())
|
||
return
|
||
}
|
||
|
||
response.Success(r, res)
|
||
}
|
||
|
||
// AdminGetDetail 管理员获取支付订单详情(HTTP接口)
|
||
func (s *PaymentOrderService) AdminGetDetail(r *ghttp.Request) {
|
||
// 获取请求参数
|
||
id := r.Get("id").Uint()
|
||
if id == 0 {
|
||
response.Error(r, response.CodeInvalidParam, "订单ID不能为空")
|
||
return
|
||
}
|
||
|
||
req := &PaymentOrderDetailReq{
|
||
Id: id,
|
||
}
|
||
|
||
res, err := s.AdminDetail(r.Context(), req)
|
||
if err != nil {
|
||
response.Error(r, response.CodeInternalError, err.Error())
|
||
return
|
||
}
|
||
|
||
response.Success(r, res)
|
||
}
|