fix(dashboard): 修复产品动销排行时间范围筛选异常

修复产品动销排行接口在时间筛选上的两个问题:
1. parseRange 未处理 all,导致前端传入 all 时实际回落到默认分支,查询结果等同最近 7 天。
2. 产品动销排行原先按 activity_draw_logs.created_at 过滤时间,但销量/营收统计口径基于已支付订单,导致不同时间范围下结果失真,自定义区间与全部区间表现异常。

本次调整内容:
- 为 parseRange 增加 all 分支,返回从较早时间到当前时间的全量区间。
- OperationsProductPerformance 接口改为接收 start/end 参数,支持前端自定义时间范围透传。
- 将产品动销排行的时间过滤从 activity_draw_logs.created_at 改为 COALESCE(orders.paid_at, orders.created_at),并显式限定 orders.status = 2,使筛选口径与销量/营收统计保持一致。

修复后,全部、7天、30天和自定义时间范围将按支付时间维度返回更符合业务语义的产品动销排行结果。
This commit is contained in:
Zuncle 2026-04-25 01:52:19 +08:00
parent e6e4214df4
commit 45ea70760b

View File

@ -736,6 +736,10 @@ func parseRange(rangeType, startS, endS string) (time.Time, time.Time) {
e := now e := now
s := e.Add(-30 * 24 * time.Hour) s := e.Add(-30 * 24 * time.Hour)
return s, e return s, e
case "all":
e := now
s := time.Date(2000, 1, 1, 0, 0, 0, 0, now.Location())
return s, e
case "custom": case "custom":
if startS != "" && endS != "" { if startS != "" && endS != "" {
if st, err := time.Parse("2006-01-02", startS); err == nil { if st, err := time.Parse("2006-01-02", startS); err == nil {
@ -1854,7 +1858,7 @@ type productPerformanceItem struct {
func (h *handler) OperationsProductPerformance() core.HandlerFunc { func (h *handler) OperationsProductPerformance() core.HandlerFunc {
return func(ctx core.Context) { return func(ctx core.Context) {
s, e := parseRange(ctx.Request().URL.Query().Get("rangeType"), "", "") s, e := parseRange(ctx.Request().URL.Query().Get("rangeType"), ctx.Request().URL.Query().Get("start"), ctx.Request().URL.Query().Get("end"))
db := h.repo.GetDbR().WithContext(ctx.RequestContext()) db := h.repo.GetDbR().WithContext(ctx.RequestContext())
type performanceRow struct { type performanceRow struct {
@ -1898,8 +1902,9 @@ func (h *handler) OperationsProductPerformance() core.HandlerFunc {
Joins("LEFT JOIN orders ON orders.id = activity_draw_logs.order_id"). Joins("LEFT JOIN orders ON orders.id = activity_draw_logs.order_id").
Joins("LEFT JOIN user_item_cards ON user_item_cards.id = orders.item_card_id"). Joins("LEFT JOIN user_item_cards ON user_item_cards.id = orders.item_card_id").
Joins("LEFT JOIN system_item_cards ON system_item_cards.id = user_item_cards.card_id"). Joins("LEFT JOIN system_item_cards ON system_item_cards.id = user_item_cards.card_id").
Where("activity_draw_logs.created_at >= ?", s). Where("orders.status = ?", 2).
Where("activity_draw_logs.created_at <= ?", e). Where("COALESCE(orders.paid_at, orders.created_at) >= ?", s).
Where("COALESCE(orders.paid_at, orders.created_at) <= ?", e).
Group("activity_issues.activity_id"). Group("activity_issues.activity_id").
Order("sales_count DESC"). Order("sales_count DESC").
Limit(10). Limit(10).