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()), } }