forked from all_user/stat_center
Initial commit
This commit is contained in:
@@ -0,0 +1,970 @@
|
||||
package innerserverser
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
"sort"
|
||||
"stat/api/proto"
|
||||
"stat/common/log"
|
||||
"stat/common/tgbot"
|
||||
"stat/common/utils"
|
||||
"stat/models/appInfoMod"
|
||||
"stat/models/dailystatmod"
|
||||
"stat/statg"
|
||||
"time"
|
||||
|
||||
"github.com/360EntSecGroup-Skylar/excelize"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
)
|
||||
|
||||
const titlestyle = `{
|
||||
"font":{
|
||||
"color":"#333333",
|
||||
"bold":true,
|
||||
"size":16,
|
||||
"family":"arial"
|
||||
},
|
||||
|
||||
"alignment":{
|
||||
"vertical":"center",
|
||||
"horizontal":"center",
|
||||
"wrap_text":true
|
||||
}
|
||||
}`
|
||||
|
||||
const cellstyle = `{
|
||||
"font":{
|
||||
"color":"#333333",
|
||||
"bold":false,
|
||||
"size":10,
|
||||
"family":"arial"
|
||||
},
|
||||
"alignment":{
|
||||
"vertical":"center",
|
||||
"horizontal":"center",
|
||||
"wrap_text":true
|
||||
}
|
||||
}`
|
||||
|
||||
func InnerRequest(url string, reqproto interface{}, bind interface{}) error {
|
||||
data, err := json.Marshal(reqproto)
|
||||
|
||||
if err != nil {
|
||||
log.Error("InnerRequest json.Marshal", log.Any("err", err))
|
||||
return err
|
||||
}
|
||||
|
||||
//resp, err = InnerPlainPost(url, data)
|
||||
bodyReader := bytes.NewReader(data)
|
||||
req, err := http.NewRequest(http.MethodPost, url, bodyReader)
|
||||
if err != nil {
|
||||
log.Error("InnerRequest http.NewRequest", log.Any("err", err))
|
||||
return err
|
||||
}
|
||||
timeout := 30 * time.Second
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
client := http.Client{
|
||||
Timeout: timeout,
|
||||
}
|
||||
resp, err := client.Do(req)
|
||||
|
||||
if err != nil {
|
||||
log.Error("InnerRequest http.NewRequest", log.Any("err", err))
|
||||
return err
|
||||
}
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
err = fmt.Errorf("error status %s, http code %d", resp.Status, resp.StatusCode)
|
||||
log.Error("InnerRequest http.NewRequest resp", log.Any("err", err))
|
||||
return err
|
||||
}
|
||||
|
||||
defer resp.Body.Close()
|
||||
|
||||
data, err = io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Error("InnerRequest io.ReadAll", log.Any("err", err))
|
||||
return err
|
||||
}
|
||||
|
||||
return json.Unmarshal(data, bind)
|
||||
}
|
||||
|
||||
// bili请求过来的
|
||||
func InnerRecgaregeList(ctx context.Context, req *proto.InnerRechargeReq) (
|
||||
*proto.InnerDailyRechargeList, error) {
|
||||
if req.InnerId != int32(statg.Conf.ServerIndex) {
|
||||
err := fmt.Errorf("InnerRecgaregeList req.InnerId %d", req.InnerId)
|
||||
log.Error("InnerRecgaregeList req.InnerId", log.Any("err", err))
|
||||
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := &proto.InnerDailyRechargeList{}
|
||||
resp.List = make([]*proto.InnerDailyRecharge, 0)
|
||||
|
||||
begin := req.Begin
|
||||
end := req.End
|
||||
|
||||
list, appinfo, err := GetDailyStatList(ctx, &end, &begin)
|
||||
if err != nil {
|
||||
log.Error("InnerRecgaregeList:GetDbList", log.E(err))
|
||||
return nil, err
|
||||
}
|
||||
for _, info := range list {
|
||||
if info.AppId == 889 {
|
||||
continue
|
||||
}
|
||||
name := ""
|
||||
if data, ok := appinfo[info.AppId]; ok {
|
||||
name = data.Name
|
||||
}
|
||||
temp := &proto.InnerDailyRecharge{
|
||||
AppId: info.AppId,
|
||||
Name: name,
|
||||
Type: "",
|
||||
SumDate: info.SumDate,
|
||||
DateTime: info.SumDate.Format(time.DateOnly),
|
||||
DailyVistCount: info.TotalVisitCount,
|
||||
DailyRegister: info.NewTotalCount,
|
||||
DailyAppAmount: info.TotalAmount,
|
||||
DailyGameAmount: info.GameRechageAmount,
|
||||
RechargeOrder: info.SuccessRechargeOrder,
|
||||
}
|
||||
resp.List = append(resp.List, temp)
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func GetDbList(ctx context.Context, day *time.Time, yesterday *time.Time) (
|
||||
[]*dailystatmod.DailyStatMod, map[int32]*appInfoMod.AppInfo, error) {
|
||||
list := make([]*dailystatmod.DailyStatMod, 0)
|
||||
appinfo, serr := appInfoMod.GetAllAppIdMap(ctx, bson.M{})
|
||||
if serr != nil {
|
||||
log.Error("InnerServerDailyStat appInfoMod.GetAllAppInfo", log.Any("serr", serr))
|
||||
return nil, nil, serr
|
||||
}
|
||||
for _, info := range appinfo {
|
||||
//data, serr := dailystatmod.FindOneDailyStat(ctx, info.AppId, yesterday)
|
||||
rechargelist, serr := dailystatmod.GetDailyStatTotalList(ctx, &info.AppId, yesterday, day)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerDailyStat dailystatmod.GetDailyStatTotalList", log.Any("serr", serr))
|
||||
continue
|
||||
}
|
||||
if len(rechargelist) != 1 {
|
||||
log.Error("InnerServerDailyStat dailystatmod.GetDailyStatTotalList",
|
||||
log.Any("len(rechargelist)", len(rechargelist)), log.Any("appid", info.AppId),
|
||||
log.Any("yesterday", yesterday), log.Any("day", day))
|
||||
continue
|
||||
}
|
||||
if rechargelist != nil {
|
||||
list = append(list, rechargelist...)
|
||||
} else {
|
||||
log.Error("InnerServerDailyStat rechargelist nil")
|
||||
}
|
||||
}
|
||||
return list, appinfo, nil
|
||||
}
|
||||
|
||||
// 从这个方法开始bili本机调用
|
||||
func DocExsit(path string) bool {
|
||||
_, err := os.Stat(path)
|
||||
if err != nil {
|
||||
if os.IsExist(err) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// bili请求麻豆知乎信息只在bili启动麻豆知乎只响应数据
|
||||
func InnerServerDailyStat(ctx context.Context) error {
|
||||
if statg.Conf.ServerIndex != statg.ServerIndexBili {
|
||||
log.Error("InnerServerDailyStat serverindex",
|
||||
log.Any("serverindex", statg.Conf.ServerIndex))
|
||||
return nil
|
||||
}
|
||||
log.Info("InnerServerDailyStat start")
|
||||
list := make([]*proto.InnerDailyRecharge, 0)
|
||||
now := time.Now()
|
||||
|
||||
for id, info := range statg.Conf.InnerServers {
|
||||
if id == statg.ServerIndexBili {
|
||||
continue
|
||||
}
|
||||
|
||||
if id != statg.ServerIndexBili && info == "" {
|
||||
log.Error("statg.Conf.InnerServers server not found",
|
||||
log.Any("statg.Conf.InnerServers", id))
|
||||
continue
|
||||
}
|
||||
req := &proto.InnerRechargeReq{
|
||||
InnerId: int32(id),
|
||||
Begin: utils.BeginWithTime(now).Add(-24 * time.Hour),
|
||||
End: utils.BeginWithTime(now),
|
||||
}
|
||||
url := info + "/api/stat/inner/recharge/list"
|
||||
log.Info("InnerServerDailyStat", log.Any("req", url))
|
||||
res := &proto.InnerDailyRechargeResp{}
|
||||
err := InnerRequest(url, req, res)
|
||||
if err != nil {
|
||||
log.Error("InnerServerDailyStat InnerRequest",
|
||||
log.Any("InnerRequest", err))
|
||||
continue
|
||||
}
|
||||
if res == nil {
|
||||
log.Error("InnerServerDailyStat InnerRequest data not found")
|
||||
continue
|
||||
}
|
||||
if res.Data.List != nil && len(res.Data.List) > 0 {
|
||||
list = append(list, res.Data.List...)
|
||||
}
|
||||
}
|
||||
|
||||
/*appinfo, serr := appInfoMod.GetAllAppIdMap(ctx, bson.M{})
|
||||
if serr != nil {
|
||||
log.Error("InnerServerDailyStat appInfoMod.GetAllAppInfo", log.Any("serr", serr))
|
||||
return nil, serr
|
||||
}
|
||||
*/
|
||||
|
||||
yesterday := utils.BeginOfYesterday()
|
||||
day := utils.BeginOfToday()
|
||||
|
||||
bililist, appinfo, err := GetDbList(ctx, &day, &yesterday)
|
||||
if err != nil {
|
||||
log.Error("InnerServerDailyStat:GetDbList", log.E(err))
|
||||
return err
|
||||
}
|
||||
|
||||
for _, info := range bililist {
|
||||
name := ""
|
||||
if data, ok := appinfo[info.AppId]; ok {
|
||||
name = data.Name
|
||||
}
|
||||
temp := &proto.InnerDailyRecharge{
|
||||
AppId: info.AppId,
|
||||
Name: name,
|
||||
Type: "",
|
||||
DateTime: "",
|
||||
DailyVistCount: info.TotalVisitCount,
|
||||
DailyRegister: info.NewTotalCount,
|
||||
DailyAppAmount: info.TotalAmount,
|
||||
DailyGameAmount: info.GameRechageAmount,
|
||||
RechargeOrder: info.SuccessRechargeOrder,
|
||||
}
|
||||
list = append(list, temp)
|
||||
}
|
||||
|
||||
temp := &proto.InnerDailyRecharge{}
|
||||
for _, info := range list {
|
||||
temp.AppId = 0
|
||||
temp.Name = "天宇总充值"
|
||||
temp.CellType = 1
|
||||
temp.DailyVistCount += info.DailyVistCount
|
||||
temp.DailyRegister += info.DailyRegister
|
||||
temp.DailyAppAmount += info.DailyAppAmount
|
||||
temp.DailyGameAmount += info.DailyGameAmount
|
||||
temp.RechargeOrder += info.RechargeOrder
|
||||
}
|
||||
list = append(list, temp)
|
||||
for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 {
|
||||
list[i], list[j] = list[j], list[i]
|
||||
}
|
||||
dir := yesterday.Format("2006-01-02")
|
||||
filePath := "/usr/local" + "/bakexel/" + dir + "/"
|
||||
//filename := utils.BeginOfToday().Format("2006-01-02")
|
||||
if !DocExsit(filePath) {
|
||||
err = os.Mkdir(filePath, os.ModePerm)
|
||||
if err != nil {
|
||||
log.Error("InnerServerDailyStat:export save file to disk failed",
|
||||
log.Any("fileName", filePath),
|
||||
log.E(err))
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
f := excelize.NewFile()
|
||||
|
||||
if f == nil {
|
||||
log.Error("InnerServerDailyStat f failed")
|
||||
err = errors.New("InnerServerDailyStat f failed")
|
||||
return err
|
||||
}
|
||||
|
||||
// 设置列宽
|
||||
f.SetColWidth(sheetName, "A", "L", 23)
|
||||
|
||||
// 设置表头行高
|
||||
f.SetRowHeight(sheetName, 1, 25)
|
||||
// 设置表头样式
|
||||
headStyleID, _ := f.NewStyle(titlestyle)
|
||||
headStyleID0, _ := f.NewStyle(cellstyle)
|
||||
f.SetCellStyle(sheetName, "A1", "L1", headStyleID)
|
||||
idx := f.NewSheet(sheetName)
|
||||
var exportTransWaterTitleold = map[string]string{
|
||||
"A1": "产品",
|
||||
"B1": "归属",
|
||||
"C1": "日期",
|
||||
"D1": "日活跃",
|
||||
"E1": "日注册",
|
||||
"F1": "视频日充值",
|
||||
"G1": "棋牌日充值",
|
||||
"H1": "交易笔数",
|
||||
}
|
||||
|
||||
rowindex := 'A'
|
||||
for k, v := range exportTransWaterTitleold {
|
||||
f.SetCellValue(sheetName, k, v)
|
||||
row := fmt.Sprintf("%s%d", string(rowindex), 2)
|
||||
|
||||
f.SetCellStyle(sheetName, row, row, headStyleID0)
|
||||
rowindex++
|
||||
}
|
||||
|
||||
for k, v := range list {
|
||||
i := 'A' // i 不能超过Z,即列输不能超过26列,超出将出现bug
|
||||
if v.AppId != 0 {
|
||||
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), v.Name) //名称
|
||||
}
|
||||
i++
|
||||
|
||||
/*if v.AppId != 0 {
|
||||
if v.AppId == 888 {
|
||||
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), "集团") //归属
|
||||
} else {
|
||||
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), "内部") //归属
|
||||
}
|
||||
}
|
||||
*/
|
||||
i++
|
||||
|
||||
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), dir) //时间
|
||||
i++
|
||||
|
||||
totalamount := fmt.Sprintf("%.2f", float64(v.DailyVistCount)*0.01)
|
||||
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //日活跃
|
||||
i++
|
||||
|
||||
totalamount = fmt.Sprintf("%.2f", float64(v.DailyRegister)*0.01)
|
||||
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //日注册
|
||||
i++
|
||||
|
||||
totalamount = fmt.Sprintf("%.2f", float64(v.DailyAppAmount)*0.0001)
|
||||
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //视频日充值
|
||||
i++
|
||||
|
||||
if v.AppId == 0 || v.AppId == 888 {
|
||||
totalamount = fmt.Sprintf("%.2f", float64(v.DailyGameAmount)*0.0001)
|
||||
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //棋牌日充值
|
||||
}
|
||||
i++
|
||||
|
||||
totalamount = fmt.Sprintf("%.2f", float64(v.RechargeOrder)*0.01)
|
||||
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", string(i), k+2), totalamount) //交易笔数
|
||||
}
|
||||
|
||||
f.SetActiveSheet(idx)
|
||||
fileName := filePath + dir + ".xlsx"
|
||||
|
||||
if err = f.SaveAs(fileName); err != nil {
|
||||
log.Error("InnerServerDailyStat:export save file to disk failed",
|
||||
log.Any("fileName", fileName),
|
||||
log.E(err))
|
||||
return err
|
||||
}
|
||||
|
||||
if statg.RchssendBot != nil {
|
||||
err = statg.RchssendBot.Sendrchstochat("天宇公司日报", fileName, tgbot.FileTypeDocument)
|
||||
//statg.Bot.Sendrchstochat("充值", fileName, tgbot.FileTypeDocument)
|
||||
if err != nil {
|
||||
log.Error("Sendrchstochat", log.Any("Sendrchstochat", err))
|
||||
}
|
||||
}
|
||||
|
||||
log.Info("InnerServerDailyStat end")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// bili请求麻豆知乎信息只在bili启动麻豆知乎只响应数据
|
||||
func InnerServerMonthStat(ctx context.Context, begin, end *time.Time) error {
|
||||
if statg.Conf.ServerIndex != statg.ServerIndexBili {
|
||||
log.Error("InnerServerMonthStat serverindex",
|
||||
log.Any("serverindex", statg.Conf.ServerIndex))
|
||||
return nil
|
||||
}
|
||||
log.Info("InnerServerMonthStat start")
|
||||
var f *excelize.File
|
||||
newxlslfile := false
|
||||
var err error
|
||||
yesterday := utils.BeginOfYesterday()
|
||||
day := utils.BeginOfToday()
|
||||
|
||||
if begin != nil && end != nil {
|
||||
yesterday = *begin
|
||||
day = *end
|
||||
}
|
||||
dir := yesterday.Format("2006-01")
|
||||
dayrow := yesterday.Format("2006-01-02")
|
||||
filePath := "/usr/local" + "/bakmonth/" + dir + "/"
|
||||
filename := filePath + dir + ".xlsx"
|
||||
if !DocExsit(filePath) {
|
||||
err = os.MkdirAll(filePath, os.ModePerm)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat:export save file to disk failed",
|
||||
log.Any("fileName", filePath),
|
||||
log.E(err))
|
||||
return err
|
||||
}
|
||||
f = excelize.NewFile()
|
||||
newxlslfile = true
|
||||
} else {
|
||||
if !DocExsit(filename) {
|
||||
f = excelize.NewFile()
|
||||
newxlslfile = true
|
||||
} else {
|
||||
f, err = excelize.OpenFile(filename)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat excelize.OpenFile failed",
|
||||
log.Any("fileName", filePath),
|
||||
log.E(err))
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if f == nil {
|
||||
log.Error("InnerServerMonthStat f failed")
|
||||
err = errors.New("InnerServerMonthStat f failed")
|
||||
return err
|
||||
}
|
||||
|
||||
list := make([]*proto.InnerDailyRecharge, 0)
|
||||
for id, info := range statg.Conf.InnerServers {
|
||||
if id == statg.ServerIndexBili {
|
||||
continue
|
||||
}
|
||||
|
||||
if id != statg.ServerIndexBili && info == "" {
|
||||
log.Error("InnerServerMonthStat server not found",
|
||||
log.Any("statg.Conf.InnerServers", id))
|
||||
continue
|
||||
}
|
||||
req := &proto.InnerRechargeReq{
|
||||
InnerId: int32(id),
|
||||
Begin: yesterday,
|
||||
End: day,
|
||||
}
|
||||
url := info + "/api/stat/inner/recharge/list"
|
||||
log.Info("InnerServerMonthStat", log.Any("req", url))
|
||||
res := &proto.InnerDailyRechargeResp{}
|
||||
err = InnerRequest(url, req, res)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat InnerRequest",
|
||||
log.Any("InnerRequest", err))
|
||||
continue
|
||||
}
|
||||
if res == nil {
|
||||
log.Error("InnerServerMonthStat InnerRequest data not found")
|
||||
continue
|
||||
}
|
||||
if res.Data.List != nil && len(res.Data.List) > 0 {
|
||||
list = append(list, res.Data.List...)
|
||||
}
|
||||
}
|
||||
|
||||
bililist, appinfo, err := GetDbList(ctx, &day, &yesterday)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat:GetDbList", log.E(err))
|
||||
return err
|
||||
}
|
||||
|
||||
for _, info := range bililist {
|
||||
name := ""
|
||||
if data, ok := appinfo[info.AppId]; ok {
|
||||
name = data.Name
|
||||
}
|
||||
temp := &proto.InnerDailyRecharge{
|
||||
AppId: info.AppId,
|
||||
Name: name,
|
||||
Type: "",
|
||||
DateTime: "",
|
||||
DailyVistCount: info.TotalVisitCount,
|
||||
DailyRegister: info.NewTotalCount,
|
||||
DailyAppAmount: info.TotalAmount,
|
||||
DailyGameAmount: info.GameRechageAmount,
|
||||
RechargeOrder: info.SuccessRechargeOrder,
|
||||
}
|
||||
list = append(list, temp)
|
||||
}
|
||||
|
||||
temp := &proto.InnerDailyRecharge{}
|
||||
for _, info := range list {
|
||||
temp.AppId = 0
|
||||
temp.CellType = 1
|
||||
temp.Name = "天宇总充值"
|
||||
temp.DailyVistCount += info.DailyVistCount
|
||||
temp.DailyRegister += info.DailyRegister
|
||||
temp.DailyAppAmount += info.DailyAppAmount
|
||||
temp.DailyGameAmount += info.DailyGameAmount
|
||||
temp.RechargeOrder += info.RechargeOrder
|
||||
}
|
||||
list = append(list, temp)
|
||||
for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 {
|
||||
list[i], list[j] = list[j], list[i]
|
||||
}
|
||||
|
||||
// 设置表头样式
|
||||
headStyleID, _ := f.NewStyle(titlestyle)
|
||||
// 设置表头样式
|
||||
headStyleID0, _ := f.NewStyle(cellstyle)
|
||||
|
||||
if newxlslfile {
|
||||
err = NewXlslFile0(f, list, headStyleID, headStyleID0)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat excelize.OpenFile failed",
|
||||
log.Any("fileName", filePath),
|
||||
log.E(err))
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
err = OpenOldXlsl(f, list)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat excelize.OpenFile failed",
|
||||
log.Any("fileName", filePath),
|
||||
log.E(err))
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
row := 0
|
||||
cols := f.GetRows(sheetName)
|
||||
for rowindex, col := range cols {
|
||||
for colindex, rowCell := range col {
|
||||
if rowCell == "" {
|
||||
continue
|
||||
}
|
||||
if colindex == 0 {
|
||||
if rowCell == dayrow {
|
||||
row = rowindex + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if row == 0 {
|
||||
return errors.New("InnerServerMonthStat row <= 0")
|
||||
}
|
||||
|
||||
for _, info := range list {
|
||||
cellday, serr := utils.CoordinatesToCellName(info.BeginCol, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
return serr
|
||||
}
|
||||
cellregister, serr := utils.CoordinatesToCellName(info.BeginCol+1, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
return serr
|
||||
}
|
||||
cellrecharge, serr := utils.CoordinatesToCellName(info.BeginCol+2, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
|
||||
return serr
|
||||
}
|
||||
cellgame, serr := utils.CoordinatesToCellName(info.BeginCol+3, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
|
||||
return serr
|
||||
}
|
||||
cellorder, serr := utils.CoordinatesToCellName(info.BeginCol+4, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
|
||||
return serr
|
||||
}
|
||||
|
||||
f.SetCellStyle(sheetName, cellday, cellday, headStyleID0)
|
||||
totalamount := fmt.Sprintf("%.2f", float64(info.DailyVistCount)*0.01)
|
||||
f.SetCellValue(sheetName, cellday, totalamount)
|
||||
|
||||
f.SetCellStyle(sheetName, cellregister, cellregister, headStyleID0)
|
||||
totalamount = fmt.Sprintf("%.2f", float64(info.DailyRegister)*0.01)
|
||||
f.SetCellValue(sheetName, cellregister, totalamount)
|
||||
|
||||
f.SetCellStyle(sheetName, cellrecharge, cellrecharge, headStyleID0)
|
||||
totalamount = fmt.Sprintf("%.2f", float64(info.DailyAppAmount)*0.0001)
|
||||
f.SetCellValue(sheetName, cellrecharge, totalamount)
|
||||
|
||||
if info.AppId == 0 || info.AppId == 888 {
|
||||
f.SetCellStyle(sheetName, cellgame, cellgame, headStyleID0)
|
||||
totalamount = fmt.Sprintf("%.2f", float64(info.DailyGameAmount)*0.0001)
|
||||
f.SetCellValue(sheetName, cellgame, totalamount)
|
||||
}
|
||||
|
||||
f.SetCellStyle(sheetName, cellorder, cellorder, headStyleID0)
|
||||
totalamount = fmt.Sprintf("%.2f", float64(info.RechargeOrder)*0.01)
|
||||
f.SetCellValue(sheetName, cellorder, totalamount)
|
||||
}
|
||||
if newxlslfile {
|
||||
err = f.SaveAs(filename)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat SaveAs ", log.Any("err", err))
|
||||
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
err = f.Save()
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat Save ", log.Any("err", err))
|
||||
|
||||
return err
|
||||
}
|
||||
}
|
||||
input, err := os.ReadFile(filename)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat ReadFile ", log.Any("err", err))
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
destinationFile := filePath + dayrow + ".xlsx"
|
||||
err = os.WriteFile(destinationFile, input, 0777)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat WriteFile ", log.Any("err", err))
|
||||
|
||||
return err
|
||||
}
|
||||
if statg.RchssendBot != nil {
|
||||
err = statg.RchssendBot.Sendrchstochat("天宇公司综合日报", destinationFile,
|
||||
tgbot.FileTypeDocument)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat", log.Any("Sendrchstochat", err))
|
||||
}
|
||||
}
|
||||
|
||||
log.Info("InnerServerMonthStat end")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func InnerServerMonthStat2(ctx context.Context, begin, end *time.Time, cmd *tgbot.Command) error {
|
||||
if statg.Conf.ServerIndex != statg.ServerIndexBili {
|
||||
log.Error("InnerServerMonthStat serverindex",
|
||||
log.Any("serverindex", statg.Conf.ServerIndex))
|
||||
return nil
|
||||
}
|
||||
log.Info("InnerServerMonthStat start")
|
||||
f := excelize.NewFile()
|
||||
now := time.Now().AddDate(0, 0, -1)
|
||||
start := utils.BeginOfMonth(now)
|
||||
stop := utils.BeginWithTime(now).AddDate(0, 0, 1)
|
||||
if begin != nil {
|
||||
start = *begin
|
||||
}
|
||||
if end != nil {
|
||||
stop = *end
|
||||
}
|
||||
listOrg := make([]*proto.InnerDailyRecharge, 0)
|
||||
for id, info := range statg.Conf.InnerServers {
|
||||
req := &proto.InnerRechargeReq{
|
||||
InnerId: int32(id),
|
||||
Begin: start,
|
||||
End: stop,
|
||||
}
|
||||
url := info + "/api/stat/inner/recharge/list"
|
||||
log.Info("InnerServerMonthStat", log.Any("req", url))
|
||||
res := &proto.InnerDailyRechargeResp{}
|
||||
err := InnerRequest(url, req, res)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat InnerRequest",
|
||||
log.Any("InnerRequest", err))
|
||||
continue
|
||||
}
|
||||
if res == nil {
|
||||
log.Error("InnerServerMonthStat InnerRequest data not found")
|
||||
continue
|
||||
}
|
||||
if res.Data.List != nil && len(res.Data.List) > 0 {
|
||||
listOrg = append(listOrg, res.Data.List...)
|
||||
}
|
||||
}
|
||||
appNames := make(map[int32]string)
|
||||
appNames[0] = "天宇总充值"
|
||||
source := map[int64]*DayRecharge{}
|
||||
for _, info := range listOrg {
|
||||
appNames[info.AppId] = info.Name
|
||||
temp := &proto.InnerDailyRecharge{
|
||||
AppId: info.AppId,
|
||||
Name: info.Name,
|
||||
SumDate: info.SumDate,
|
||||
DateTime: info.SumDate.Format(time.DateOnly),
|
||||
DailyVistCount: info.DailyVistCount,
|
||||
DailyRegister: info.DailyRegister,
|
||||
DailyAppAmount: info.DailyAppAmount,
|
||||
DailyGameAmount: info.DailyGameAmount,
|
||||
RechargeOrder: info.RechargeOrder,
|
||||
}
|
||||
found, ok := source[info.SumDate.Unix()]
|
||||
if !ok {
|
||||
found = &DayRecharge{
|
||||
SumDate: info.SumDate,
|
||||
List: make([]*proto.InnerDailyRecharge, 0),
|
||||
Dict: make(map[int32]*proto.InnerDailyRecharge),
|
||||
}
|
||||
source[info.SumDate.Unix()] = found
|
||||
}
|
||||
found.List = append(found.List, temp)
|
||||
found.Dict[info.AppId] = temp
|
||||
found.Total.Name = "天宇总充值"
|
||||
found.Total.DateTime = info.SumDate.Format(time.DateOnly)
|
||||
found.Total.SumDate = info.SumDate
|
||||
found.Total.DailyVistCount += temp.DailyVistCount
|
||||
found.Total.DailyRegister += temp.DailyRegister
|
||||
found.Total.DailyAppAmount += temp.DailyAppAmount
|
||||
found.Total.DailyGameAmount += temp.DailyGameAmount
|
||||
found.Total.RechargeOrder += temp.RechargeOrder
|
||||
}
|
||||
appIds := make([]int, 0)
|
||||
for id, _ := range appNames {
|
||||
appIds = append(appIds, int(id))
|
||||
}
|
||||
sort.Sort(sort.IntSlice(appIds))
|
||||
AppInfos := make([]*AppInformation, 0)
|
||||
for _, id := range appIds {
|
||||
AppInfos = append(AppInfos, &AppInformation{
|
||||
Id: id,
|
||||
Name: appNames[int32(id)],
|
||||
})
|
||||
}
|
||||
for _, value := range source {
|
||||
value.Dict[0] = &value.Total
|
||||
}
|
||||
// 按APP汇总
|
||||
for _, app := range AppInfos {
|
||||
for _, value := range source {
|
||||
if info, ok := value.Dict[int32(app.Id)]; ok {
|
||||
app.Total.DailyVistCount += info.DailyVistCount
|
||||
app.Total.DailyRegister += info.DailyRegister
|
||||
app.Total.DailyAppAmount += info.DailyAppAmount
|
||||
app.Total.DailyGameAmount += info.DailyGameAmount
|
||||
app.Total.RechargeOrder += info.RechargeOrder
|
||||
}
|
||||
}
|
||||
}
|
||||
// 设置表头样式
|
||||
headStyleID, _ := f.NewStyle(titlestyle)
|
||||
// 设置表头样式
|
||||
headStyleID0, _ := f.NewStyle(cellstyle)
|
||||
// 设置表结构
|
||||
err := NewXlslFile2(f, AppInfos, headStyleID, headStyleID0, now)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat excelize.OpenFile failed", log.E(err))
|
||||
return err
|
||||
}
|
||||
// 设置数据
|
||||
row := 4
|
||||
for day := start; day.Before(stop); day = day.AddDate(0, 0, 1) {
|
||||
if found, ok := source[day.Unix()]; ok {
|
||||
for _, app := range AppInfos {
|
||||
if info, ok2 := found.Dict[int32(app.Id)]; ok2 {
|
||||
_ = SetAppData(f, info, row, app.BeginCol, headStyleID0)
|
||||
}
|
||||
}
|
||||
}
|
||||
row++
|
||||
}
|
||||
// 设置总计
|
||||
row = utils.EndOfMonth(now).Day() - utils.BeginOfMonth(now).Day() + 1 + 4
|
||||
for _, app := range AppInfos {
|
||||
_ = SetAppData(f, &app.Total, row, app.BeginCol, headStyleID0)
|
||||
}
|
||||
// 保存文件
|
||||
tempDir := os.TempDir()
|
||||
fmt.Println("临时文件目录:", tempDir)
|
||||
|
||||
// 创建一个临时文件
|
||||
yesterday := utils.BeginOfYesterday().Format(time.DateOnly)
|
||||
fileName := path.Join(tempDir, fmt.Sprintf("%s.xlsx", yesterday))
|
||||
//defer os.Remove(fileName) // 确保程序结束后删除临时文件
|
||||
err = f.SaveAs(fileName)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat SaveAs ", log.Any("err", err))
|
||||
return err
|
||||
}
|
||||
// 发送文件
|
||||
if cmd != nil {
|
||||
err = cmd.SendFile("天宇公司综合日报", fileName)
|
||||
} else {
|
||||
if statg.RchssendBot != nil {
|
||||
err = statg.RchssendBot.Sendrchstochat("天宇公司综合日报", fileName, tgbot.FileTypeDocument)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat", log.Any("Sendrchstochat", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func SetAppData(f *excelize.File, info *proto.InnerDailyRecharge, row, col int, headStyle int) error {
|
||||
cellday, serr := utils.CoordinatesToCellName(col, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
return serr
|
||||
}
|
||||
cellregister, serr := utils.CoordinatesToCellName(col+1, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
return serr
|
||||
}
|
||||
cellrecharge, serr := utils.CoordinatesToCellName(col+2, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
|
||||
return serr
|
||||
}
|
||||
cellgame, serr := utils.CoordinatesToCellName(col+3, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
|
||||
return serr
|
||||
}
|
||||
cellorder, serr := utils.CoordinatesToCellName(col+4, row)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerMonthStat CoordinatesToCellName ", log.Any("err", serr))
|
||||
|
||||
return serr
|
||||
}
|
||||
|
||||
f.SetCellStyle(sheetName, cellday, cellday, headStyle)
|
||||
totalamount := fmt.Sprintf("%.2f", float64(info.DailyVistCount)*0.01)
|
||||
f.SetCellValue(sheetName, cellday, totalamount)
|
||||
|
||||
f.SetCellStyle(sheetName, cellregister, cellregister, headStyle)
|
||||
totalamount = fmt.Sprintf("%.2f", float64(info.DailyRegister)*0.01)
|
||||
f.SetCellValue(sheetName, cellregister, totalamount)
|
||||
|
||||
f.SetCellStyle(sheetName, cellrecharge, cellrecharge, headStyle)
|
||||
totalamount = fmt.Sprintf("%.2f", float64(info.DailyAppAmount)*0.0001)
|
||||
f.SetCellValue(sheetName, cellrecharge, totalamount)
|
||||
|
||||
if info.AppId == 0 || info.AppId == 888 {
|
||||
f.SetCellStyle(sheetName, cellgame, cellgame, headStyle)
|
||||
totalamount = fmt.Sprintf("%.2f", float64(info.DailyGameAmount)*0.0001)
|
||||
f.SetCellValue(sheetName, cellgame, totalamount)
|
||||
}
|
||||
|
||||
f.SetCellStyle(sheetName, cellorder, cellorder, headStyle)
|
||||
totalamount = fmt.Sprintf("%.2f", float64(info.RechargeOrder)*0.01)
|
||||
f.SetCellValue(sheetName, cellorder, totalamount)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetDailyStatList(ctx context.Context, day *time.Time, yesterday *time.Time) (
|
||||
[]*dailystatmod.DailyStatMod, map[int32]*appInfoMod.AppInfo, error) {
|
||||
list := make([]*dailystatmod.DailyStatMod, 0)
|
||||
appinfo, serr := appInfoMod.GetAllAppIdMap(ctx, bson.M{})
|
||||
if serr != nil {
|
||||
log.Error("InnerServerDailyStat appInfoMod.GetAllAppInfo", log.Any("serr", serr))
|
||||
return nil, nil, serr
|
||||
}
|
||||
for _, info := range appinfo {
|
||||
rechargelist, serr := dailystatmod.GetDailyStatTotalList(ctx, &info.AppId, yesterday, day)
|
||||
if serr != nil {
|
||||
log.Error("InnerServerDailyStat dailystatmod.GetDailyStatTotalList", log.Any("serr", serr))
|
||||
continue
|
||||
}
|
||||
if rechargelist != nil {
|
||||
list = append(list, rechargelist...)
|
||||
} else {
|
||||
log.Error("InnerServerDailyStat rechargelist nil")
|
||||
}
|
||||
}
|
||||
return list, appinfo, nil
|
||||
}
|
||||
|
||||
type appDailyDataStat struct {
|
||||
AppName string `json:"appName"` // 产品名称
|
||||
AppId int32 `json:"appId"` // 产品Id
|
||||
SumDate time.Time `json:"sumDate"` // 日期
|
||||
Type string `json:"type"` // 产品类型,pay:付费,free:免费
|
||||
TotalVisitCount float64 `json:"totalVisitCount"` // 日活跃
|
||||
TotalNewCount float64 `json:"totalNewCount"` // 日注册
|
||||
TotalVidAmount float64 `json:"totalVidAmount"` // 视频日充值
|
||||
TotalQpAmount float64 `json:"totalQpAmount"` // 棋牌日充值
|
||||
VipRechargeCount float64 `json:"vipRechargeCount"` // vip交易笔数
|
||||
CoinRechargeCount float64 `json:"coinRechargeCount"` // 金币交易笔数
|
||||
RechargeCount float64 `json:"rechargeCount"` // 交易总笔数
|
||||
MonthAmount float64 `json:"monthAmount"` // 当月总充值
|
||||
MonthNewCount float64 `json:"monthNewCount"` // 当月总注册
|
||||
MonthRechargeCount float64 `json:"monthRechargeCount"` // 当月总交易笔数
|
||||
MonthVisitCount float64 `json:"monthVisitCount"` // 当月总日活
|
||||
}
|
||||
|
||||
func TianyuAppDailyData(ctx context.Context) ([]*appDailyDataStat, error) {
|
||||
resp := make([]*appDailyDataStat, 0)
|
||||
if statg.Conf.ServerIndex != statg.ServerIndexBili {
|
||||
log.Error("InnerServerMonthStat serverindex",
|
||||
log.Any("serverindex", statg.Conf.ServerIndex))
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
log.Info("InnerServerMonthStat start")
|
||||
now := time.Now().AddDate(0, 0, -1)
|
||||
start := utils.BeginOfMonth(now)
|
||||
stop := utils.BeginWithTime(now).AddDate(0, 0, 1)
|
||||
|
||||
listOrg := make([]*proto.InnerDailyRecharge, 0)
|
||||
for id, info := range statg.Conf.InnerServers {
|
||||
req := &proto.InnerRechargeReq{
|
||||
InnerId: int32(id),
|
||||
Begin: start,
|
||||
End: stop,
|
||||
}
|
||||
url := info + "/api/stat/inner/recharge/list"
|
||||
log.Info("InnerServerMonthStat", log.Any("req", url))
|
||||
res := &proto.InnerDailyRechargeResp{}
|
||||
err := InnerRequest(url, req, res)
|
||||
if err != nil {
|
||||
log.Error("InnerServerMonthStat InnerRequest",
|
||||
log.Any("InnerRequest", err))
|
||||
continue
|
||||
}
|
||||
if res == nil {
|
||||
log.Error("InnerServerMonthStat InnerRequest data not found")
|
||||
continue
|
||||
}
|
||||
if res.Data.List != nil && len(res.Data.List) > 0 {
|
||||
listOrg = append(listOrg, res.Data.List...)
|
||||
}
|
||||
}
|
||||
|
||||
for _, info := range listOrg {
|
||||
temp := &appDailyDataStat{
|
||||
AppId: 100000 + info.AppId,
|
||||
AppName: info.Name,
|
||||
SumDate: info.SumDate,
|
||||
TotalVisitCount: float64(info.DailyVistCount),
|
||||
TotalNewCount: float64(info.DailyRegister),
|
||||
TotalVidAmount: float64(info.DailyAppAmount),
|
||||
TotalQpAmount: float64(info.DailyGameAmount),
|
||||
RechargeCount: float64(info.RechargeOrder),
|
||||
}
|
||||
resp = append(resp, temp)
|
||||
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
Reference in New Issue
Block a user