Files
quyun/backend/app/http/admin/orders.go
2025-05-06 21:16:23 +08:00

82 lines
1.8 KiB
Go

package admin
import (
"fmt"
"quyun/app/models"
"quyun/app/requests"
"quyun/database/fields"
"quyun/providers/wepay"
"github.com/gofiber/fiber/v3"
)
type OrderListQuery struct {
OrderNumber *string `query:"order_number"`
UserID *int64 `query:"user_id"`
}
// @provider
type orders struct {
wepay *wepay.Client
}
// List users
//
// @Router /admin/orders [get]
// @Bind pagination query
// @Bind query query
func (ctl *orders) List(ctx fiber.Ctx, pagination *requests.Pagination, query *OrderListQuery) (*requests.Pager, error) {
cond := models.Orders.BuildConditionWithKey(query.OrderNumber, query.UserID)
return models.Orders.List(ctx.Context(), pagination, cond)
}
// Refund
// @Router /admin/orders/:id/refund [post]
// @Bind id path
func (ctl *orders) Refund(ctx fiber.Ctx, id int64) error {
order, err := models.Orders.GetByID(ctx.Context(), id)
if err != nil {
return err
}
post, err := models.Posts.GetByID(ctx.Context(), order.PostID)
if err != nil {
return err
}
refundTotal := order.Price * int64(order.Discount) / 100
resp, err := ctl.wepay.Refund(ctx.Context(), func(bm *wepay.BodyMap) {
bm.
OutRefundNo(order.OrderNo).
OutTradeNo(order.OrderNo).
TransactionID(order.TransactionID).
CNYRefundAmount(refundTotal, refundTotal).
RefundReason("管理员退款").
RefundGoods([]wepay.RefundGoodsInfo{
{
MerchantGoodsID: fmt.Sprintf("%d", order.PostID),
GoodsName: post.Title,
RefundQuantity: 1,
RefundAmount: refundTotal,
UnitPrice: order.Price,
},
})
})
if err != nil {
return err
}
meta := order.Meta.Data
meta.RefundResp = resp
order.Meta = fields.ToJson(meta)
order.RefundTransactionID = resp.RefundId
order.Status = fields.OrderStatusRefundProcessing
if err := models.Orders.Update(ctx.Context(), order); err != nil {
return err
}
return nil
}