Browse Source

临时提交

boweniac 3 months ago
parent
commit
fa16022dac

+ 21 - 12
desc/wechat/dashboard.api

@@ -16,26 +16,35 @@ type (
     }
 
     ChartsData {
-        AiResponse *ChartsInfo `json:"ai_response"`
-        SopRun *ChartsInfo `json:"sop_run"`
-        TotalFriend *ChartsInfo `json:"total_friend"`
-        TotalGroup *ChartsInfo `json:"total_group"`
-        AccountBalance *ChartsInfo `json:"account_balance"`
-        ConsumeToken *ChartsInfo `json:"consume_token"`
-        ActiveUser *ChartsInfo `json:"active_user"`
-        NewUser *ChartsInfo `json:"new_user"`
+        AiResponse *ChartsUint `json:"ai_response"`
+        SopRun *ChartsUint `json:"sop_run"`
+        TotalFriend *ChartsUint `json:"total_friend"`
+        TotalGroup *ChartsUint `json:"total_group"`
+        AccountBalance *ChartsUint `json:"account_balance"`
+        ConsumeToken *ChartsUint `json:"consume_token"`
+        ActiveUser *ChartsUint `json:"active_user"`
+        NewUser *ChartsInt `json:"new_user"`
     }
 
-    ChartsInfo {
-        Count *uint64 `json:"count"`
-        Rate *float32 `json:"rate"`
+    ChartsUint {
+        Count uint64 `json:"count"`
+        Rate float32 `json:"rate"`
         Label []string `json:"label"`
         Val []uint64 `json:"val"`
     }
+
+    ChartsInt {
+        Count int64 `json:"count"`
+        Rate float32 `json:"rate"`
+        Label []string `json:"label"`
+        Val []int64 `json:"val"`
+    }
 )
 
 @server(
-	group: dashboard
+	jwt: Auth
+    group: dashboard
+    middleware: Authority
 )
 
 service Wechat {

+ 5 - 1
etc/wechat-docker.yaml

@@ -80,4 +80,8 @@ Aliyun:
 
 Fastgpt:
   BASE_URL: http://new-api.gkscrm.com/v1
-  API_KEY: sk-ZQRNypQOC8ID5WbpCdF263C58dF44271842e86D408Bb3848
+  API_KEY: sk-ZQRNypQOC8ID5WbpCdF263C58dF44271842e86D408Bb3848
+
+Xiaoice:
+  SubscriptionKey: ccaa5a6ff70f4393a934e69b9ace31bb
+  GptbotsAuthorization: app-hQL7oVq57McK5VBHlsMfhtUD

+ 0 - 44
internal/handler/dashboard/gptbots_message_handler.go

@@ -1,44 +0,0 @@
-package dashboard
-
-import (
-	"net/http"
-
-	"github.com/zeromicro/go-zero/rest/httpx"
-
-	"wechat-api/internal/logic/dashboard"
-	"wechat-api/internal/svc"
-	"wechat-api/internal/types"
-)
-
-// swagger:route post /dashboard/charts dashboard GptbotsMessage
-//
-// gen gptbots | 调用gptbots
-//
-// gen gptbots | 调用gptbots
-//
-// Parameters:
-//  + name: body
-//    require: true
-//    in: body
-//    type: ChartsReq
-//
-// Responses:
-//  200: ChartsResp
-
-func GptbotsMessageHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
-	return func(w http.ResponseWriter, r *http.Request) {
-		var req types.ChartsReq
-		if err := httpx.Parse(r, &req, true); err != nil {
-			httpx.ErrorCtx(r.Context(), w, err)
-			return
-		}
-
-		l := dashboard.NewGptbotsMessageLogic(r.Context(), svcCtx)
-		resp, err := l.GptbotsMessage(&req)
-		if err != nil {
-			httpx.ErrorCtx(r.Context(), w, err)
-		} else {
-			httpx.OkJsonCtx(r.Context(), w, resp)
-		}
-	}
-}

+ 11 - 7
internal/handler/routes.go

@@ -1490,12 +1490,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 	)
 
 	server.AddRoutes(
-		[]rest.Route{
-			{
-				Method:  http.MethodPost,
-				Path:    "/dashboard/charts",
-				Handler: dashboard.GetChartsHandler(serverCtx),
-			},
-		},
+		rest.WithMiddlewares(
+			[]rest.Middleware{serverCtx.Authority},
+			[]rest.Route{
+				{
+					Method:  http.MethodPost,
+					Path:    "/dashboard/charts",
+					Handler: dashboard.GetChartsHandler(serverCtx),
+				},
+			}...,
+		),
+		rest.WithJwt(serverCtx.Config.Auth.AccessSecret),
 	)
 }

+ 256 - 3
internal/logic/dashboard/get_charts_logic.go

@@ -3,7 +3,12 @@ package dashboard
 import (
 	"context"
 	"fmt"
+	"github.com/suyuan32/simple-admin-common/msg/errormsg"
+	"strconv"
 	"time"
+	"wechat-api/ent"
+	"wechat-api/ent/usagestatisticday"
+	"wechat-api/ent/usagestatistichour"
 	"wechat-api/internal/svc"
 	"wechat-api/internal/types"
 
@@ -23,6 +28,16 @@ func NewGetChartsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetChar
 		svcCtx: svcCtx}
 }
 
+type SumUint struct {
+	Addtime uint64 `json:"addtime"`
+	Value   uint64 `json:"value"`
+}
+
+type SumInt struct {
+	Addtime uint64 `json:"addtime"`
+	Value   int64  `json:"value"`
+}
+
 func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp, err error) {
 	// 获取组织id
 	var organizationId uint64 = 0
@@ -44,11 +59,12 @@ func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp
 	var startTime time.Time
 	for i, layout := range layouts {
 		startTime, err = time.Parse(layout, *req.StartDate)
+		layoutsType = i
 		if err == nil {
 			break
 		}
-		layoutsType = i
 	}
+	l.Infof("----------------layoutsType--------------: %d", layoutsType)
 	if err != nil {
 		fmt.Println("解析开始时间失败:", err)
 		return
@@ -76,9 +92,246 @@ func (l *GetChartsLogic) GetCharts(req *types.ChartsReq) (resp *types.ChartsResp
 		isCurrentDay = endTime.Year() == now.Year() && endTime.Month() == now.Month() && endTime.Day() == now.Day()
 	}
 
+	// 定义变量
+	var aiResponse types.ChartsUint
+	var sopRun types.ChartsUint
+	var totalFriend types.ChartsUint
+	var totalGroup types.ChartsUint
+	var accountBalance types.ChartsUint
+	var consumeToken types.ChartsUint
+	var activeUser types.ChartsUint
+	var newUser types.ChartsInt
+
+	var aiResponseSum []SumUint
+	var sopRunSum []SumUint
+	var totalFriendSum []SumUint
+	var totalGroupSum []SumUint
+	var consumeTokenSum []SumUint
+	var activeUserSum []SumUint
+	var newUserSum []SumInt
+
 	if isCurrentDay && layoutsType == 1 && req.StartDate == req.EndDate {
-		// 
+		// 返回当日每小时的数据
+		startOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
+		startAddTimeString := startOfDay.Format("2006010200")
+		startAddTime, err := strconv.ParseUint(startAddTimeString, 10, 64)
+		if err != nil {
+			fmt.Println("转换开始时间失败:", err)
+			return nil, err
+		}
+		usageStatisticHour := l.svcCtx.DB.UsageStatisticHour.Query().Where(
+			usagestatistichour.OrganizationID(organizationId),
+			usagestatistichour.AddtimeGTE(startAddTime),
+		).GroupBy(usagestatistichour.FieldAddtime)
+		_ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldAiResponse), "value")).Scan(l.ctx, &aiResponseSum)
+		_ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldSopRun), "value")).Scan(l.ctx, &sopRunSum)
+		_ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldTotalFriend), "value")).Scan(l.ctx, &totalFriendSum)
+		_ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldTotalGroup), "value")).Scan(l.ctx, &totalGroupSum)
+		_ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldConsumeToken), "value")).Scan(l.ctx, &consumeTokenSum)
+		_ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldActiveUser), "value")).Scan(l.ctx, &activeUserSum)
+		_ = usageStatisticHour.Aggregate(ent.As(ent.Sum(usagestatistichour.FieldNewUser), "value")).Scan(l.ctx, &newUserSum)
+		for _, ar := range aiResponseSum {
+			aiResponse = types.ChartsUint{
+				Count: aiResponse.Count + ar.Value,
+				Val:   append(aiResponse.Val, ar.Value),
+			}
+		}
+		for _, sr := range sopRunSum {
+			sopRun = types.ChartsUint{
+				Count: sopRun.Count + sr.Value,
+				Val:   append(sopRun.Val, sr.Value),
+			}
+		}
+		for _, tf := range totalFriendSum {
+			totalFriend = types.ChartsUint{
+				Count: tf.Value,
+				Val:   append(totalFriend.Val, tf.Value),
+			}
+		}
+		for _, tg := range totalGroupSum {
+			totalGroup = types.ChartsUint{
+				Count: tg.Value,
+				Val:   append(totalGroup.Val, tg.Value),
+			}
+		}
+		for _, ct := range consumeTokenSum {
+			addtimeLastTwoDigits := ct.Addtime % 100
+			consumeToken = types.ChartsUint{
+				Count: consumeToken.Count + ct.Value,
+				Val:   append(consumeToken.Val, ct.Value),
+				Label: append(consumeToken.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
+			}
+		}
+		for _, au := range activeUserSum {
+			activeUser = types.ChartsUint{
+				Count: au.Value,
+				Val:   append(activeUser.Val, au.Value),
+			}
+		}
+		for _, nu := range newUserSum {
+			addtimeLastTwoDigits := nu.Addtime % 100
+			newUser = types.ChartsInt{
+				Count: nu.Value,
+				Val:   append(newUser.Val, nu.Value),
+				Label: append(newUser.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
+			}
+		}
+	} else {
+		// 从天表统计数据
+		startAddTimeString := startTime.Format("20060102")
+		startAddTime, err := strconv.ParseUint(startAddTimeString, 10, 64)
+		if err != nil {
+			fmt.Println("转换开始时间失败:", err)
+			return nil, err
+		}
+		endAddTimeString := endTime.Format("20060102")
+		endAddTime, err := strconv.ParseUint(endAddTimeString, 10, 64)
+		if err != nil {
+			fmt.Println("转换截止时间失败:", err)
+			return nil, err
+		}
+		usageStatisticDay := l.svcCtx.DB.UsageStatisticDay.Query().
+			Where(
+				usagestatisticday.OrganizationID(organizationId),
+				usagestatisticday.AddtimeGTE(startAddTime),
+				usagestatisticday.AddtimeLTE(endAddTime),
+			).
+			GroupBy(usagestatisticday.FieldAddtime)
+		_ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldAiResponse), "value")).Scan(l.ctx, &aiResponseSum)
+		_ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldSopRun), "value")).Scan(l.ctx, &sopRunSum)
+		_ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldTotalFriend), "value")).Scan(l.ctx, &totalFriendSum)
+		_ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldTotalGroup), "value")).Scan(l.ctx, &totalGroupSum)
+		_ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldConsumeToken), "value")).Scan(l.ctx, &consumeTokenSum)
+		_ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldActiveUser), "value")).Scan(l.ctx, &activeUserSum)
+		_ = usageStatisticDay.Aggregate(ent.As(ent.Sum(usagestatisticday.FieldNewUser), "value")).Scan(l.ctx, &newUserSum)
+
+		for _, ar := range aiResponseSum {
+			aiResponse = types.ChartsUint{
+				Count: aiResponse.Count + ar.Value,
+				Val:   append(aiResponse.Val, ar.Value),
+			}
+		}
+		for _, sr := range sopRunSum {
+			sopRun = types.ChartsUint{
+				Count: sopRun.Count + sr.Value,
+				Val:   append(sopRun.Val, sr.Value),
+			}
+		}
+		for _, tf := range totalFriendSum {
+			totalFriend = types.ChartsUint{
+				Count: tf.Value,
+				Val:   append(totalFriend.Val, tf.Value),
+			}
+		}
+		for _, tg := range totalGroupSum {
+			totalGroup = types.ChartsUint{
+				Count: tg.Value,
+				Val:   append(totalGroup.Val, tg.Value),
+			}
+		}
+		for _, ct := range consumeTokenSum {
+			addtimeLastTwoDigits := ct.Addtime % 100
+			consumeToken = types.ChartsUint{
+				Count: consumeToken.Count + ct.Value,
+				Val:   append(consumeToken.Val, ct.Value),
+				Label: append(consumeToken.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
+			}
+		}
+		for _, au := range activeUserSum {
+			activeUser = types.ChartsUint{
+				Count: au.Value,
+				Val:   append(activeUser.Val, au.Value),
+			}
+		}
+		for _, nu := range newUserSum {
+			addtimeLastTwoDigits := nu.Addtime % 100
+			newUser = types.ChartsInt{
+				Count: nu.Value,
+				Val:   append(newUser.Val, nu.Value),
+				Label: append(newUser.Label, fmt.Sprintf("%02d", addtimeLastTwoDigits)),
+			}
+		}
+
+		if isCurrentDay {
+			// 从小时表统计当天数据
+			startOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
+			startOfDayAddTimeString := startOfDay.Format("2006010200")
+			startOfDayAddTime, err := strconv.ParseUint(startOfDayAddTimeString, 10, 64)
+			if err != nil {
+				fmt.Println("转换开始时间失败:", err)
+				return nil, err
+			}
+			usageStatisticHour, err := l.svcCtx.DB.UsageStatisticHour.Query().Where(
+				usagestatistichour.OrganizationID(organizationId),
+				usagestatistichour.AddtimeGTE(startOfDayAddTime),
+			).All(l.ctx)
+			if err != nil {
+				return nil, err
+			}
+			hourLen := len(usageStatisticHour)
+			if hourLen > 0 {
+				var aiResponseOfDay uint64
+				var sopRunOfDay uint64
+				var totalFriendOfDay uint64
+				var totalGroupOfDay uint64
+				var consumeTokenOfDay uint64
+				var activeUserOfDay uint64
+				var newUserOfDay int64
+
+				for _, hourData := range usageStatisticHour {
+					aiResponseOfDay += hourData.AiResponse
+					sopRunOfDay += hourData.SopRun
+					consumeTokenOfDay += hourData.ConsumeToken
+				}
+				totalFriendOfDay = usageStatisticHour[hourLen-1].TotalFriend
+				totalGroupOfDay = usageStatisticHour[hourLen-1].TotalGroup
+				activeUserOfDay = usageStatisticHour[hourLen-1].ActiveUser
+				newUserOfDay = usageStatisticHour[hourLen-1].NewUser
+
+				aiResponse = types.ChartsUint{
+					Count: aiResponse.Count + aiResponseOfDay,
+					Val:   append(aiResponse.Val, aiResponseOfDay),
+				}
+				sopRun = types.ChartsUint{
+					Count: sopRun.Count + sopRunOfDay,
+					Val:   append(sopRun.Val, sopRunOfDay),
+				}
+				totalFriend = types.ChartsUint{
+					Count: totalFriendOfDay,
+					Val:   append(totalFriend.Val, totalFriendOfDay),
+				}
+				totalGroup = types.ChartsUint{
+					Count: totalGroupOfDay,
+					Val:   append(totalGroup.Val, totalGroupOfDay),
+				}
+				consumeToken = types.ChartsUint{
+					Count: consumeToken.Count + consumeTokenOfDay,
+					Val:   append(consumeToken.Val, consumeTokenOfDay),
+					Label: append(consumeToken.Label, "今日"),
+				}
+				activeUser = types.ChartsUint{
+					Count: activeUserOfDay,
+					Val:   append(activeUser.Val, activeUserOfDay),
+				}
+				newUser = types.ChartsInt{
+					Count: newUserOfDay,
+					Val:   append(newUser.Val, newUserOfDay),
+					Label: append(newUser.Label, "今日"),
+				}
+			}
+		}
+	}
+
+	chartsData := types.ChartsData{
+		AiResponse:     &aiResponse,
+		SopRun:         &sopRun,
+		TotalFriend:    &totalFriend,
+		TotalGroup:     &totalGroup,
+		AccountBalance: &accountBalance,
+		ConsumeToken:   &consumeToken,
+		ActiveUser:     &activeUser,
+		NewUser:        &newUser,
 	}
 
-	return
+	return &types.ChartsResp{BaseDataInfo: types.BaseDataInfo{Msg: errormsg.UpdateSuccess}, Data: &chartsData}, nil
 }

+ 20 - 14
internal/types/types.go

@@ -2920,20 +2920,26 @@ type ChartsResp struct {
 }
 
 type ChartsData struct {
-	AiResponse     *ChartsInfo `json:"ai_response"`
-	SopRun         *ChartsInfo `json:"sop_run"`
-	TotalFriend    *ChartsInfo `json:"total_friend"`
-	TotalGroup     *ChartsInfo `json:"total_group"`
-	AccountBalance *ChartsInfo `json:"account_balance"`
-	ConsumeToken   *ChartsInfo `json:"consume_token"`
-	ActiveUser     *ChartsInfo `json:"active_user"`
-	NewUser        *ChartsInfo `json:"new_user"`
-}
-
-// swagger:model ChartsInfo
-type ChartsInfo struct {
-	Count *uint64  `json:"count"`
-	Rate  *float32 `json:"rate"`
+	AiResponse     *ChartsUint `json:"ai_response"`
+	SopRun         *ChartsUint `json:"sop_run"`
+	TotalFriend    *ChartsUint `json:"total_friend"`
+	TotalGroup     *ChartsUint `json:"total_group"`
+	AccountBalance *ChartsUint `json:"account_balance"`
+	ConsumeToken   *ChartsUint `json:"consume_token"`
+	ActiveUser     *ChartsUint `json:"active_user"`
+	NewUser        *ChartsInt  `json:"new_user"`
+}
+
+type ChartsUint struct {
+	Count uint64   `json:"count"`
+	Rate  float32  `json:"rate"`
 	Label []string `json:"label"`
 	Val   []uint64 `json:"val"`
 }
+
+type ChartsInt struct {
+	Count int64    `json:"count"`
+	Rate  float32  `json:"rate"`
+	Label []string `json:"label"`
+	Val   []int64  `json:"val"`
+}