Browse Source

Merge branch 'debug' of http://git.ascrm.cn/scrm/wechat-api into debug

* 'debug' of http://git.ascrm.cn/scrm/wechat-api:
  fix:修复sop_task bug
  重写,改为直接调用接口
  优化?测试一下
  1. 调整 work_id 2. 修复 model 参数转变量问题
  请求参数里的model转存在另外一个请求参数Variables里
  1.fastgptWorkIdMap映射字典增加新的workId 2.增加对fastgpt特有写法的请求参数chatId的支持
  1.修改workID和workToken映射字典结构,增加函数可以获得WorkId对应的token及数字索引值 2.compapi权限验证增加rds读取 3.每次请求后增加数据库日志记录及实时token统计
  fixbug
boweniac 1 month ago
parent
commit
448a616093

+ 4 - 2
desc/openapi/chat.api

@@ -41,6 +41,8 @@ type (
 	FastGptSpecReq {
         //ChatId
         ChatId string `json:"chat_id,optional"`
+		//FastgptChatId
+		FastgptChatId string `json:"chatId,optional"`
         //ResponseChatItemId
         ResponseChatItemId string `json:"response_chat_item_id,optional"`
         //Detail 详情开关
@@ -84,8 +86,8 @@ type (
     }
 
 	FastgptSpecResp {
-		ResponseData []map[string]string `json:"responseData,omitempty"`
-		NewVariables map[string]string `json:"newVariables,omitempty"`
+		ResponseData []map[string]interface{} `json:"responseData,omitempty"`
+		NewVariables map[string]interface{} `json:"newVariables,omitempty"`
 	}
 	
 	ChatCompletionAudio {

+ 1 - 2
desc/wechat/sop_task.api

@@ -57,8 +57,7 @@ type (
         // SOP 任务名称 
         Name  *string `json:"name,optional"`
 
-        // 创建者 id 
-        CreatorId  *string `json:"creatorId,optional"`
+        Status  *uint8 `json:"status,optional"`
     }
 
     // SopTask information response | SopTask信息返回体

+ 135 - 1
internal/logic/chat/chat_completions_logic.go

@@ -3,6 +3,7 @@ package chat
 import (
 	"context"
 	"errors"
+	"strconv"
 
 	"wechat-api/ent"
 	"wechat-api/internal/svc"
@@ -10,6 +11,11 @@ import (
 	"wechat-api/internal/utils/compapi"
 	"wechat-api/internal/utils/contextkey"
 
+	"wechat-api/ent/custom_types"
+	"wechat-api/ent/predicate"
+	"wechat-api/ent/usagedetail"
+	"wechat-api/ent/usagetotal"
+
 	"github.com/zeromicro/go-zero/core/logx"
 )
 
@@ -56,12 +62,140 @@ func (l *ChatCompletionsLogic) ChatCompletions(req *types.CompApiReq) (resp *typ
 	if len(apiKeyObj.OpenaiBase) == 0 || len(workToken) == 0 {
 		return nil, errors.New("not auth info")
 	}
-	return l.workForFastgpt(req, workToken, apiKeyObj.OpenaiBase)
+
+	apiResp, err := l.workForFastgpt(req, workToken, apiKeyObj.OpenaiBase)
+	if err == nil && apiResp != nil {
+		l.doRequestLog(req, apiResp) //请求记录
+	}
+
+	return apiResp, err
+}
+
+func (l *ChatCompletionsLogic) doRequestLog(req *types.CompApiReq, resp *types.CompOpenApiResp) error {
+	authToken, ok := contextkey.OpenapiTokenKey.GetValue(l.ctx)
+	if !ok {
+		return errors.New("content get auth token err")
+	}
+
+	return l.appendUsageDetailLog(authToken, req, resp)
+}
+
+func (l *ChatCompletionsLogic) getUsagetotalIdByToken(authToken string) (uint64, error) {
+
+	var predicates []predicate.UsageTotal
+	predicates = append(predicates, usagetotal.BotIDEQ(authToken))
+	return l.svcCtx.DB.UsageTotal.Query().Where(predicates...).FirstID(l.ctx)
+
+}
+
+func (l *ChatCompletionsLogic) replaceUsagetotalTokens(authToken string, sumTotalTokens uint64, newUsageDetailId uint64, orgId uint64) error {
+
+	Id, err := l.getUsagetotalIdByToken(authToken)
+	if err != nil && !ent.IsNotFound(err) {
+		return err
+	}
+	if Id > 0 { //UsageTotal have record by  newUsageDetailId
+		_, err = l.svcCtx.DB.UsageTotal.UpdateOneID(Id).
+			SetTotalTokens(sumTotalTokens).
+			SetEndIndex(newUsageDetailId).
+			Save(l.ctx)
+	} else { //create new record by  newUsageDetailId
+		logType := 5
+		_, err = l.svcCtx.DB.UsageTotal.Create().
+			SetNotNilBotID(&authToken).
+			SetNotNilEndIndex(&newUsageDetailId).
+			SetNotNilTotalTokens(&sumTotalTokens).
+			SetNillableType(&logType).
+			SetNotNilOrganizationID(&orgId).
+			Save(l.ctx)
+	}
+
+	return err
+}
+
+func (l *ChatCompletionsLogic) updateUsageTotal(authToken string, newUsageDetailId uint64, orgId uint64) error {
+
+	sumTotalTokens, err := l.sumTotalTokensByAuthToken(authToken) //首先sum UsageDetail的TotalTokens
+	if err == nil {
+		err = l.replaceUsagetotalTokens(authToken, sumTotalTokens, newUsageDetailId, orgId) //再更新(包含新建)Usagetotal的otalTokens
+	}
+	return err
+}
+
+// sum total_tokens from usagedetail by AuthToken
+func (l *ChatCompletionsLogic) sumTotalTokensByAuthToken(authToken string) (uint64, error) {
+
+	var predicates []predicate.UsageDetail
+	predicates = append(predicates, usagedetail.BotIDEQ(authToken))
+
+	var res []struct {
+		Sum, Min, Max, Count uint64
+	}
+	totalTokens := uint64(0)
+	var err error = nil
+	err = l.svcCtx.DB.UsageDetail.Query().Where(predicates...).Aggregate(ent.Sum("total_tokens"),
+		ent.Min("total_tokens"), ent.Max("total_tokens"), ent.Count()).Scan(l.ctx, &res)
+	if err == nil {
+		if len(res) > 0 {
+			totalTokens = res[0].Sum
+		} else {
+			totalTokens = 0
+		}
+	}
+	return totalTokens, err
+}
+
+func (l *ChatCompletionsLogic) appendUsageDetailLog(authToken string, req *types.CompApiReq, resp *types.CompOpenApiResp) error {
+
+	logType := 5
+	workIdx := compapi.GetWorkIdxByID(req.EventType, req.WorkId)
+	rawReqResp := custom_types.OriginalData{Request: req, Response: resp}
+
+	tmpId := 0
+	tmpId, _ = strconv.Atoi(resp.ID)
+	sessionId := uint64(tmpId)
+	orgId := uint64(0)
+	apiKeyObj, ok := contextkey.AuthTokenInfoKey.GetValue(l.ctx)
+	if ok {
+		orgId = apiKeyObj.OrganizationID
+	}
+	promptTokens := uint64(resp.Usage.PromptTokens)
+	completionToken := uint64(resp.Usage.CompletionTokens)
+	totalTokens := promptTokens + completionToken
+
+	res, err := l.svcCtx.DB.UsageDetail.Create().
+		SetNotNilType(&logType).
+		SetNotNilBotID(&authToken).
+		SetNotNilReceiverID(&req.EventType).
+		SetNotNilSessionID(&sessionId).
+		SetNillableApp(&workIdx).
+		SetNillableRequest(&req.Messages[0].Content).
+		SetNillableResponse(&resp.Choices[0].Message.Content).
+		SetNillableOrganizationID(&orgId).
+		SetOriginalData(rawReqResp).
+		SetNillablePromptTokens(&promptTokens).
+		SetNillableCompletionTokens(&completionToken).
+		SetNillableTotalTokens(&totalTokens).
+		Save(l.ctx)
+
+	if err == nil { //插入UsageDetai之后再统计UsageTotal
+		l.updateUsageTotal(authToken, res.ID, orgId)
+	}
+	return err
 }
 
 func (l *ChatCompletionsLogic) workForFastgpt(req *types.CompApiReq, apiKey string, apiBase string) (resp *types.CompOpenApiResp, err error) {
 
 	//apiKey := "fastgpt-d2uehCb2T40h9chNGjf4bpFrVKmMkCFPbrjfVLZ6DAL2zzqzOFJWP"
+	if len(req.ChatId) > 0 && len(req.FastgptChatId) == 0 {
+		req.FastgptChatId = req.ChatId
+	}
+	if len(req.Model) > 0 {
+		if req.Variables == nil {
+			req.Variables = make(map[string]string)
+		}
+		req.Variables["model"] = req.Model
+	}
 	return compapi.NewFastgptChatCompletions(l.ctx, apiKey, apiBase, req)
 
 }

+ 8 - 6
internal/logic/department/create_department_logic.go

@@ -57,7 +57,8 @@ func (l *CreateDepartmentLogic) CreateDepartment(req *types.DepartmentInfo) (res
 		PromotionRate: int32(15),
 		Timezone:      "Asia/Shanghai",
 	}
-	err = l.svcCtx.MongoModel.UsersModel.Insert(context.TODO(), user_info)
+	usersModel := users.NewUsersModel(l.svcCtx.Config.FastgptMongoConf.Url, l.svcCtx.Config.FastgptMongoConf.DBName, "users")
+	err = usersModel.Insert(context.TODO(), user_info)
 	if err != nil {
 		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
 	}
@@ -71,8 +72,8 @@ func (l *CreateDepartmentLogic) CreateDepartment(req *types.DepartmentInfo) (res
 		CreateTime:        time.Date(2024, 7, 10, 12, 0, 18, 197000000, time.UTC),
 		Balance:           int32(999900000),
 	}
-
-	err = l.svcCtx.MongoModel.TeamsModel.Insert(context.TODO(), teams_info)
+	teamsModel := teams.NewTeamsModel(l.svcCtx.Config.FastgptMongoConf.Url, l.svcCtx.Config.FastgptMongoConf.DBName, "teams")
+	err = teamsModel.Insert(context.TODO(), teams_info)
 	if err != nil {
 		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
 	}
@@ -88,8 +89,8 @@ func (l *CreateDepartmentLogic) CreateDepartment(req *types.DepartmentInfo) (res
 		DefaultTeam: true,
 		Version:     int32(0),
 	}
-
-	err = l.svcCtx.MongoModel.TeamMembersModel.Insert(context.TODO(), team_members_info)
+	teamMembersModel := team_members.NewTeamMembersModel(l.svcCtx.Config.FastgptMongoConf.Url, l.svcCtx.Config.FastgptMongoConf.DBName, "team_members")
+	err = teamMembersModel.Insert(context.TODO(), team_members_info)
 	if err != nil {
 		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
 	}
@@ -331,8 +332,9 @@ func (l *CreateDepartmentLogic) CreateDepartment(req *types.DepartmentInfo) (res
 		ScheduledTriggerConfig:   nil,
 		ScheduledTriggerNextTime: nil,
 	}
+	appsModel := apps.NewAppsModel(l.svcCtx.Config.FastgptMongoConf.Url, l.svcCtx.Config.FastgptMongoConf.DBName, "apps")
 
-	err = l.svcCtx.MongoModel.AppsModel.Insert(context.TODO(), apps_info)
+	err = appsModel.Insert(context.TODO(), apps_info)
 	if err != nil {
 		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
 	}

File diff suppressed because it is too large
+ 13 - 254
internal/logic/fastgpt/create_app_logic.go


+ 36 - 5
internal/logic/fastgpt/delete_app_logic.go

@@ -2,12 +2,13 @@ package fastgpt
 
 import (
 	"context"
+	"fmt"
 	"github.com/suyuan32/simple-admin-common/msg/errormsg"
-	"github.com/zeromicro/go-zero/core/errorx"
+	"github.com/zeromicro/go-zero/core/logx"
+	"net/http"
+	"strconv"
 	"wechat-api/internal/svc"
 	"wechat-api/internal/types"
-
-	"github.com/zeromicro/go-zero/core/logx"
 )
 
 type DeleteAppLogic struct {
@@ -24,11 +25,41 @@ func NewDeleteAppLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteA
 }
 
 func (l *DeleteAppLogic) DeleteApp(req *types.DeleteAppsReq) (resp *types.BaseMsgResp, err error) {
+	organizationId := l.ctx.Value("organizationId").(uint64)
 
-	_, err = l.svcCtx.MongoModel.AppsModel.Delete(context.TODO(), req.Id)
+	organizationIdStr := strconv.FormatUint(organizationId, 10)
+	token, err := getToken(organizationIdStr)
 	if err != nil {
-		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
+		return nil, fmt.Errorf("invalid token")
 	}
 
+	AppDelete(req.Id, token)
+
 	return &types.BaseMsgResp{Msg: errormsg.Success}, nil
 }
+
+func AppDelete(id string, token string) {
+	url := fmt.Sprintf("https://fastgpt.gkscrm.com/api/core/app/del?appId=%s", id)
+
+	// 创建一个新的请求
+	req1, err := http.NewRequest("GET", url, nil)
+	if err != nil {
+		fmt.Printf("Error creating request: %v\n", err)
+		return
+	}
+
+	// 设置请求头
+	req1.Header.Set("Content-Type", "application/json")
+	req1.Header.Set("Cookie", fmt.Sprintf("fastgpt_token=%s", token))
+
+	// 使用 http.Client 发送请求
+	client := &http.Client{}
+	resp1, err := client.Do(req1)
+	if err != nil {
+		fmt.Printf("Error sending request: %v\n", err)
+		return
+	}
+	defer resp1.Body.Close()
+
+	return
+}

+ 67 - 24
internal/logic/fastgpt/get_apps_list_logic.go

@@ -1,14 +1,16 @@
 package fastgpt
 
 import (
+	"bytes"
 	"context"
-	"github.com/zeromicro/go-zero/core/errorx"
+	"encoding/json"
+	"fmt"
+	"github.com/zeromicro/go-zero/core/logx"
+	"io/ioutil"
+	"net/http"
 	"strconv"
-
 	"wechat-api/internal/svc"
 	"wechat-api/internal/types"
-
-	"github.com/zeromicro/go-zero/core/logx"
 )
 
 type GetAppsListLogic struct {
@@ -28,36 +30,77 @@ func (l *GetAppsListLogic) GetAppsList(req *types.AppsListReq) (resp *types.Apps
 	organizationId := l.ctx.Value("organizationId").(uint64)
 
 	organizationIdStr := strconv.FormatUint(organizationId, 10)
-
-	user, err := l.svcCtx.MongoModel.UsersModel.FindOneByUsername(context.TODO(), organizationIdStr)
+	token, err := getToken(organizationIdStr)
 	if err != nil {
-		return nil, errorx.NewInvalidArgumentError("fastgpt get list failed " + err.Error())
+		return nil, fmt.Errorf("invalid token")
 	}
 
-	teamMember, err := l.svcCtx.MongoModel.TeamMembersModel.FindOneByUserId(context.TODO(), user.ID)
+	keyword := ""
+	if req.Keyword != nil {
+		keyword = *req.Keyword
+	}
+	response := CoreAppList(req.Type, keyword, token)
+
+	return &types.AppsListResp{Data: response}, nil
+}
+
+// 定义一个结构体用于表示整个 JSON 响应
+type Response struct {
+	Status string                    `json:"status"`
+	Data   []*types.AppsListRespInfo `json:"data"`
+}
+
+type AppListRequest struct {
+	Type      []string `json:"type"`
+	SearchKey string   `json:"searchKey"`
+}
+
+func CoreAppList(apps_type string, searchKey string, token string) []*types.AppsListRespInfo {
+	url := "https://fastgpt.gkscrm.com/api/core/app/list"
+	requestBodyData := AppListRequest{
+		Type:      []string{"folder", apps_type},
+		SearchKey: searchKey,
+	}
+
+	// 将结构体转换为 JSON 字节切片
+	requestBody, err := json.Marshal(requestBodyData)
 	if err != nil {
-		return nil, errorx.NewInvalidArgumentError("fastgpt get list failed " + err.Error())
+		fmt.Printf("Error marshalling request body: %v\n", err)
+		return nil
 	}
 
-	data, err := l.svcCtx.MongoModel.AppsModel.FindAll(context.TODO(), teamMember.TeamID, req.Type, req.Keyword)
+	// 创建一个新的请求
+	req1, err := http.NewRequest("POST", url, bytes.NewBuffer(requestBody))
 	if err != nil {
-		return nil, errorx.NewInvalidArgumentError("fastgpt get list failed " + err.Error())
+		fmt.Printf("Error creating request: %v\n", err)
+		return nil
 	}
 
-	var appList []*types.AppsListRespInfo
+	// 设置请求头
+	req1.Header.Set("Content-Type", "application/json")
+	req1.Header.Set("Cookie", fmt.Sprintf("fastgpt_token=%s", token))
+
+	// 使用 http.Client 发送请求
+	client := &http.Client{}
+	resp1, err := client.Do(req1)
+	if err != nil {
+		fmt.Printf("Error sending request: %v\n", err)
+		return nil
+	}
+	defer resp1.Body.Close()
 
-	if data != nil {
-		for _, app := range data {
-			appList = append(appList, &types.AppsListRespInfo{
-				Id:     app.ID.Hex(),
-				TeamId: app.TeamID.Hex(),
-				TmbId:  app.TmbID.Hex(),
-				Avatar: app.Avatar,
-				Name:   app.Name,
-				Intro:  app.Intro,
-			})
-		}
+	// 读取响应
+	body, err := ioutil.ReadAll(resp1.Body)
+	if err != nil {
+		fmt.Printf("Error reading response: %v\n", err)
+		return nil
 	}
 
-	return &types.AppsListResp{Data: appList}, nil
+	var response Response
+	err = json.Unmarshal(body, &response)
+	if err != nil {
+		fmt.Printf("Error unmarshalling JSON: %v\n", err)
+		return nil
+	}
+	return response.Data
 }

+ 2 - 2
internal/logic/fastgpt/set_token_logic.go

@@ -37,7 +37,7 @@ func (l *SetTokenLogic) SetToken(username string) (resp *types.BaseMsgResp, err
 		return nil, fmt.Errorf("invalid token")
 	}
 	data, err := l.svcCtx.CoreRpc.GetUserById(context.TODO(), &core.UUIDReq{Id: claims.UserId})
-	token, err := l.getToken(strconv.FormatUint(*data.DepartmentId, 10))
+	token, err := getToken(strconv.FormatUint(*data.DepartmentId, 10))
 	if err != nil {
 		return nil, fmt.Errorf("invalid token")
 	}
@@ -67,7 +67,7 @@ func (l *SetTokenLogic) SetToken(username string) (resp *types.BaseMsgResp, err
 	return
 }
 
-func (l *SetTokenLogic) getToken(username string) (string, error) {
+func getToken(username string) (string, error) {
 	// 设置请求的 URL 和请求体
 	url := "https://agent.gkscrm.com/api/support/user/account/loginByPassword"
 	payload := map[string]string{

+ 40 - 11
internal/logic/fastgpt/update_app_logic.go

@@ -1,14 +1,15 @@
 package fastgpt
 
 import (
+	"bytes"
 	"context"
+	"fmt"
 	"github.com/suyuan32/simple-admin-common/msg/errormsg"
-	"github.com/zeromicro/go-zero/core/errorx"
+	"github.com/zeromicro/go-zero/core/logx"
+	"net/http"
+	"strconv"
 	"wechat-api/internal/svc"
 	"wechat-api/internal/types"
-	apps "wechat-api/mongo_model/apps"
-
-	"github.com/zeromicro/go-zero/core/logx"
 )
 
 type UpdateAppLogic struct {
@@ -29,15 +30,43 @@ func (l *UpdateAppLogic) UpdateApp(req *types.UpdateAppsReq) (resp *types.BaseMs
 	if req.Intro != nil {
 		intro = *req.Intro
 	}
-	apps_info := &apps.Apps{
-		ID:    mustParseObjectID(req.Id),
-		Name:  req.Name,
-		Intro: intro,
-	}
-	_, err = l.svcCtx.MongoModel.AppsModel.UpdateInfo(context.TODO(), apps_info)
+	organizationId := l.ctx.Value("organizationId").(uint64)
+
+	organizationIdStr := strconv.FormatUint(organizationId, 10)
+	token, err := getToken(organizationIdStr)
 	if err != nil {
-		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
+		return nil, fmt.Errorf("invalid token")
 	}
 
+	AppUpdate(req.Id, req.Name, intro, token)
+
 	return &types.BaseMsgResp{Msg: errormsg.Success}, nil
 }
+
+func AppUpdate(id string, name string, intro string, token string) {
+	url := fmt.Sprintf("https://fastgpt.gkscrm.com/api/core/app/update?appId=%s", id)
+	jsonStr := fmt.Sprintf(`{"name":"%s","intro":"%s"}`, name, intro)
+	requestBody := []byte(jsonStr)
+
+	// 创建一个新的请求
+	req1, err := http.NewRequest("PUT", url, bytes.NewBuffer(requestBody))
+	if err != nil {
+		fmt.Printf("Error creating request: %v\n", err)
+		return
+	}
+
+	// 设置请求头
+	req1.Header.Set("Content-Type", "application/json")
+	req1.Header.Set("Cookie", fmt.Sprintf("fastgpt_token=%s", token))
+
+	// 使用 http.Client 发送请求
+	client := &http.Client{}
+	resp1, err := client.Do(req1)
+	if err != nil {
+		fmt.Printf("Error sending request: %v\n", err)
+		return
+	}
+	defer resp1.Body.Close()
+
+	return
+}

+ 2 - 2
internal/logic/sop_task/get_sop_task_list_logic.go

@@ -36,8 +36,8 @@ func (l *GetSopTaskListLogic) GetSopTaskList(req *types.SopTaskListReq) (*types.
 	if req.Name != nil {
 		predicates = append(predicates, soptask.NameContains(*req.Name))
 	}
-	if req.CreatorId != nil {
-		predicates = append(predicates, soptask.CreatorIDContains(*req.CreatorId))
+	if req.Status != nil && *req.Status > 0 {
+		predicates = append(predicates, soptask.Status(*req.Status))
 	}
 	data, err := l.svcCtx.DB.SopTask.Query().Where(predicates...).Page(l.ctx, req.Page, req.PageSize)
 

+ 8 - 0
internal/logic/sop_task/publish_sop_task_logic.go

@@ -4,6 +4,7 @@ import (
 	"context"
 	"errors"
 	"github.com/suyuan32/simple-admin-common/msg/errormsg"
+	"github.com/zeromicro/go-zero/core/errorx"
 	"regexp"
 	"strconv"
 	"strings"
@@ -65,6 +66,13 @@ func (l *PublishSopTaskLogic) PublishSopTask(req *types.IDReq) (resp *types.Base
 			return nil, errors.New(errormsg.ValidationError)
 		}
 
+		if len(sopTask.BotWxidList) == 0 {
+			return nil, errorx.NewInvalidArgumentError("发信人不能为空")
+		}
+		if len(sopTask.Edges.TaskStages) == 0 {
+			return nil, errorx.NewInvalidArgumentError("SOP阶段不能为空")
+		}
+
 		// 查询任务的所有 sop_stages
 		err = l.svcCtx.DB.SopTask.UpdateOneID(req.Id).
 			SetStatus(3).

+ 4 - 0
internal/logic/sop_task/update_sop_task_logic.go

@@ -36,6 +36,10 @@ func (l *UpdateSopTaskLogic) UpdateSopTask(req *types.SopTaskInfo) (*types.BaseM
 		return nil, dberrorhandler.DefaultEntError(l.Logger, fmt.Errorf("planEndTime must be greater than planStartTime"), req)
 	}
 
+	if len(req.BotWxidList) == 0 {
+		return nil, errorx.NewInvalidArgumentError("发信人不能为空")
+	}
+
 	err := l.svcCtx.DB.SopTask.UpdateOneID(*req.Id).
 		Where(soptask.StatusEQ(1), soptask.OrganizationID(organizationId)).
 		SetNotNilStatus(req.Status).

+ 57 - 50
internal/middleware/openauthority_middleware.go

@@ -3,9 +3,8 @@ package middleware
 import (
 	"context"
 	"encoding/json"
-	"fmt"
+	"errors"
 	"net/http"
-	"reflect"
 
 	"wechat-api/ent"
 	"wechat-api/ent/apikey"
@@ -42,59 +41,74 @@ func NewOpenAuthorityMiddleware(db *ent.Client, rds redis.UniversalClient, c con
 
 func (m *OpenAuthorityMiddleware) checkTokenUserInfo(ctx context.Context, authToken string) (*ent.ApiKey, int, error) {
 	var (
-		rc  int
-		err error
-		val *ent.ApiKey
+		rc        int
+		err       error
+		apiKeyObj *ent.ApiKey
+		fromId    = -1
 	)
-	val, rc, err = m.getTokenUserInfoByDb(ctx, authToken)
-	return val, rc, err
-
-	/*
-		r, e = m.getTokenUserInfoByRds(ctx, loginToken)
-		fmt.Println("redis:", "code-", r, "err-", e)
-	*/
-	/*
-		//首先从redis取数据
-		_, rc, err = m.getTokenUserInfoByRds(ctx, authToken)
-		fmt.Printf("++++++++++++++++++++++++get authinfo from rds out:%d/err:%s\n", rc, err)
-		if rc <= 0 || err != nil { //无法获得后再从数据库获得
-			rc = 0
-			err = nil
-			val, rc, err = m.getTokenUserInfoByDb(ctx, authToken)
-			fmt.Println("----------------------After m.getTokenUserInfoByDb:", val)
-			err = m.saveTokenUserInfoToRds(ctx, authToken, val)
-			fmt.Println("------------save saveTokenUserInfoToRd err:", err)
+	_ = fromId
+
+	//首先从redis取数据
+	apiKeyObj, rc, err = m.getTokenUserInfoByRds(ctx, authToken)
+	if rc <= 0 || err != nil { //无法获得后再从数据库获得	{
+
+		rc = 0
+		err = nil
+		apiKeyObj, rc, err = m.getTokenUserInfoByDb(ctx, authToken)
+		if err == nil {
+			//get apiKeyObj from db succ
+			fromId = 1
+			err = m.saveTokenUserInfoToRds(ctx, authToken, apiKeyObj)
 		}
+	} else {
+		fromId = 2
+	}
 
-		_ = rc
-		if err != nil {
-			return nil, 0, err
+	/*
+		if err == nil {
+
+			fromStr := ""
+			switch fromId {
+			case 1:
+				fromStr = "DB"
+			case 2:
+				fromStr = "RDS"
+			}
+			fmt.Println("=========================================>>>")
+			fmt.Printf("In checkTokenUserInfo Get Token Info From %s\n", fromStr)
+			fmt.Printf("Key:'%s'\n", apiKeyObj.Key)
+			fmt.Printf("Title:'%s'\n", apiKeyObj.Title)
+			fmt.Printf("OpenaiBase:'%s'\n", apiKeyObj.OpenaiBase)
+			fmt.Printf("OpenaiKey:'%s'\n", apiKeyObj.OpenaiKey)
+			fmt.Println("<<<=========================================")
 		}
-		return val, 0, nil
 	*/
+	return apiKeyObj, rc, err
 }
 
 func (m *OpenAuthorityMiddleware) saveTokenUserInfoToRds(ctx context.Context, authToken string, saveInfo *ent.ApiKey) error {
-	if bs, err := json.Marshal(saveInfo); err == nil {
-		return err
-	} else {
-		rc, err := m.Rds.HSet(ctx, compapi.APIAuthInfoKey, authToken, string(bs)).Result()
-		fmt.Printf("#~~~~~~~~~~~~~~~++~~~~~~~~~~~~~HSet Val:%s get Result:%d/%s\n", string(bs), rc, err)
-		return err
+	bs, err := json.Marshal(saveInfo)
+	if err == nil {
+
+		_, err = m.Rds.HSet(ctx, compapi.APIAuthInfoKey, authToken, string(bs)).Result()
 	}
+	return err
 }
 func (m *OpenAuthorityMiddleware) getTokenUserInfoByRds(ctx context.Context, authToken string) (*ent.ApiKey, int, error) {
 
 	rcode := -1
-	val, err := m.Rds.HGet(ctx, compapi.APIAuthInfoKey, authToken).Result()
-	if err == redis.Nil {
-		rcode = 0
-	} else if err == nil {
-		rcode = 1
+	result := ent.ApiKey{}
+	jsonStr, err := m.Rds.HGet(ctx, compapi.APIAuthInfoKey, authToken).Result()
+	if errors.Is(err, redis.Nil) {
+		rcode = 0 //key not exist
+	} else if err == nil { //find key
+
+		err := json.Unmarshal([]byte(jsonStr), &result)
+		if err == nil {
+			rcode = 1
+		}
 	}
-	fmt.Printf("#####################From Redis By Key:'%s' Get '%s'(%s/%T)\n", authToken, val, reflect.TypeOf(val), val)
-	fmt.Println(val)
-	return nil, rcode, err
+	return &result, rcode, err
 }
 
 func (m *OpenAuthorityMiddleware) getTokenUserInfoByDb(ctx context.Context, loginToken string) (*ent.ApiKey, int, error) {
@@ -124,16 +138,9 @@ func (m *OpenAuthorityMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc
 			httpx.Error(w, errorx.NewApiError(http.StatusForbidden, "无法获取合适的授权信息"))
 			return
 		}
-		//ctx = contextkey.OpenapiTokenKey.WithValue(ctx, apiToken)
 		ctx = contextkey.AuthTokenInfoKey.WithValue(ctx, apiKeyObj)
-		/*
-			fmt.Println("=========================================")
-			fmt.Printf("In Middleware Get Token Info:\nKey:'%s'\n", apiKeyObj.Key)
-			fmt.Printf("Title:'%s'\n", apiKeyObj.Title)
-			fmt.Printf("OpenaiBase:'%s'\n", apiKeyObj.OpenaiBase)
-			fmt.Printf("OpenaiKey:'%s'\n", apiKeyObj.OpenaiKey)
-			fmt.Println("=========================================")
-		*/
+		ctx = contextkey.OpenapiTokenKey.WithValue(ctx, authToken)
+
 		newReq := r.WithContext(ctx)
 		// Passthrough to next handler if need
 		next(w, newReq)

+ 6 - 5
internal/types/types.go

@@ -1280,9 +1280,8 @@ type SopTaskListInfo struct {
 type SopTaskListReq struct {
 	PageInfo
 	// SOP 任务名称
-	Name *string `json:"name,optional"`
-	// 创建者 id
-	CreatorId *string `json:"creatorId,optional"`
+	Name   *string `json:"name,optional"`
+	Status *uint8  `json:"status,optional"`
 }
 
 // SopTask information response | SopTask信息返回体
@@ -1938,6 +1937,8 @@ type CompCtlReq struct {
 type FastGptSpecReq struct {
 	//ChatId
 	ChatId string `json:"chat_id,optional"`
+	//FastgptChatId
+	FastgptChatId string `json:"chatId,optional"`
 	//ResponseChatItemId
 	ResponseChatItemId string `json:"response_chat_item_id,optional"`
 	//Detail 详情开关
@@ -1984,8 +1985,8 @@ type StdCompApiResp struct {
 
 // swagger:model FastgptSpecResp
 type FastgptSpecResp struct {
-	ResponseData []map[string]string `json:"responseData,omitempty"`
-	NewVariables map[string]string   `json:"newVariables,omitempty"`
+	ResponseData []map[string]interface{} `json:"responseData,omitempty"`
+	NewVariables map[string]interface{}   `json:"newVariables,omitempty"`
 }
 
 type ChatCompletionAudio struct {

+ 7 - 10
internal/utils/compapi/config.go

@@ -11,16 +11,13 @@ const (
 	APIAuthInfoKey string = "COMPAPI_AUTHINFO"
 )
 
-var fastgptWorkIdMap = map[string]string{
-	"default":              "fastgpt-jcDATa9aH4vtUsjDpCU773BxmLU50IxKUX9nUT0mCTLQkEoo1hPxPEdNQeOEWGTn",
-	"OPTIMIZE_CALL_SCRIPT": "fastgpt-bcQ9cWKd6y9a2LfizweeWEnukkQi1Oq46yoiRg9yDNLm8NPTWXsyFwcB",
+type workIdInfo struct {
+	Id  string
+	Idx int
 }
 
-// 获取workToken
-func GetWorkTokenByID(eventType string, workId string) string {
-	val, exist := fastgptWorkIdMap[workId]
-	if !exist {
-		val = fastgptWorkIdMap["default"]
-	}
-	return val
+var fastgptWorkIdMap = map[string]workIdInfo{
+	"default":              {"fastgpt-jcDATa9aH4vtUsjDpCU773BxmLU50IxKUX9nUT0mCTLQkEoo1hPxPEdNQeOEWGTn", 0},
+	"OPTIMIZE_CALL_SCRIPT": {"fastgpt-bcQ9cWKd6y9a2LfizweeWEnukkQi1Oq46yoiRg9yDNLm8NPTWXsyFwcB", 1},
+	"TEST_DOUYIN":          {"fastgpt-bwt6oSGcjwJ1qBgT276oeFD34IAhfjEQBCZWJfJR1oj3WqJl7751ljSrc", 2},
 }

+ 19 - 0
internal/utils/compapi/func.go

@@ -42,6 +42,7 @@ func DoChatCompletions(ctx context.Context, client *openai.Client, chatInfo *typ
 	if jsonBytes, err = json.Marshal(chatInfo); err != nil {
 		return nil, err
 	}
+	//fmt.Printf("In DoChatCompletions, req: '%s'\n", string(jsonBytes))
 	customResp := types.CompOpenApiResp{}
 	reqBodyOps := option.WithRequestBody("application/json", jsonBytes)
 	respBodyOps := option.WithResponseBodyInto(&customResp)
@@ -188,3 +189,21 @@ func DoChatCompletionsStreamOld(ctx context.Context, client *openai.Client, chat
 	}
 	return nil, nil
 }
+
+// 获取workToken
+func GetWorkTokenByID(eventType string, workId string) string {
+	val, exist := fastgptWorkIdMap[workId]
+	if !exist {
+		val = fastgptWorkIdMap["default"]
+	}
+	return val.Id
+}
+
+// 获取workIdx
+func GetWorkIdxByID(eventType string, workId string) int {
+	val, exist := fastgptWorkIdMap[workId]
+	if !exist {
+		val = fastgptWorkIdMap["default"]
+	}
+	return val.Idx
+}

Some files were not shown because too many files changed in this diff