Files
quyun-v2/backend/app/http/tenant/order_admin.go

192 lines
5.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package tenant
import (
"time"
"quyun/v2/app/errorx"
"quyun/v2/app/http/tenant/dto"
"quyun/v2/app/requests"
"quyun/v2/app/services"
"quyun/v2/database/models"
"github.com/gofiber/fiber/v3"
log "github.com/sirupsen/logrus"
)
// orderAdmin provides tenant-admin order management endpoints.
//
// @provider
type orderAdmin struct{}
// adminOrderList
//
// @Summary 订单列表(租户管理)
// @Tags Tenant
// @Accept json
// @Produce json
// @Param tenantCode path string true "Tenant Code"
// @Param filter query dto.AdminOrderListFilter true "Filter"
// @Success 200 {object} requests.Pager{items=models.Order}
//
// @Router /t/:tenantCode/v1/admin/orders [get]
// @Bind tenant local key(tenant)
// @Bind tenantUser local key(tenant_user)
// @Bind filter query
func (*orderAdmin) adminOrderList(
ctx fiber.Ctx,
tenant *models.Tenant,
tenantUser *models.TenantUser,
filter *dto.AdminOrderListFilter,
) (*requests.Pager, error) {
if err := requireTenantAdmin(tenantUser); err != nil {
return nil, err
}
if filter == nil {
filter = &dto.AdminOrderListFilter{}
}
log.WithFields(log.Fields{
"tenant_id": tenant.ID,
"user_id": tenantUser.UserID,
"query_user_id": filter.UserID,
"username": filter.UsernameTrimmed(),
"content_id": filter.ContentID,
"content_title": filter.ContentTitleTrimmed(),
"type": filter.Type,
"status": filter.Status,
"created_at_from": filter.CreatedAtFrom,
"created_at_to": filter.CreatedAtTo,
"paid_at_from": filter.PaidAtFrom,
"paid_at_to": filter.PaidAtTo,
}).Info("tenant.admin.orders.list")
return services.Order.AdminOrderPage(ctx, tenant.ID, filter)
}
// adminOrderExport
//
// @Summary 订单导出(租户管理)
// @Tags Tenant
// @Accept json
// @Produce json
// @Param tenantCode path string true "Tenant Code"
// @Param filter query dto.AdminOrderListFilter true "Filter"
// @Success 200 {object} dto.AdminOrderExportResponse
//
// @Router /t/:tenantCode/v1/admin/orders/export [get]
// @Bind tenant local key(tenant)
// @Bind tenantUser local key(tenant_user)
// @Bind filter query
func (*orderAdmin) adminOrderExport(
ctx fiber.Ctx,
tenant *models.Tenant,
tenantUser *models.TenantUser,
filter *dto.AdminOrderListFilter,
) (*dto.AdminOrderExportResponse, error) {
if err := requireTenantAdmin(tenantUser); err != nil {
return nil, err
}
if filter == nil {
filter = &dto.AdminOrderListFilter{}
}
log.WithFields(log.Fields{
"tenant_id": tenant.ID,
"user_id": tenantUser.UserID,
}).Info("tenant.admin.orders.export")
return services.Order.AdminOrderExportCSV(ctx.Context(), tenant.ID, filter)
}
// adminOrderDetail
//
// @Summary 订单详情(租户管理)
// @Tags Tenant
// @Accept json
// @Produce json
// @Param tenantCode path string true "Tenant Code"
// @Param orderID path int64 true "OrderID"
// @Success 200 {object} dto.AdminOrderDetail
//
// @Router /t/:tenantCode/v1/admin/orders/:orderID [get]
// @Bind tenant local key(tenant)
// @Bind tenantUser local key(tenant_user)
// @Bind orderID path
func (*orderAdmin) adminOrderDetail(
ctx fiber.Ctx,
tenant *models.Tenant,
tenantUser *models.TenantUser,
orderID int64,
) (*dto.AdminOrderDetail, error) {
if err := requireTenantAdmin(tenantUser); err != nil {
return nil, err
}
log.WithFields(log.Fields{
"tenant_id": tenant.ID,
"user_id": tenantUser.UserID,
"order_id": orderID,
}).Info("tenant.admin.orders.detail")
m, err := services.Order.AdminOrderDetail(ctx, tenant.ID, orderID)
if err != nil {
return nil, err
}
return &dto.AdminOrderDetail{Order: m}, nil
}
// adminRefund
//
// @Summary 订单退款(租户管理)
// @Description 该接口只负责将订单从 paid 推进到 refunding并提交异步退款任务退款入账与权益回收由 worker 异步完成。
// @Description 重复请求幂等:订单处于 refunding/refunded 时会返回当前订单状态,不会重复入账/重复回收权益。
// @Tags Tenant
// @Accept json
// @Produce json
// @Param tenantCode path string true "Tenant Code"
// @Param orderID path int64 true "OrderID"
// @Param form body dto.AdminOrderRefundForm true "Form"
// @Success 200 {object} models.Order
//
// @Router /t/:tenantCode/v1/admin/orders/:orderID/refund [post]
// @Bind tenant local key(tenant)
// @Bind tenantUser local key(tenant_user)
// @Bind orderID path
// @Bind form body
func (*orderAdmin) adminRefund(
ctx fiber.Ctx,
tenant *models.Tenant,
tenantUser *models.TenantUser,
orderID int64,
form *dto.AdminOrderRefundForm,
) (*models.Order, error) {
if err := requireTenantAdmin(tenantUser); err != nil {
return nil, err
}
if form == nil {
return nil, errorx.ErrInvalidParameter
}
log.WithFields(log.Fields{
"tenant_id": tenant.ID,
"user_id": tenantUser.UserID,
"order_id": orderID,
"force": form.Force,
"idempotency_key": form.IdempotencyKey,
}).Info("tenant.admin.orders.refund")
return services.Order.AdminRefundOrder(
ctx,
tenant.ID,
tenantUser.UserID,
orderID,
form.Force,
form.Reason,
form.IdempotencyKey,
time.Now(),
)
}
// 注意:已移除“租户管理员为用户充值”能力。
// 余额已改为 users 表的全局余额,用户可在已加入租户间共享消费;按租户充值会导致账务复杂且易出错。