2026-08-03 05:52:02 +00:00
|
|
|
|
package crm
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
|
2026-08-19 02:01:15 +00:00
|
|
|
|
crmUC "apps/backend/internal/module/crm/usecase"
|
2026-08-03 05:52:02 +00:00
|
|
|
|
"apps/backend/internal/svc"
|
|
|
|
|
|
"apps/backend/internal/types"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type GetCrmStatsLogic struct {
|
|
|
|
|
|
logx.Logger
|
|
|
|
|
|
ctx context.Context
|
|
|
|
|
|
svcCtx *svc.ServiceContext
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func NewGetCrmStatsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCrmStatsLogic {
|
|
|
|
|
|
return &GetCrmStatsLogic{Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (l *GetCrmStatsLogic) GetCrmStats(req *types.CrmStatsReq) (*types.CrmStatsData, error) {
|
|
|
|
|
|
uid, err := ownerUID(l.ctx)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
stats, err := l.svcCtx.Crm.Stats(l.ctx, uid, req.From, req.To)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2026-08-19 02:01:15 +00:00
|
|
|
|
terms := make([]types.TermConversionStat, 0, len(stats.Terms))
|
|
|
|
|
|
for _, s := range stats.Terms {
|
|
|
|
|
|
row := types.TermConversionStat{
|
|
|
|
|
|
Term: s.Key, Accepted: s.Accepted, Replied: s.Replied, Won: s.Won,
|
|
|
|
|
|
InsufficientSample: s.Accepted < crmUC.StatsMinSample,
|
|
|
|
|
|
}
|
|
|
|
|
|
// 樣本不足只給絕對數,不給會被過度解讀的比率(spec §9.5)
|
|
|
|
|
|
if !row.InsufficientSample {
|
|
|
|
|
|
row.ConversionRate = float64(s.Won) / float64(s.Accepted)
|
|
|
|
|
|
}
|
|
|
|
|
|
terms = append(terms, row)
|
|
|
|
|
|
}
|
|
|
|
|
|
sources := make([]types.SourceConversionStat, 0, len(stats.Sources))
|
|
|
|
|
|
for _, s := range stats.Sources {
|
|
|
|
|
|
sources = append(sources, types.SourceConversionStat{
|
|
|
|
|
|
Source: s.Key, Won: s.Won, InsufficientSample: s.Won < crmUC.StatsMinSample,
|
|
|
|
|
|
})
|
2026-08-03 05:52:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
return &types.CrmStatsData{
|
2026-08-19 02:01:15 +00:00
|
|
|
|
Terms: terms,
|
|
|
|
|
|
Variants: []types.VariantConversionStat{},
|
|
|
|
|
|
Sources: sources,
|
|
|
|
|
|
UnavailableDimensions: stats.UnavailableDimensions,
|
2026-08-03 05:52:02 +00:00
|
|
|
|
}, nil
|
|
|
|
|
|
}
|