96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package admin
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"quyun/app/model"
|
|
"quyun/app/requests"
|
|
"quyun/database/fields"
|
|
"quyun/providers/wepay"
|
|
|
|
"github.com/gofiber/fiber/v3"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
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 := model.OrdersModel().BuildConditionWithKey(query.OrderNumber, query.UserID)
|
|
return model.OrdersModel().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 := model.OrdersModel().GetByID(ctx.Context(), id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
user, err := model.UsersModel().GetByID(ctx.Context(), order.UserID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
post, err := model.PostsModel().GetByID(ctx.Context(), order.PostID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if order.PaymentMethod == "balance" {
|
|
if err := user.AddBalance(ctx.Context(), order.Meta.Data.CostBalance); err != nil {
|
|
return errors.Wrap(err, "add balance failed")
|
|
}
|
|
|
|
if err := user.RevokePosts(ctx.Context(), order.PostID); err != nil {
|
|
return errors.Wrap(err, "revoke posts failed")
|
|
}
|
|
|
|
order.Status = fields.OrderStatusRefundSuccess
|
|
if err := order.Update(ctx.Context()); err != nil {
|
|
return errors.Wrap(err, "update order failed")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
refundTotal := order.Price*int64(order.Discount)/100 - order.Meta.Data.CostBalance
|
|
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(fmt.Sprintf("%s 退款", post.Title))
|
|
})
|
|
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 := order.Update(ctx.Context()); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|