You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

71 lines
2.8 KiB

package api
import (
"yunyan/comm"
"yunyan/lego/sys/log"
"yunyan/pb"
"strings"
"time"
)
// RebuildStats 全量重建统计(仅超管)
//
// 【已缩小范围】原先此接口还会清空并重算 app_stat_daily/monthly/yearly/global 四张
// 「App 综合运营统计」表。运营统计已整体迁到运营后台(analyze 模块把当日快照经 NATS 推到
// console 主库 stats_global_day,后台读 api_getstatssummary / api_getstatstrend),
// app 服务不再产出、也不再存运营统计,那部分逻辑连同四张表一并移除。
//
// 现在仍然重建的是两张**业务表**,与运营统计无关、且各有在线读者:
// - userstatistics —— 用户维度累计消耗,用户排行榜依赖;从 useruselog + echomeet_record 重算
// - product_stat —— 产品激活数/绑定用户数,代理仪表盘 api_getagentdashboard 依赖;从 userdevice 重算
//
// 响应里的 daily/monthly/yearly 行数恒为 0——字段保留只为不破坏老调用方的结构。
//
// @Summary 重建统计数据
// @Description 从源表重算 userstatistics 与 product_stat(仅超管);App 运营统计已迁至运营后台,不在此重建
// @Tags API
// @Accept json
// @Produce json
// @Param user body pb.ApiRebuildStatsReq true "重建请求"
// @Success 200 {object} comm.HttpResult{data=pb.ApiRebuildStatsResp} "成功"
// @Router /web/api/api_rebuildstats [post]
func (this *apiComp) RebuildStats(session comm.IUserSession, req *pb.ApiRebuildStatsReq) (resp *pb.ApiRebuildStatsResp, errdata *pb.ErrorData) {
start := time.Now()
resp = &pb.ApiRebuildStatsResp{}
// 1. 从消耗日志重建 userstatistics(用户排行榜依赖)
uRows, uErr := this.module.model.rebuildUserStatisticsFromLogs()
if uErr != nil {
errdata = dbErr(uErr, "rebuildUserStatisticsFromLogs")
return
}
this.module.Info("RebuildStats: userstatistics rebuilt from logs",
log.Field{Key: "rows", Value: uRows},
)
// 2. 重建产品激活/绑定统计:全量扫描 userdevice 落库 product_stat,
// 供代理仪表盘(api_getagentdashboard)按产品读取激活数 / 绑定用户数。
psRows, psErr := this.module.model.rebuildProductStats()
if psErr != nil {
errdata = dbErr(psErr, "rebuildProductStats")
return
}
this.module.Info("RebuildStats: product_stat rebuilt",
log.Field{Key: "rows", Value: psRows},
)
resp.CostMs = time.Since(start).Milliseconds()
this.module.Info("RebuildStats done",
log.Field{Key: "userstatistics", Value: uRows},
log.Field{Key: "product_stat", Value: psRows},
log.Field{Key: "cost_ms", Value: resp.CostMs},
)
return
}
func dbErr(err error, where string) *pb.ErrorData {
return &pb.ErrorData{
Code: pb.ErrorCode_DBError,
Message: where + ": " + strings.TrimSpace(err.Error()),
}
}