正在显示
74 个修改的文件
包含
4756 行增加
和
0 行删除
.dockerignore
0 → 100644
.gitignore
0 → 100644
1 | +# Compiled Object codefiles, Static and Dynamic libs (Shared Objects) | ||
2 | +*.o | ||
3 | +*.a | ||
4 | +*.so | ||
5 | + | ||
6 | +# Folders | ||
7 | +_obj | ||
8 | +_test | ||
9 | + | ||
10 | +# Architecture specific extensions/prefixes | ||
11 | +*.[568vq] | ||
12 | +[568vq].out | ||
13 | + | ||
14 | +*.cgo1.go | ||
15 | +*.cgo2.c | ||
16 | +_cgo_defun.c | ||
17 | +_cgo_gotypes.go | ||
18 | +_cgo_export.* | ||
19 | + | ||
20 | +_testmain.go | ||
21 | + | ||
22 | +*.exe | ||
23 | +*.test | ||
24 | +.log | ||
25 | +.idea | ||
26 | +.vscode | ||
27 | +.gitkeep | ||
28 | + | ||
29 | +app.log | ||
30 | +go.sum | ||
31 | +lastupdate.tmp | ||
32 | +*.log | ||
33 | + | ||
34 | +public/ | ||
35 | +logs/ | ||
36 | +cmd/discuss/api/etc/core.local.yaml |
cmd/ep/README.md
0 → 100644
cmd/ep/chat/Makefile
0 → 100644
1 | +.PHONY: model | ||
2 | +model: | ||
3 | + goctl model mysql ddl -s .\cmd\ep\chat\deploy\database\table.sql -d cmd/ep/chat | ||
4 | + | ||
5 | +.PHONY: api | ||
6 | +api: | ||
7 | + goctl api go -api .\cmd\ep\chat\dsl\core.api -dir cmd/ep/chat/api -style go_zero | ||
8 | + | ||
9 | +.PHONY: swagger | ||
10 | +swagger: | ||
11 | + goctl api plugin -plugin goctl-swagger="swagger -filename core.json" -api .\cmd\ep\chat\dsl\core.api -dir .\cmd\ep\chat\generate | ||
12 | + | ||
13 | +.PHONY: build | ||
14 | +build: | ||
15 | + docker build -f cmd/ep/chat/deploy/docker/Dockerfile -t sumicro/chat:1.0.0 . |
cmd/ep/chat/api/core.go
0 → 100644
1 | +package main | ||
2 | + | ||
3 | +import ( | ||
4 | + "flag" | ||
5 | + "fmt" | ||
6 | + "github.com/zeromicro/go-zero/core/logx" | ||
7 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/db" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" | ||
11 | + "net/http" | ||
12 | + | ||
13 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/config" | ||
14 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/handler" | ||
15 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
16 | + | ||
17 | + "github.com/zeromicro/go-zero/core/conf" | ||
18 | + "github.com/zeromicro/go-zero/rest" | ||
19 | +) | ||
20 | + | ||
21 | +var configFile = flag.String("f", "etc/core.yaml", "the config file") | ||
22 | + | ||
23 | +func main() { | ||
24 | + flag.Parse() | ||
25 | + | ||
26 | + var c config.Config | ||
27 | + conf.MustLoad(*configFile, &c) | ||
28 | + | ||
29 | + // 系统设置 | ||
30 | + systemSetup(c) | ||
31 | + | ||
32 | + // 服务初始化 | ||
33 | + opts := make([]rest.RunOption, 0) | ||
34 | + opts = append(opts, rest.WithCustomCors(func(header http.Header) { | ||
35 | + header.Set("Access-Control-Allow-Headers", "*") | ||
36 | + }, func(writer http.ResponseWriter) { | ||
37 | + | ||
38 | + })) | ||
39 | + opts = append(opts, rest.WithUnauthorizedCallback(func(w http.ResponseWriter, r *http.Request, err error) { | ||
40 | + if err != nil { | ||
41 | + logx.Debugf("unauthorized: %s \n", err.Error()) | ||
42 | + } | ||
43 | + httpx.WriteJson(w, http.StatusUnauthorized, xerr.Error(xerr.TokenExpireError, err.Error())) | ||
44 | + return | ||
45 | + })) | ||
46 | + | ||
47 | + server := rest.MustNewServer(c.RestConf, opts...) | ||
48 | + defer server.Stop() | ||
49 | + | ||
50 | + ctx := svc.NewServiceContext(c) | ||
51 | + handler.RegisterHandlers(server, ctx) | ||
52 | + | ||
53 | + // 数据迁移 | ||
54 | + if c.Migrate { | ||
55 | + db.Migrate(ctx.DB) | ||
56 | + } | ||
57 | + | ||
58 | + fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port) | ||
59 | + server.Start() | ||
60 | +} | ||
61 | + | ||
62 | +func systemSetup(c config.Config) { | ||
63 | + // 初始化Domain里面的配置 | ||
64 | + domain.ProjectName = c.Name | ||
65 | + | ||
66 | + // 系统错误应答包装 | ||
67 | + httpx.SetErrorHandlerCtx(xerr.ErrorHandlerCtx) | ||
68 | + | ||
69 | + // 系统成功应答包装 | ||
70 | + httpx.SetOkHandler(xerr.OkHandlerCtx) | ||
71 | +} |
cmd/ep/chat/api/etc/core.yaml
0 → 100644
1 | +Name: sumicro-chat | ||
2 | +Host: 0.0.0.0 | ||
3 | +Port: 8080 | ||
4 | + | ||
5 | +Verbose: false | ||
6 | +Migrate: true | ||
7 | +Timeout: 30000 | ||
8 | +LogRequest: true # 记录详细请求日志 | ||
9 | + | ||
10 | +Log: | ||
11 | + #Mode: file | ||
12 | + Encoding: plain | ||
13 | + Level: debug # info | ||
14 | + MaxSize: 1 # 2MB | ||
15 | + TimeFormat: 2006-01-02 15:04:05 | ||
16 | + Rotation: size | ||
17 | + MaxContentLength: 10240 | ||
18 | + | ||
19 | +SystemAuth: | ||
20 | + AccessSecret: su-platform | ||
21 | + AccessExpire: 360000 | ||
22 | + | ||
23 | +Redis: | ||
24 | + Host: 127.0.0.1:6379 | ||
25 | + Type: node | ||
26 | + Pass: | ||
27 | +DB: | ||
28 | + DataSource: host=114.55.200.59 user=postgres password=eagle1010 dbname=su_enterprise_platform port=31543 sslmode=disable TimeZone=Asia/Shanghai | ||
29 | + |
cmd/ep/chat/api/internal/config/config.go
0 → 100644
1 | +package config | ||
2 | + | ||
3 | +import ( | ||
4 | + "github.com/zeromicro/go-zero/core/stores/redis" | ||
5 | + "github.com/zeromicro/go-zero/rest" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/config" | ||
7 | +) | ||
8 | + | ||
9 | +type Config struct { | ||
10 | + rest.RestConf | ||
11 | + config.Config | ||
12 | + Redis redis.RedisConf `json:",optional"` | ||
13 | + SystemAuth config.Auth | ||
14 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func ChatModelsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.ChatModelsRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := chat.NewChatModelsLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.ChatModels(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func ChatSessionConversationHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.ChatSessionConversationRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := chat.NewChatSessionConversationLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.ChatSessionConversation(w, r, &req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func ChatSessionConversationWsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.ChatSessionConversationRequestWs | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := chat.NewChatSessionConversationWsLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.ChatSessionConversationWs(w, r, &req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func ChatSessionDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.ChatSessionDeleteRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := chat.NewChatSessionDeleteLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.ChatSessionDelete(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func ChatSessionGetHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.ChatSessionGetRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := chat.NewChatSessionGetLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.ChatSessionGet(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func ChatSessionRecordsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.ChatSessionRecordsRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := chat.NewChatSessionRecordsLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.ChatSessionRecords(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func ChatSessionSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.ChatSessionSaveRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := chat.NewChatSessionSaveLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.ChatSessionSave(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func ChatSessionSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.ChatSessionSearchRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := chat.NewChatSessionSearchLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.ChatSessionSearch(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func ChatSessionUpdateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.ChatSessionUpdateRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := chat.NewChatSessionUpdateLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.ChatSessionUpdate(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
cmd/ep/chat/api/internal/handler/routes.go
0 → 100644
1 | +// Code generated by goctl. DO NOT EDIT. | ||
2 | +package handler | ||
3 | + | ||
4 | +import ( | ||
5 | + "net/http" | ||
6 | + | ||
7 | + chat "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/handler/chat" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + | ||
10 | + "github.com/zeromicro/go-zero/rest" | ||
11 | +) | ||
12 | + | ||
13 | +func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { | ||
14 | + server.AddRoutes( | ||
15 | + rest.WithMiddlewares( | ||
16 | + []rest.Middleware{serverCtx.LogRequest}, | ||
17 | + []rest.Route{ | ||
18 | + { | ||
19 | + Method: http.MethodGet, | ||
20 | + Path: "/chat/session/:id", | ||
21 | + Handler: chat.ChatSessionGetHandler(serverCtx), | ||
22 | + }, | ||
23 | + { | ||
24 | + Method: http.MethodPost, | ||
25 | + Path: "/chat/session", | ||
26 | + Handler: chat.ChatSessionSaveHandler(serverCtx), | ||
27 | + }, | ||
28 | + { | ||
29 | + Method: http.MethodDelete, | ||
30 | + Path: "/chat/session/:id", | ||
31 | + Handler: chat.ChatSessionDeleteHandler(serverCtx), | ||
32 | + }, | ||
33 | + { | ||
34 | + Method: http.MethodPut, | ||
35 | + Path: "/chat/session/:id", | ||
36 | + Handler: chat.ChatSessionUpdateHandler(serverCtx), | ||
37 | + }, | ||
38 | + { | ||
39 | + Method: http.MethodPost, | ||
40 | + Path: "/chat/session/search", | ||
41 | + Handler: chat.ChatSessionSearchHandler(serverCtx), | ||
42 | + }, | ||
43 | + { | ||
44 | + Method: http.MethodPost, | ||
45 | + Path: "/chat/session/conversation", | ||
46 | + Handler: chat.ChatSessionConversationHandler(serverCtx), | ||
47 | + }, | ||
48 | + { | ||
49 | + Method: http.MethodGet, | ||
50 | + Path: "/chat/session/conversation", | ||
51 | + Handler: chat.ChatSessionConversationWsHandler(serverCtx), | ||
52 | + }, | ||
53 | + { | ||
54 | + Method: http.MethodPost, | ||
55 | + Path: "/chat/session/records", | ||
56 | + Handler: chat.ChatSessionRecordsHandler(serverCtx), | ||
57 | + }, | ||
58 | + { | ||
59 | + Method: http.MethodGet, | ||
60 | + Path: "/chat/models", | ||
61 | + Handler: chat.ChatModelsHandler(serverCtx), | ||
62 | + }, | ||
63 | + }..., | ||
64 | + ), | ||
65 | + rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), | ||
66 | + rest.WithPrefix("/v1"), | ||
67 | + ) | ||
68 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "github.com/samber/lo" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
7 | + | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | + | ||
11 | + "github.com/zeromicro/go-zero/core/logx" | ||
12 | +) | ||
13 | + | ||
14 | +type ChatModelsLogic struct { | ||
15 | + logx.Logger | ||
16 | + ctx context.Context | ||
17 | + svcCtx *svc.ServiceContext | ||
18 | +} | ||
19 | + | ||
20 | +func NewChatModelsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatModelsLogic { | ||
21 | + return &ChatModelsLogic{ | ||
22 | + Logger: logx.WithContext(ctx), | ||
23 | + ctx: ctx, | ||
24 | + svcCtx: svcCtx, | ||
25 | + } | ||
26 | +} | ||
27 | + | ||
28 | +func (l *ChatModelsLogic) ChatModels(req *types.ChatModelsRequest) (resp *types.ChatModelsResponse, err error) { | ||
29 | + var models = make([]types.Model, 0) | ||
30 | + lo.ForEach(domain.DefaultChatModels, func(item *domain.ChatModel, index int) { | ||
31 | + models = append(models, types.Model{ | ||
32 | + Id: item.Id, | ||
33 | + Name: item.Name, | ||
34 | + Logo: item.Logo, | ||
35 | + Code: item.Code, | ||
36 | + }) | ||
37 | + }) | ||
38 | + resp = &types.ChatModelsResponse{ | ||
39 | + List: models, | ||
40 | + } | ||
41 | + return | ||
42 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/open" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/ai" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" | ||
11 | + "net/http" | ||
12 | + "time" | ||
13 | + | ||
14 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
15 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
16 | + | ||
17 | + "github.com/zeromicro/go-zero/core/logx" | ||
18 | +) | ||
19 | + | ||
20 | +type ChatSessionConversationLogic struct { | ||
21 | + logx.Logger | ||
22 | + ctx context.Context | ||
23 | + svcCtx *svc.ServiceContext | ||
24 | +} | ||
25 | + | ||
26 | +func NewChatSessionConversationLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatSessionConversationLogic { | ||
27 | + return &ChatSessionConversationLogic{ | ||
28 | + Logger: logx.WithContext(ctx), | ||
29 | + ctx: ctx, | ||
30 | + svcCtx: svcCtx, | ||
31 | + } | ||
32 | +} | ||
33 | + | ||
34 | +func (l *ChatSessionConversationLogic) ChatSessionConversation(w http.ResponseWriter, r *http.Request, req *types.ChatSessionConversationRequest) (resp *types.ChatSessionConversationResponse, err error) { | ||
35 | + var ( | ||
36 | + conn = l.svcCtx.DefaultDBConn() | ||
37 | + dm *domain.ChatSessionRecord | ||
38 | + token = contextdata.GetUserTokenFromCtx(l.ctx) | ||
39 | + session *domain.ChatSession | ||
40 | + user open.User | ||
41 | + model *domain.ChatModel | ||
42 | + ok bool | ||
43 | + beginUnix = time.Now().UnixMilli() | ||
44 | + ) | ||
45 | + if session, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.SessionId); err != nil { | ||
46 | + return nil, xerr.NewErrMsgErr("会话不存在", err) | ||
47 | + } | ||
48 | + if user, err = l.svcCtx.SystemOpen.User(l.ctx, conn, token.UserId); err != nil { | ||
49 | + return nil, xerr.NewErrMsgErr("用户不存在", err) | ||
50 | + } | ||
51 | + if user.Id != session.UserId { | ||
52 | + return nil, xerr.NewErrMsgErr("无权限", err) | ||
53 | + } | ||
54 | + if model, ok = domain.DefaultChatModels.Match(req.ModelId); !ok { | ||
55 | + return nil, xerr.NewErrMsgErr("模型不存在", err) | ||
56 | + } | ||
57 | + dm = &domain.ChatSessionRecord{ | ||
58 | + CompanyId: token.CompanyId, | ||
59 | + UserId: token.UserId, | ||
60 | + SessionId: req.SessionId, | ||
61 | + ModelId: req.ModelId, | ||
62 | + Author: NewDomainUser(user), | ||
63 | + ContentType: req.ContentType, | ||
64 | + ProblemText: req.Text, | ||
65 | + Metadata: domain.Metadata{}, | ||
66 | + Cost: 0, | ||
67 | + Status: domain.Processing, | ||
68 | + } | ||
69 | + var answer string | ||
70 | + var channel = make(chan string, 5) | ||
71 | + // 异步访问AI接口 | ||
72 | + go func() { | ||
73 | + // 异步访问AI接口 | ||
74 | + answer, err = Conversation(model, req.Text, channel) | ||
75 | + }() | ||
76 | + for { | ||
77 | + if _, ok = <-channel; !ok { | ||
78 | + break | ||
79 | + } | ||
80 | + } | ||
81 | + if err != nil { | ||
82 | + return nil, xerr.NewErrMsgErr("AI模型异常,稍后再试", err) | ||
83 | + } | ||
84 | + | ||
85 | + // 记录 | ||
86 | + dm.AnswerText = answer | ||
87 | + dm.Cost = time.Now().UnixMilli() - beginUnix | ||
88 | + dm.Status = domain.FinishedSuccess | ||
89 | + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
90 | + dm, err = l.svcCtx.ChatSessionRecordRepository.Insert(l.ctx, conn, dm) | ||
91 | + return err | ||
92 | + }, true); err != nil { | ||
93 | + return nil, xerr.NewErrMsg("保存失败") | ||
94 | + } | ||
95 | + record := NewTypesChatRecord(dm, user) | ||
96 | + resp = &types.ChatSessionConversationResponse{ | ||
97 | + Record: &record, | ||
98 | + Parts: make([]string, 0), | ||
99 | + Finished: true, | ||
100 | + } | ||
101 | + return | ||
102 | +} | ||
103 | + | ||
104 | +func Conversation(m *domain.ChatModel, text string, channel chan string) (answer string, err error) { | ||
105 | + | ||
106 | + switch m.Id { | ||
107 | + // 星火3.5 | ||
108 | + case 1, 2, 3: | ||
109 | + answer, err = ai.ChatGPT(m.Code, m.Config.AppKey, text, channel) | ||
110 | + case 4: | ||
111 | + answer, err = ai.Spark(m.Config.AppId, m.Config.AppKey, m.Config.AppSecret, text, channel) | ||
112 | + } | ||
113 | + if err != nil { | ||
114 | + return "", err | ||
115 | + } | ||
116 | + return | ||
117 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "github.com/gorilla/websocket" | ||
6 | + "github.com/zeromicro/go-zero/core/fx" | ||
7 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/open" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
12 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" | ||
13 | + "net/http" | ||
14 | + "time" | ||
15 | + | ||
16 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
17 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
18 | + | ||
19 | + "github.com/zeromicro/go-zero/core/logx" | ||
20 | +) | ||
21 | + | ||
22 | +type ChatSessionConversationWsLogic struct { | ||
23 | + logx.Logger | ||
24 | + ctx context.Context | ||
25 | + svcCtx *svc.ServiceContext | ||
26 | +} | ||
27 | + | ||
28 | +func NewChatSessionConversationWsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatSessionConversationWsLogic { | ||
29 | + return &ChatSessionConversationWsLogic{ | ||
30 | + Logger: logx.WithContext(ctx), | ||
31 | + ctx: ctx, | ||
32 | + svcCtx: svcCtx, | ||
33 | + } | ||
34 | +} | ||
35 | + | ||
36 | +func (l *ChatSessionConversationWsLogic) ChatSessionConversationWs(w http.ResponseWriter, r *http.Request, req *types.ChatSessionConversationRequestWs) (resp *types.ChatSessionConversationResponse, err error) { | ||
37 | + var ( | ||
38 | + conn = l.svcCtx.DefaultDBConn() | ||
39 | + dm *domain.ChatSessionRecord | ||
40 | + token = contextdata.GetUserTokenFromCtx(l.ctx) | ||
41 | + session *domain.ChatSession | ||
42 | + user open.User | ||
43 | + model *domain.ChatModel | ||
44 | + ok bool | ||
45 | + ) | ||
46 | + if session, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.SessionId); err != nil { | ||
47 | + return nil, xerr.NewErrMsgErr("会话不存在", err) | ||
48 | + } | ||
49 | + if user, err = l.svcCtx.SystemOpen.User(l.ctx, conn, token.UserId); err != nil { | ||
50 | + return nil, xerr.NewErrMsgErr("用户不存在", err) | ||
51 | + } | ||
52 | + if user.Id != session.UserId { | ||
53 | + return nil, xerr.NewErrMsgErr("无权限", err) | ||
54 | + } | ||
55 | + if model, ok = domain.DefaultChatModels.Match(req.ModelId); !ok { | ||
56 | + return nil, xerr.NewErrMsgErr("模型不存在", err) | ||
57 | + } | ||
58 | + | ||
59 | + var answer string | ||
60 | + | ||
61 | + var upgrader = websocket.Upgrader{ | ||
62 | + ReadBufferSize: 1024, | ||
63 | + WriteBufferSize: 1024, | ||
64 | + CheckOrigin: func(r *http.Request) bool { | ||
65 | + return true | ||
66 | + }, | ||
67 | + } | ||
68 | + var wsconn *websocket.Conn | ||
69 | + wsconn, err = upgrader.Upgrade(w, r, nil) | ||
70 | + if err != nil { | ||
71 | + httpx.ErrorCtx(r.Context(), w, err) | ||
72 | + return | ||
73 | + } | ||
74 | + defer func() { | ||
75 | + wsconn.Close() | ||
76 | + }() | ||
77 | + for { | ||
78 | + var text []byte | ||
79 | + _, text, err = wsconn.ReadMessage() | ||
80 | + if err != nil { | ||
81 | + break | ||
82 | + } | ||
83 | + var beginUnix = time.Now().UnixMilli() | ||
84 | + var channel = make(chan string, 5) | ||
85 | + dm = &domain.ChatSessionRecord{ | ||
86 | + CompanyId: token.CompanyId, | ||
87 | + UserId: token.UserId, | ||
88 | + SessionId: req.SessionId, | ||
89 | + ModelId: req.ModelId, | ||
90 | + Author: NewDomainUser(user), | ||
91 | + ContentType: req.ContentType, | ||
92 | + ProblemText: string(text), | ||
93 | + Metadata: domain.Metadata{}, | ||
94 | + Cost: 0, | ||
95 | + Status: domain.Processing, | ||
96 | + } | ||
97 | + fx.Parallel(func() { | ||
98 | + // 异步访问AI接口 | ||
99 | + answer, err = Conversation(model, string(text), channel) | ||
100 | + }, func() { | ||
101 | + for { | ||
102 | + var v string | ||
103 | + if v, ok = <-channel; ok { | ||
104 | + if err = wsconn.WriteJSON(types.ChatSessionConversationResponse{Parts: []string{v}, Finished: false}); err != nil { | ||
105 | + //httpx.ErrorCtx(r.Context(), w, err) | ||
106 | + dm.Status = domain.FinishedFail | ||
107 | + break | ||
108 | + } | ||
109 | + } else { | ||
110 | + dm.Status = domain.FinishedSuccess | ||
111 | + break | ||
112 | + } | ||
113 | + } | ||
114 | + return | ||
115 | + }) | ||
116 | + | ||
117 | + // 记录 | ||
118 | + dm.AnswerText = answer | ||
119 | + dm.Cost = time.Now().UnixMilli() - beginUnix | ||
120 | + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
121 | + dm, err = l.svcCtx.ChatSessionRecordRepository.Insert(l.ctx, conn, dm) | ||
122 | + return err | ||
123 | + }, true); err != nil { | ||
124 | + return nil, xerr.NewErrMsg("保存失败") | ||
125 | + } | ||
126 | + record := NewTypesChatRecord(dm, user) | ||
127 | + if err = wsconn.WriteJSON(types.ChatSessionConversationResponse{Record: &record, Finished: true}); err != nil { | ||
128 | + return | ||
129 | + } | ||
130 | + } | ||
131 | + | ||
132 | + if err != nil { | ||
133 | + return nil, xerr.NewErrMsgErr("AI模型异常,稍后再试", err) | ||
134 | + } | ||
135 | + return | ||
136 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" | ||
9 | + | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
12 | + | ||
13 | + "github.com/zeromicro/go-zero/core/logx" | ||
14 | +) | ||
15 | + | ||
16 | +type ChatSessionDeleteLogic struct { | ||
17 | + logx.Logger | ||
18 | + ctx context.Context | ||
19 | + svcCtx *svc.ServiceContext | ||
20 | +} | ||
21 | + | ||
22 | +func NewChatSessionDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatSessionDeleteLogic { | ||
23 | + return &ChatSessionDeleteLogic{ | ||
24 | + Logger: logx.WithContext(ctx), | ||
25 | + ctx: ctx, | ||
26 | + svcCtx: svcCtx, | ||
27 | + } | ||
28 | +} | ||
29 | + | ||
30 | +func (l *ChatSessionDeleteLogic) ChatSessionDelete(req *types.ChatSessionDeleteRequest) (resp *types.ChatSessionDeleteResponse, err error) { | ||
31 | + var ( | ||
32 | + conn = l.svcCtx.DefaultDBConn() | ||
33 | + dm *domain.ChatSession | ||
34 | + token = contextdata.GetUserTokenFromCtx(l.ctx) | ||
35 | + ) | ||
36 | + if dm, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
37 | + return nil, xerr.NewErrMsgErr("不存在", err) | ||
38 | + } | ||
39 | + if dm.UserId != token.UserId { | ||
40 | + return nil, xerr.NewErrMsgErr("无权限", err) | ||
41 | + } | ||
42 | + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
43 | + if dm, err = l.svcCtx.ChatSessionRepository.Delete(l.ctx, conn, dm); err != nil { | ||
44 | + return err | ||
45 | + } | ||
46 | + return nil | ||
47 | + }, true); err != nil { | ||
48 | + return nil, xerr.NewErrMsgErr("移除失败", err) | ||
49 | + } | ||
50 | + return | ||
51 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "github.com/samber/lo" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/open" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" | ||
10 | + | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
12 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
13 | + | ||
14 | + "github.com/zeromicro/go-zero/core/logx" | ||
15 | +) | ||
16 | + | ||
17 | +type ChatSessionGetLogic struct { | ||
18 | + logx.Logger | ||
19 | + ctx context.Context | ||
20 | + svcCtx *svc.ServiceContext | ||
21 | +} | ||
22 | + | ||
23 | +func NewChatSessionGetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatSessionGetLogic { | ||
24 | + return &ChatSessionGetLogic{ | ||
25 | + Logger: logx.WithContext(ctx), | ||
26 | + ctx: ctx, | ||
27 | + svcCtx: svcCtx, | ||
28 | + } | ||
29 | +} | ||
30 | + | ||
31 | +func (l *ChatSessionGetLogic) ChatSessionGet(req *types.ChatSessionGetRequest) (resp *types.ChatSessionGetResponse, err error) { | ||
32 | + var ( | ||
33 | + conn = l.svcCtx.DefaultDBConn() | ||
34 | + dm *domain.ChatSession | ||
35 | + records []*domain.ChatSessionRecord | ||
36 | + token = contextdata.GetUserTokenFromCtx(l.ctx) | ||
37 | + user open.User | ||
38 | + ) | ||
39 | + // 货号唯一 | ||
40 | + if dm, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
41 | + return nil, xerr.NewErrMsgErr("不存在", err) | ||
42 | + } | ||
43 | + if user, err = l.svcCtx.SystemOpen.User(l.ctx, conn, dm.UserId); err != nil { | ||
44 | + return nil, xerr.NewErrMsgErr("用户不存在", err) | ||
45 | + } | ||
46 | + if _, records, err = l.svcCtx.ChatSessionRecordRepository.FindByCompanyUser(l.ctx, conn, token.CompanyId, token.UserId, domain.NewQueryOptions().MustWithKV("sessionId", dm.Id)); err != nil { | ||
47 | + return nil, xerr.NewErr(err) | ||
48 | + } | ||
49 | + var typesRecords []types.Record | ||
50 | + lo.ForEach(records, func(item *domain.ChatSessionRecord, index int) { | ||
51 | + typesRecords = append(typesRecords, NewTypesChatRecord(item, user)) | ||
52 | + }) | ||
53 | + | ||
54 | + resp = &types.ChatSessionGetResponse{ | ||
55 | + ChatSession: NewTypesChatSession(dm), | ||
56 | + Records: typesRecords, | ||
57 | + } | ||
58 | + return | ||
59 | +} | ||
60 | + | ||
61 | +func NewTypesChatRecord(item *domain.ChatSessionRecord, user open.User) types.Record { | ||
62 | + model, ok := domain.DefaultChatModels.Match(item.ModelId) | ||
63 | + var typesModel *types.Model | ||
64 | + if !ok { | ||
65 | + typesModel = &types.Model{} | ||
66 | + } else { | ||
67 | + typesModel = &types.Model{ | ||
68 | + Name: model.Name, | ||
69 | + Id: model.Id, | ||
70 | + Logo: model.Logo, | ||
71 | + } | ||
72 | + } | ||
73 | + return types.Record{ | ||
74 | + Id: item.Id, | ||
75 | + SessionId: item.SessionId, | ||
76 | + GroupId: item.Group, | ||
77 | + Author: NewTypesUser(user), | ||
78 | + Model: typesModel, | ||
79 | + ContentType: item.ContentType, | ||
80 | + ProblemText: item.ProblemText, | ||
81 | + AnswerText: item.AnswerText, | ||
82 | + Status: item.Status, | ||
83 | + CreateAt: item.CreatedAt, | ||
84 | + } | ||
85 | +} | ||
86 | + | ||
87 | +func NewTypesUser(user open.User) *types.User { | ||
88 | + if user.Id == 0 && user.Name == "" { | ||
89 | + return nil | ||
90 | + } | ||
91 | + return &types.User{ | ||
92 | + Id: user.Id, | ||
93 | + Name: user.Name, | ||
94 | + } | ||
95 | +} | ||
96 | + | ||
97 | +func NewDomainUser(user open.User) domain.User { | ||
98 | + if user.Id == 0 && user.Name == "" { | ||
99 | + return domain.User{} | ||
100 | + } | ||
101 | + return domain.User{ | ||
102 | + Id: user.Id, | ||
103 | + Name: user.Name, | ||
104 | + } | ||
105 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "github.com/samber/lo" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/open" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/tool" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" | ||
11 | + | ||
12 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
13 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
14 | + | ||
15 | + "github.com/zeromicro/go-zero/core/logx" | ||
16 | +) | ||
17 | + | ||
18 | +type ChatSessionRecordsLogic struct { | ||
19 | + logx.Logger | ||
20 | + ctx context.Context | ||
21 | + svcCtx *svc.ServiceContext | ||
22 | +} | ||
23 | + | ||
24 | +func NewChatSessionRecordsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatSessionRecordsLogic { | ||
25 | + return &ChatSessionRecordsLogic{ | ||
26 | + Logger: logx.WithContext(ctx), | ||
27 | + ctx: ctx, | ||
28 | + svcCtx: svcCtx, | ||
29 | + } | ||
30 | +} | ||
31 | + | ||
32 | +func (l *ChatSessionRecordsLogic) ChatSessionRecords(req *types.ChatSessionRecordsRequest) (resp *types.ChatSessionRecordsResponse, err error) { | ||
33 | + var ( | ||
34 | + conn = l.svcCtx.DefaultDBConn() | ||
35 | + //chatSession *domain.ChatSession | ||
36 | + records []*domain.ChatSessionRecord | ||
37 | + token = contextdata.GetUserTokenFromCtx(l.ctx) | ||
38 | + user open.User | ||
39 | + total int64 | ||
40 | + ) | ||
41 | + queryOptions := domain.NewQueryOptions().MustWithKV("sessionId", req.SessionId) | ||
42 | + if req.Page > 0 && req.Size > 0 { | ||
43 | + queryOptions.WithOffsetLimit(req.Page, req.Size) | ||
44 | + } | ||
45 | + if total, records, err = l.svcCtx.ChatSessionRecordRepository.FindByCompanyUser(l.ctx, conn, token.CompanyId, token.UserId, queryOptions); err != nil { | ||
46 | + return nil, xerr.NewErr(err) | ||
47 | + } | ||
48 | + var typesRecords []types.Record | ||
49 | + var lazyUser = tool.NewLazyLoadService(l.svcCtx.SystemOpen.User) | ||
50 | + lo.ForEach(records, func(item *domain.ChatSessionRecord, index int) { | ||
51 | + user, _ = lazyUser.Load(l.ctx, conn, item.UserId) | ||
52 | + typesRecords = append(typesRecords, NewTypesChatRecord(item, user)) | ||
53 | + }) | ||
54 | + resp = &types.ChatSessionRecordsResponse{ | ||
55 | + Records: typesRecords, | ||
56 | + Total: total, | ||
57 | + } | ||
58 | + return | ||
59 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" | ||
9 | + | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
12 | + | ||
13 | + "github.com/zeromicro/go-zero/core/logx" | ||
14 | +) | ||
15 | + | ||
16 | +type ChatSessionSaveLogic struct { | ||
17 | + logx.Logger | ||
18 | + ctx context.Context | ||
19 | + svcCtx *svc.ServiceContext | ||
20 | +} | ||
21 | + | ||
22 | +func NewChatSessionSaveLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatSessionSaveLogic { | ||
23 | + return &ChatSessionSaveLogic{ | ||
24 | + Logger: logx.WithContext(ctx), | ||
25 | + ctx: ctx, | ||
26 | + svcCtx: svcCtx, | ||
27 | + } | ||
28 | +} | ||
29 | + | ||
30 | +func (l *ChatSessionSaveLogic) ChatSessionSave(req *types.ChatSessionSaveRequest) (resp *types.ChatSessionSaveResponse, err error) { | ||
31 | + var ( | ||
32 | + dm *domain.ChatSession | ||
33 | + token = contextdata.GetUserTokenFromCtx(l.ctx) | ||
34 | + ) | ||
35 | + dm = NewDomainChatSession(token, req.ChatSession) | ||
36 | + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
37 | + dm, err = l.svcCtx.ChatSessionRepository.Insert(l.ctx, conn, dm) | ||
38 | + return err | ||
39 | + }, true); err != nil { | ||
40 | + return nil, xerr.NewErrMsg("保存失败") | ||
41 | + } | ||
42 | + resp = &types.ChatSessionSaveResponse{} | ||
43 | + return | ||
44 | +} | ||
45 | + | ||
46 | +func NewDomainChatSession(token contextdata.UserToken, item types.ChatSessionItem) *domain.ChatSession { | ||
47 | + title := item.Title | ||
48 | + if item.Title == "" { | ||
49 | + title = "新对话窗口" | ||
50 | + } | ||
51 | + return &domain.ChatSession{ | ||
52 | + CompanyId: token.CompanyId, | ||
53 | + UserId: token.UserId, | ||
54 | + Title: title, | ||
55 | + Abstract: title, | ||
56 | + } | ||
57 | +} | ||
58 | + | ||
59 | +func NewTypesChatSession(item *domain.ChatSession) types.ChatSessionItem { | ||
60 | + return types.ChatSessionItem{ | ||
61 | + Id: item.Id, | ||
62 | + Title: item.Title, | ||
63 | + Abstract: item.Abstract, | ||
64 | + CreatedAt: item.CreatedAt, | ||
65 | + } | ||
66 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "fmt" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
7 | + | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
10 | + | ||
11 | + "github.com/zeromicro/go-zero/core/logx" | ||
12 | +) | ||
13 | + | ||
14 | +type ChatSessionSearchLogic struct { | ||
15 | + logx.Logger | ||
16 | + ctx context.Context | ||
17 | + svcCtx *svc.ServiceContext | ||
18 | +} | ||
19 | + | ||
20 | +func NewChatSessionSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatSessionSearchLogic { | ||
21 | + return &ChatSessionSearchLogic{ | ||
22 | + Logger: logx.WithContext(ctx), | ||
23 | + ctx: ctx, | ||
24 | + svcCtx: svcCtx, | ||
25 | + } | ||
26 | +} | ||
27 | + | ||
28 | +func (l *ChatSessionSearchLogic) ChatSessionSearch(req *types.ChatSessionSearchRequest) (resp *types.ChatSessionSearchResponse, err error) { | ||
29 | + var ( | ||
30 | + conn = l.svcCtx.DefaultDBConn() | ||
31 | + dms []*domain.ChatSession | ||
32 | + total int64 | ||
33 | + ) | ||
34 | + | ||
35 | + queryOptions := domain.NewQueryOptions(). | ||
36 | + WithKV("title", fmt.Sprintf("%%%v%%", req.Title)) | ||
37 | + | ||
38 | + if req.Page != 0 && req.Size != 0 { | ||
39 | + queryOptions.WithOffsetLimit(req.Page, req.Size) | ||
40 | + } | ||
41 | + | ||
42 | + total, dms, err = l.svcCtx.ChatSessionRepository.Find(l.ctx, conn, queryOptions) | ||
43 | + list := make([]types.ChatSessionItem, 0) | ||
44 | + for i := range dms { | ||
45 | + list = append(list, NewTypesChatSession(dms[i])) | ||
46 | + } | ||
47 | + resp = &types.ChatSessionSearchResponse{ | ||
48 | + List: list, | ||
49 | + Total: total, | ||
50 | + } | ||
51 | + return | ||
52 | +} |
1 | +package chat | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" | ||
9 | + | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" | ||
12 | + | ||
13 | + "github.com/zeromicro/go-zero/core/logx" | ||
14 | +) | ||
15 | + | ||
16 | +type ChatSessionUpdateLogic struct { | ||
17 | + logx.Logger | ||
18 | + ctx context.Context | ||
19 | + svcCtx *svc.ServiceContext | ||
20 | +} | ||
21 | + | ||
22 | +func NewChatSessionUpdateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatSessionUpdateLogic { | ||
23 | + return &ChatSessionUpdateLogic{ | ||
24 | + Logger: logx.WithContext(ctx), | ||
25 | + ctx: ctx, | ||
26 | + svcCtx: svcCtx, | ||
27 | + } | ||
28 | +} | ||
29 | + | ||
30 | +func (l *ChatSessionUpdateLogic) ChatSessionUpdate(req *types.ChatSessionUpdateRequest) (resp *types.ChatSessionUpdateResponse, err error) { | ||
31 | + var ( | ||
32 | + conn = l.svcCtx.DefaultDBConn() | ||
33 | + dm *domain.ChatSession | ||
34 | + token = contextdata.GetUserTokenFromCtx(l.ctx) | ||
35 | + ) | ||
36 | + if dm, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
37 | + return nil, xerr.NewErrMsgErr("不存在", err) | ||
38 | + } | ||
39 | + if dm.UserId != token.UserId { | ||
40 | + return nil, xerr.NewErrMsgErr("无权限", err) | ||
41 | + } | ||
42 | + // 赋值 | ||
43 | + dm.Title = req.ChatSession.Title | ||
44 | + dm.Abstract = req.ChatSession.Abstract | ||
45 | + | ||
46 | + // 更新 | ||
47 | + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
48 | + dm, err = l.svcCtx.ChatSessionRepository.UpdateWithVersion(l.ctx, conn, dm) | ||
49 | + return err | ||
50 | + }, true); err != nil { | ||
51 | + return nil, xerr.NewErrMsg("更新失败") | ||
52 | + } | ||
53 | + resp = &types.ChatSessionUpdateResponse{} | ||
54 | + return | ||
55 | +} |
1 | +package middleware |
1 | +package svc | ||
2 | + | ||
3 | +import ( | ||
4 | + "github.com/zeromicro/go-zero/core/stores/redis" | ||
5 | + "github.com/zeromicro/go-zero/rest" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/config" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/db/repository" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/open" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/cache" | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/database" | ||
12 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/middleware" | ||
13 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
14 | + "gorm.io/gorm" | ||
15 | +) | ||
16 | + | ||
17 | +type ServiceContext struct { | ||
18 | + Config config.Config | ||
19 | + LogRequest rest.Middleware | ||
20 | + Redis *redis.Redis | ||
21 | + DB *gorm.DB | ||
22 | + ChatSessionRepository domain.ChatSessionRepository | ||
23 | + ChatSessionRecordRepository domain.ChatSessionRecordRepository | ||
24 | + SystemOpen open.SystemOpen | ||
25 | +} | ||
26 | + | ||
27 | +func NewServiceContext(c config.Config) *ServiceContext { | ||
28 | + db := database.OpenGormPGDB(c.DB.DataSource, c.Log.Mode) | ||
29 | + | ||
30 | + mlCache := cache.NewMultiLevelCache([]string{c.Redis.Host}, c.Redis.Pass) | ||
31 | + redis, _ := redis.NewRedis(redis.RedisConf{Host: c.Redis.Host, Pass: c.Redis.Pass, Type: "node"}) | ||
32 | + return &ServiceContext{ | ||
33 | + Config: c, | ||
34 | + DB: db, | ||
35 | + Redis: redis, | ||
36 | + LogRequest: middleware.NewLogRequestMiddleware(c.LogRequest).Handle, | ||
37 | + ChatSessionRepository: repository.NewChatSessionRepository(cache.NewCachedRepository(mlCache)), | ||
38 | + ChatSessionRecordRepository: repository.NewChatSessionRecordRepository(cache.NewCachedRepository(mlCache)), | ||
39 | + | ||
40 | + SystemOpen: open.NewSystemOpen(c.Redis), | ||
41 | + } | ||
42 | +} | ||
43 | + | ||
44 | +func (svc *ServiceContext) DefaultDBConn() transaction.Conn { | ||
45 | + return transaction.NewTransactionContext(svc.DB) | ||
46 | +} |
cmd/ep/chat/api/internal/types/types.go
0 → 100644
1 | +// Code generated by goctl. DO NOT EDIT. | ||
2 | +package types | ||
3 | + | ||
4 | +type ChatSessionGetRequest struct { | ||
5 | + Id int64 `path:"id"` | ||
6 | +} | ||
7 | + | ||
8 | +type ChatSessionGetResponse struct { | ||
9 | + ChatSession ChatSessionItem `json:"session"` | ||
10 | + Records []Record `json:"records"` | ||
11 | +} | ||
12 | + | ||
13 | +type ChatSessionSaveRequest struct { | ||
14 | + ChatSession ChatSessionItem `json:"session"` | ||
15 | +} | ||
16 | + | ||
17 | +type ChatSessionSaveResponse struct { | ||
18 | +} | ||
19 | + | ||
20 | +type ChatSessionDeleteRequest struct { | ||
21 | + Id int64 `path:"id"` | ||
22 | +} | ||
23 | + | ||
24 | +type ChatSessionDeleteResponse struct { | ||
25 | +} | ||
26 | + | ||
27 | +type ChatSessionUpdateRequest struct { | ||
28 | + Id int64 `path:"id"` | ||
29 | + ChatSession ChatSessionItem `json:"session"` | ||
30 | +} | ||
31 | + | ||
32 | +type ChatSessionUpdateResponse struct { | ||
33 | +} | ||
34 | + | ||
35 | +type ChatSessionSearchRequest struct { | ||
36 | + Page int `json:"page,optional"` | ||
37 | + Size int `json:"size,optional"` | ||
38 | + Title string `json:"title,optional"` // 按标题搜索 | ||
39 | +} | ||
40 | + | ||
41 | +type ChatSessionSearchResponse struct { | ||
42 | + List []ChatSessionItem `json:"list"` | ||
43 | + Total int64 `json:"total"` | ||
44 | +} | ||
45 | + | ||
46 | +type ChatSessionItem struct { | ||
47 | + Id int64 `json:"id,optional,omitempty"` // 唯一标识 | ||
48 | + Title string `json:"title,optional,omitempty"` // 会话标题 | ||
49 | + Abstract string `json:"abstract,optional,omitempty"` // 摘要 | ||
50 | + CreatedAt int64 `json:"createdAt,optional,omitempty"` // 创建时间 | ||
51 | +} | ||
52 | + | ||
53 | +type ChatModelsRequest struct { | ||
54 | +} | ||
55 | + | ||
56 | +type ChatModelsResponse struct { | ||
57 | + List []Model `json:"list"` | ||
58 | +} | ||
59 | + | ||
60 | +type Model struct { | ||
61 | + Id int64 `json:"id"` // 模型ID | ||
62 | + Name string `json:"name"` // 模型名称 | ||
63 | + Code string `json:"code"` // 模型编码 | ||
64 | + Logo string `json:"logo"` // 模型LOGO地址 | ||
65 | +} | ||
66 | + | ||
67 | +type ChatSessionRecordsRequest struct { | ||
68 | + Page int `json:"page,optional"` | ||
69 | + Size int `json:"size,optional"` | ||
70 | + SessionId int64 `json:"sessionId"` | ||
71 | +} | ||
72 | + | ||
73 | +type ChatSessionRecordsResponse struct { | ||
74 | + Records []Record `json:"list"` | ||
75 | + Total int64 `json:"total"` | ||
76 | +} | ||
77 | + | ||
78 | +type ChatSessionConversationRequest struct { | ||
79 | + SessionId int64 `json:"sessionId"` // 会话ID | ||
80 | + ModelId int64 `json:"modelId"` // 模型ID | ||
81 | + ContentType string `json:"contentType"` // 内容类型 文本:text (图片:image 文档:document) | ||
82 | + Text string `json:"text"` // 内容文本 | ||
83 | + FileUrl string `json:"fileUrl,optional"` // 文件地址 | ||
84 | +} | ||
85 | + | ||
86 | +type ChatSessionConversationResponse struct { | ||
87 | + Record *Record `json:"record,omitempty"` | ||
88 | + Parts []string `json:"parts"` | ||
89 | + Finished bool `json:"finished"` | ||
90 | +} | ||
91 | + | ||
92 | +type ChatSessionConversationRequestWs struct { | ||
93 | + SessionId int64 `form:"sessionId"` // 会话ID | ||
94 | + ModelId int64 `form:"modelId"` // 模型ID | ||
95 | + ContentType string `form:"contentType"` // 内容类型 文本:text (图片:image 文档:document) | ||
96 | + Text string `form:"text"` // 内容文本 | ||
97 | +} | ||
98 | + | ||
99 | +type Record struct { | ||
100 | + Id int64 `json:"id"` // 记录ID | ||
101 | + SessionId int64 `json:"sessionId"` // 会话ID | ||
102 | + GroupId int64 `json:"groupId"` // 分组ID | ||
103 | + ModelId int64 `json:"modelId,omitempty"` // 模型ID | ||
104 | + AuthorId int64 `json:"authorId,omitempty"` // 作者ID | ||
105 | + Author *User `json:"author,omitempty"` // 提问人 | ||
106 | + Model *Model `json:"model,omitempty"` // 应答人 | ||
107 | + ContentType string `json:"contentType"` // 内容类型 文本:text (图片:image 文档:document) | ||
108 | + ProblemText string `json:"problemText"` // 问题文本 | ||
109 | + AnswerText string `json:"answerText"` // 回答文本 | ||
110 | + Status string `json:"status"` // 状态 处理中:processing 超时:finished_timeout 结束成功:finished_fail 结束失败:finished_success | ||
111 | + CreateAt int64 `json:"createAt"` // 创建时间 | ||
112 | +} | ||
113 | + | ||
114 | +type Content struct { | ||
115 | + ContentType string `json:"contentType"` // 内容类型 文本:text (图片:image 文档:document) | ||
116 | + Parts []string `json:"parts"` // 内容 | ||
117 | +} | ||
118 | + | ||
119 | +type User struct { | ||
120 | + Id int64 `json:"id"` // 用ID | ||
121 | + Name string `json:"name"` // 名称 | ||
122 | + Avatar string `json:"avatar"` // 头像 | ||
123 | +} |
cmd/ep/chat/deploy/database/table.sql
0 → 100644
1 | +CREATE TABLE `chat_session` | ||
2 | +( | ||
3 | + `id` int(0) NOT NULL COMMENT '唯一标识', | ||
4 | + PRIMARY KEY (`id`) USING BTREE | ||
5 | +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; | ||
6 | + | ||
7 | +CREATE TABLE `chat_session_record` | ||
8 | +( | ||
9 | + `id` int(0) NOT NULL COMMENT '唯一标识', | ||
10 | + PRIMARY KEY (`id`) USING BTREE | ||
11 | +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; | ||
12 | + | ||
13 | +CREATE TABLE `chat_model` | ||
14 | +( | ||
15 | + `id` int(0) NOT NULL COMMENT '唯一标识', | ||
16 | + PRIMARY KEY (`id`) USING BTREE | ||
17 | +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; |
cmd/ep/chat/deploy/docker/Dockerfile
0 → 100644
1 | +FROM golang:1.19-alpine as builder | ||
2 | + | ||
3 | +# Define the project name | 定义项目名称 | ||
4 | +ARG PROJECT=core | ||
5 | +ARG PROJECTCODE=chat | ||
6 | + | ||
7 | +WORKDIR /build | ||
8 | +COPY . . | ||
9 | + | ||
10 | +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories | ||
11 | +RUN apk update --no-cache && apk add --no-cache tzdata | ||
12 | +RUN go env -w GO111MODULE=on \ | ||
13 | + && go env -w GOPROXY=https://goproxy.cn,direct \ | ||
14 | + && go env -w CGO_ENABLED=0 \ | ||
15 | + && go env \ | ||
16 | + && go mod tidy \ | ||
17 | + && cd cmd/ep/${PROJECTCODE}/api \ | ||
18 | + && go build -ldflags="-s -w" -o /build/api/${PROJECT} ${PROJECT}.go | ||
19 | + | ||
20 | +FROM alpine:latest | ||
21 | + | ||
22 | +# Define the project name | 定义项目名称 | ||
23 | +ARG PROJECT=core | ||
24 | +ARG PROJECTCODE=chat | ||
25 | +# Define the config file name | 定义配置文件名 | ||
26 | +ARG CONFIG_FILE=core.yaml | ||
27 | +# Define the author | 定义作者 | ||
28 | +ARG AUTHOR=785409885@qq.com | ||
29 | + | ||
30 | +LABEL org.opencontainers.image.authors=${AUTHOR} | ||
31 | + | ||
32 | +WORKDIR /app | ||
33 | +ENV PROJECT=${PROJECT} | ||
34 | +ENV CONFIG_FILE=${CONFIG_FILE} | ||
35 | +ENV TZ Asia/Shanghai | ||
36 | + | ||
37 | +COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai | ||
38 | +COPY --from=builder /build/api/${PROJECT} ./ | ||
39 | +COPY --from=builder /build/cmd/ep/${PROJECTCODE}/api/etc/${CONFIG_FILE} ./etc/ | ||
40 | + | ||
41 | +EXPOSE 8080 | ||
42 | +ENTRYPOINT ./${PROJECT} -f etc/${CONFIG_FILE} |
cmd/ep/chat/deploy/k8s/dev/install.sh
0 → 100644
1 | +#!/bin/bash | ||
2 | +export PATH=/root/local/bin:$PATH | ||
3 | +kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
4 | +if [ "$?" == "1" ];then | ||
5 | + kubectl create -f /tmp/test/sumifcc-discuss/sumifcc-discuss.yaml --record | ||
6 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
7 | + if [ "$?" == "0" ];then | ||
8 | + echo "sumifcc-discuss service install success!" | ||
9 | + else | ||
10 | + echo "sumifcc-discuss service install fail!" | ||
11 | + fi | ||
12 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
13 | + if [ "$?" == "0" ];then | ||
14 | + echo "sumifcc-discuss deployment install success!" | ||
15 | + else | ||
16 | + echo "sumifcc-discuss deployment install fail!" | ||
17 | + fi | ||
18 | +else | ||
19 | + kubectl delete -f /tmp/test/sumifcc-discuss/sumifcc-discuss.yaml | ||
20 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
21 | + while [ "$?" == "0" ] | ||
22 | + do | ||
23 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
24 | + done | ||
25 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
26 | + while [ "$?" == "0" ] | ||
27 | + do | ||
28 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
29 | + done | ||
30 | + kubectl create -f /tmp/test/sumifcc-discuss/sumifcc-discuss.yaml --record | ||
31 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
32 | + if [ "$?" == "0" ];then | ||
33 | + echo "sumifcc-discuss service update success!" | ||
34 | + else | ||
35 | + echo "sumifcc-discuss service update fail!" | ||
36 | + fi | ||
37 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
38 | + if [ "$?" == "0" ];then | ||
39 | + echo "sumifcc-discuss deployment update success!" | ||
40 | + else | ||
41 | + echo "sumifcc-discuss deployment update fail!" | ||
42 | + fi | ||
43 | +fi |
cmd/ep/chat/deploy/k8s/dev/sumicro-chat.yaml
0 → 100644
1 | +apiVersion: v1 | ||
2 | +kind: ConfigMap | ||
3 | +metadata: | ||
4 | + name: sumicro-chat-config-dev | ||
5 | +data: | ||
6 | + core.yaml: | | ||
7 | + Name: sumicro-chat-dev | ||
8 | + Host: 0.0.0.0 | ||
9 | + Port: 8080 | ||
10 | + | ||
11 | + Verbose: false | ||
12 | + Migrate: true | ||
13 | + Timeout: 30000 | ||
14 | + LogRequest: true # 记录详细请求日志 | ||
15 | + | ||
16 | + Log: | ||
17 | + #Mode: file | ||
18 | + Encoding: plain | ||
19 | + Level: debug # info | ||
20 | + MaxSize: 1 # 2MB | ||
21 | + TimeFormat: 2006-01-02 15:04:05 | ||
22 | + Rotation: size | ||
23 | + MaxContentLength: 10240 | ||
24 | + | ||
25 | + SystemAuth: | ||
26 | + AccessSecret: su-platform | ||
27 | + AccessExpire: 360000 | ||
28 | + | ||
29 | + Redis: | ||
30 | + Host: 192.168.0.243:6379 | ||
31 | + Type: node | ||
32 | + Pass: | ||
33 | + DB: | ||
34 | + DataSource: host=114.55.200.59 user=postgres password=eagle1010 dbname=su_enterprise_platform port=31543 sslmode=disable TimeZone=Asia/Shanghai | ||
35 | + | ||
36 | +--- | ||
37 | +apiVersion: v1 | ||
38 | +kind: Service | ||
39 | +metadata: | ||
40 | + name: sumicro-chat | ||
41 | + namespace: mmm-suplus-test | ||
42 | + labels: | ||
43 | + k8s-app: sumicro-chat | ||
44 | +spec: | ||
45 | + ports: | ||
46 | + - name: "http" | ||
47 | + port: 80 | ||
48 | + targetPort: 8080 | ||
49 | + - name: "https" | ||
50 | + port: 443 | ||
51 | + targetPort: 443 | ||
52 | + selector: | ||
53 | + k8s-app: sumicro-chat | ||
54 | +--- | ||
55 | +apiVersion: extensions/v1beta1 | ||
56 | +kind: Deployment | ||
57 | +metadata: | ||
58 | + name: sumicro-chat | ||
59 | + namespace: mmm-suplus-test | ||
60 | + labels: | ||
61 | + k8s-app: sumicro-chat | ||
62 | +spec: | ||
63 | + replicas: 1 | ||
64 | + template: | ||
65 | + metadata: | ||
66 | + labels: | ||
67 | + k8s-app: sumicro-chat | ||
68 | + spec: | ||
69 | + affinity: | ||
70 | + nodeAffinity: | ||
71 | + preferredDuringSchedulingIgnoredDuringExecution: | ||
72 | + - preference: {} | ||
73 | + weight: 100 | ||
74 | + requiredDuringSchedulingIgnoredDuringExecution: | ||
75 | + nodeSelectorTerms: | ||
76 | + - matchExpressions: | ||
77 | + - key: kubernetes.io/hostname | ||
78 | + operator: In | ||
79 | + values: | ||
80 | + - cn-hangzhou.i-bp1djh1xn7taumbue1ze | ||
81 | + | ||
82 | + containers: | ||
83 | + - name: sumicro-chat | ||
84 | + image: 192.168.0.243:5000/mmm/sumicro-chat:dev | ||
85 | + imagePullPolicy: Always | ||
86 | + ports: | ||
87 | + - containerPort: 8080 | ||
88 | + - containerPort: 443 | ||
89 | + volumeMounts: | ||
90 | + - mountPath: /opt/logs | ||
91 | + name: accesslogs | ||
92 | + - mountPath: /app/etc | ||
93 | + name: config-volume | ||
94 | + env: | ||
95 | + - name: LOG_LEVEL | ||
96 | + value: "debug" | ||
97 | + - name: LOG_FILE | ||
98 | + value: "true" | ||
99 | + volumes: | ||
100 | + - name: accesslogs | ||
101 | + emptyDir: {} | ||
102 | + - name: config-volume | ||
103 | + configMap: | ||
104 | + name: sumicro-chat-config-dev |
cmd/ep/chat/deploy/k8s/prd/install.sh
0 → 100644
1 | +#!/bin/bash | ||
2 | +export PATH=/root/local/bin:$PATH | ||
3 | +kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
4 | +if [ "$?" == "1" ];then | ||
5 | + kubectl create -f /tmp/test/sumifcc-discuss/sumifcc-discuss.yaml --record | ||
6 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
7 | + if [ "$?" == "0" ];then | ||
8 | + echo "sumifcc-discuss service install success!" | ||
9 | + else | ||
10 | + echo "sumifcc-discuss service install fail!" | ||
11 | + fi | ||
12 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
13 | + if [ "$?" == "0" ];then | ||
14 | + echo "sumifcc-discuss deployment install success!" | ||
15 | + else | ||
16 | + echo "sumifcc-discuss deployment install fail!" | ||
17 | + fi | ||
18 | +else | ||
19 | + kubectl delete -f /tmp/test/sumifcc-discuss/sumifcc-discuss.yaml | ||
20 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
21 | + while [ "$?" == "0" ] | ||
22 | + do | ||
23 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
24 | + done | ||
25 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
26 | + while [ "$?" == "0" ] | ||
27 | + do | ||
28 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
29 | + done | ||
30 | + kubectl create -f /tmp/test/sumifcc-discuss/sumifcc-discuss.yaml --record | ||
31 | + kubectl -n mmm-suplus-test get svc | grep -q sumifcc-discuss | ||
32 | + if [ "$?" == "0" ];then | ||
33 | + echo "sumifcc-discuss service update success!" | ||
34 | + else | ||
35 | + echo "sumifcc-discuss service update fail!" | ||
36 | + fi | ||
37 | + kubectl -n mmm-suplus-test get pods | grep -q sumifcc-discuss | ||
38 | + if [ "$?" == "0" ];then | ||
39 | + echo "sumifcc-discuss deployment update success!" | ||
40 | + else | ||
41 | + echo "sumifcc-discuss deployment update fail!" | ||
42 | + fi | ||
43 | +fi |
cmd/ep/chat/deploy/k8s/prd/sumicro-chat.yaml
0 → 100644
1 | +apiVersion: v1 | ||
2 | +kind: ConfigMap | ||
3 | +metadata: | ||
4 | + name: sumicro-chat-config-prd | ||
5 | +data: | ||
6 | + config.yml: | | ||
7 | + Name: sumicro-chat-prd | ||
8 | + Host: 0.0.0.0 | ||
9 | + Port: 8080 | ||
10 | + | ||
11 | + Verbose: false | ||
12 | + Migrate: true | ||
13 | + Timeout: 30000 | ||
14 | + LogRequest: true # 记录详细请求日志 | ||
15 | + | ||
16 | + Log: | ||
17 | + #Mode: file | ||
18 | + Encoding: plain | ||
19 | + Level: debug # info | ||
20 | + MaxSize: 1 # 2MB | ||
21 | + TimeFormat: 2006-01-02 15:04:05 | ||
22 | + Rotation: size | ||
23 | + MaxContentLength: 10240 | ||
24 | + | ||
25 | + SystemAuth: | ||
26 | + AccessSecret: su-platform | ||
27 | + AccessExpire: 360000 | ||
28 | + | ||
29 | + Redis: | ||
30 | + Host: 192.168.0.243:6379 | ||
31 | + Type: node | ||
32 | + Pass: | ||
33 | + DB: | ||
34 | + DataSource: host=114.55.200.59 user=postgres password=eagle1010 dbname=su_enterprise_platform port=31543 sslmode=disable TimeZone=Asia/Shanghai | ||
35 | + | ||
36 | +--- | ||
37 | +apiVersion: v1 | ||
38 | +kind: Service | ||
39 | +metadata: | ||
40 | + name: sumicro-chat | ||
41 | + namespace: mmm-suplus-test | ||
42 | + labels: | ||
43 | + k8s-app: sumicro-chat | ||
44 | +spec: | ||
45 | + ports: | ||
46 | + - name: "http" | ||
47 | + port: 80 | ||
48 | + targetPort: 8080 | ||
49 | + - name: "https" | ||
50 | + port: 443 | ||
51 | + targetPort: 443 | ||
52 | + selector: | ||
53 | + k8s-app: sumicro-chat | ||
54 | +--- | ||
55 | +apiVersion: extensions/v1beta1 | ||
56 | +kind: Deployment | ||
57 | +metadata: | ||
58 | + name: sumicro-chat | ||
59 | + namespace: mmm-suplus-test | ||
60 | + labels: | ||
61 | + k8s-app: sumicro-chat | ||
62 | +spec: | ||
63 | + replicas: 1 | ||
64 | + template: | ||
65 | + metadata: | ||
66 | + labels: | ||
67 | + k8s-app: sumicro-chat | ||
68 | + spec: | ||
69 | + affinity: | ||
70 | + nodeAffinity: | ||
71 | + preferredDuringSchedulingIgnoredDuringExecution: | ||
72 | + - preference: {} | ||
73 | + weight: 100 | ||
74 | + requiredDuringSchedulingIgnoredDuringExecution: | ||
75 | + nodeSelectorTerms: | ||
76 | + - matchExpressions: | ||
77 | + - key: kubernetes.io/hostname | ||
78 | + operator: In | ||
79 | + values: | ||
80 | + - cn-hangzhou.i-bp1djh1xn7taumbue1ze | ||
81 | + | ||
82 | + containers: | ||
83 | + - name: sumicro-chat | ||
84 | + image: 192.168.0.243:5000/mmm/sumicro-chat:dev | ||
85 | + imagePullPolicy: Always | ||
86 | + ports: | ||
87 | + - containerPort: 8080 | ||
88 | + - containerPort: 443 | ||
89 | + volumeMounts: | ||
90 | + - mountPath: /opt/logs | ||
91 | + name: accesslogs | ||
92 | + - mountPath: /app/etc | ||
93 | + name: config-volume | ||
94 | + env: | ||
95 | + - name: LOG_LEVEL | ||
96 | + value: "debug" | ||
97 | + - name: LOG_FILE | ||
98 | + value: "true" | ||
99 | + volumes: | ||
100 | + - name: accesslogs | ||
101 | + emptyDir: {} | ||
102 | + - name: config-volume | ||
103 | + configMap: | ||
104 | + name: sumicro-chat-config-prd |
cmd/ep/chat/doc/openai-proxy/README.md
0 → 100644
1 | +## 1、准备工作 | ||
2 | + | ||
3 | +在开始之前,我们需要准备一些东西: | ||
4 | +* Docker:这是一个用于容器化应用程序的开源平台。 | ||
5 | + | ||
6 | +## 2、准备Nginx配置文件 | ||
7 | +完整的配置文件见**nginx.conf**,其核心部分如下: | ||
8 | +```conf | ||
9 | +server { | ||
10 | + listen 80; # 监听80端口,用于HTTP请求 | ||
11 | + location / { | ||
12 | + proxy_pass https://api.openai.com/; # 反向代理到https://api.openai.com/这个地址 | ||
13 | + proxy_ssl_server_name on; # 开启代理SSL服务器名称验证,确保SSL连接的安全性 | ||
14 | + proxy_set_header Host api.openai.com; # 设置代理请求头中的Host字段为api.openai.com | ||
15 | + chunked_transfer_encoding off; # 禁用分块编码传输,避免可能的代理问题 | ||
16 | + proxy_buffering off; # 禁用代理缓存,避免数据传输延迟 | ||
17 | + proxy_cache off; # 禁用代理缓存,确保实时获取最新的数据 | ||
18 | + #proxy_set_header X-Forwarded-For $remote_addr; # 将客户端真实IP添加到代理请求头中的X-Forwarded-For字段中,用于记录客户端真实IP | ||
19 | + } | ||
20 | +} | ||
21 | +``` | ||
22 | + | ||
23 | +## 3、启动服务 | ||
24 | + | ||
25 | +### 3.1、docker run | ||
26 | +``` | ||
27 | +docker run -itd -p 80:80 -v $PWD/nginx.conf:/etc/nginx/nginx.conf --name my-nginx nginx | ||
28 | +``` | ||
29 | + | ||
30 | +### 3.2、docker compose up | ||
31 | +``` | ||
32 | +docker compose up -d | ||
33 | +``` | ||
34 | + | ||
35 | +## 4、应用 | ||
36 | +```python | ||
37 | +# Note: you need to be using OpenAI Python v0.27.0 for the code below to work | ||
38 | +import openai | ||
39 | +openai.api_key = api_key | ||
40 | +openai.api_base = "your_proxy_url" # 代理地址,如“http://www.test.com/v1” | ||
41 | +openai.ChatCompletion.create( | ||
42 | + model="gpt-3.5-turbo", | ||
43 | + messages=[ | ||
44 | + {"role": "system", "content": "You are a helpful assistant."}, | ||
45 | + {"role": "user", "content": "Who won the world series in 2020?"}, | ||
46 | + {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."}, | ||
47 | + {"role": "user", "content": "Where was it played?"} | ||
48 | + ] | ||
49 | +) | ||
50 | +``` |
cmd/ep/chat/doc/openai-proxy/nginx.conf
0 → 100644
1 | +user nginx; | ||
2 | +worker_processes auto; | ||
3 | + | ||
4 | +error_log /var/log/nginx/error.log notice; | ||
5 | +pid /var/run/nginx.pid; | ||
6 | + | ||
7 | + | ||
8 | +events { | ||
9 | + worker_connections 1024; | ||
10 | +} | ||
11 | + | ||
12 | + | ||
13 | +http { | ||
14 | + include /etc/nginx/mime.types; | ||
15 | + default_type application/octet-stream; | ||
16 | + | ||
17 | + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' | ||
18 | + '$status $body_bytes_sent "$http_referer" ' | ||
19 | + '"$http_user_agent" "$http_x_forwarded_for"'; | ||
20 | + | ||
21 | + access_log /var/log/nginx/access.log main; | ||
22 | + | ||
23 | + sendfile on; | ||
24 | + #tcp_nopush on; | ||
25 | + | ||
26 | + keepalive_timeout 65; | ||
27 | + | ||
28 | + #gzip on; | ||
29 | + | ||
30 | + # include /etc/nginx/conf.d/*.conf; | ||
31 | + | ||
32 | + server { | ||
33 | + listen 80; | ||
34 | + location / { | ||
35 | + proxy_pass https://api.openai.com/; | ||
36 | + proxy_ssl_server_name on; | ||
37 | + proxy_set_header Host api.openai.com; | ||
38 | + chunked_transfer_encoding off; | ||
39 | + proxy_buffering off; | ||
40 | + proxy_cache off; | ||
41 | + proxy_set_header X-Forwarded-For $remote_addr; | ||
42 | + } | ||
43 | + } | ||
44 | +} |
cmd/ep/chat/dsl/core.api
0 → 100644
cmd/ep/chat/dsl/core/model.api
0 → 100644
cmd/ep/chat/dsl/core/session.api
0 → 100644
1 | +syntax = "v1" | ||
2 | + | ||
3 | +// 后台接口 | ||
4 | +@server( | ||
5 | + prefix: v1 | ||
6 | + group: chat | ||
7 | + middleware: LogRequest | ||
8 | + jwt: SystemAuth | ||
9 | +) | ||
10 | +service Core { | ||
11 | + @doc "聊天会话-详情" | ||
12 | + @handler chatSessionGet | ||
13 | + get /chat/session/:id (ChatSessionGetRequest) returns (ChatSessionGetResponse) | ||
14 | + @doc "聊天会话-保存" | ||
15 | + @handler chatSessionSave | ||
16 | + post /chat/session (ChatSessionSaveRequest) returns (ChatSessionSaveResponse) | ||
17 | + @doc "聊天会话-删除" | ||
18 | + @handler chatSessionDelete | ||
19 | + delete /chat/session/:id (ChatSessionDeleteRequest) returns (ChatSessionDeleteResponse) | ||
20 | + @doc "聊天会话-更新" | ||
21 | + @handler chatSessionUpdate | ||
22 | + put /chat/session/:id (ChatSessionUpdateRequest) returns (ChatSessionUpdateResponse) | ||
23 | + @doc "聊天会话-搜索" | ||
24 | + @handler chatSessionSearch | ||
25 | + post /chat/session/search (ChatSessionSearchRequest) returns (ChatSessionSearchResponse) | ||
26 | + @doc "聊天会话-对话" | ||
27 | + @handler chatSessionConversation | ||
28 | + post /chat/session/conversation (ChatSessionConversationRequest) returns (ChatSessionConversationResponse) | ||
29 | + @doc "聊天会话-对话" | ||
30 | + @handler chatSessionConversationWs | ||
31 | + get /chat/session/conversation (ChatSessionConversationRequestWs) returns (ChatSessionConversationResponse) | ||
32 | + | ||
33 | + @doc "聊天会话-对话记录列表" | ||
34 | + @handler chatSessionRecords | ||
35 | + post /chat/session/records (ChatSessionRecordsRequest) returns (ChatSessionRecordsResponse) | ||
36 | + | ||
37 | + @doc "模型列表" | ||
38 | + @handler chatModels | ||
39 | + get /chat/models (ChatModelsRequest) returns (ChatModelsResponse) | ||
40 | +} | ||
41 | + | ||
42 | +type ( | ||
43 | + ChatSessionGetRequest { | ||
44 | + Id int64 `path:"id"` | ||
45 | + } | ||
46 | + ChatSessionGetResponse { | ||
47 | + ChatSession ChatSessionItem `json:"session"` | ||
48 | + Records []Record `json:"records"` | ||
49 | + } | ||
50 | + | ||
51 | + ChatSessionSaveRequest { | ||
52 | + ChatSession ChatSessionItem `json:"session"` | ||
53 | + } | ||
54 | + ChatSessionSaveResponse {} | ||
55 | + | ||
56 | + ChatSessionDeleteRequest { | ||
57 | + Id int64 `path:"id"` | ||
58 | + } | ||
59 | + ChatSessionDeleteResponse {} | ||
60 | + | ||
61 | + ChatSessionUpdateRequest { | ||
62 | + Id int64 `path:"id"` | ||
63 | + ChatSession ChatSessionItem `json:"session"` | ||
64 | + } | ||
65 | + ChatSessionUpdateResponse {} | ||
66 | + | ||
67 | + ChatSessionSearchRequest { | ||
68 | + Page int `json:"page,optional"` | ||
69 | + Size int `json:"size,optional"` | ||
70 | + Title string `json:"title,optional"` // 按标题搜索 | ||
71 | + } | ||
72 | + ChatSessionSearchResponse{ | ||
73 | + List []ChatSessionItem `json:"list"` | ||
74 | + Total int64 `json:"total"` | ||
75 | + } | ||
76 | + ChatSessionItem { | ||
77 | + Id int64 `json:"id,optional,omitempty"` // 唯一标识 | ||
78 | + Title string `json:"title,optional,omitempty"` // 会话标题 | ||
79 | + Abstract string `json:"abstract,optional,omitempty"` // 摘要 | ||
80 | + CreatedAt int64 `json:"createdAt,optional,omitempty"` // 创建时间 | ||
81 | + } | ||
82 | +) | ||
83 | + | ||
84 | +// 模型列表 | ||
85 | +type( | ||
86 | + ChatModelsRequest{ | ||
87 | + | ||
88 | + } | ||
89 | + ChatModelsResponse{ | ||
90 | + List []Model `json:"list"` | ||
91 | + } | ||
92 | + Model{ | ||
93 | + Id int64 `json:"id"` // 模型ID | ||
94 | + Name string `json:"name"` // 模型名称 | ||
95 | + Code string `json:"code"` // 模型编码 | ||
96 | + Logo string `json:"logo"` // 模型LOGO地址 | ||
97 | + } | ||
98 | +) | ||
99 | + | ||
100 | +// 聊天会话-记录列表 | ||
101 | +type( | ||
102 | + ChatSessionRecordsRequest{ | ||
103 | + Page int `json:"page,optional"` | ||
104 | + Size int `json:"size,optional"` | ||
105 | + SessionId int64 `json:"sessionId"` | ||
106 | + } | ||
107 | + ChatSessionRecordsResponse{ | ||
108 | + Records []Record `json:"list"` | ||
109 | + Total int64 `json:"total"` | ||
110 | + } | ||
111 | +) | ||
112 | + | ||
113 | +// 聊天会话-对话 | ||
114 | +type( | ||
115 | + ChatSessionConversationRequest{ | ||
116 | + SessionId int64 `json:"sessionId"` // 会话ID | ||
117 | + ModelId int64 `json:"modelId"` // 模型ID | ||
118 | + ContentType string `json:"contentType"` // 内容类型 文本:text (图片:image 文档:document) | ||
119 | + Text string `json:"text"` // 内容文本 | ||
120 | + FileUrl string `json:"fileUrl,optional"` // 文件地址 | ||
121 | + } | ||
122 | + ChatSessionConversationResponse{ | ||
123 | + Record *Record `json:"record,omitempty"` | ||
124 | + Parts []string `json:"parts"` | ||
125 | + Finished bool `json:"finished"` | ||
126 | + } | ||
127 | + ChatSessionConversationRequestWs{ | ||
128 | + SessionId int64 `form:"sessionId"` // 会话ID | ||
129 | + ModelId int64 `form:"modelId"` // 模型ID | ||
130 | + ContentType string `form:"contentType"` // 内容类型 文本:text (图片:image 文档:document) | ||
131 | + Text string `form:"text"` // 内容文本 | ||
132 | + } | ||
133 | + Record{ | ||
134 | + Id int64 `json:"id"` // 记录ID | ||
135 | + SessionId int64 `json:"sessionId"` // 会话ID | ||
136 | + GroupId int64 `json:"groupId"` // 分组ID | ||
137 | + ModelId int64 `json:"modelId,omitempty"` // 模型ID | ||
138 | + AuthorId int64 `json:"authorId,omitempty"` // 作者ID | ||
139 | + Author *User `json:"author,omitempty"` // 提问人 | ||
140 | + Model *Model `json:"model,omitempty"` // 应答人 | ||
141 | + ContentType string `json:"contentType"` // 内容类型 文本:text (图片:image 文档:document) | ||
142 | + ProblemText string `json:"problemText"` // 问题文本 | ||
143 | + AnswerText string `json:"answerText"` // 回答文本 | ||
144 | + Status string `json:"status"` // 状态 处理中:processing 超时:finished_timeout 结束成功:finished_fail 结束失败:finished_success | ||
145 | + CreateAt int64 `json:"createAt"` // 创建时间 | ||
146 | + } | ||
147 | + Content{ | ||
148 | + ContentType string `json:"contentType"` // 内容类型 文本:text (图片:image 文档:document) | ||
149 | + Parts []string `json:"parts"` // 内容 | ||
150 | + } | ||
151 | + User { | ||
152 | + Id int64 `json:"id"` // 用ID | ||
153 | + Name string `json:"name"` // 名称 | ||
154 | + Avatar string `json:"avatar"` // 头像 | ||
155 | + } | ||
156 | +) |
cmd/ep/chat/dsl/core/session_records.api
0 → 100644
cmd/ep/chat/generate/core.json
0 → 100644
1 | +{ | ||
2 | + "swagger": "2.0", | ||
3 | + "info": { | ||
4 | + "title": "", | ||
5 | + "version": "" | ||
6 | + }, | ||
7 | + "schemes": [ | ||
8 | + "http", | ||
9 | + "https" | ||
10 | + ], | ||
11 | + "consumes": [ | ||
12 | + "application/json" | ||
13 | + ], | ||
14 | + "produces": [ | ||
15 | + "application/json" | ||
16 | + ], | ||
17 | + "paths": { | ||
18 | + "v1/chat/models": { | ||
19 | + "get": { | ||
20 | + "summary": "模型列表", | ||
21 | + "operationId": "chatModels", | ||
22 | + "responses": { | ||
23 | + "200": { | ||
24 | + "description": "A successful response.", | ||
25 | + "schema": { | ||
26 | + "$ref": "#/definitions/ChatModelsResponse" | ||
27 | + } | ||
28 | + } | ||
29 | + }, | ||
30 | + "requestBody": {}, | ||
31 | + "tags": [ | ||
32 | + "chat" | ||
33 | + ] | ||
34 | + } | ||
35 | + }, | ||
36 | + "v1/chat/session": { | ||
37 | + "post": { | ||
38 | + "summary": "聊天会话-保存", | ||
39 | + "operationId": "chatSessionSave", | ||
40 | + "responses": { | ||
41 | + "200": { | ||
42 | + "description": "A successful response.", | ||
43 | + "schema": { | ||
44 | + "$ref": "#/definitions/ChatSessionSaveResponse" | ||
45 | + } | ||
46 | + } | ||
47 | + }, | ||
48 | + "parameters": [ | ||
49 | + { | ||
50 | + "name": "body", | ||
51 | + "in": "body", | ||
52 | + "required": true, | ||
53 | + "schema": { | ||
54 | + "$ref": "#/definitions/ChatSessionSaveRequest" | ||
55 | + } | ||
56 | + } | ||
57 | + ], | ||
58 | + "requestBody": {}, | ||
59 | + "tags": [ | ||
60 | + "chat" | ||
61 | + ] | ||
62 | + } | ||
63 | + }, | ||
64 | + "v1/chat/session/conversation": { | ||
65 | + "get": { | ||
66 | + "summary": "聊天会话-对话", | ||
67 | + "operationId": "chatSessionConversation", | ||
68 | + "responses": { | ||
69 | + "200": { | ||
70 | + "description": "A successful response.", | ||
71 | + "schema": { | ||
72 | + "$ref": "#/definitions/ChatSessionConversationResponse" | ||
73 | + } | ||
74 | + } | ||
75 | + }, | ||
76 | + "parameters": [ | ||
77 | + { | ||
78 | + "name": "sessionId", | ||
79 | + "description": " 会话ID", | ||
80 | + "in": "query", | ||
81 | + "required": true, | ||
82 | + "type": "integer", | ||
83 | + "format": "int64" | ||
84 | + }, | ||
85 | + { | ||
86 | + "name": "modelId", | ||
87 | + "description": " 模型ID", | ||
88 | + "in": "query", | ||
89 | + "required": true, | ||
90 | + "type": "integer", | ||
91 | + "format": "int64" | ||
92 | + }, | ||
93 | + { | ||
94 | + "name": "contentType", | ||
95 | + "description": " 内容类型 文本:text (图片:image 文档:document)", | ||
96 | + "in": "query", | ||
97 | + "required": true, | ||
98 | + "type": "string" | ||
99 | + }, | ||
100 | + { | ||
101 | + "name": "text", | ||
102 | + "description": " 内容文本", | ||
103 | + "in": "query", | ||
104 | + "required": true, | ||
105 | + "type": "string" | ||
106 | + }, | ||
107 | + { | ||
108 | + "name": "fileUrl", | ||
109 | + "description": " 文件地址", | ||
110 | + "in": "query", | ||
111 | + "required": true, | ||
112 | + "type": "string" | ||
113 | + } | ||
114 | + ], | ||
115 | + "requestBody": {}, | ||
116 | + "tags": [ | ||
117 | + "chat" | ||
118 | + ] | ||
119 | + } | ||
120 | + }, | ||
121 | + "v1/chat/session/records": { | ||
122 | + "get": { | ||
123 | + "summary": "聊天会话-对话记录列表", | ||
124 | + "operationId": "chatSessionRecords", | ||
125 | + "responses": { | ||
126 | + "200": { | ||
127 | + "description": "A successful response.", | ||
128 | + "schema": { | ||
129 | + "$ref": "#/definitions/ChatSessionRecordsResponse" | ||
130 | + } | ||
131 | + } | ||
132 | + }, | ||
133 | + "parameters": [ | ||
134 | + { | ||
135 | + "name": "page", | ||
136 | + "in": "query", | ||
137 | + "required": false, | ||
138 | + "type": "integer", | ||
139 | + "format": "int32" | ||
140 | + }, | ||
141 | + { | ||
142 | + "name": "size", | ||
143 | + "in": "query", | ||
144 | + "required": false, | ||
145 | + "type": "integer", | ||
146 | + "format": "int32" | ||
147 | + }, | ||
148 | + { | ||
149 | + "name": "sessionId", | ||
150 | + "in": "query", | ||
151 | + "required": true, | ||
152 | + "type": "integer", | ||
153 | + "format": "int64" | ||
154 | + } | ||
155 | + ], | ||
156 | + "requestBody": {}, | ||
157 | + "tags": [ | ||
158 | + "chat" | ||
159 | + ] | ||
160 | + } | ||
161 | + }, | ||
162 | + "v1/chat/session/search": { | ||
163 | + "post": { | ||
164 | + "summary": "聊天会话-搜索", | ||
165 | + "operationId": "chatSessionSearch", | ||
166 | + "responses": { | ||
167 | + "200": { | ||
168 | + "description": "A successful response.", | ||
169 | + "schema": { | ||
170 | + "$ref": "#/definitions/ChatSessionSearchResponse" | ||
171 | + } | ||
172 | + } | ||
173 | + }, | ||
174 | + "parameters": [ | ||
175 | + { | ||
176 | + "name": "body", | ||
177 | + "in": "body", | ||
178 | + "required": true, | ||
179 | + "schema": { | ||
180 | + "$ref": "#/definitions/ChatSessionSearchRequest" | ||
181 | + } | ||
182 | + } | ||
183 | + ], | ||
184 | + "requestBody": {}, | ||
185 | + "tags": [ | ||
186 | + "chat" | ||
187 | + ] | ||
188 | + } | ||
189 | + }, | ||
190 | + "v1/chat/session/{id}": { | ||
191 | + "get": { | ||
192 | + "summary": "聊天会话-详情", | ||
193 | + "operationId": "chatSessionGet", | ||
194 | + "responses": { | ||
195 | + "200": { | ||
196 | + "description": "A successful response.", | ||
197 | + "schema": { | ||
198 | + "$ref": "#/definitions/ChatSessionGetResponse" | ||
199 | + } | ||
200 | + } | ||
201 | + }, | ||
202 | + "parameters": [ | ||
203 | + { | ||
204 | + "name": "id", | ||
205 | + "in": "path", | ||
206 | + "required": true, | ||
207 | + "type": "string" | ||
208 | + } | ||
209 | + ], | ||
210 | + "requestBody": {}, | ||
211 | + "tags": [ | ||
212 | + "chat" | ||
213 | + ] | ||
214 | + }, | ||
215 | + "delete": { | ||
216 | + "summary": "聊天会话-删除", | ||
217 | + "operationId": "chatSessionDelete", | ||
218 | + "responses": { | ||
219 | + "200": { | ||
220 | + "description": "A successful response.", | ||
221 | + "schema": { | ||
222 | + "$ref": "#/definitions/ChatSessionDeleteResponse" | ||
223 | + } | ||
224 | + } | ||
225 | + }, | ||
226 | + "parameters": [ | ||
227 | + { | ||
228 | + "name": "id", | ||
229 | + "in": "path", | ||
230 | + "required": true, | ||
231 | + "type": "string" | ||
232 | + }, | ||
233 | + { | ||
234 | + "name": "body", | ||
235 | + "in": "body", | ||
236 | + "required": true, | ||
237 | + "schema": { | ||
238 | + "$ref": "#/definitions/ChatSessionDeleteRequest" | ||
239 | + } | ||
240 | + } | ||
241 | + ], | ||
242 | + "requestBody": {}, | ||
243 | + "tags": [ | ||
244 | + "chat" | ||
245 | + ] | ||
246 | + }, | ||
247 | + "put": { | ||
248 | + "summary": "聊天会话-更新", | ||
249 | + "operationId": "chatSessionUpdate", | ||
250 | + "responses": { | ||
251 | + "200": { | ||
252 | + "description": "A successful response.", | ||
253 | + "schema": { | ||
254 | + "$ref": "#/definitions/ChatSessionUpdateResponse" | ||
255 | + } | ||
256 | + } | ||
257 | + }, | ||
258 | + "parameters": [ | ||
259 | + { | ||
260 | + "name": "id", | ||
261 | + "in": "path", | ||
262 | + "required": true, | ||
263 | + "type": "string" | ||
264 | + }, | ||
265 | + { | ||
266 | + "name": "body", | ||
267 | + "in": "body", | ||
268 | + "required": true, | ||
269 | + "schema": { | ||
270 | + "$ref": "#/definitions/ChatSessionUpdateRequest" | ||
271 | + } | ||
272 | + } | ||
273 | + ], | ||
274 | + "requestBody": {}, | ||
275 | + "tags": [ | ||
276 | + "chat" | ||
277 | + ] | ||
278 | + } | ||
279 | + } | ||
280 | + }, | ||
281 | + "definitions": { | ||
282 | + "ChatModelsRequest": { | ||
283 | + "type": "object", | ||
284 | + "title": "ChatModelsRequest" | ||
285 | + }, | ||
286 | + "ChatModelsResponse": { | ||
287 | + "type": "object", | ||
288 | + "properties": { | ||
289 | + "list": { | ||
290 | + "type": "array", | ||
291 | + "items": { | ||
292 | + "$ref": "#/definitions/Model" | ||
293 | + } | ||
294 | + } | ||
295 | + }, | ||
296 | + "title": "ChatModelsResponse", | ||
297 | + "required": [ | ||
298 | + "list" | ||
299 | + ] | ||
300 | + }, | ||
301 | + "ChatSessionConversationRequest": { | ||
302 | + "type": "object", | ||
303 | + "properties": { | ||
304 | + "sessionId": { | ||
305 | + "type": "integer", | ||
306 | + "format": "int64", | ||
307 | + "description": " 会话ID" | ||
308 | + }, | ||
309 | + "modelId": { | ||
310 | + "type": "integer", | ||
311 | + "format": "int64", | ||
312 | + "description": " 模型ID" | ||
313 | + }, | ||
314 | + "contentType": { | ||
315 | + "type": "string", | ||
316 | + "description": " 内容类型 文本:text (图片:image 文档:document)" | ||
317 | + }, | ||
318 | + "text": { | ||
319 | + "type": "string", | ||
320 | + "description": " 内容文本" | ||
321 | + }, | ||
322 | + "fileUrl": { | ||
323 | + "type": "string", | ||
324 | + "description": " 文件地址" | ||
325 | + } | ||
326 | + }, | ||
327 | + "title": "ChatSessionConversationRequest", | ||
328 | + "required": [ | ||
329 | + "sessionId", | ||
330 | + "modelId", | ||
331 | + "contentType", | ||
332 | + "text", | ||
333 | + "fileUrl" | ||
334 | + ] | ||
335 | + }, | ||
336 | + "ChatSessionConversationResponse": { | ||
337 | + "type": "object", | ||
338 | + "title": "ChatSessionConversationResponse" | ||
339 | + }, | ||
340 | + "ChatSessionDeleteRequest": { | ||
341 | + "type": "object", | ||
342 | + "properties": { | ||
343 | + "id": { | ||
344 | + "type": "integer", | ||
345 | + "format": "int64" | ||
346 | + } | ||
347 | + }, | ||
348 | + "title": "ChatSessionDeleteRequest", | ||
349 | + "required": [ | ||
350 | + "id" | ||
351 | + ] | ||
352 | + }, | ||
353 | + "ChatSessionDeleteResponse": { | ||
354 | + "type": "object", | ||
355 | + "title": "ChatSessionDeleteResponse" | ||
356 | + }, | ||
357 | + "ChatSessionGetRequest": { | ||
358 | + "type": "object", | ||
359 | + "properties": { | ||
360 | + "id": { | ||
361 | + "type": "integer", | ||
362 | + "format": "int64" | ||
363 | + } | ||
364 | + }, | ||
365 | + "title": "ChatSessionGetRequest", | ||
366 | + "required": [ | ||
367 | + "id" | ||
368 | + ] | ||
369 | + }, | ||
370 | + "ChatSessionGetResponse": { | ||
371 | + "type": "object", | ||
372 | + "properties": { | ||
373 | + "session": { | ||
374 | + "$ref": "#/definitions/ChatSessionItem" | ||
375 | + }, | ||
376 | + "records": { | ||
377 | + "type": "array", | ||
378 | + "items": { | ||
379 | + "$ref": "#/definitions/Record" | ||
380 | + } | ||
381 | + } | ||
382 | + }, | ||
383 | + "title": "ChatSessionGetResponse", | ||
384 | + "required": [ | ||
385 | + "session", | ||
386 | + "records" | ||
387 | + ] | ||
388 | + }, | ||
389 | + "ChatSessionItem": { | ||
390 | + "type": "object", | ||
391 | + "properties": { | ||
392 | + "id": { | ||
393 | + "type": "integer", | ||
394 | + "format": "int64", | ||
395 | + "description": " 唯一标识" | ||
396 | + }, | ||
397 | + "title": { | ||
398 | + "type": "string", | ||
399 | + "description": " 会话标题" | ||
400 | + }, | ||
401 | + "abstract": { | ||
402 | + "type": "string", | ||
403 | + "description": " 摘要" | ||
404 | + }, | ||
405 | + "createdAt": { | ||
406 | + "type": "integer", | ||
407 | + "format": "int64", | ||
408 | + "description": " 创建时间" | ||
409 | + } | ||
410 | + }, | ||
411 | + "title": "ChatSessionItem", | ||
412 | + "required": [ | ||
413 | + "id", | ||
414 | + "title", | ||
415 | + "abstract", | ||
416 | + "createdAt" | ||
417 | + ] | ||
418 | + }, | ||
419 | + "ChatSessionRecordsRequest": { | ||
420 | + "type": "object", | ||
421 | + "properties": { | ||
422 | + "page": { | ||
423 | + "type": "integer", | ||
424 | + "format": "int32" | ||
425 | + }, | ||
426 | + "size": { | ||
427 | + "type": "integer", | ||
428 | + "format": "int32" | ||
429 | + }, | ||
430 | + "sessionId": { | ||
431 | + "type": "integer", | ||
432 | + "format": "int64" | ||
433 | + } | ||
434 | + }, | ||
435 | + "title": "ChatSessionRecordsRequest", | ||
436 | + "required": [ | ||
437 | + "sessionId" | ||
438 | + ] | ||
439 | + }, | ||
440 | + "ChatSessionRecordsResponse": { | ||
441 | + "type": "object", | ||
442 | + "properties": { | ||
443 | + "list": { | ||
444 | + "type": "array", | ||
445 | + "items": { | ||
446 | + "$ref": "#/definitions/Record" | ||
447 | + } | ||
448 | + }, | ||
449 | + "total": { | ||
450 | + "type": "integer", | ||
451 | + "format": "int64" | ||
452 | + } | ||
453 | + }, | ||
454 | + "title": "ChatSessionRecordsResponse", | ||
455 | + "required": [ | ||
456 | + "list", | ||
457 | + "total" | ||
458 | + ] | ||
459 | + }, | ||
460 | + "ChatSessionSaveRequest": { | ||
461 | + "type": "object", | ||
462 | + "properties": { | ||
463 | + "session": { | ||
464 | + "$ref": "#/definitions/ChatSessionItem" | ||
465 | + } | ||
466 | + }, | ||
467 | + "title": "ChatSessionSaveRequest", | ||
468 | + "required": [ | ||
469 | + "session" | ||
470 | + ] | ||
471 | + }, | ||
472 | + "ChatSessionSaveResponse": { | ||
473 | + "type": "object", | ||
474 | + "title": "ChatSessionSaveResponse" | ||
475 | + }, | ||
476 | + "ChatSessionSearchRequest": { | ||
477 | + "type": "object", | ||
478 | + "properties": { | ||
479 | + "page": { | ||
480 | + "type": "integer", | ||
481 | + "format": "int32" | ||
482 | + }, | ||
483 | + "size": { | ||
484 | + "type": "integer", | ||
485 | + "format": "int32" | ||
486 | + }, | ||
487 | + "title": { | ||
488 | + "type": "string", | ||
489 | + "description": " 按标题搜索" | ||
490 | + } | ||
491 | + }, | ||
492 | + "title": "ChatSessionSearchRequest" | ||
493 | + }, | ||
494 | + "ChatSessionSearchResponse": { | ||
495 | + "type": "object", | ||
496 | + "properties": { | ||
497 | + "list": { | ||
498 | + "type": "array", | ||
499 | + "items": { | ||
500 | + "$ref": "#/definitions/ChatSessionItem" | ||
501 | + } | ||
502 | + }, | ||
503 | + "total": { | ||
504 | + "type": "integer", | ||
505 | + "format": "int64" | ||
506 | + } | ||
507 | + }, | ||
508 | + "title": "ChatSessionSearchResponse", | ||
509 | + "required": [ | ||
510 | + "list", | ||
511 | + "total" | ||
512 | + ] | ||
513 | + }, | ||
514 | + "ChatSessionUpdateRequest": { | ||
515 | + "type": "object", | ||
516 | + "properties": { | ||
517 | + "id": { | ||
518 | + "type": "integer", | ||
519 | + "format": "int64" | ||
520 | + }, | ||
521 | + "session": { | ||
522 | + "$ref": "#/definitions/ChatSessionItem" | ||
523 | + } | ||
524 | + }, | ||
525 | + "title": "ChatSessionUpdateRequest", | ||
526 | + "required": [ | ||
527 | + "id", | ||
528 | + "session" | ||
529 | + ] | ||
530 | + }, | ||
531 | + "ChatSessionUpdateResponse": { | ||
532 | + "type": "object", | ||
533 | + "title": "ChatSessionUpdateResponse" | ||
534 | + }, | ||
535 | + "Content": { | ||
536 | + "type": "object", | ||
537 | + "properties": { | ||
538 | + "contentType": { | ||
539 | + "type": "string", | ||
540 | + "description": " 内容类型 文本:text (图片:image 文档:document)" | ||
541 | + }, | ||
542 | + "parts": { | ||
543 | + "type": "array", | ||
544 | + "items": { | ||
545 | + "type": "string" | ||
546 | + }, | ||
547 | + "description": " 内容" | ||
548 | + } | ||
549 | + }, | ||
550 | + "title": "Content", | ||
551 | + "required": [ | ||
552 | + "contentType", | ||
553 | + "parts" | ||
554 | + ] | ||
555 | + }, | ||
556 | + "Model": { | ||
557 | + "type": "object", | ||
558 | + "properties": { | ||
559 | + "id": { | ||
560 | + "type": "integer", | ||
561 | + "format": "int64", | ||
562 | + "description": " 模型ID" | ||
563 | + }, | ||
564 | + "name": { | ||
565 | + "type": "string", | ||
566 | + "description": " 模型名称" | ||
567 | + }, | ||
568 | + "code": { | ||
569 | + "type": "string", | ||
570 | + "description": " 模型编码" | ||
571 | + }, | ||
572 | + "logo": { | ||
573 | + "type": "string", | ||
574 | + "description": " 模型LOGO地址" | ||
575 | + } | ||
576 | + }, | ||
577 | + "title": "Model", | ||
578 | + "required": [ | ||
579 | + "id", | ||
580 | + "name", | ||
581 | + "code", | ||
582 | + "logo" | ||
583 | + ] | ||
584 | + }, | ||
585 | + "Record": { | ||
586 | + "type": "object", | ||
587 | + "properties": { | ||
588 | + "id": { | ||
589 | + "type": "integer", | ||
590 | + "format": "int64", | ||
591 | + "description": " 记录ID" | ||
592 | + }, | ||
593 | + "sessionId": { | ||
594 | + "type": "integer", | ||
595 | + "format": "int64", | ||
596 | + "description": " 会话ID" | ||
597 | + }, | ||
598 | + "groupId": { | ||
599 | + "type": "integer", | ||
600 | + "format": "int64", | ||
601 | + "description": " 分组ID" | ||
602 | + }, | ||
603 | + "modelId": { | ||
604 | + "type": "integer", | ||
605 | + "format": "int64", | ||
606 | + "description": " 模型ID" | ||
607 | + }, | ||
608 | + "authorId": { | ||
609 | + "type": "integer", | ||
610 | + "format": "int64", | ||
611 | + "description": " 作者ID" | ||
612 | + }, | ||
613 | + "author": { | ||
614 | + "$ref": "#/definitions/User", | ||
615 | + "description": " 提问人" | ||
616 | + }, | ||
617 | + "model": { | ||
618 | + "$ref": "#/definitions/Model", | ||
619 | + "description": " 应答人" | ||
620 | + }, | ||
621 | + "contentType": { | ||
622 | + "type": "string", | ||
623 | + "description": " 内容类型 文本:text (图片:image 文档:document)" | ||
624 | + }, | ||
625 | + "problemText": { | ||
626 | + "type": "string", | ||
627 | + "description": " 问题文本" | ||
628 | + }, | ||
629 | + "answerText": { | ||
630 | + "type": "string", | ||
631 | + "description": " 回答文本" | ||
632 | + }, | ||
633 | + "status": { | ||
634 | + "type": "string", | ||
635 | + "description": " 状态 处理中:processing 超时:finished_timeout 结束成功:finished_fail 结束失败:finished_success" | ||
636 | + }, | ||
637 | + "createAt": { | ||
638 | + "type": "integer", | ||
639 | + "format": "int64", | ||
640 | + "description": " 创建时间" | ||
641 | + } | ||
642 | + }, | ||
643 | + "title": "Record", | ||
644 | + "required": [ | ||
645 | + "id", | ||
646 | + "sessionId", | ||
647 | + "groupId", | ||
648 | + "modelId", | ||
649 | + "authorId", | ||
650 | + "author", | ||
651 | + "model", | ||
652 | + "contentType", | ||
653 | + "problemText", | ||
654 | + "answerText", | ||
655 | + "status", | ||
656 | + "createAt" | ||
657 | + ] | ||
658 | + }, | ||
659 | + "User": { | ||
660 | + "type": "object", | ||
661 | + "properties": { | ||
662 | + "id": { | ||
663 | + "type": "integer", | ||
664 | + "format": "int64", | ||
665 | + "description": " 用ID" | ||
666 | + }, | ||
667 | + "name": { | ||
668 | + "type": "string", | ||
669 | + "description": " 名称" | ||
670 | + }, | ||
671 | + "avatar": { | ||
672 | + "type": "string", | ||
673 | + "description": " 头像" | ||
674 | + } | ||
675 | + }, | ||
676 | + "title": "User", | ||
677 | + "required": [ | ||
678 | + "id", | ||
679 | + "name", | ||
680 | + "avatar" | ||
681 | + ] | ||
682 | + } | ||
683 | + }, | ||
684 | + "securityDefinitions": { | ||
685 | + "apiKey": { | ||
686 | + "type": "apiKey", | ||
687 | + "description": "Enter JWT Bearer token **_only_**", | ||
688 | + "name": "Authorization", | ||
689 | + "in": "header" | ||
690 | + } | ||
691 | + }, | ||
692 | + "security": [ | ||
693 | + { | ||
694 | + "apiKey": [] | ||
695 | + } | ||
696 | + ] | ||
697 | +} |
cmd/ep/chat/generate/dsl/api/chat_model.api
0 → 100644
1 | + | ||
2 | +syntax = "v1" | ||
3 | + | ||
4 | +info( | ||
5 | + title: "xx实例" | ||
6 | + desc: "xx实例" | ||
7 | + author: "author" | ||
8 | + email: "email" | ||
9 | + version: "v1" | ||
10 | +) | ||
11 | + | ||
12 | +@server( | ||
13 | + prefix: v1 | ||
14 | + group: chat_model | ||
15 | + jwt: JwtAuth | ||
16 | +) | ||
17 | +service Core { | ||
18 | + @doc "详情" | ||
19 | + @handler chat_modelGet | ||
20 | + get /chat_model/:id (ChatModelGetRequest) returns (ChatModelGetResponse) | ||
21 | + @doc "保存" | ||
22 | + @handler chat_modelSave | ||
23 | + post /chat_model (ChatModelSaveRequest) returns (ChatModelSaveResponse) | ||
24 | + @doc "删除" | ||
25 | + @handler chat_modelDelete | ||
26 | + delete /chat_model/:id (ChatModelDeleteRequest) returns (ChatModelDeleteResponse) | ||
27 | + @doc "更新" | ||
28 | + @handler chat_modelUpdate | ||
29 | + put /chat_model/:id (ChatModelUpdateRequest) returns (ChatModelUpdateResponse) | ||
30 | + @doc "搜索" | ||
31 | + @handler chat_modelSearch | ||
32 | + post /chat_model/search (ChatModelSearchRequest) returns (ChatModelSearchResponse) | ||
33 | +} | ||
34 | + | ||
35 | +type ( | ||
36 | + ChatModelGetRequest { | ||
37 | + Id int64 `path:"id"` | ||
38 | + } | ||
39 | + ChatModelGetResponse { | ||
40 | + ChatModel ChatModelItem `json:"chat_model"` | ||
41 | + } | ||
42 | + | ||
43 | + ChatModelSaveRequest { | ||
44 | + ChatModel ChatModelItem `json:"chat_model"` | ||
45 | + } | ||
46 | + ChatModelSaveResponse {} | ||
47 | + | ||
48 | + ChatModelDeleteRequest { | ||
49 | + Id int64 `path:"id"` | ||
50 | + } | ||
51 | + ChatModelDeleteResponse {} | ||
52 | + | ||
53 | + ChatModelUpdateRequest { | ||
54 | + Id int64 `path:"id"` | ||
55 | + ChatModel ChatModelItem `json:"chat_model"` | ||
56 | + } | ||
57 | + ChatModelUpdateResponse {} | ||
58 | + | ||
59 | + ChatModelSearchRequest { | ||
60 | + Page int `json:"page"` | ||
61 | + Size int `json:"size"` | ||
62 | + } | ||
63 | + ChatModelSearchResponse{ | ||
64 | + List []ChatModelItem `json:"list"` | ||
65 | + Total int64 `json:"total"` | ||
66 | + } | ||
67 | + ChatModelItem { | ||
68 | + | ||
69 | + } | ||
70 | +) | ||
71 | + | ||
72 | +// logic CRUD | ||
73 | +// Save | ||
74 | + //var ( | ||
75 | + // conn = l.svcCtx.DefaultDBConn() | ||
76 | + // dm *domain.ChatModel | ||
77 | + //) | ||
78 | + //// 唯一判断 | ||
79 | + | ||
80 | + //dm = NewDomainChatModel(req.ChatModel) | ||
81 | + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
82 | + // dm, err = l.svcCtx.ChatModelRepository.Insert(l.ctx, conn, dm) | ||
83 | + // return err | ||
84 | + //}, true); err != nil { | ||
85 | + // return nil, xerr.NewErrMsg("保存失败") | ||
86 | + //} | ||
87 | + ////resp = &types.ChatModelSaveResponse{} | ||
88 | + //return | ||
89 | + | ||
90 | +//func NewDomainChatModel(item types.ChatModelItem) *domain.ChatModel { | ||
91 | +// return &domain.ChatModel{ | ||
92 | + | ||
93 | +// } | ||
94 | +//} | ||
95 | +// | ||
96 | +//func NewTypesChatModel(item *domain.ChatModel) types.ChatModelItem { | ||
97 | +// return types.ChatModelItem{ | ||
98 | +// Id: item.Id, | ||
99 | +// } | ||
100 | +//} | ||
101 | + | ||
102 | +// Get | ||
103 | + //var ( | ||
104 | + // conn = l.svcCtx.DefaultDBConn() | ||
105 | + // dm *domain.ChatModel | ||
106 | + //) | ||
107 | + //// 货号唯一 | ||
108 | + //if dm, err = l.svcCtx.ChatModelRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
109 | + // return nil, xerr.NewErrMsgErr("不存在", err) | ||
110 | + //} | ||
111 | + //resp = &types.ChatModelGetResponse{ | ||
112 | + // ChatModel: NewTypesChatModel(dm), | ||
113 | + //} | ||
114 | + //return | ||
115 | + | ||
116 | +// Delete | ||
117 | + //var ( | ||
118 | + // conn = l.svcCtx.DefaultDBConn() | ||
119 | + // dm *domain.ChatModel | ||
120 | + //) | ||
121 | + //if dm, err = l.svcCtx.ChatModelRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
122 | + // return nil, xerr.NewErrMsgErr("不存在", err) | ||
123 | + //} | ||
124 | + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
125 | + // if dm, err = l.svcCtx.ChatModelRepository.Delete(l.ctx, conn, dm); err != nil { | ||
126 | + // return err | ||
127 | + // } | ||
128 | + // return nil | ||
129 | + //}, true); err != nil { | ||
130 | + // return nil, xerr.NewErrMsgErr("移除失败", err) | ||
131 | + //} | ||
132 | + //return | ||
133 | + | ||
134 | +// Search | ||
135 | + //var ( | ||
136 | + // conn = l.svcCtx.DefaultDBConn() | ||
137 | + // dms []*domain.ChatModel | ||
138 | + // total int64 | ||
139 | + //) | ||
140 | + // | ||
141 | + //queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size). | ||
142 | + // WithKV("", "") | ||
143 | + | ||
144 | + //total, dms, err = l.svcCtx.ChatModelRepository.Find(l.ctx, conn, queryOptions) | ||
145 | + //list := make([]types.ChatModelItem, 0) | ||
146 | + //for i := range dms { | ||
147 | + // list = append(list, NewTypesChatModel(dms[i])) | ||
148 | + //} | ||
149 | + //resp = &types.ChatModelSearchResponse{ | ||
150 | + // List: list, | ||
151 | + // Total: total, | ||
152 | + //} | ||
153 | + //return | ||
154 | + | ||
155 | +// Update | ||
156 | + //var ( | ||
157 | + // conn = l.svcCtx.DefaultDBConn() | ||
158 | + // dm *domain.ChatModel | ||
159 | + //) | ||
160 | + //if dm, err = l.svcCtx.ChatModelRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
161 | + // return nil, xerr.NewErrMsgErr("不存在", err) | ||
162 | + //} | ||
163 | + //// 不可编辑判断 | ||
164 | + | ||
165 | + //// 赋值 | ||
166 | + | ||
167 | + //// 更新 | ||
168 | + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
169 | + // dm, err = l.svcCtx.ChatModelRepository.UpdateWithVersion(l.ctx, conn, dm) | ||
170 | + // return err | ||
171 | + //}, true); err != nil { | ||
172 | + // return nil, xerr.NewErrMsg("更新失败") | ||
173 | + //} | ||
174 | + //resp = &types.ChatModelUpdateResponse{} | ||
175 | + //return |
1 | + | ||
2 | +syntax = "v1" | ||
3 | + | ||
4 | +info( | ||
5 | + title: "xx实例" | ||
6 | + desc: "xx实例" | ||
7 | + author: "author" | ||
8 | + email: "email" | ||
9 | + version: "v1" | ||
10 | +) | ||
11 | + | ||
12 | +@server( | ||
13 | + prefix: v1 | ||
14 | + group: chat_session | ||
15 | + jwt: JwtAuth | ||
16 | +) | ||
17 | +service Core { | ||
18 | + @doc "详情" | ||
19 | + @handler chat_sessionGet | ||
20 | + get /chat_session/:id (ChatSessionGetRequest) returns (ChatSessionGetResponse) | ||
21 | + @doc "保存" | ||
22 | + @handler chat_sessionSave | ||
23 | + post /chat_session (ChatSessionSaveRequest) returns (ChatSessionSaveResponse) | ||
24 | + @doc "删除" | ||
25 | + @handler chat_sessionDelete | ||
26 | + delete /chat_session/:id (ChatSessionDeleteRequest) returns (ChatSessionDeleteResponse) | ||
27 | + @doc "更新" | ||
28 | + @handler chat_sessionUpdate | ||
29 | + put /chat_session/:id (ChatSessionUpdateRequest) returns (ChatSessionUpdateResponse) | ||
30 | + @doc "搜索" | ||
31 | + @handler chat_sessionSearch | ||
32 | + post /chat_session/search (ChatSessionSearchRequest) returns (ChatSessionSearchResponse) | ||
33 | +} | ||
34 | + | ||
35 | +type ( | ||
36 | + ChatSessionGetRequest { | ||
37 | + Id int64 `path:"id"` | ||
38 | + } | ||
39 | + ChatSessionGetResponse { | ||
40 | + ChatSession ChatSessionItem `json:"chat_session"` | ||
41 | + } | ||
42 | + | ||
43 | + ChatSessionSaveRequest { | ||
44 | + ChatSession ChatSessionItem `json:"chat_session"` | ||
45 | + } | ||
46 | + ChatSessionSaveResponse {} | ||
47 | + | ||
48 | + ChatSessionDeleteRequest { | ||
49 | + Id int64 `path:"id"` | ||
50 | + } | ||
51 | + ChatSessionDeleteResponse {} | ||
52 | + | ||
53 | + ChatSessionUpdateRequest { | ||
54 | + Id int64 `path:"id"` | ||
55 | + ChatSession ChatSessionItem `json:"chat_session"` | ||
56 | + } | ||
57 | + ChatSessionUpdateResponse {} | ||
58 | + | ||
59 | + ChatSessionSearchRequest { | ||
60 | + Page int `json:"page"` | ||
61 | + Size int `json:"size"` | ||
62 | + } | ||
63 | + ChatSessionSearchResponse{ | ||
64 | + List []ChatSessionItem `json:"list"` | ||
65 | + Total int64 `json:"total"` | ||
66 | + } | ||
67 | + ChatSessionItem { | ||
68 | + | ||
69 | + } | ||
70 | +) | ||
71 | + | ||
72 | +// logic CRUD | ||
73 | +// Save | ||
74 | + //var ( | ||
75 | + // conn = l.svcCtx.DefaultDBConn() | ||
76 | + // dm *domain.ChatSession | ||
77 | + //) | ||
78 | + //// 唯一判断 | ||
79 | + | ||
80 | + //dm = NewDomainChatSession(req.ChatSession) | ||
81 | + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
82 | + // dm, err = l.svcCtx.ChatSessionRepository.Insert(l.ctx, conn, dm) | ||
83 | + // return err | ||
84 | + //}, true); err != nil { | ||
85 | + // return nil, xerr.NewErrMsg("保存失败") | ||
86 | + //} | ||
87 | + ////resp = &types.ChatSessionSaveResponse{} | ||
88 | + //return | ||
89 | + | ||
90 | +//func NewDomainChatSession(item types.ChatSessionItem) *domain.ChatSession { | ||
91 | +// return &domain.ChatSession{ | ||
92 | + | ||
93 | +// } | ||
94 | +//} | ||
95 | +// | ||
96 | +//func NewTypesChatSession(item *domain.ChatSession) types.ChatSessionItem { | ||
97 | +// return types.ChatSessionItem{ | ||
98 | +// Id: item.Id, | ||
99 | +// } | ||
100 | +//} | ||
101 | + | ||
102 | +// Get | ||
103 | + //var ( | ||
104 | + // conn = l.svcCtx.DefaultDBConn() | ||
105 | + // dm *domain.ChatSession | ||
106 | + //) | ||
107 | + //// 货号唯一 | ||
108 | + //if dm, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
109 | + // return nil, xerr.NewErrMsgErr("不存在", err) | ||
110 | + //} | ||
111 | + //resp = &types.ChatSessionGetResponse{ | ||
112 | + // ChatSession: NewTypesChatSession(dm), | ||
113 | + //} | ||
114 | + //return | ||
115 | + | ||
116 | +// Delete | ||
117 | + //var ( | ||
118 | + // conn = l.svcCtx.DefaultDBConn() | ||
119 | + // dm *domain.ChatSession | ||
120 | + //) | ||
121 | + //if dm, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
122 | + // return nil, xerr.NewErrMsgErr("不存在", err) | ||
123 | + //} | ||
124 | + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
125 | + // if dm, err = l.svcCtx.ChatSessionRepository.Delete(l.ctx, conn, dm); err != nil { | ||
126 | + // return err | ||
127 | + // } | ||
128 | + // return nil | ||
129 | + //}, true); err != nil { | ||
130 | + // return nil, xerr.NewErrMsgErr("移除失败", err) | ||
131 | + //} | ||
132 | + //return | ||
133 | + | ||
134 | +// Search | ||
135 | + //var ( | ||
136 | + // conn = l.svcCtx.DefaultDBConn() | ||
137 | + // dms []*domain.ChatSession | ||
138 | + // total int64 | ||
139 | + //) | ||
140 | + // | ||
141 | + //queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size). | ||
142 | + // WithKV("", "") | ||
143 | + | ||
144 | + //total, dms, err = l.svcCtx.ChatSessionRepository.Find(l.ctx, conn, queryOptions) | ||
145 | + //list := make([]types.ChatSessionItem, 0) | ||
146 | + //for i := range dms { | ||
147 | + // list = append(list, NewTypesChatSession(dms[i])) | ||
148 | + //} | ||
149 | + //resp = &types.ChatSessionSearchResponse{ | ||
150 | + // List: list, | ||
151 | + // Total: total, | ||
152 | + //} | ||
153 | + //return | ||
154 | + | ||
155 | +// Update | ||
156 | + //var ( | ||
157 | + // conn = l.svcCtx.DefaultDBConn() | ||
158 | + // dm *domain.ChatSession | ||
159 | + //) | ||
160 | + //if dm, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
161 | + // return nil, xerr.NewErrMsgErr("不存在", err) | ||
162 | + //} | ||
163 | + //// 不可编辑判断 | ||
164 | + | ||
165 | + //// 赋值 | ||
166 | + | ||
167 | + //// 更新 | ||
168 | + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
169 | + // dm, err = l.svcCtx.ChatSessionRepository.UpdateWithVersion(l.ctx, conn, dm) | ||
170 | + // return err | ||
171 | + //}, true); err != nil { | ||
172 | + // return nil, xerr.NewErrMsg("更新失败") | ||
173 | + //} | ||
174 | + //resp = &types.ChatSessionUpdateResponse{} | ||
175 | + //return |
1 | + | ||
2 | +syntax = "v1" | ||
3 | + | ||
4 | +info( | ||
5 | + title: "xx实例" | ||
6 | + desc: "xx实例" | ||
7 | + author: "author" | ||
8 | + email: "email" | ||
9 | + version: "v1" | ||
10 | +) | ||
11 | + | ||
12 | +@server( | ||
13 | + prefix: v1 | ||
14 | + group: chat_session_record | ||
15 | + jwt: JwtAuth | ||
16 | +) | ||
17 | +service Core { | ||
18 | + @doc "详情" | ||
19 | + @handler chat_session_recordGet | ||
20 | + get /chat_session_record/:id (ChatSessionRecordGetRequest) returns (ChatSessionRecordGetResponse) | ||
21 | + @doc "保存" | ||
22 | + @handler chat_session_recordSave | ||
23 | + post /chat_session_record (ChatSessionRecordSaveRequest) returns (ChatSessionRecordSaveResponse) | ||
24 | + @doc "删除" | ||
25 | + @handler chat_session_recordDelete | ||
26 | + delete /chat_session_record/:id (ChatSessionRecordDeleteRequest) returns (ChatSessionRecordDeleteResponse) | ||
27 | + @doc "更新" | ||
28 | + @handler chat_session_recordUpdate | ||
29 | + put /chat_session_record/:id (ChatSessionRecordUpdateRequest) returns (ChatSessionRecordUpdateResponse) | ||
30 | + @doc "搜索" | ||
31 | + @handler chat_session_recordSearch | ||
32 | + post /chat_session_record/search (ChatSessionRecordSearchRequest) returns (ChatSessionRecordSearchResponse) | ||
33 | +} | ||
34 | + | ||
35 | +type ( | ||
36 | + ChatSessionRecordGetRequest { | ||
37 | + Id int64 `path:"id"` | ||
38 | + } | ||
39 | + ChatSessionRecordGetResponse { | ||
40 | + ChatSessionRecord ChatSessionRecordItem `json:"chat_session_record"` | ||
41 | + } | ||
42 | + | ||
43 | + ChatSessionRecordSaveRequest { | ||
44 | + ChatSessionRecord ChatSessionRecordItem `json:"chat_session_record"` | ||
45 | + } | ||
46 | + ChatSessionRecordSaveResponse {} | ||
47 | + | ||
48 | + ChatSessionRecordDeleteRequest { | ||
49 | + Id int64 `path:"id"` | ||
50 | + } | ||
51 | + ChatSessionRecordDeleteResponse {} | ||
52 | + | ||
53 | + ChatSessionRecordUpdateRequest { | ||
54 | + Id int64 `path:"id"` | ||
55 | + ChatSessionRecord ChatSessionRecordItem `json:"chat_session_record"` | ||
56 | + } | ||
57 | + ChatSessionRecordUpdateResponse {} | ||
58 | + | ||
59 | + ChatSessionRecordSearchRequest { | ||
60 | + Page int `json:"page"` | ||
61 | + Size int `json:"size"` | ||
62 | + } | ||
63 | + ChatSessionRecordSearchResponse{ | ||
64 | + List []ChatSessionRecordItem `json:"list"` | ||
65 | + Total int64 `json:"total"` | ||
66 | + } | ||
67 | + ChatSessionRecordItem { | ||
68 | + | ||
69 | + } | ||
70 | +) | ||
71 | + | ||
72 | +// logic CRUD | ||
73 | +// Save | ||
74 | + //var ( | ||
75 | + // conn = l.svcCtx.DefaultDBConn() | ||
76 | + // dm *domain.ChatSessionRecord | ||
77 | + //) | ||
78 | + //// 唯一判断 | ||
79 | + | ||
80 | + //dm = NewDomainChatSessionRecord(req.ChatSessionRecord) | ||
81 | + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
82 | + // dm, err = l.svcCtx.ChatSessionRecordRepository.Insert(l.ctx, conn, dm) | ||
83 | + // return err | ||
84 | + //}, true); err != nil { | ||
85 | + // return nil, xerr.NewErrMsg("保存失败") | ||
86 | + //} | ||
87 | + ////resp = &types.ChatSessionRecordSaveResponse{} | ||
88 | + //return | ||
89 | + | ||
90 | +//func NewDomainChatSessionRecord(item types.ChatSessionRecordItem) *domain.ChatSessionRecord { | ||
91 | +// return &domain.ChatSessionRecord{ | ||
92 | + | ||
93 | +// } | ||
94 | +//} | ||
95 | +// | ||
96 | +//func NewTypesChatSessionRecord(item *domain.ChatSessionRecord) types.ChatSessionRecordItem { | ||
97 | +// return types.ChatSessionRecordItem{ | ||
98 | +// Id: item.Id, | ||
99 | +// } | ||
100 | +//} | ||
101 | + | ||
102 | +// Get | ||
103 | + //var ( | ||
104 | + // conn = l.svcCtx.DefaultDBConn() | ||
105 | + // dm *domain.ChatSessionRecord | ||
106 | + //) | ||
107 | + //// 货号唯一 | ||
108 | + //if dm, err = l.svcCtx.ChatSessionRecordRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
109 | + // return nil, xerr.NewErrMsgErr("不存在", err) | ||
110 | + //} | ||
111 | + //resp = &types.ChatSessionRecordGetResponse{ | ||
112 | + // ChatSessionRecord: NewTypesChatSessionRecord(dm), | ||
113 | + //} | ||
114 | + //return | ||
115 | + | ||
116 | +// Delete | ||
117 | + //var ( | ||
118 | + // conn = l.svcCtx.DefaultDBConn() | ||
119 | + // dm *domain.ChatSessionRecord | ||
120 | + //) | ||
121 | + //if dm, err = l.svcCtx.ChatSessionRecordRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
122 | + // return nil, xerr.NewErrMsgErr("不存在", err) | ||
123 | + //} | ||
124 | + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
125 | + // if dm, err = l.svcCtx.ChatSessionRecordRepository.Delete(l.ctx, conn, dm); err != nil { | ||
126 | + // return err | ||
127 | + // } | ||
128 | + // return nil | ||
129 | + //}, true); err != nil { | ||
130 | + // return nil, xerr.NewErrMsgErr("移除失败", err) | ||
131 | + //} | ||
132 | + //return | ||
133 | + | ||
134 | +// Search | ||
135 | + //var ( | ||
136 | + // conn = l.svcCtx.DefaultDBConn() | ||
137 | + // dms []*domain.ChatSessionRecord | ||
138 | + // total int64 | ||
139 | + //) | ||
140 | + // | ||
141 | + //queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size). | ||
142 | + // WithKV("", "") | ||
143 | + | ||
144 | + //total, dms, err = l.svcCtx.ChatSessionRecordRepository.Find(l.ctx, conn, queryOptions) | ||
145 | + //list := make([]types.ChatSessionRecordItem, 0) | ||
146 | + //for i := range dms { | ||
147 | + // list = append(list, NewTypesChatSessionRecord(dms[i])) | ||
148 | + //} | ||
149 | + //resp = &types.ChatSessionRecordSearchResponse{ | ||
150 | + // List: list, | ||
151 | + // Total: total, | ||
152 | + //} | ||
153 | + //return | ||
154 | + | ||
155 | +// Update | ||
156 | + //var ( | ||
157 | + // conn = l.svcCtx.DefaultDBConn() | ||
158 | + // dm *domain.ChatSessionRecord | ||
159 | + //) | ||
160 | + //if dm, err = l.svcCtx.ChatSessionRecordRepository.FindOne(l.ctx, conn, req.Id); err != nil { | ||
161 | + // return nil, xerr.NewErrMsgErr("不存在", err) | ||
162 | + //} | ||
163 | + //// 不可编辑判断 | ||
164 | + | ||
165 | + //// 赋值 | ||
166 | + | ||
167 | + //// 更新 | ||
168 | + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error { | ||
169 | + // dm, err = l.svcCtx.ChatSessionRecordRepository.UpdateWithVersion(l.ctx, conn, dm) | ||
170 | + // return err | ||
171 | + //}, true); err != nil { | ||
172 | + // return nil, xerr.NewErrMsg("更新失败") | ||
173 | + //} | ||
174 | + //resp = &types.ChatSessionRecordUpdateResponse{} | ||
175 | + //return |
1 | + | ||
2 | +syntax = "proto3"; | ||
3 | + | ||
4 | +option go_package ="./pb"; | ||
5 | + | ||
6 | +package pb; | ||
7 | + | ||
8 | +message ChatModelGetReq { | ||
9 | + int64 Id = 1; | ||
10 | +} | ||
11 | +message ChatModelGetResp{ | ||
12 | + ChatModelItem ChatModel = 1; | ||
13 | +} | ||
14 | + | ||
15 | +message ChatModelSaveReq { | ||
16 | + | ||
17 | +} | ||
18 | +message ChatModelSaveResp{ | ||
19 | + | ||
20 | +} | ||
21 | + | ||
22 | +message ChatModelDeleteReq { | ||
23 | + int64 Id = 1; | ||
24 | +} | ||
25 | +message ChatModelDeleteResp{ | ||
26 | + | ||
27 | +} | ||
28 | + | ||
29 | +message ChatModelUpdateReq { | ||
30 | + int64 Id = 1; | ||
31 | +} | ||
32 | +message ChatModelUpdateResp{ | ||
33 | + | ||
34 | +} | ||
35 | + | ||
36 | +message ChatModelSearchReq { | ||
37 | + int64 PageNumber = 1; | ||
38 | + int64 PageSize = 2; | ||
39 | +} | ||
40 | +message ChatModelSearchResp{ | ||
41 | + repeated ChatModelItem List =1; | ||
42 | + int64 Total =2; | ||
43 | +} | ||
44 | +message ChatModelItem { | ||
45 | + | ||
46 | +} | ||
47 | + | ||
48 | +service ChatModelService { | ||
49 | + rpc ChatModelGet(ChatModelGetReq) returns(ChatModelGetResp); | ||
50 | + rpc ChatModelSave(ChatModelSaveReq) returns(ChatModelSaveResp); | ||
51 | + rpc ChatModelDelete(ChatModelDeleteReq) returns(ChatModelDeleteResp); | ||
52 | + rpc ChatModelUpdate(ChatModelUpdateReq) returns(ChatModelUpdateResp); | ||
53 | + rpc ChatModelSearch(ChatModelSearchReq) returns(ChatModelSearchResp); | ||
54 | +} |
1 | + | ||
2 | +syntax = "proto3"; | ||
3 | + | ||
4 | +option go_package ="./pb"; | ||
5 | + | ||
6 | +package pb; | ||
7 | + | ||
8 | +message ChatSessionGetReq { | ||
9 | + int64 Id = 1; | ||
10 | +} | ||
11 | +message ChatSessionGetResp{ | ||
12 | + ChatSessionItem ChatSession = 1; | ||
13 | +} | ||
14 | + | ||
15 | +message ChatSessionSaveReq { | ||
16 | + | ||
17 | +} | ||
18 | +message ChatSessionSaveResp{ | ||
19 | + | ||
20 | +} | ||
21 | + | ||
22 | +message ChatSessionDeleteReq { | ||
23 | + int64 Id = 1; | ||
24 | +} | ||
25 | +message ChatSessionDeleteResp{ | ||
26 | + | ||
27 | +} | ||
28 | + | ||
29 | +message ChatSessionUpdateReq { | ||
30 | + int64 Id = 1; | ||
31 | +} | ||
32 | +message ChatSessionUpdateResp{ | ||
33 | + | ||
34 | +} | ||
35 | + | ||
36 | +message ChatSessionSearchReq { | ||
37 | + int64 PageNumber = 1; | ||
38 | + int64 PageSize = 2; | ||
39 | +} | ||
40 | +message ChatSessionSearchResp{ | ||
41 | + repeated ChatSessionItem List =1; | ||
42 | + int64 Total =2; | ||
43 | +} | ||
44 | +message ChatSessionItem { | ||
45 | + | ||
46 | +} | ||
47 | + | ||
48 | +service ChatSessionService { | ||
49 | + rpc ChatSessionGet(ChatSessionGetReq) returns(ChatSessionGetResp); | ||
50 | + rpc ChatSessionSave(ChatSessionSaveReq) returns(ChatSessionSaveResp); | ||
51 | + rpc ChatSessionDelete(ChatSessionDeleteReq) returns(ChatSessionDeleteResp); | ||
52 | + rpc ChatSessionUpdate(ChatSessionUpdateReq) returns(ChatSessionUpdateResp); | ||
53 | + rpc ChatSessionSearch(ChatSessionSearchReq) returns(ChatSessionSearchResp); | ||
54 | +} |
1 | + | ||
2 | +syntax = "proto3"; | ||
3 | + | ||
4 | +option go_package ="./pb"; | ||
5 | + | ||
6 | +package pb; | ||
7 | + | ||
8 | +message ChatSessionRecordGetReq { | ||
9 | + int64 Id = 1; | ||
10 | +} | ||
11 | +message ChatSessionRecordGetResp{ | ||
12 | + ChatSessionRecordItem ChatSessionRecord = 1; | ||
13 | +} | ||
14 | + | ||
15 | +message ChatSessionRecordSaveReq { | ||
16 | + | ||
17 | +} | ||
18 | +message ChatSessionRecordSaveResp{ | ||
19 | + | ||
20 | +} | ||
21 | + | ||
22 | +message ChatSessionRecordDeleteReq { | ||
23 | + int64 Id = 1; | ||
24 | +} | ||
25 | +message ChatSessionRecordDeleteResp{ | ||
26 | + | ||
27 | +} | ||
28 | + | ||
29 | +message ChatSessionRecordUpdateReq { | ||
30 | + int64 Id = 1; | ||
31 | +} | ||
32 | +message ChatSessionRecordUpdateResp{ | ||
33 | + | ||
34 | +} | ||
35 | + | ||
36 | +message ChatSessionRecordSearchReq { | ||
37 | + int64 PageNumber = 1; | ||
38 | + int64 PageSize = 2; | ||
39 | +} | ||
40 | +message ChatSessionRecordSearchResp{ | ||
41 | + repeated ChatSessionRecordItem List =1; | ||
42 | + int64 Total =2; | ||
43 | +} | ||
44 | +message ChatSessionRecordItem { | ||
45 | + | ||
46 | +} | ||
47 | + | ||
48 | +service ChatSessionRecordService { | ||
49 | + rpc ChatSessionRecordGet(ChatSessionRecordGetReq) returns(ChatSessionRecordGetResp); | ||
50 | + rpc ChatSessionRecordSave(ChatSessionRecordSaveReq) returns(ChatSessionRecordSaveResp); | ||
51 | + rpc ChatSessionRecordDelete(ChatSessionRecordDeleteReq) returns(ChatSessionRecordDeleteResp); | ||
52 | + rpc ChatSessionRecordUpdate(ChatSessionRecordUpdateReq) returns(ChatSessionRecordUpdateResp); | ||
53 | + rpc ChatSessionRecordSearch(ChatSessionRecordSearchReq) returns(ChatSessionRecordSearchResp); | ||
54 | +} |
cmd/ep/chat/internal/pkg/db/migrate.go
0 → 100644
1 | +package models | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
6 | + "gorm.io/gorm" | ||
7 | + "gorm.io/plugin/soft_delete" | ||
8 | +) | ||
9 | + | ||
10 | +type ChatModel struct { | ||
11 | + Id int64 // 唯一标识 | ||
12 | + CreatedAt int64 | ||
13 | + UpdatedAt int64 | ||
14 | + DeletedAt int64 | ||
15 | + Version int | ||
16 | + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` | ||
17 | +} | ||
18 | + | ||
19 | +func (m *ChatModel) TableName() string { | ||
20 | + return "chat.model" | ||
21 | +} | ||
22 | + | ||
23 | +func (m *ChatModel) BeforeCreate(tx *gorm.DB) (err error) { | ||
24 | + // m.CreatedAt = time.Now().Unix() | ||
25 | + // m.UpdatedAt = time.Now().Unix() | ||
26 | + return | ||
27 | +} | ||
28 | + | ||
29 | +func (m *ChatModel) BeforeUpdate(tx *gorm.DB) (err error) { | ||
30 | + // m.UpdatedAt = time.Now().Unix() | ||
31 | + return | ||
32 | +} | ||
33 | + | ||
34 | +func (m *ChatModel) CacheKeyFunc() string { | ||
35 | + if m.Id == 0 { | ||
36 | + return "" | ||
37 | + } | ||
38 | + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id) | ||
39 | +} | ||
40 | + | ||
41 | +func (m *ChatModel) CacheKeyFuncByObject(obj interface{}) string { | ||
42 | + if v, ok := obj.(*ChatModel); ok { | ||
43 | + return v.CacheKeyFunc() | ||
44 | + } | ||
45 | + return "" | ||
46 | +} | ||
47 | + | ||
48 | +func (m *ChatModel) CachePrimaryKeyFunc() string { | ||
49 | + if len("") == 0 { | ||
50 | + return "" | ||
51 | + } | ||
52 | + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key") | ||
53 | +} |
1 | +package models | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
6 | + "gorm.io/gorm" | ||
7 | + "gorm.io/plugin/soft_delete" | ||
8 | +) | ||
9 | + | ||
10 | +type ChatSession struct { | ||
11 | + Id int64 // 唯一标识 | ||
12 | + CompanyId int64 // 公司ID | ||
13 | + UserId int64 // 用户ID | ||
14 | + Title string // 会话标题 | ||
15 | + Abstract string // 摘要 | ||
16 | + CreatedAt int64 | ||
17 | + UpdatedAt int64 | ||
18 | + DeletedAt int64 | ||
19 | + Version int | ||
20 | + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` | ||
21 | +} | ||
22 | + | ||
23 | +func (m *ChatSession) TableName() string { | ||
24 | + return "chat.session" | ||
25 | +} | ||
26 | + | ||
27 | +func (m *ChatSession) BeforeCreate(tx *gorm.DB) (err error) { | ||
28 | + // m.CreatedAt = time.Now().Unix() | ||
29 | + // m.UpdatedAt = time.Now().Unix() | ||
30 | + return | ||
31 | +} | ||
32 | + | ||
33 | +func (m *ChatSession) BeforeUpdate(tx *gorm.DB) (err error) { | ||
34 | + // m.UpdatedAt = time.Now().Unix() | ||
35 | + return | ||
36 | +} | ||
37 | + | ||
38 | +func (m *ChatSession) CacheKeyFunc() string { | ||
39 | + if m.Id == 0 { | ||
40 | + return "" | ||
41 | + } | ||
42 | + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id) | ||
43 | +} | ||
44 | + | ||
45 | +func (m *ChatSession) CacheKeyFuncByObject(obj interface{}) string { | ||
46 | + if v, ok := obj.(*ChatSession); ok { | ||
47 | + return v.CacheKeyFunc() | ||
48 | + } | ||
49 | + return "" | ||
50 | +} | ||
51 | + | ||
52 | +func (m *ChatSession) CachePrimaryKeyFunc() string { | ||
53 | + if len("") == 0 { | ||
54 | + return "" | ||
55 | + } | ||
56 | + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key") | ||
57 | +} |
1 | +package models | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
6 | + "gorm.io/gorm" | ||
7 | + "gorm.io/plugin/soft_delete" | ||
8 | +) | ||
9 | + | ||
10 | +type ChatSessionRecord struct { | ||
11 | + Id int64 // 唯一标识 | ||
12 | + Group int64 // 分组(一个问题多次重复提问) | ||
13 | + CompanyId int64 // 公司ID | ||
14 | + UserId int64 // 用户ID | ||
15 | + SessionId int64 // 会话ID | ||
16 | + ModelId int64 // 选择模型ID | ||
17 | + Author domain.User `gorm:"type:jsonb;serializer:json"` // 作者 | ||
18 | + ContentType string // 内容类型 文本:text (图片:image 文档:document) | ||
19 | + ProblemText string // 问题文本 | ||
20 | + AnswerText string // 回答文本 | ||
21 | + Metadata domain.Metadata `gorm:"type:jsonb;serializer:json"` // 记录元数据 | ||
22 | + Cost int64 // 花费时间 单位毫秒 | ||
23 | + Status string // 状态 处理中:processing 超时:finished_timeout 结束成功:finished_fail 结束失败:finished_success | ||
24 | + CreatedAt int64 | ||
25 | + UpdatedAt int64 | ||
26 | + DeletedAt int64 | ||
27 | + Version int | ||
28 | + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` | ||
29 | +} | ||
30 | + | ||
31 | +func (m *ChatSessionRecord) TableName() string { | ||
32 | + return "chat.session_record" | ||
33 | +} | ||
34 | + | ||
35 | +func (m *ChatSessionRecord) BeforeCreate(tx *gorm.DB) (err error) { | ||
36 | + // m.CreatedAt = time.Now().Unix() | ||
37 | + // m.UpdatedAt = time.Now().Unix() | ||
38 | + return | ||
39 | +} | ||
40 | + | ||
41 | +func (m *ChatSessionRecord) BeforeUpdate(tx *gorm.DB) (err error) { | ||
42 | + // m.UpdatedAt = time.Now().Unix() | ||
43 | + return | ||
44 | +} | ||
45 | + | ||
46 | +func (m *ChatSessionRecord) CacheKeyFunc() string { | ||
47 | + if m.Id == 0 { | ||
48 | + return "" | ||
49 | + } | ||
50 | + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id) | ||
51 | +} | ||
52 | + | ||
53 | +func (m *ChatSessionRecord) CacheKeyFuncByObject(obj interface{}) string { | ||
54 | + if v, ok := obj.(*ChatSessionRecord); ok { | ||
55 | + return v.CacheKeyFunc() | ||
56 | + } | ||
57 | + return "" | ||
58 | +} | ||
59 | + | ||
60 | +func (m *ChatSessionRecord) CachePrimaryKeyFunc() string { | ||
61 | + if len("") == 0 { | ||
62 | + return "" | ||
63 | + } | ||
64 | + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key") | ||
65 | +} |
1 | +package repository | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "github.com/jinzhu/copier" | ||
6 | + "github.com/pkg/errors" | ||
7 | + "github.com/tiptok/gocomm/pkg/cache" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/db/models" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
11 | + "gorm.io/gorm" | ||
12 | +) | ||
13 | + | ||
14 | +type ChatModelRepository struct { | ||
15 | + *cache.CachedRepository | ||
16 | +} | ||
17 | + | ||
18 | +func (repository *ChatModelRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ChatModel) (*domain.ChatModel, error) { | ||
19 | + var ( | ||
20 | + err error | ||
21 | + m = &models.ChatModel{} | ||
22 | + tx = conn.DB() | ||
23 | + ) | ||
24 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
25 | + return nil, err | ||
26 | + } | ||
27 | + if tx = tx.Model(m).Save(m); tx.Error != nil { | ||
28 | + return nil, tx.Error | ||
29 | + } | ||
30 | + dm.Id = m.Id | ||
31 | + return repository.ModelToDomainModel(m) | ||
32 | + | ||
33 | +} | ||
34 | + | ||
35 | +func (repository *ChatModelRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ChatModel) (*domain.ChatModel, error) { | ||
36 | + var ( | ||
37 | + err error | ||
38 | + m *models.ChatModel | ||
39 | + tx = conn.DB() | ||
40 | + ) | ||
41 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
42 | + return nil, err | ||
43 | + } | ||
44 | + queryFunc := func() (interface{}, error) { | ||
45 | + tx = tx.Model(m).Updates(m) | ||
46 | + return nil, tx.Error | ||
47 | + } | ||
48 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
49 | + return nil, err | ||
50 | + } | ||
51 | + return repository.ModelToDomainModel(m) | ||
52 | +} | ||
53 | + | ||
54 | +func (repository *ChatModelRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ChatModel) (*domain.ChatModel, error) { | ||
55 | + var ( | ||
56 | + err error | ||
57 | + m *models.ChatModel | ||
58 | + tx = transaction.DB() | ||
59 | + ) | ||
60 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
61 | + return nil, err | ||
62 | + } | ||
63 | + oldVersion := dm.Version | ||
64 | + m.Version += 1 | ||
65 | + queryFunc := func() (interface{}, error) { | ||
66 | + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m) | ||
67 | + if tx.RowsAffected == 0 { | ||
68 | + return nil, domain.ErrUpdateFail | ||
69 | + } | ||
70 | + return nil, tx.Error | ||
71 | + } | ||
72 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
73 | + return nil, err | ||
74 | + } | ||
75 | + return repository.ModelToDomainModel(m) | ||
76 | +} | ||
77 | + | ||
78 | +func (repository *ChatModelRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ChatModel) (*domain.ChatModel, error) { | ||
79 | + var ( | ||
80 | + tx = conn.DB() | ||
81 | + m = &models.ChatModel{Id: dm.Id} | ||
82 | + ) | ||
83 | + queryFunc := func() (interface{}, error) { | ||
84 | + tx = tx.Where("id = ?", m.Id).Delete(m) | ||
85 | + return m, tx.Error | ||
86 | + } | ||
87 | + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
88 | + return dm, err | ||
89 | + } | ||
90 | + return repository.ModelToDomainModel(m) | ||
91 | +} | ||
92 | + | ||
93 | +func (repository *ChatModelRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatModel, error) { | ||
94 | + var ( | ||
95 | + err error | ||
96 | + tx = conn.DB() | ||
97 | + m = new(models.ChatModel) | ||
98 | + ) | ||
99 | + queryFunc := func() (interface{}, error) { | ||
100 | + tx = tx.Model(m).Where("id = ?", id).First(m) | ||
101 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
102 | + return nil, domain.ErrNotFound | ||
103 | + } | ||
104 | + return m, tx.Error | ||
105 | + } | ||
106 | + cacheModel := new(models.ChatModel) | ||
107 | + cacheModel.Id = id | ||
108 | + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil { | ||
109 | + return nil, err | ||
110 | + } | ||
111 | + return repository.ModelToDomainModel(m) | ||
112 | +} | ||
113 | + | ||
114 | +func (repository *ChatModelRepository) FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatModel, error) { | ||
115 | + var ( | ||
116 | + err error | ||
117 | + tx = conn.DB() | ||
118 | + m = new(models.ChatModel) | ||
119 | + ) | ||
120 | + queryFunc := func() (interface{}, error) { | ||
121 | + tx = tx.Model(m).Unscoped().Where("id = ?", id).First(m) | ||
122 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
123 | + return nil, domain.ErrNotFound | ||
124 | + } | ||
125 | + return m, tx.Error | ||
126 | + } | ||
127 | + cacheModel := new(models.ChatModel) | ||
128 | + cacheModel.Id = id | ||
129 | + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil { | ||
130 | + return nil, err | ||
131 | + } | ||
132 | + return repository.ModelToDomainModel(m) | ||
133 | +} | ||
134 | + | ||
135 | +func (repository *ChatModelRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ChatModel, error) { | ||
136 | + var ( | ||
137 | + tx = conn.DB() | ||
138 | + ms []*models.ChatModel | ||
139 | + dms = make([]*domain.ChatModel, 0) | ||
140 | + total int64 | ||
141 | + ) | ||
142 | + queryFunc := func() (interface{}, error) { | ||
143 | + tx = tx.Model(&ms).Order("id desc") | ||
144 | + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { | ||
145 | + return dms, tx.Error | ||
146 | + } | ||
147 | + return dms, nil | ||
148 | + } | ||
149 | + | ||
150 | + if _, err := repository.Query(queryFunc); err != nil { | ||
151 | + return 0, nil, err | ||
152 | + } | ||
153 | + | ||
154 | + for _, item := range ms { | ||
155 | + if dm, err := repository.ModelToDomainModel(item); err != nil { | ||
156 | + return 0, dms, err | ||
157 | + } else { | ||
158 | + dms = append(dms, dm) | ||
159 | + } | ||
160 | + } | ||
161 | + return total, dms, nil | ||
162 | +} | ||
163 | + | ||
164 | +func (repository *ChatModelRepository) ModelToDomainModel(from *models.ChatModel) (*domain.ChatModel, error) { | ||
165 | + to := &domain.ChatModel{} | ||
166 | + err := copier.Copy(to, from) | ||
167 | + return to, err | ||
168 | +} | ||
169 | + | ||
170 | +func (repository *ChatModelRepository) DomainModelToModel(from *domain.ChatModel) (*models.ChatModel, error) { | ||
171 | + to := &models.ChatModel{} | ||
172 | + err := copier.Copy(to, from) | ||
173 | + return to, err | ||
174 | +} | ||
175 | + | ||
176 | +func NewChatModelRepository(cache *cache.CachedRepository) domain.ChatModelRepository { | ||
177 | + return &ChatModelRepository{CachedRepository: cache} | ||
178 | +} |
1 | +package repository | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "github.com/jinzhu/copier" | ||
6 | + "github.com/pkg/errors" | ||
7 | + "github.com/tiptok/gocomm/pkg/cache" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/db/models" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
11 | + "gorm.io/gorm" | ||
12 | +) | ||
13 | + | ||
14 | +type ChatSessionRecordRepository struct { | ||
15 | + *cache.CachedRepository | ||
16 | +} | ||
17 | + | ||
18 | +func (repository *ChatSessionRecordRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ChatSessionRecord) (*domain.ChatSessionRecord, error) { | ||
19 | + var ( | ||
20 | + err error | ||
21 | + m = &models.ChatSessionRecord{} | ||
22 | + tx = conn.DB() | ||
23 | + ) | ||
24 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
25 | + return nil, err | ||
26 | + } | ||
27 | + if tx = tx.Model(m).Save(m); tx.Error != nil { | ||
28 | + return nil, tx.Error | ||
29 | + } | ||
30 | + dm.Id = m.Id | ||
31 | + return repository.ModelToDomainModel(m) | ||
32 | + | ||
33 | +} | ||
34 | + | ||
35 | +func (repository *ChatSessionRecordRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ChatSessionRecord) (*domain.ChatSessionRecord, error) { | ||
36 | + var ( | ||
37 | + err error | ||
38 | + m *models.ChatSessionRecord | ||
39 | + tx = conn.DB() | ||
40 | + ) | ||
41 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
42 | + return nil, err | ||
43 | + } | ||
44 | + queryFunc := func() (interface{}, error) { | ||
45 | + tx = tx.Model(m).Updates(m) | ||
46 | + return nil, tx.Error | ||
47 | + } | ||
48 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
49 | + return nil, err | ||
50 | + } | ||
51 | + return repository.ModelToDomainModel(m) | ||
52 | +} | ||
53 | + | ||
54 | +func (repository *ChatSessionRecordRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ChatSessionRecord) (*domain.ChatSessionRecord, error) { | ||
55 | + var ( | ||
56 | + err error | ||
57 | + m *models.ChatSessionRecord | ||
58 | + tx = transaction.DB() | ||
59 | + ) | ||
60 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
61 | + return nil, err | ||
62 | + } | ||
63 | + oldVersion := dm.Version | ||
64 | + m.Version += 1 | ||
65 | + queryFunc := func() (interface{}, error) { | ||
66 | + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m) | ||
67 | + if tx.RowsAffected == 0 { | ||
68 | + return nil, domain.ErrUpdateFail | ||
69 | + } | ||
70 | + return nil, tx.Error | ||
71 | + } | ||
72 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
73 | + return nil, err | ||
74 | + } | ||
75 | + return repository.ModelToDomainModel(m) | ||
76 | +} | ||
77 | + | ||
78 | +func (repository *ChatSessionRecordRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ChatSessionRecord) (*domain.ChatSessionRecord, error) { | ||
79 | + var ( | ||
80 | + tx = conn.DB() | ||
81 | + m = &models.ChatSessionRecord{Id: dm.Id} | ||
82 | + ) | ||
83 | + queryFunc := func() (interface{}, error) { | ||
84 | + tx = tx.Where("id = ?", m.Id).Delete(m) | ||
85 | + return m, tx.Error | ||
86 | + } | ||
87 | + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
88 | + return dm, err | ||
89 | + } | ||
90 | + return repository.ModelToDomainModel(m) | ||
91 | +} | ||
92 | + | ||
93 | +func (repository *ChatSessionRecordRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatSessionRecord, error) { | ||
94 | + var ( | ||
95 | + err error | ||
96 | + tx = conn.DB() | ||
97 | + m = new(models.ChatSessionRecord) | ||
98 | + ) | ||
99 | + queryFunc := func() (interface{}, error) { | ||
100 | + tx = tx.Model(m).Where("id = ?", id).First(m) | ||
101 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
102 | + return nil, domain.ErrNotFound | ||
103 | + } | ||
104 | + return m, tx.Error | ||
105 | + } | ||
106 | + cacheModel := new(models.ChatSessionRecord) | ||
107 | + cacheModel.Id = id | ||
108 | + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil { | ||
109 | + return nil, err | ||
110 | + } | ||
111 | + return repository.ModelToDomainModel(m) | ||
112 | +} | ||
113 | + | ||
114 | +func (repository *ChatSessionRecordRepository) FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatSessionRecord, error) { | ||
115 | + var ( | ||
116 | + err error | ||
117 | + tx = conn.DB() | ||
118 | + m = new(models.ChatSessionRecord) | ||
119 | + ) | ||
120 | + queryFunc := func() (interface{}, error) { | ||
121 | + tx = tx.Model(m).Unscoped().Where("id = ?", id).First(m) | ||
122 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
123 | + return nil, domain.ErrNotFound | ||
124 | + } | ||
125 | + return m, tx.Error | ||
126 | + } | ||
127 | + cacheModel := new(models.ChatSessionRecord) | ||
128 | + cacheModel.Id = id | ||
129 | + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil { | ||
130 | + return nil, err | ||
131 | + } | ||
132 | + return repository.ModelToDomainModel(m) | ||
133 | +} | ||
134 | + | ||
135 | +func (repository *ChatSessionRecordRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ChatSessionRecord, error) { | ||
136 | + var ( | ||
137 | + tx = conn.DB() | ||
138 | + ms []*models.ChatSessionRecord | ||
139 | + dms = make([]*domain.ChatSessionRecord, 0) | ||
140 | + total int64 | ||
141 | + ) | ||
142 | + queryFunc := func() (interface{}, error) { | ||
143 | + tx = tx.Model(&ms).Order("id asc") | ||
144 | + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { | ||
145 | + return dms, tx.Error | ||
146 | + } | ||
147 | + return dms, nil | ||
148 | + } | ||
149 | + | ||
150 | + if _, err := repository.Query(queryFunc); err != nil { | ||
151 | + return 0, nil, err | ||
152 | + } | ||
153 | + | ||
154 | + for _, item := range ms { | ||
155 | + if dm, err := repository.ModelToDomainModel(item); err != nil { | ||
156 | + return 0, dms, err | ||
157 | + } else { | ||
158 | + dms = append(dms, dm) | ||
159 | + } | ||
160 | + } | ||
161 | + return total, dms, nil | ||
162 | +} | ||
163 | + | ||
164 | +func (repository *ChatSessionRecordRepository) FindByCompanyUser(ctx context.Context, conn transaction.Conn, companyId, userId int64, queryOptions map[string]interface{}) (int64, []*domain.ChatSessionRecord, error) { | ||
165 | + var ( | ||
166 | + tx = conn.DB() | ||
167 | + ms []*models.ChatSessionRecord | ||
168 | + dms = make([]*domain.ChatSessionRecord, 0) | ||
169 | + total int64 | ||
170 | + ) | ||
171 | + queryFunc := func() (interface{}, error) { | ||
172 | + tx = tx.Model(&ms).Order("id asc") | ||
173 | + tx.Where("company_id = ?", companyId).Where("user_id = ?", userId) | ||
174 | + if v, ok := queryOptions["sessionId"]; ok { | ||
175 | + tx.Where("session_id =?", v) | ||
176 | + } | ||
177 | + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { | ||
178 | + return dms, tx.Error | ||
179 | + } | ||
180 | + return dms, nil | ||
181 | + } | ||
182 | + | ||
183 | + if _, err := repository.Query(queryFunc); err != nil { | ||
184 | + return 0, nil, err | ||
185 | + } | ||
186 | + | ||
187 | + for _, item := range ms { | ||
188 | + if dm, err := repository.ModelToDomainModel(item); err != nil { | ||
189 | + return 0, dms, err | ||
190 | + } else { | ||
191 | + dms = append(dms, dm) | ||
192 | + } | ||
193 | + } | ||
194 | + return total, dms, nil | ||
195 | +} | ||
196 | + | ||
197 | +func (repository *ChatSessionRecordRepository) ModelToDomainModel(from *models.ChatSessionRecord) (*domain.ChatSessionRecord, error) { | ||
198 | + to := &domain.ChatSessionRecord{} | ||
199 | + err := copier.Copy(to, from) | ||
200 | + return to, err | ||
201 | +} | ||
202 | + | ||
203 | +func (repository *ChatSessionRecordRepository) DomainModelToModel(from *domain.ChatSessionRecord) (*models.ChatSessionRecord, error) { | ||
204 | + to := &models.ChatSessionRecord{} | ||
205 | + err := copier.Copy(to, from) | ||
206 | + return to, err | ||
207 | +} | ||
208 | + | ||
209 | +func NewChatSessionRecordRepository(cache *cache.CachedRepository) domain.ChatSessionRecordRepository { | ||
210 | + return &ChatSessionRecordRepository{CachedRepository: cache} | ||
211 | +} |
1 | +package repository | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "github.com/jinzhu/copier" | ||
6 | + "github.com/pkg/errors" | ||
7 | + "github.com/tiptok/gocomm/pkg/cache" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/db/models" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
11 | + "gorm.io/gorm" | ||
12 | +) | ||
13 | + | ||
14 | +type ChatSessionRepository struct { | ||
15 | + *cache.CachedRepository | ||
16 | +} | ||
17 | + | ||
18 | +func (repository *ChatSessionRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ChatSession) (*domain.ChatSession, error) { | ||
19 | + var ( | ||
20 | + err error | ||
21 | + m = &models.ChatSession{} | ||
22 | + tx = conn.DB() | ||
23 | + ) | ||
24 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
25 | + return nil, err | ||
26 | + } | ||
27 | + if tx = tx.Model(m).Save(m); tx.Error != nil { | ||
28 | + return nil, tx.Error | ||
29 | + } | ||
30 | + dm.Id = m.Id | ||
31 | + return repository.ModelToDomainModel(m) | ||
32 | + | ||
33 | +} | ||
34 | + | ||
35 | +func (repository *ChatSessionRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ChatSession) (*domain.ChatSession, error) { | ||
36 | + var ( | ||
37 | + err error | ||
38 | + m *models.ChatSession | ||
39 | + tx = conn.DB() | ||
40 | + ) | ||
41 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
42 | + return nil, err | ||
43 | + } | ||
44 | + queryFunc := func() (interface{}, error) { | ||
45 | + tx = tx.Model(m).Updates(m) | ||
46 | + return nil, tx.Error | ||
47 | + } | ||
48 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
49 | + return nil, err | ||
50 | + } | ||
51 | + return repository.ModelToDomainModel(m) | ||
52 | +} | ||
53 | + | ||
54 | +func (repository *ChatSessionRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ChatSession) (*domain.ChatSession, error) { | ||
55 | + var ( | ||
56 | + err error | ||
57 | + m *models.ChatSession | ||
58 | + tx = transaction.DB() | ||
59 | + ) | ||
60 | + if m, err = repository.DomainModelToModel(dm); err != nil { | ||
61 | + return nil, err | ||
62 | + } | ||
63 | + oldVersion := dm.Version | ||
64 | + m.Version += 1 | ||
65 | + queryFunc := func() (interface{}, error) { | ||
66 | + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m) | ||
67 | + if tx.RowsAffected == 0 { | ||
68 | + return nil, domain.ErrUpdateFail | ||
69 | + } | ||
70 | + return nil, tx.Error | ||
71 | + } | ||
72 | + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
73 | + return nil, err | ||
74 | + } | ||
75 | + return repository.ModelToDomainModel(m) | ||
76 | +} | ||
77 | + | ||
78 | +func (repository *ChatSessionRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ChatSession) (*domain.ChatSession, error) { | ||
79 | + var ( | ||
80 | + tx = conn.DB() | ||
81 | + m = &models.ChatSession{Id: dm.Id} | ||
82 | + ) | ||
83 | + queryFunc := func() (interface{}, error) { | ||
84 | + tx = tx.Where("id = ?", m.Id).Delete(m) | ||
85 | + return m, tx.Error | ||
86 | + } | ||
87 | + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil { | ||
88 | + return dm, err | ||
89 | + } | ||
90 | + return repository.ModelToDomainModel(m) | ||
91 | +} | ||
92 | + | ||
93 | +func (repository *ChatSessionRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatSession, error) { | ||
94 | + var ( | ||
95 | + err error | ||
96 | + tx = conn.DB() | ||
97 | + m = new(models.ChatSession) | ||
98 | + ) | ||
99 | + queryFunc := func() (interface{}, error) { | ||
100 | + tx = tx.Model(m).Where("id = ?", id).First(m) | ||
101 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
102 | + return nil, domain.ErrNotFound | ||
103 | + } | ||
104 | + return m, tx.Error | ||
105 | + } | ||
106 | + cacheModel := new(models.ChatSession) | ||
107 | + cacheModel.Id = id | ||
108 | + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil { | ||
109 | + return nil, err | ||
110 | + } | ||
111 | + return repository.ModelToDomainModel(m) | ||
112 | +} | ||
113 | + | ||
114 | +func (repository *ChatSessionRepository) FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatSession, error) { | ||
115 | + var ( | ||
116 | + err error | ||
117 | + tx = conn.DB() | ||
118 | + m = new(models.ChatSession) | ||
119 | + ) | ||
120 | + queryFunc := func() (interface{}, error) { | ||
121 | + tx = tx.Model(m).Unscoped().Where("id = ?", id).First(m) | ||
122 | + if errors.Is(tx.Error, gorm.ErrRecordNotFound) { | ||
123 | + return nil, domain.ErrNotFound | ||
124 | + } | ||
125 | + return m, tx.Error | ||
126 | + } | ||
127 | + cacheModel := new(models.ChatSession) | ||
128 | + cacheModel.Id = id | ||
129 | + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil { | ||
130 | + return nil, err | ||
131 | + } | ||
132 | + return repository.ModelToDomainModel(m) | ||
133 | +} | ||
134 | + | ||
135 | +func (repository *ChatSessionRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ChatSession, error) { | ||
136 | + var ( | ||
137 | + tx = conn.DB() | ||
138 | + ms []*models.ChatSession | ||
139 | + dms = make([]*domain.ChatSession, 0) | ||
140 | + total int64 | ||
141 | + ) | ||
142 | + queryFunc := func() (interface{}, error) { | ||
143 | + tx = tx.Model(&ms).Order("id desc") | ||
144 | + if v, ok := queryOptions["title"]; ok { | ||
145 | + tx.Where("title like ?", v) | ||
146 | + } | ||
147 | + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { | ||
148 | + return dms, tx.Error | ||
149 | + } | ||
150 | + return dms, nil | ||
151 | + } | ||
152 | + | ||
153 | + if _, err := repository.Query(queryFunc); err != nil { | ||
154 | + return 0, nil, err | ||
155 | + } | ||
156 | + | ||
157 | + for _, item := range ms { | ||
158 | + if dm, err := repository.ModelToDomainModel(item); err != nil { | ||
159 | + return 0, dms, err | ||
160 | + } else { | ||
161 | + dms = append(dms, dm) | ||
162 | + } | ||
163 | + } | ||
164 | + return total, dms, nil | ||
165 | +} | ||
166 | + | ||
167 | +func (repository *ChatSessionRepository) ModelToDomainModel(from *models.ChatSession) (*domain.ChatSession, error) { | ||
168 | + to := &domain.ChatSession{} | ||
169 | + err := copier.Copy(to, from) | ||
170 | + return to, err | ||
171 | +} | ||
172 | + | ||
173 | +func (repository *ChatSessionRepository) DomainModelToModel(from *domain.ChatSession) (*models.ChatSession, error) { | ||
174 | + to := &models.ChatSession{} | ||
175 | + err := copier.Copy(to, from) | ||
176 | + return to, err | ||
177 | +} | ||
178 | + | ||
179 | +func NewChatSessionRepository(cache *cache.CachedRepository) domain.ChatSessionRepository { | ||
180 | + return &ChatSessionRepository{CachedRepository: cache} | ||
181 | +} |
1 | +package transaction |
1 | +package domain | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "github.com/samber/lo" | ||
6 | + "github.com/sashabaranov/go-openai" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
8 | +) | ||
9 | + | ||
10 | +type ChatModel struct { | ||
11 | + Id int64 `json:",omitempty"` // 唯一标识 | ||
12 | + Name string `json:",omitempty"` | ||
13 | + Code string `json:",omitempty"` | ||
14 | + Logo string `json:",omitempty"` | ||
15 | + Config ModelConfig `json:",omitempty"` | ||
16 | + CreatedAt int64 `json:",omitempty"` | ||
17 | + UpdatedAt int64 `json:",omitempty"` | ||
18 | + DeletedAt int64 `json:",omitempty"` | ||
19 | + Version int `json:",omitempty"` | ||
20 | +} | ||
21 | + | ||
22 | +type ChatModelRepository interface { | ||
23 | + Insert(ctx context.Context, conn transaction.Conn, dm *ChatModel) (*ChatModel, error) | ||
24 | + Update(ctx context.Context, conn transaction.Conn, dm *ChatModel) (*ChatModel, error) | ||
25 | + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ChatModel) (*ChatModel, error) | ||
26 | + Delete(ctx context.Context, conn transaction.Conn, dm *ChatModel) (*ChatModel, error) | ||
27 | + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ChatModel, error) | ||
28 | + FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*ChatModel, error) | ||
29 | + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ChatModel, error) | ||
30 | +} | ||
31 | + | ||
32 | +type ChatModels []*ChatModel | ||
33 | + | ||
34 | +func (list ChatModels) Match(id int64) (*ChatModel, bool) { | ||
35 | + return lo.Find(list, func(item *ChatModel) bool { | ||
36 | + if item.Id == id { | ||
37 | + return true | ||
38 | + } | ||
39 | + return false | ||
40 | + }) | ||
41 | +} | ||
42 | + | ||
43 | +var DefaultChatModels ChatModels = []*ChatModel{ | ||
44 | + NewChatModels(1, "ChatGPT 4o", openai.GPT4o, "", NewModelConfig("", "sk-proj-0odTHgsYqzGpjPMWYuw2T3BlbkFJpaIsQ9I6j8kYc8P7l60H", "")), | ||
45 | + NewChatModels(2, "ChatGPT 4-turbo", openai.GPT4Turbo, "", NewModelConfig("", "sk-proj-0odTHgsYqzGpjPMWYuw2T3BlbkFJpaIsQ9I6j8kYc8P7l60H", "")), | ||
46 | + NewChatModels(3, "ChatGPT 3.5", openai.GPT3Dot5Turbo, "", NewModelConfig("", "sk-proj-0odTHgsYqzGpjPMWYuw2T3BlbkFJpaIsQ9I6j8kYc8P7l60H", "")), | ||
47 | + NewChatModels(4, "星火大模型V3.5", "spark3.5", "", NewModelConfig("4fd8694e", "4a4081a20e9ba0fb1b9686ed93221989", "NTVkM2FjNzk2NzQ5MzBkNWMwYTUwNjAz")), | ||
48 | +} | ||
49 | + | ||
50 | +type ModelConfig struct { | ||
51 | + AppId string | ||
52 | + AppKey string | ||
53 | + AppSecret string | ||
54 | +} | ||
55 | + | ||
56 | +func NewModelConfig(appid, appKey, appSecret string) ModelConfig { | ||
57 | + return ModelConfig{ | ||
58 | + AppId: appid, | ||
59 | + AppKey: appKey, | ||
60 | + AppSecret: appSecret, | ||
61 | + } | ||
62 | +} | ||
63 | + | ||
64 | +func NewChatModels(id int64, name, code string, logo string, config ModelConfig) *ChatModel { | ||
65 | + return &ChatModel{ | ||
66 | + Id: id, | ||
67 | + Name: name, | ||
68 | + Code: code, | ||
69 | + Logo: logo, | ||
70 | + Config: config, | ||
71 | + } | ||
72 | +} |
1 | +package domain | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
6 | +) | ||
7 | + | ||
8 | +type ChatSession struct { | ||
9 | + Id int64 `json:",omitempty"` // 唯一标识 | ||
10 | + CompanyId int64 `json:",omitempty"` // 公司ID | ||
11 | + UserId int64 `json:",omitempty"` // 用户ID | ||
12 | + Title string `json:",omitempty"` // 会话标题 | ||
13 | + Abstract string `json:",omitempty"` // 摘要 | ||
14 | + CreatedAt int64 `json:",omitempty"` | ||
15 | + UpdatedAt int64 `json:",omitempty"` | ||
16 | + DeletedAt int64 `json:",omitempty"` | ||
17 | + Version int `json:",omitempty"` | ||
18 | +} | ||
19 | + | ||
20 | +type ChatSessionRepository interface { | ||
21 | + Insert(ctx context.Context, conn transaction.Conn, dm *ChatSession) (*ChatSession, error) | ||
22 | + Update(ctx context.Context, conn transaction.Conn, dm *ChatSession) (*ChatSession, error) | ||
23 | + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ChatSession) (*ChatSession, error) | ||
24 | + Delete(ctx context.Context, conn transaction.Conn, dm *ChatSession) (*ChatSession, error) | ||
25 | + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ChatSession, error) | ||
26 | + FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*ChatSession, error) | ||
27 | + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ChatSession, error) | ||
28 | +} |
1 | +package domain | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
6 | +) | ||
7 | + | ||
8 | +type ChatSessionRecord struct { | ||
9 | + Id int64 // 唯一标识 | ||
10 | + Group int64 // 分组(一个问题多次重复提问) | ||
11 | + CompanyId int64 // 公司ID | ||
12 | + UserId int64 // 用户ID | ||
13 | + SessionId int64 // 会话ID | ||
14 | + ModelId int64 // 选择模型ID | ||
15 | + Author User // 作者 | ||
16 | + ContentType string // 内容类型 文本:text (图片:image 文档:document) | ||
17 | + ProblemText string // 问题文本 | ||
18 | + AnswerText string // 回答文本 | ||
19 | + Metadata Metadata // 记录元数据 | ||
20 | + Cost int64 // 花费时间 单位毫秒 | ||
21 | + Status string // 状态 处理中:processing 超时:finished_timeout 结束成功:finished_fail 结束失败:finished_success | ||
22 | + CreatedAt int64 `json:",omitempty"` | ||
23 | + UpdatedAt int64 `json:",omitempty"` | ||
24 | + DeletedAt int64 `json:",omitempty"` | ||
25 | + Version int `json:",omitempty"` | ||
26 | +} | ||
27 | + | ||
28 | +const ( | ||
29 | + Processing = "processing" | ||
30 | + FinishedTimeout = "finished_timeout" | ||
31 | + FinishedFail = "finished_fail" | ||
32 | + FinishedSuccess = "finished_success" | ||
33 | +) | ||
34 | + | ||
35 | +type User struct { | ||
36 | + Id int64 | ||
37 | + Name string | ||
38 | + Avatar string | ||
39 | + Role string // 角色类型 用户:user 模型:model | ||
40 | +} | ||
41 | + | ||
42 | +type Metadata struct { | ||
43 | + FailReason string // 失败原因 | ||
44 | +} | ||
45 | + | ||
46 | +type ChatSessionRecordRepository interface { | ||
47 | + Insert(ctx context.Context, conn transaction.Conn, dm *ChatSessionRecord) (*ChatSessionRecord, error) | ||
48 | + Update(ctx context.Context, conn transaction.Conn, dm *ChatSessionRecord) (*ChatSessionRecord, error) | ||
49 | + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ChatSessionRecord) (*ChatSessionRecord, error) | ||
50 | + Delete(ctx context.Context, conn transaction.Conn, dm *ChatSessionRecord) (*ChatSessionRecord, error) | ||
51 | + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ChatSessionRecord, error) | ||
52 | + FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*ChatSessionRecord, error) | ||
53 | + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ChatSessionRecord, error) | ||
54 | + FindByCompanyUser(ctx context.Context, conn transaction.Conn, companyId, userId int64, queryOptions map[string]interface{}) (int64, []*ChatSessionRecord, error) | ||
55 | +} |
1 | +package domain | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "fmt" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" | ||
7 | + "reflect" | ||
8 | +) | ||
9 | + | ||
10 | +func OffsetLimit(page, size int) (offset int, limit int) { | ||
11 | + if page == 0 { | ||
12 | + page = 1 | ||
13 | + } | ||
14 | + if size == 0 { | ||
15 | + size = 20 | ||
16 | + } | ||
17 | + offset = (page - 1) * size | ||
18 | + limit = size | ||
19 | + return | ||
20 | +} | ||
21 | + | ||
22 | +type QueryOptions map[string]interface{} | ||
23 | + | ||
24 | +func NewQueryOptions() QueryOptions { | ||
25 | + options := make(map[string]interface{}) | ||
26 | + return options | ||
27 | +} | ||
28 | +func (options QueryOptions) WithOffsetLimit(page, size int) QueryOptions { | ||
29 | + offset, limit := OffsetLimit(page, size) | ||
30 | + options["offset"] = offset | ||
31 | + options["limit"] = limit | ||
32 | + return options | ||
33 | +} | ||
34 | + | ||
35 | +func (options QueryOptions) WithKV(key string, value interface{}) QueryOptions { | ||
36 | + if isEmptyOrZeroValue(value) { | ||
37 | + return options | ||
38 | + } | ||
39 | + options[key] = value | ||
40 | + return options | ||
41 | +} | ||
42 | + | ||
43 | +func isEmptyOrZeroValue(i interface{}) bool { | ||
44 | + if i == nil { | ||
45 | + return true // 如果接口为空,返回true | ||
46 | + } | ||
47 | + // 使用反射判断接口的值是否为零值 | ||
48 | + v := reflect.ValueOf(i) | ||
49 | + switch v.Kind() { | ||
50 | + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: | ||
51 | + return v.Len() == 0 | ||
52 | + case reflect.Bool: | ||
53 | + return !v.Bool() | ||
54 | + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||
55 | + return v.Int() == 0 | ||
56 | + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | ||
57 | + return v.Uint() == 0 | ||
58 | + case reflect.Float32, reflect.Float64: | ||
59 | + return v.Float() == 0 | ||
60 | + case reflect.Interface, reflect.Ptr: | ||
61 | + return v.IsNil() | ||
62 | + default: | ||
63 | + return false // 其他类型默认不为空 | ||
64 | + } | ||
65 | +} | ||
66 | + | ||
67 | +func (options QueryOptions) MustWithKV(key string, value interface{}) QueryOptions { | ||
68 | + options[key] = value | ||
69 | + return options | ||
70 | +} | ||
71 | + | ||
72 | +func (options QueryOptions) Copy() QueryOptions { | ||
73 | + newOptions := NewQueryOptions() | ||
74 | + for k, v := range options { | ||
75 | + newOptions[k] = v | ||
76 | + } | ||
77 | + return newOptions | ||
78 | +} | ||
79 | + | ||
80 | +type IndexQueryOptionFunc func() QueryOptions | ||
81 | + | ||
82 | +// 自定义的一些查询条件 | ||
83 | + | ||
84 | +func (options QueryOptions) WithCountOnly() QueryOptions { | ||
85 | + options["countOnly"] = true | ||
86 | + return options | ||
87 | +} | ||
88 | +func (options QueryOptions) WithFindOnly() QueryOptions { | ||
89 | + options["findOnly"] = true | ||
90 | + return options | ||
91 | +} | ||
92 | + | ||
93 | +func LazyLoad[K comparable, T any](source map[K]T, ctx context.Context, conn transaction.Conn, k K, load func(context.Context, transaction.Conn, K) (T, error)) (T, error) { | ||
94 | + if isEmptyOrZeroValue(k) { | ||
95 | + var t T | ||
96 | + return t, fmt.Errorf("empty key ‘%v’", k) | ||
97 | + } | ||
98 | + if v, ok := source[k]; ok { | ||
99 | + return v, nil | ||
100 | + } | ||
101 | + if v, err := load(ctx, conn, k); err != nil { | ||
102 | + return v, err | ||
103 | + } else { | ||
104 | + source[k] = v | ||
105 | + return v, nil | ||
106 | + } | ||
107 | +} | ||
108 | + | ||
109 | +func Values[T any, V any](list []T, each func(item T) V) []V { | ||
110 | + var result []V | ||
111 | + for _, item := range list { | ||
112 | + value := each(item) | ||
113 | + result = append(result, value) | ||
114 | + } | ||
115 | + return result | ||
116 | +} |
cmd/ep/chat/internal/pkg/domain/vars.go
0 → 100644
cmd/ep/system/Makefile
0 → 100644
1 | +.PHONY: model | ||
2 | +model: | ||
3 | + goctl model mysql ddl -s .\cmd\ep\system\deploy\database\table.sql -d cmd/ep/system | ||
4 | + | ||
5 | +.PHONY: api | ||
6 | +api: | ||
7 | + goctl api go -api .\cmd\ep\system\dsl\core.api -dir cmd/ep/system/api -style go_zero | ||
8 | + | ||
9 | +.PHONY: swagger | ||
10 | +swagger: | ||
11 | + goctl api plugin -plugin goctl-swagger="swagger -filename core.json" -api .\cmd\ep\system\dsl\core.api -dir .\cmd\ep\system\generate | ||
12 | + | ||
13 | +.PHONY: build | ||
14 | +build: | ||
15 | + docker build -f cmd/ep/system/deploy/docker/Dockerfile -t sumicro/system:1.0.0 . |
cmd/ep/system/api/core.go
0 → 100644
1 | +package main | ||
2 | + | ||
3 | +import ( | ||
4 | + "flag" | ||
5 | + "fmt" | ||
6 | + "github.com/zeromicro/go-zero/core/logx" | ||
7 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/config" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/db" | ||
12 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain" | ||
13 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/gateway/smslib" | ||
14 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" | ||
15 | + "net/http" | ||
16 | + | ||
17 | + "github.com/zeromicro/go-zero/core/conf" | ||
18 | + "github.com/zeromicro/go-zero/rest" | ||
19 | +) | ||
20 | + | ||
21 | +var configFile = flag.String("f", "etc/core.yaml", "the config file") | ||
22 | + | ||
23 | +func main() { | ||
24 | + flag.Parse() | ||
25 | + | ||
26 | + var c config.Config | ||
27 | + conf.MustLoad(*configFile, &c) | ||
28 | + | ||
29 | + // 系统设置 | ||
30 | + systemSetup(c) | ||
31 | + | ||
32 | + // 服务初始化 | ||
33 | + opts := make([]rest.RunOption, 0) | ||
34 | + opts = append(opts, rest.WithCustomCors(func(header http.Header) { | ||
35 | + header.Set("Access-Control-Allow-Headers", "*") | ||
36 | + }, func(writer http.ResponseWriter) { | ||
37 | + | ||
38 | + })) | ||
39 | + opts = append(opts, rest.WithUnauthorizedCallback(func(w http.ResponseWriter, r *http.Request, err error) { | ||
40 | + if err != nil { | ||
41 | + logx.Debugf("unauthorized: %s \n", err.Error()) | ||
42 | + } | ||
43 | + httpx.WriteJson(w, http.StatusUnauthorized, xerr.Error(xerr.TokenExpireError, err.Error())) | ||
44 | + return | ||
45 | + })) | ||
46 | + | ||
47 | + server := rest.MustNewServer(c.RestConf, opts...) | ||
48 | + defer server.Stop() | ||
49 | + | ||
50 | + ctx := svc.NewServiceContext(c) | ||
51 | + handler.RegisterHandlers(server, ctx) | ||
52 | + server.AddRoutes(RoutersOpenapi(ctx)) | ||
53 | + | ||
54 | + // 数据迁移 | ||
55 | + if c.Migrate { | ||
56 | + db.Migrate(ctx.DB) | ||
57 | + } | ||
58 | + | ||
59 | + fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port) | ||
60 | + server.Start() | ||
61 | +} | ||
62 | + | ||
63 | +func systemSetup(c config.Config) { | ||
64 | + // 初始化Domain里面的配置 | ||
65 | + domain.ProjectName = c.Name | ||
66 | + | ||
67 | + // 系统错误应答包装 | ||
68 | + httpx.SetErrorHandlerCtx(xerr.ErrorHandlerCtx) | ||
69 | + | ||
70 | + // 系统成功应答包装 | ||
71 | + httpx.SetOkHandler(xerr.OkHandlerCtx) | ||
72 | +} | ||
73 | + | ||
74 | +func RoutersOpenapi(svc *svc.ServiceContext) []rest.Route { | ||
75 | + return []rest.Route{ | ||
76 | + { | ||
77 | + Method: http.MethodPost, | ||
78 | + Path: "/openapi/sms/send-sms-code", | ||
79 | + Handler: smslib.SendSmsCodeHandler(svc.SmsService), | ||
80 | + }, | ||
81 | + } | ||
82 | +} |
cmd/ep/system/api/etc/core.yaml
0 → 100644
1 | +Name: sumicro-system | ||
2 | +Host: 0.0.0.0 | ||
3 | +Port: 8080 | ||
4 | + | ||
5 | +Verbose: false | ||
6 | +Migrate: true | ||
7 | +Timeout: 30000 | ||
8 | +LogRequest: true # 记录详细请求日志 | ||
9 | + | ||
10 | +Log: | ||
11 | + #Mode: file | ||
12 | + Encoding: plain | ||
13 | + Level: debug # info | ||
14 | + MaxSize: 1 # 2MB | ||
15 | + TimeFormat: 2006-01-02 15:04:05 | ||
16 | + Rotation: size | ||
17 | + MaxContentLength: 10240 | ||
18 | + | ||
19 | +SystemAuth: | ||
20 | + AccessSecret: su-platform | ||
21 | + AccessExpire: 360000 | ||
22 | + | ||
23 | +Redis: | ||
24 | + Host: 127.0.0.1:6379 | ||
25 | + Type: node | ||
26 | + Pass: | ||
27 | +DB: | ||
28 | + DataSource: host=114.55.200.59 user=postgres password=eagle1010 dbname=su_enterprise_platform port=31543 sslmode=disable TimeZone=Asia/Shanghai |
cmd/ep/system/api/internal/config/config.go
0 → 100644
1 | +package config | ||
2 | + | ||
3 | +import ( | ||
4 | + "github.com/zeromicro/go-zero/core/stores/redis" | ||
5 | + "github.com/zeromicro/go-zero/rest" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/config" | ||
7 | +) | ||
8 | + | ||
9 | +type Config struct { | ||
10 | + rest.RestConf | ||
11 | + config.Config | ||
12 | + Redis redis.RedisConf `json:",optional"` | ||
13 | + SystemAuth config.Auth | ||
14 | + DebugSmsCode string `json:",optional,default=999512"` | ||
15 | +} |
1 | +package auth | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/auth" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func SystemAuthLoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.AuthLoginRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := auth.NewSystemAuthLoginLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.SystemAuthLogin(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package auth | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/auth" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func SystemAuthRegisterHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.CompanyRegisterRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := auth.NewSystemAuthRegisterLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.SystemAuthRegister(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package auth | ||
2 | + | ||
3 | +import ( | ||
4 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" | ||
5 | + "net/http" | ||
6 | + | ||
7 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/auth" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" | ||
11 | +) | ||
12 | + | ||
13 | +func SystemAuthUserInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
14 | + return func(w http.ResponseWriter, r *http.Request) { | ||
15 | + var req types.UserInfoRequest | ||
16 | + if err := httpx.Parse(r, &req); err != nil { | ||
17 | + httpx.ErrorCtx(r.Context(), w, err) | ||
18 | + return | ||
19 | + } | ||
20 | + | ||
21 | + token := contextdata.GetUserTokenFromCtx(r.Context()) | ||
22 | + req.UserId = token.UserId | ||
23 | + req.CompanyId = token.CompanyId | ||
24 | + req.EmployeeId = token.EmployeeId | ||
25 | + l := auth.NewSystemAuthUserInfoLogic(r.Context(), svcCtx) | ||
26 | + resp, err := l.SystemAuthUserInfo(&req) | ||
27 | + if err != nil { | ||
28 | + httpx.ErrorCtx(r.Context(), w, err) | ||
29 | + } else { | ||
30 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
31 | + } | ||
32 | + } | ||
33 | +} |
1 | +package department | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/department" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func SystemDepartmentBatchDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.DepartmentBatchDeleteRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := department.NewSystemDepartmentBatchDeleteLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.SystemDepartmentBatchDelete(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package department | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/department" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func SystemDepartmentDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.DepartmentDeleteRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := department.NewSystemDepartmentDeleteLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.SystemDepartmentDelete(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package department | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/department" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func SystemDepartmentExportHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.DepartmentSearchRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := department.NewSystemDepartmentExportLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.SystemDepartmentExport(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package department | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/department" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func SystemDepartmentGetHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.DepartmentGetRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := department.NewSystemDepartmentGetLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.SystemDepartmentGet(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
1 | +package department | ||
2 | + | ||
3 | +import ( | ||
4 | + "net/http" | ||
5 | + | ||
6 | + "github.com/zeromicro/go-zero/rest/httpx" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/department" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" | ||
10 | +) | ||
11 | + | ||
12 | +func SystemDepartmentImportHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | ||
13 | + return func(w http.ResponseWriter, r *http.Request) { | ||
14 | + var req types.DepartmentImportRequest | ||
15 | + if err := httpx.Parse(r, &req); err != nil { | ||
16 | + httpx.ErrorCtx(r.Context(), w, err) | ||
17 | + return | ||
18 | + } | ||
19 | + | ||
20 | + l := department.NewSystemDepartmentImportLogic(r.Context(), svcCtx) | ||
21 | + resp, err := l.SystemDepartmentImport(&req) | ||
22 | + if err != nil { | ||
23 | + httpx.ErrorCtx(r.Context(), w, err) | ||
24 | + } else { | ||
25 | + httpx.OkJsonCtx(r.Context(), w, resp) | ||
26 | + } | ||
27 | + } | ||
28 | +} |
-
请 注册 或 登录 后发表评论