feat: add coupon risk review

This commit is contained in:
2026-01-15 17:01:36 +08:00
parent c8ec0af07f
commit ba1d120c84
10 changed files with 1255 additions and 8 deletions

View File

@@ -45,6 +45,22 @@ func (c *coupons) ListGrants(ctx fiber.Ctx, filter *dto.SuperCouponGrantListFilt
return services.Super.ListCouponGrants(ctx, filter)
}
// List coupon risks
//
// @Router /super/v1/coupon-risks [get]
// @Summary List coupon risks
// @Description List coupon risk records across tenants
// @Tags Coupon
// @Accept json
// @Produce json
// @Param page query int false "Page number"
// @Param limit query int false "Page size"
// @Success 200 {object} requests.Pager{items=[]dto.SuperCouponRiskItem}
// @Bind filter query
func (c *coupons) ListRisks(ctx fiber.Ctx, filter *dto.SuperCouponRiskListFilter) (*requests.Pager, error) {
return services.Super.ListCouponRisks(ctx, filter)
}
// Update coupon status
//
// @Router /super/v1/coupons/:id<int>/status [patch]

View File

@@ -142,3 +142,82 @@ type SuperCouponGrantItem struct {
// CreatedAt 领取时间RFC3339
CreatedAt string `json:"created_at"`
}
// SuperCouponRiskListFilter 超管优惠券异常核查过滤条件。
type SuperCouponRiskListFilter struct {
requests.Pagination
// RiskType 异常类型过滤used_without_order/order_status_mismatch/used_outside_window/unused_has_order_or_used_at/duplicate_grant
RiskType *string `query:"risk_type"`
// CouponID 优惠券ID过滤精确匹配
CouponID *int64 `query:"coupon_id"`
// TenantID 租户ID过滤精确匹配
TenantID *int64 `query:"tenant_id"`
// TenantCode 租户编码过滤(模糊匹配)。
TenantCode *string `query:"tenant_code"`
// TenantName 租户名称过滤(模糊匹配)。
TenantName *string `query:"tenant_name"`
// Keyword 优惠券标题/描述关键词(模糊匹配)。
Keyword *string `query:"keyword"`
// UserID 用户ID过滤精确匹配
UserID *int64 `query:"user_id"`
// Username 用户名过滤(模糊匹配)。
Username *string `query:"username"`
// Status 用户券状态过滤unused/used/expired
Status *consts.UserCouponStatus `query:"status"`
// OrderStatus 订单状态过滤。
OrderStatus *consts.OrderStatus `query:"order_status"`
// CreatedAtFrom 领取时间起始RFC3339
CreatedAtFrom *string `query:"created_at_from"`
// CreatedAtTo 领取时间结束RFC3339
CreatedAtTo *string `query:"created_at_to"`
// UsedAtFrom 使用时间起始RFC3339
UsedAtFrom *string `query:"used_at_from"`
// UsedAtTo 使用时间结束RFC3339
UsedAtTo *string `query:"used_at_to"`
// Asc 升序字段id/created_at/used_at
Asc *string `query:"asc"`
// Desc 降序字段id/created_at/used_at
Desc *string `query:"desc"`
}
// SuperCouponRiskItem 超管优惠券异常核查记录。
type SuperCouponRiskItem struct {
// ID 用户券ID。
ID int64 `json:"id"`
// RiskType 异常类型。
RiskType string `json:"risk_type"`
// RiskReason 异常说明。
RiskReason string `json:"risk_reason"`
// CouponID 优惠券ID。
CouponID int64 `json:"coupon_id"`
// CouponTitle 优惠券标题。
CouponTitle string `json:"coupon_title"`
// TenantID 租户ID。
TenantID int64 `json:"tenant_id"`
// TenantCode 租户编码。
TenantCode string `json:"tenant_code"`
// TenantName 租户名称。
TenantName string `json:"tenant_name"`
// UserID 用户ID。
UserID int64 `json:"user_id"`
// Username 用户名。
Username string `json:"username"`
// Status 用户券状态。
Status consts.UserCouponStatus `json:"status"`
// StatusDescription 状态描述(用于展示)。
StatusDescription string `json:"status_description"`
// OrderID 使用订单ID。
OrderID int64 `json:"order_id"`
// OrderStatus 订单状态。
OrderStatus consts.OrderStatus `json:"order_status"`
// OrderStatusDescription 订单状态描述(用于展示)。
OrderStatusDescription string `json:"order_status_description"`
// OrderAmountPaid 订单实付金额(分)。
OrderAmountPaid int64 `json:"order_amount_paid"`
// PaidAt 订单支付时间RFC3339
PaidAt string `json:"paid_at"`
// UsedAt 使用时间RFC3339
UsedAt string `json:"used_at"`
// CreatedAt 领取时间RFC3339
CreatedAt string `json:"created_at"`
}

View File

@@ -114,6 +114,11 @@ func (r *Routes) Register(router fiber.Router) {
r.coupons.ListGrants,
Query[dto.SuperCouponGrantListFilter]("filter"),
))
r.log.Debugf("Registering route: Get /super/v1/coupon-risks -> coupons.ListRisks")
router.Get("/super/v1/coupon-risks"[len(r.Path()):], DataFunc1(
r.coupons.ListRisks,
Query[dto.SuperCouponRiskListFilter]("filter"),
))
r.log.Debugf("Registering route: Get /super/v1/coupons -> coupons.List")
router.Get("/super/v1/coupons"[len(r.Path()):], DataFunc1(
r.coupons.List,