作者 yangfu

feat-1.0 chat doc

正在显示 84 个修改的文件 包含 5073 行增加223 行删除
@@ -8,7 +8,7 @@ Timeout: 30000 @@ -8,7 +8,7 @@ Timeout: 30000
8 LogRequest: true # 记录详细请求日志 8 LogRequest: true # 记录详细请求日志
9 9
10 Log: 10 Log:
11 - Mode: file 11 + #Mode: file
12 Encoding: plain 12 Encoding: plain
13 Level: debug # info 13 Level: debug # info
14 MaxSize: 1 # 2MB 14 MaxSize: 1 # 2MB
  1 +package chat
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  11 +)
  12 +
  13 +func ChatMySparkSessionsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.ChatSessionSearchRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := chat.NewChatSessionSearchLogic(r.Context(), svcCtx)
  22 + req.Module = domain.ModuleSparkChat
  23 + resp, err := l.ChatSessionSearch(&req)
  24 + if err != nil {
  25 + httpx.ErrorCtx(r.Context(), w, err)
  26 + } else {
  27 + httpx.OkJsonCtx(r.Context(), w, resp)
  28 + }
  29 + }
  30 +}
1 package chat 1 package chat
2 2
3 import ( 3 import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain"
4 "net/http" 5 "net/http"
5 6
6 "github.com/zeromicro/go-zero/rest/httpx" 7 "github.com/zeromicro/go-zero/rest/httpx"
@@ -18,6 +19,8 @@ func ChatSessionSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { @@ -18,6 +19,8 @@ func ChatSessionSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
18 } 19 }
19 20
20 l := chat.NewChatSessionSaveLogic(r.Context(), svcCtx) 21 l := chat.NewChatSessionSaveLogic(r.Context(), svcCtx)
  22 + req.ChatSession.Module = domain.ModuleOpenaiChat
  23 + req.ChatSession.Type = domain.TypeChat
21 resp, err := l.ChatSessionSave(&req) 24 resp, err := l.ChatSessionSave(&req)
22 if err != nil { 25 if err != nil {
23 httpx.ErrorCtx(r.Context(), w, err) 26 httpx.ErrorCtx(r.Context(), w, err)
1 package chat 1 package chat
2 2
3 import ( 3 import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain"
4 "net/http" 5 "net/http"
5 6
6 "github.com/zeromicro/go-zero/rest/httpx" 7 "github.com/zeromicro/go-zero/rest/httpx"
@@ -18,6 +19,7 @@ func ChatSessionSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { @@ -18,6 +19,7 @@ func ChatSessionSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
18 } 19 }
19 20
20 l := chat.NewChatSessionSearchLogic(r.Context(), svcCtx) 21 l := chat.NewChatSessionSearchLogic(r.Context(), svcCtx)
  22 + req.Module = domain.ModuleOpenaiChat
21 resp, err := l.ChatSessionSearch(&req) 23 resp, err := l.ChatSessionSearch(&req)
22 if err != nil { 24 if err != nil {
23 httpx.ErrorCtx(r.Context(), w, err) 25 httpx.ErrorCtx(r.Context(), w, err)
  1 +package chat
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  6 + "net/http"
  7 +
  8 + "github.com/zeromicro/go-zero/rest/httpx"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/logic/chat"
  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 +
  14 +func ChatSparkSessionSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  15 + return func(w http.ResponseWriter, r *http.Request) {
  16 + var req types.ChatSessionSaveRequest
  17 + if err := httpx.Parse(r, &req); err != nil {
  18 + httpx.ErrorCtx(r.Context(), w, err)
  19 + return
  20 + }
  21 +
  22 + l := chat.NewChatSessionSaveLogic(r.Context(), svcCtx)
  23 + req.ChatSession.Module = domain.ModuleSparkChat
  24 + if req.ChatSession.DatasetId > 0 {
  25 + req.ChatSession.Type = domain.TypeSparkDatasetChat
  26 + } else if len(req.ChatSession.DocumentIds) > 0 {
  27 + req.ChatSession.Type = domain.TypeSparkDocumentsChat
  28 + } else {
  29 + httpx.ErrorCtx(r.Context(), w, xerr.NewErrMsgErr("知识库、文档至少选一个", nil))
  30 + return
  31 + }
  32 + resp, err := l.ChatSessionSave(&req)
  33 + if err != nil {
  34 + httpx.ErrorCtx(r.Context(), w, err)
  35 + } else {
  36 + httpx.OkJsonCtx(r.Context(), w, resp)
  37 + }
  38 + }
  39 +}
  1 +package dataset
  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/dataset"
  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 ChatDatasetDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDatasetDeleteRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := dataset.NewChatDatasetDeleteLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDatasetDelete(&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 dataset
  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/dataset"
  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 ChatDatasetGetHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDatasetGetRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := dataset.NewChatDatasetGetLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDatasetGet(&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 dataset
  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/dataset"
  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 ChatDatasetRenameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDatasetRenameRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := dataset.NewChatDatasetRenameLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDatasetRename(&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 dataset
  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/dataset"
  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 ChatDatasetSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDatasetSaveRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := dataset.NewChatDatasetSaveLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDatasetSave(&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 dataset
  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/dataset"
  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 ChatDatasetSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDatasetSearchRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := dataset.NewChatDatasetSearchLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDatasetSearch(&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 dataset
  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/dataset"
  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 ChatDatasetUpdateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDatasetUpdateRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := dataset.NewChatDatasetUpdateLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDatasetUpdate(&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 document
  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/document"
  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 ChatDocumentDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDocumentDeleteRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := document.NewChatDocumentDeleteLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDocumentDelete(&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 document
  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/document"
  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 ChatDocumentGetHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDocumentGetRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := document.NewChatDocumentGetLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDocumentGet(&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 document
  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/document"
  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 ChatDocumentRenameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDocumentRenameRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := document.NewChatDocumentRenameLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDocumentRename(&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 document
  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/document"
  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 ChatDocumentSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDocumentSaveRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := document.NewChatDocumentSaveLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDocumentSave(&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 document
  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/document"
  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 ChatDocumentSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChatDocumentSearchRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := document.NewChatDocumentSearchLogic(r.Context(), svcCtx)
  21 + resp, err := l.ChatDocumentSearch(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
@@ -5,6 +5,8 @@ import ( @@ -5,6 +5,8 @@ import (
5 "net/http" 5 "net/http"
6 6
7 chat "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/handler/chat" 7 chat "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/handler/chat"
  8 + dataset "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/handler/dataset"
  9 + document "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/handler/document"
8 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc" 10 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
9 11
10 "github.com/zeromicro/go-zero/rest" 12 "github.com/zeromicro/go-zero/rest"
@@ -52,6 +54,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -52,6 +54,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
52 }, 54 },
53 { 55 {
54 Method: http.MethodPost, 56 Method: http.MethodPost,
  57 + Path: "/chat/session/my_spark_sessions",
  58 + Handler: chat.ChatMySparkSessionsHandler(serverCtx),
  59 + },
  60 + {
  61 + Method: http.MethodPost,
  62 + Path: "/chat/spark_session",
  63 + Handler: chat.ChatSparkSessionSaveHandler(serverCtx),
  64 + },
  65 + {
  66 + Method: http.MethodPost,
55 Path: "/chat/session/records", 67 Path: "/chat/session/records",
56 Handler: chat.ChatSessionRecordsHandler(serverCtx), 68 Handler: chat.ChatSessionRecordsHandler(serverCtx),
57 }, 69 },
@@ -65,4 +77,79 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -65,4 +77,79 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
65 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), 77 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
66 rest.WithPrefix("/v1"), 78 rest.WithPrefix("/v1"),
67 ) 79 )
  80 +
  81 + server.AddRoutes(
  82 + rest.WithMiddlewares(
  83 + []rest.Middleware{serverCtx.LogRequest},
  84 + []rest.Route{
  85 + {
  86 + Method: http.MethodGet,
  87 + Path: "/chat/document/:id",
  88 + Handler: document.ChatDocumentGetHandler(serverCtx),
  89 + },
  90 + {
  91 + Method: http.MethodPost,
  92 + Path: "/chat/document",
  93 + Handler: document.ChatDocumentSaveHandler(serverCtx),
  94 + },
  95 + {
  96 + Method: http.MethodDelete,
  97 + Path: "/chat/document/:id",
  98 + Handler: document.ChatDocumentDeleteHandler(serverCtx),
  99 + },
  100 + {
  101 + Method: http.MethodPost,
  102 + Path: "/chat/document/rename",
  103 + Handler: document.ChatDocumentRenameHandler(serverCtx),
  104 + },
  105 + {
  106 + Method: http.MethodPost,
  107 + Path: "/chat/document/search",
  108 + Handler: document.ChatDocumentSearchHandler(serverCtx),
  109 + },
  110 + }...,
  111 + ),
  112 + rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
  113 + rest.WithPrefix("/v1"),
  114 + )
  115 +
  116 + server.AddRoutes(
  117 + rest.WithMiddlewares(
  118 + []rest.Middleware{serverCtx.LogRequest},
  119 + []rest.Route{
  120 + {
  121 + Method: http.MethodGet,
  122 + Path: "/chat/dataset/:id",
  123 + Handler: dataset.ChatDatasetGetHandler(serverCtx),
  124 + },
  125 + {
  126 + Method: http.MethodPost,
  127 + Path: "/chat/dataset",
  128 + Handler: dataset.ChatDatasetSaveHandler(serverCtx),
  129 + },
  130 + {
  131 + Method: http.MethodDelete,
  132 + Path: "/chat/dataset/:id",
  133 + Handler: dataset.ChatDatasetDeleteHandler(serverCtx),
  134 + },
  135 + {
  136 + Method: http.MethodPut,
  137 + Path: "/chat/dataset/:id",
  138 + Handler: dataset.ChatDatasetUpdateHandler(serverCtx),
  139 + },
  140 + {
  141 + Method: http.MethodPost,
  142 + Path: "/chat/dataset/rename",
  143 + Handler: dataset.ChatDatasetRenameHandler(serverCtx),
  144 + },
  145 + {
  146 + Method: http.MethodPost,
  147 + Path: "/chat/dataset/search",
  148 + Handler: dataset.ChatDatasetSearchHandler(serverCtx),
  149 + },
  150 + }...,
  151 + ),
  152 + rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
  153 + rest.WithPrefix("/v1"),
  154 + )
68 } 155 }
@@ -28,6 +28,9 @@ func NewChatModelsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatMo @@ -28,6 +28,9 @@ func NewChatModelsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatMo
28 func (l *ChatModelsLogic) ChatModels(req *types.ChatModelsRequest) (resp *types.ChatModelsResponse, err error) { 28 func (l *ChatModelsLogic) ChatModels(req *types.ChatModelsRequest) (resp *types.ChatModelsResponse, err error) {
29 var models = make([]types.Model, 0) 29 var models = make([]types.Model, 0)
30 lo.ForEach(domain.DefaultChatModels, func(item *domain.ChatModel, index int) { 30 lo.ForEach(domain.DefaultChatModels, func(item *domain.ChatModel, index int) {
  31 + if item.Id == domain.SparkChatDocModelId {
  32 + return
  33 + }
31 models = append(models, types.Model{ 34 models = append(models, types.Model{
32 Id: item.Id, 35 Id: item.Id,
33 Name: item.Name, 36 Name: item.Name,
  1 +package chat
  2 +
  3 +import (
  4 + "context"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  8 +
  9 + "github.com/zeromicro/go-zero/core/logx"
  10 +)
  11 +
  12 +type ChatMySparkSessionsLogic struct {
  13 + logx.Logger
  14 + ctx context.Context
  15 + svcCtx *svc.ServiceContext
  16 +}
  17 +
  18 +func NewChatMySparkSessionsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatMySparkSessionsLogic {
  19 + return &ChatMySparkSessionsLogic{
  20 + Logger: logx.WithContext(ctx),
  21 + ctx: ctx,
  22 + svcCtx: svcCtx,
  23 + }
  24 +}
  25 +
  26 +func (l *ChatMySparkSessionsLogic) ChatMySparkSessions(req *types.ChatSessionSearchRequest) (resp *types.ChatSessionSearchResponse, err error) {
  27 + // todo: add your logic here and delete this line
  28 +
  29 + return
  30 +}
@@ -2,10 +2,13 @@ package chat @@ -2,10 +2,13 @@ package chat
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "github.com/samber/lo"
  6 + "github.com/zeromicro/go-zero/core/fx"
5 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" 7 "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" 8 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/open"
7 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/ai" 9 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/ai"
8 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" 10 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
  11 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/tool"
9 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" 12 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
10 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" 13 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
11 "net/http" 14 "net/http"
@@ -38,7 +41,6 @@ func (l *ChatSessionConversationLogic) ChatSessionConversation(w http.ResponseWr @@ -38,7 +41,6 @@ func (l *ChatSessionConversationLogic) ChatSessionConversation(w http.ResponseWr
38 token = contextdata.GetUserTokenFromCtx(l.ctx) 41 token = contextdata.GetUserTokenFromCtx(l.ctx)
39 session *domain.ChatSession 42 session *domain.ChatSession
40 user open.User 43 user open.User
41 - model *domain.ChatModel  
42 ok bool 44 ok bool
43 beginUnix = time.Now().UnixMilli() 45 beginUnix = time.Now().UnixMilli()
44 ) 46 )
@@ -51,8 +53,8 @@ func (l *ChatSessionConversationLogic) ChatSessionConversation(w http.ResponseWr @@ -51,8 +53,8 @@ func (l *ChatSessionConversationLogic) ChatSessionConversation(w http.ResponseWr
51 if user.Id != session.UserId { 53 if user.Id != session.UserId {
52 return nil, xerr.NewErrMsgErr("无权限", err) 54 return nil, xerr.NewErrMsgErr("无权限", err)
53 } 55 }
54 - if model, ok = domain.DefaultChatModels.Match(req.ModelId); !ok {  
55 - return nil, xerr.NewErrMsgErr("模型不存在", err) 56 + if session.Module == domain.ModuleSparkChat {
  57 + req.ModelId = domain.SparkChatDocModelId
56 } 58 }
57 dm = &domain.ChatSessionRecord{ 59 dm = &domain.ChatSessionRecord{
58 CompanyId: token.CompanyId, 60 CompanyId: token.CompanyId,
@@ -69,15 +71,16 @@ func (l *ChatSessionConversationLogic) ChatSessionConversation(w http.ResponseWr @@ -69,15 +71,16 @@ func (l *ChatSessionConversationLogic) ChatSessionConversation(w http.ResponseWr
69 var answer string 71 var answer string
70 var channel = make(chan string, 5) 72 var channel = make(chan string, 5)
71 // 异步访问AI接口 73 // 异步访问AI接口
72 - go func() {  
73 - // 异步访问AI接口  
74 - answer, err = Conversation(model, req.Text, channel)  
75 - }() 74 + fx.Parallel(func() {
  75 + answer, err = Conversation(l.ctx, l.svcCtx, session, req.ModelId, req.Text, channel)
  76 + }, func() {
76 for { 77 for {
77 if _, ok = <-channel; !ok { 78 if _, ok = <-channel; !ok {
78 break 79 break
79 } 80 }
  81 + logx.Info(1)
80 } 82 }
  83 + })
81 if err != nil { 84 if err != nil {
82 return nil, xerr.NewErrMsgErr("AI模型异常,稍后再试", err) 85 return nil, xerr.NewErrMsgErr("AI模型异常,稍后再试", err)
83 } 86 }
@@ -101,17 +104,63 @@ func (l *ChatSessionConversationLogic) ChatSessionConversation(w http.ResponseWr @@ -101,17 +104,63 @@ func (l *ChatSessionConversationLogic) ChatSessionConversation(w http.ResponseWr
101 return 104 return
102 } 105 }
103 106
104 -func Conversation(m *domain.ChatModel, text string, channel chan string) (answer string, err error) {  
105 - 107 +// Conversation 普通对话
  108 +func Conversation(ctx context.Context, svc *svc.ServiceContext, session *domain.ChatSession, modelId int64, text string, channel chan string) (answer string, err error) {
  109 + var (
  110 + m *domain.ChatModel
  111 + ok bool
  112 + )
  113 + defer close(channel)
  114 + if m, ok = domain.DefaultChatModels.Match(modelId); !ok {
  115 + err = xerr.NewErrMsgErr("模型不存在", err)
  116 + return
  117 + }
  118 + if session.Module == domain.ModuleSparkChat {
  119 + return SparkDocumentConversation(ctx, svc, session, m, text, channel)
  120 + }
106 switch m.Id { 121 switch m.Id {
107 // 星火3.5 122 // 星火3.5
108 case 1, 2, 3: 123 case 1, 2, 3:
109 answer, err = ai.ChatGPT(m.Code, m.Config.AppKey, text, channel) 124 answer, err = ai.ChatGPT(m.Code, m.Config.AppKey, text, channel)
110 case 4: 125 case 4:
111 - answer, err = ai.Spark(m.Config.AppId, m.Config.AppKey, m.Config.AppSecret, text, channel) 126 + answer, err = ai.ChatSpark(m.Config.AppId, m.Config.AppKey, m.Config.AppSecret, text, channel)
112 } 127 }
113 if err != nil { 128 if err != nil {
114 return "", err 129 return "", err
115 } 130 }
116 return 131 return
117 } 132 }
  133 +
  134 +// SparkDocumentConversation 星火文档对话
  135 +func SparkDocumentConversation(ctx context.Context, svcCtx *svc.ServiceContext, session *domain.ChatSession, m *domain.ChatModel, text string, channel chan string) (answer string, err error) {
  136 + var (
  137 + conn = svcCtx.DefaultDBConn()
  138 + )
  139 + // 获取文件ID列表
  140 + fileIds := make([]string, 0)
  141 + lazyDocument := tool.NewLazyLoadService(svcCtx.ChatDocumentRepository.FindOne)
  142 + if session.Type == domain.TypeSparkDatasetChat { // 知识库
  143 + _, documentMapping, _ := svcCtx.ChatDatasetDocumentMappingRepository.FindByDataset(ctx, conn, session.Metadata.DatasetId)
  144 + lo.ForEach(documentMapping, func(item *domain.ChatDatasetDocumentMapping, index int) {
  145 + if document, _ := lazyDocument.Load(ctx, conn, item.DocumentId); document != nil {
  146 + if len(document.Metadata.FileId) == 0 {
  147 + return
  148 + }
  149 + fileIds = append(fileIds, document.Metadata.FileId)
  150 + }
  151 + })
  152 + } else if session.Type == domain.TypeSparkDocumentsChat { // 多文档
  153 + lo.ForEach(session.Metadata.DocumentIds, func(item int64, index int) {
  154 + if document, _ := lazyDocument.Load(ctx, conn, item); document != nil {
  155 + if len(document.Metadata.FileId) == 0 {
  156 + return
  157 + }
  158 + fileIds = append(fileIds, document.Metadata.FileId)
  159 + }
  160 + })
  161 + }
  162 +
  163 + // 对话
  164 + c := m.Config
  165 + return ai.ChatSparkDocument(c.AppId, c.AppKey, c.AppSecret, fileIds, text, channel)
  166 +}
@@ -40,7 +40,6 @@ func (l *ChatSessionConversationWsLogic) ChatSessionConversationWs(w http.Respon @@ -40,7 +40,6 @@ func (l *ChatSessionConversationWsLogic) ChatSessionConversationWs(w http.Respon
40 token = contextdata.GetUserTokenFromCtx(l.ctx) 40 token = contextdata.GetUserTokenFromCtx(l.ctx)
41 session *domain.ChatSession 41 session *domain.ChatSession
42 user open.User 42 user open.User
43 - model *domain.ChatModel  
44 ok bool 43 ok bool
45 ) 44 )
46 if session, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.SessionId); err != nil { 45 if session, err = l.svcCtx.ChatSessionRepository.FindOne(l.ctx, conn, req.SessionId); err != nil {
@@ -52,12 +51,10 @@ func (l *ChatSessionConversationWsLogic) ChatSessionConversationWs(w http.Respon @@ -52,12 +51,10 @@ func (l *ChatSessionConversationWsLogic) ChatSessionConversationWs(w http.Respon
52 if user.Id != session.UserId { 51 if user.Id != session.UserId {
53 return nil, xerr.NewErrMsgErr("无权限", err) 52 return nil, xerr.NewErrMsgErr("无权限", err)
54 } 53 }
55 - if model, ok = domain.DefaultChatModels.Match(req.ModelId); !ok {  
56 - return nil, xerr.NewErrMsgErr("模型不存在", err) 54 + if session.Module == domain.ModuleSparkChat {
  55 + req.ModelId = domain.SparkChatDocModelId
57 } 56 }
58 -  
59 var answer string 57 var answer string
60 -  
61 var upgrader = websocket.Upgrader{ 58 var upgrader = websocket.Upgrader{
62 ReadBufferSize: 1024, 59 ReadBufferSize: 1024,
63 WriteBufferSize: 1024, 60 WriteBufferSize: 1024,
@@ -96,7 +93,7 @@ func (l *ChatSessionConversationWsLogic) ChatSessionConversationWs(w http.Respon @@ -96,7 +93,7 @@ func (l *ChatSessionConversationWsLogic) ChatSessionConversationWs(w http.Respon
96 } 93 }
97 fx.Parallel(func() { 94 fx.Parallel(func() {
98 // 异步访问AI接口 95 // 异步访问AI接口
99 - answer, err = Conversation(model, string(text), channel) 96 + answer, err = Conversation(l.ctx, l.svcCtx, session, req.ModelId, string(text), channel)
100 }, func() { 97 }, func() {
101 for { 98 for {
102 var v string 99 var v string
@@ -6,6 +6,7 @@ import ( @@ -6,6 +6,7 @@ import (
6 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata" 6 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
7 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction" 7 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
8 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" 8 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  9 + "time"
9 10
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/svc"
11 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" 12 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
@@ -39,7 +40,9 @@ func (l *ChatSessionSaveLogic) ChatSessionSave(req *types.ChatSessionSaveRequest @@ -39,7 +40,9 @@ func (l *ChatSessionSaveLogic) ChatSessionSave(req *types.ChatSessionSaveRequest
39 }, true); err != nil { 40 }, true); err != nil {
40 return nil, xerr.NewErrMsg("保存失败") 41 return nil, xerr.NewErrMsg("保存失败")
41 } 42 }
42 - resp = &types.ChatSessionSaveResponse{} 43 + resp = &types.ChatSessionSaveResponse{
  44 + ChatSession: NewTypesChatSession(dm),
  45 + }
43 return 46 return
44 } 47 }
45 48
@@ -53,6 +56,13 @@ func NewDomainChatSession(token contextdata.UserToken, item types.ChatSessionIte @@ -53,6 +56,13 @@ func NewDomainChatSession(token contextdata.UserToken, item types.ChatSessionIte
53 UserId: token.UserId, 56 UserId: token.UserId,
54 Title: title, 57 Title: title,
55 Abstract: title, 58 Abstract: title,
  59 + Module: item.Module,
  60 + Type: item.Type,
  61 + Metadata: &domain.SessionMetadata{
  62 + DatasetId: item.DatasetId,
  63 + DocumentIds: item.DocumentIds,
  64 + },
  65 + Rank: time.Now().Unix(),
56 } 66 }
57 } 67 }
58 68
@@ -4,6 +4,7 @@ import ( @@ -4,6 +4,7 @@ import (
4 "context" 4 "context"
5 "fmt" 5 "fmt"
6 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain" 6 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
7 8
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/svc"
9 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types" 10 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
@@ -30,11 +31,16 @@ func (l *ChatSessionSearchLogic) ChatSessionSearch(req *types.ChatSessionSearchR @@ -30,11 +31,16 @@ func (l *ChatSessionSearchLogic) ChatSessionSearch(req *types.ChatSessionSearchR
30 conn = l.svcCtx.DefaultDBConn() 31 conn = l.svcCtx.DefaultDBConn()
31 dms []*domain.ChatSession 32 dms []*domain.ChatSession
32 total int64 33 total int64
  34 + token = contextdata.GetUserTokenFromCtx(l.ctx)
33 ) 35 )
34 36
35 queryOptions := domain.NewQueryOptions(). 37 queryOptions := domain.NewQueryOptions().
36 - WithKV("title", fmt.Sprintf("%%%v%%", req.Title))  
37 - 38 + WithKV("module", req.Module).
  39 + WithKV("companyId", token.CompanyId).
  40 + WithKV("userId", token.UserId)
  41 + if req.Title != "" {
  42 + queryOptions.WithKV("title", fmt.Sprintf("%%%v%%", req.Title))
  43 + }
38 if req.Page != 0 && req.Size != 0 { 44 if req.Page != 0 && req.Size != 0 {
39 queryOptions.WithOffsetLimit(req.Page, req.Size) 45 queryOptions.WithOffsetLimit(req.Page, req.Size)
40 } 46 }
  1 +package chat
  2 +
  3 +import (
  4 + "context"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  8 +
  9 + "github.com/zeromicro/go-zero/core/logx"
  10 +)
  11 +
  12 +type ChatSparkSessionSaveLogic struct {
  13 + logx.Logger
  14 + ctx context.Context
  15 + svcCtx *svc.ServiceContext
  16 +}
  17 +
  18 +func NewChatSparkSessionSaveLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatSparkSessionSaveLogic {
  19 + return &ChatSparkSessionSaveLogic{
  20 + Logger: logx.WithContext(ctx),
  21 + ctx: ctx,
  22 + svcCtx: svcCtx,
  23 + }
  24 +}
  25 +
  26 +func (l *ChatSparkSessionSaveLogic) ChatSparkSessionSave(req *types.ChatSessionSaveRequest) (resp *types.ChatSessionSaveResponse, err error) {
  27 + // todo: add your logic here and delete this line
  28 +
  29 + return
  30 +}
  1 +package dataset
  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/transaction"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type ChatDatasetDeleteLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewChatDatasetDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDatasetDeleteLogic {
  22 + return &ChatDatasetDeleteLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *ChatDatasetDeleteLogic) ChatDatasetDelete(req *types.ChatDatasetDeleteRequest) (resp *types.ChatDatasetDeleteResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + dm *domain.ChatDataset
  33 + )
  34 + if dm, err = l.svcCtx.ChatDatasetRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  38 + if dm, err = l.svcCtx.ChatDatasetRepository.Delete(l.ctx, conn, dm); err != nil {
  39 + return err
  40 + }
  41 + // 删除document & dataset 关联
  42 + if err = l.svcCtx.ChatDatasetDocumentMappingRepository.DeleteByDataset(l.ctx, conn, dm.Id); err != nil {
  43 + return err
  44 + }
  45 + return nil
  46 + }, true); err != nil {
  47 + return nil, xerr.NewErrMsgErr("移除失败", err)
  48 + }
  49 + resp = &types.ChatDatasetDeleteResponse{}
  50 + return
  51 +}
  1 +package dataset
  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/pkg/tool"
  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 ChatDatasetGetLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewChatDatasetGetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDatasetGetLogic {
  23 + return &ChatDatasetGetLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *ChatDatasetGetLogic) ChatDatasetGet(req *types.ChatDatasetGetRequest) (resp *types.ChatDatasetGetResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + dm *domain.ChatDataset
  34 + documentMapping []*domain.ChatDatasetDocumentMapping
  35 + )
  36 + // 货号唯一
  37 + if dm, err = l.svcCtx.ChatDatasetRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  38 + return nil, xerr.NewErrMsgErr("不存在", err)
  39 + }
  40 + documents := make([]types.ChatDocumentItem, 0)
  41 + _, documentMapping, _ = l.svcCtx.ChatDatasetDocumentMappingRepository.FindByDataset(l.ctx, conn, dm.Id)
  42 + lazyDocument := tool.NewLazyLoadService(l.svcCtx.ChatDocumentRepository.FindOne)
  43 + lo.ForEach(documentMapping, func(item *domain.ChatDatasetDocumentMapping, index int) {
  44 + if document, _ := lazyDocument.Load(l.ctx, conn, item.DocumentId); document != nil {
  45 + documents = append(documents, types.NewTypesChatDocument(document))
  46 + }
  47 + })
  48 + resp = &types.ChatDatasetGetResponse{
  49 + ChatDataset: NewTypesChatDataset(dm, nil),
  50 + Documents: documents,
  51 + }
  52 + return
  53 +}
  1 +package dataset
  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/transaction"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type ChatDatasetRenameLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewChatDatasetRenameLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDatasetRenameLogic {
  22 + return &ChatDatasetRenameLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *ChatDatasetRenameLogic) ChatDatasetRename(req *types.ChatDatasetRenameRequest) (resp *types.ChatDatasetRenameResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + dm *domain.ChatDataset
  33 + )
  34 + if dm, err = l.svcCtx.ChatDatasetRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + // 赋值
  38 + if req.Name != "" {
  39 + dm.Name = req.Name
  40 + }
  41 + // 更新
  42 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  43 + dm, err = l.svcCtx.ChatDatasetRepository.UpdateWithVersion(l.ctx, conn, dm)
  44 + return err
  45 + }, true); err != nil {
  46 + return nil, xerr.NewErrMsg("更新失败")
  47 + }
  48 + resp = &types.ChatDatasetRenameResponse{
  49 + ChatDataset: NewTypesChatDataset(dm, nil),
  50 + }
  51 + return
  52 +}
  1 +package dataset
  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/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  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 ChatDatasetSaveLogic struct {
  18 + logx.Logger
  19 + ctx context.Context
  20 + svcCtx *svc.ServiceContext
  21 +}
  22 +
  23 +func NewChatDatasetSaveLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDatasetSaveLogic {
  24 + return &ChatDatasetSaveLogic{
  25 + Logger: logx.WithContext(ctx),
  26 + ctx: ctx,
  27 + svcCtx: svcCtx,
  28 + }
  29 +}
  30 +
  31 +func (l *ChatDatasetSaveLogic) ChatDatasetSave(req *types.ChatDatasetSaveRequest) (resp *types.ChatDatasetSaveResponse, err error) {
  32 + var (
  33 + dm *domain.ChatDataset
  34 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  35 + )
  36 + if req.Name == "" {
  37 + req.Name = "新知识库"
  38 + }
  39 + dm = &domain.ChatDataset{
  40 + UserId: token.UserId,
  41 + CompanyId: token.CompanyId,
  42 + Name: req.Name,
  43 + Status: domain.Enable,
  44 + }
  45 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  46 + if dm, err = l.svcCtx.ChatDatasetRepository.Insert(l.ctx, conn, dm); err != nil {
  47 + return err
  48 + }
  49 + if len(req.DocumentIds) > 0 {
  50 + for _, id := range req.DocumentIds {
  51 + l.svcCtx.ChatDatasetDocumentMappingRepository.Insert(l.ctx, conn, &domain.ChatDatasetDocumentMapping{
  52 + DatasetId: dm.Id,
  53 + DocumentId: id,
  54 + })
  55 + }
  56 + }
  57 + return err
  58 + }, true); err != nil {
  59 + return nil, xerr.NewErrMsg("保存失败")
  60 + }
  61 + resp = &types.ChatDatasetSaveResponse{
  62 + ChatDataset: NewTypesChatDataset(dm, lo.ToPtr(len(req.DocumentIds))),
  63 + }
  64 + return
  65 +}
  66 +
  67 +//func NewDomainChatDataset(item types.ChatDatasetItem) *domain.ChatDataset {
  68 +// return &domain.ChatDataset{
  69 +
  70 +// }
  71 +// }
  72 +func NewTypesChatDataset(item *domain.ChatDataset, fileNum *int) types.ChatDatasetItem {
  73 + return types.ChatDatasetItem{
  74 + Id: item.Id,
  75 + Name: lo.ToPtr(item.Name),
  76 + Desc: lo.ToPtr(item.Desc),
  77 + Status: lo.ToPtr(item.Status),
  78 + CreatedAt: item.CreatedAt,
  79 + UpdatedAt: item.UpdatedAt,
  80 + FileNumber: fileNum,
  81 + }
  82 +}
  1 +package dataset
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "github.com/samber/lo"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type ChatDatasetSearchLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewChatDatasetSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDatasetSearchLogic {
  22 + return &ChatDatasetSearchLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *ChatDatasetSearchLogic) ChatDatasetSearch(req *types.ChatDatasetSearchRequest) (resp *types.ChatDatasetSearchResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + dms []*domain.ChatDataset
  33 + total int64
  34 + )
  35 +
  36 + queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size).
  37 + WithKV("status", req.Status)
  38 + if req.Name != "" {
  39 + queryOptions.WithKV("name", fmt.Sprintf("%%%v%%", req.Name))
  40 + }
  41 + total, dms, err = l.svcCtx.ChatDatasetRepository.Find(l.ctx, conn, queryOptions)
  42 + list := make([]types.ChatDatasetItem, 0)
  43 +
  44 + // 知识库关联的文档
  45 + ids := domain.Values(dms, domain.ChatDatasetId)
  46 + _, documentMappings, _ := l.svcCtx.ChatDatasetDocumentMappingRepository.FindByDataset(l.ctx, conn, ids...)
  47 + documentGroups := lo.GroupBy(documentMappings, func(item *domain.ChatDatasetDocumentMapping) int64 {
  48 + return item.DatasetId
  49 + })
  50 +
  51 + for i := range dms {
  52 + var num = 0
  53 + if v, ok := documentGroups[dms[i].Id]; ok {
  54 + num = len(v)
  55 + }
  56 + list = append(list, NewTypesChatDataset(dms[i], lo.ToPtr(num)))
  57 + }
  58 + resp = &types.ChatDatasetSearchResponse{
  59 + List: list,
  60 + Total: total,
  61 + }
  62 + return
  63 +}
  1 +package dataset
  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/transaction"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type ChatDatasetUpdateLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewChatDatasetUpdateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDatasetUpdateLogic {
  22 + return &ChatDatasetUpdateLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *ChatDatasetUpdateLogic) ChatDatasetUpdate(req *types.ChatDatasetUpdateRequest) (resp *types.ChatDatasetUpdateResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + dm *domain.ChatDataset
  33 + )
  34 + if dm, err = l.svcCtx.ChatDatasetRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + // 赋值
  38 + if req.ChatDataset.Name != nil {
  39 + dm.Name = *req.ChatDataset.Name
  40 + }
  41 + if req.ChatDataset.Desc != nil {
  42 + dm.Desc = *req.ChatDataset.Desc
  43 + }
  44 + if req.ChatDataset.Status != nil {
  45 + dm.Status = *req.ChatDataset.Status
  46 + }
  47 + // 更新
  48 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  49 + dm, err = l.svcCtx.ChatDatasetRepository.UpdateWithVersion(l.ctx, conn, dm)
  50 + return err
  51 + }, true); err != nil {
  52 + return nil, xerr.NewErrMsg("更新失败")
  53 + }
  54 + resp = &types.ChatDatasetUpdateResponse{}
  55 + return
  56 +}
  1 +package document
  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/transaction"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type ChatDocumentDeleteLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewChatDocumentDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDocumentDeleteLogic {
  22 + return &ChatDocumentDeleteLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *ChatDocumentDeleteLogic) ChatDocumentDelete(req *types.ChatDocumentDeleteRequest) (resp *types.ChatDocumentDeleteResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + dm *domain.ChatDocument
  33 + )
  34 + if dm, err = l.svcCtx.ChatDocumentRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  38 + if dm, err = l.svcCtx.ChatDocumentRepository.Delete(l.ctx, conn, dm); err != nil {
  39 + return err
  40 + }
  41 + // 删除document & dataset 关联
  42 + if err = l.svcCtx.ChatDatasetDocumentMappingRepository.DeleteByDocument(l.ctx, conn, dm.Id); err != nil {
  43 + return err
  44 + }
  45 + return nil
  46 + }, true); err != nil {
  47 + return nil, xerr.NewErrMsgErr("移除失败", err)
  48 + }
  49 + return
  50 +}
  1 +package document
  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/xerr"
  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 ChatDocumentGetLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewChatDocumentGetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDocumentGetLogic {
  21 + return &ChatDocumentGetLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +func (l *ChatDocumentGetLogic) ChatDocumentGet(req *types.ChatDocumentGetRequest) (resp *types.ChatDocumentGetResponse, err error) {
  29 + var (
  30 + conn = l.svcCtx.DefaultDBConn()
  31 + dm *domain.ChatDocument
  32 + )
  33 + // 货号唯一
  34 + if dm, err = l.svcCtx.ChatDocumentRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + resp = &types.ChatDocumentGetResponse{
  38 + ChatDocument: types.NewTypesChatDocument(dm),
  39 + }
  40 + return
  41 +}
  1 +package document
  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/transaction"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type ChatDocumentRenameLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewChatDocumentRenameLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDocumentRenameLogic {
  22 + return &ChatDocumentRenameLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *ChatDocumentRenameLogic) ChatDocumentRename(req *types.ChatDocumentRenameRequest) (resp *types.ChatDocumentRenameResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + dm *domain.ChatDocument
  33 + )
  34 + if dm, err = l.svcCtx.ChatDocumentRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + // 赋值
  38 + dm.Name = req.Name
  39 + // 更新
  40 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  41 + dm, err = l.svcCtx.ChatDocumentRepository.UpdateWithVersion(l.ctx, conn, dm)
  42 + return err
  43 + }, true); err != nil {
  44 + return nil, xerr.NewErrMsg("更新失败")
  45 + }
  46 + resp = &types.ChatDocumentRenameResponse{
  47 + ChatDocument: types.NewTypesChatDocument(dm),
  48 + }
  49 + return
  50 +}
  1 +package document
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/svc"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/api/internal/types"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/ai"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type ChatDocumentSaveLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewChatDocumentSaveLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDocumentSaveLogic {
  22 + return &ChatDocumentSaveLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *ChatDocumentSaveLogic) ChatDocumentSave(req *types.ChatDocumentSaveRequest) (resp *types.ChatDocumentSaveResponse, err error) {
  30 + var (
  31 + //conn = l.svcCtx.DefaultDBConn()
  32 + dm *domain.ChatDocument
  33 + model *domain.ChatModel
  34 + fileId string
  35 + )
  36 + model, _ = domain.DefaultChatModels.Match(4)
  37 + // 文件上传星火文档
  38 + // 设置回调
  39 + if fileId, err = ai.SparkUploadFile(model.Config.AppId, model.Config.AppKey, model.Config.AppSecret, ai.SparkFileRequest{
  40 + Url: req.Url,
  41 + FileName: req.FileName,
  42 + CallbackUrl: "",
  43 + }); err != nil {
  44 + return nil, xerr.NewErrMsgErr("上传文档失败", err)
  45 + }
  46 + // 唯一判断
  47 + dm = types.NewDomainChatDocument(req.FileName, req.Url, req.Size, fileId)
  48 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  49 + dm, err = l.svcCtx.ChatDocumentRepository.Insert(l.ctx, conn, dm)
  50 + return err
  51 + }, true); err != nil {
  52 + return nil, xerr.NewErrMsg("保存失败")
  53 + }
  54 +
  55 + resp = &types.ChatDocumentSaveResponse{
  56 + ChatDocument: types.NewTypesChatDocument(dm),
  57 + }
  58 + return
  59 +}
  1 +package document
  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 ChatDocumentSearchLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewChatDocumentSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatDocumentSearchLogic {
  21 + return &ChatDocumentSearchLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +func (l *ChatDocumentSearchLogic) ChatDocumentSearch(req *types.ChatDocumentSearchRequest) (resp *types.ChatDocumentSearchResponse, err error) {
  29 + var (
  30 + conn = l.svcCtx.DefaultDBConn()
  31 + dms []*domain.ChatDocument
  32 + total int64
  33 + )
  34 +
  35 + queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size).
  36 + WithKV("fileType", req.FileType).
  37 + WithKV("status", req.Status)
  38 + if req.Name != "" {
  39 + queryOptions.WithKV("name", fmt.Sprintf("%%%v%%", req.Name))
  40 + }
  41 + total, dms, err = l.svcCtx.ChatDocumentRepository.Find(l.ctx, conn, queryOptions)
  42 + list := make([]types.ChatDocumentItem, 0)
  43 + for i := range dms {
  44 + list = append(list, types.NewTypesChatDocument(dms[i]))
  45 + }
  46 + resp = &types.ChatDocumentSearchResponse{
  47 + List: list,
  48 + Total: total,
  49 + }
  50 + return
  51 +}
@@ -21,6 +21,9 @@ type ServiceContext struct { @@ -21,6 +21,9 @@ type ServiceContext struct {
21 DB *gorm.DB 21 DB *gorm.DB
22 ChatSessionRepository domain.ChatSessionRepository 22 ChatSessionRepository domain.ChatSessionRepository
23 ChatSessionRecordRepository domain.ChatSessionRecordRepository 23 ChatSessionRecordRepository domain.ChatSessionRecordRepository
  24 + ChatDocumentRepository domain.ChatDocumentRepository
  25 + ChatDatasetRepository domain.ChatDatasetRepository
  26 + ChatDatasetDocumentMappingRepository domain.ChatDatasetDocumentMappingRepository
24 SystemOpen open.SystemOpen 27 SystemOpen open.SystemOpen
25 } 28 }
26 29
@@ -36,7 +39,9 @@ func NewServiceContext(c config.Config) *ServiceContext { @@ -36,7 +39,9 @@ func NewServiceContext(c config.Config) *ServiceContext {
36 LogRequest: middleware.NewLogRequestMiddleware(c.LogRequest).Handle, 39 LogRequest: middleware.NewLogRequestMiddleware(c.LogRequest).Handle,
37 ChatSessionRepository: repository.NewChatSessionRepository(cache.NewCachedRepository(mlCache)), 40 ChatSessionRepository: repository.NewChatSessionRepository(cache.NewCachedRepository(mlCache)),
38 ChatSessionRecordRepository: repository.NewChatSessionRecordRepository(cache.NewCachedRepository(mlCache)), 41 ChatSessionRecordRepository: repository.NewChatSessionRecordRepository(cache.NewCachedRepository(mlCache)),
39 - 42 + ChatDocumentRepository: repository.NewChatDocumentRepository(cache.NewCachedRepository(mlCache)),
  43 + ChatDatasetRepository: repository.NewChatDatasetRepository(cache.NewCachedRepository(mlCache)),
  44 + ChatDatasetDocumentMappingRepository: repository.NewChatDatasetDocumentMappingRepository(cache.NewCachedRepository(mlCache)),
40 SystemOpen: open.NewSystemOpen(c.Redis), 45 SystemOpen: open.NewSystemOpen(c.Redis),
41 } 46 }
42 } 47 }
  1 +package types
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/chat/internal/pkg/domain"
  5 + "path/filepath"
  6 + "strings"
  7 +)
  8 +
  9 +func NewDomainChatDocument(name, url string, size float64, fileId string) *domain.ChatDocument {
  10 + ext := getExt(name)
  11 + return &domain.ChatDocument{
  12 + Name: name,
  13 + Status: domain.StatusInUsed,
  14 + FileType: getFileTypeByExt(ext),
  15 + Metadata: domain.DocumentMetadata{
  16 + OriginFileName: filepath.Base(name),
  17 + Ext: ext,
  18 + FileId: fileId,
  19 + FileUrl: url,
  20 + FileSize: size,
  21 + },
  22 + }
  23 +}
  24 +
  25 +func NewTypesChatDocument(item *domain.ChatDocument) ChatDocumentItem {
  26 + return ChatDocumentItem{
  27 + Id: item.Id,
  28 + Name: item.Name,
  29 + FileType: item.FileType,
  30 + Status: item.Status,
  31 + OriginFileName: item.Metadata.OriginFileName,
  32 + Ext: item.Metadata.Ext,
  33 + FileId: item.Metadata.FileId,
  34 + FileUrl: item.Metadata.FileUrl,
  35 + FileSize: item.Metadata.FileSize,
  36 + }
  37 +}
  38 +
  39 +func getFileTypeByExt(ext string) string {
  40 + switch ext {
  41 + case "md":
  42 + return "markdown"
  43 + case "pdf":
  44 + return ext
  45 + case "txt":
  46 + return ext
  47 + case "doc", "docx":
  48 + return "doc"
  49 + default:
  50 + return ""
  51 + }
  52 + return ""
  53 +}
  54 +
  55 +func getExt(file string) string {
  56 + return strings.TrimPrefix(filepath.Ext(file), ".")
  57 +}
@@ -15,6 +15,7 @@ type ChatSessionSaveRequest struct { @@ -15,6 +15,7 @@ type ChatSessionSaveRequest struct {
15 } 15 }
16 16
17 type ChatSessionSaveResponse struct { 17 type ChatSessionSaveResponse struct {
  18 + ChatSession ChatSessionItem `json:"session"`
18 } 19 }
19 20
20 type ChatSessionDeleteRequest struct { 21 type ChatSessionDeleteRequest struct {
@@ -36,6 +37,7 @@ type ChatSessionSearchRequest struct { @@ -36,6 +37,7 @@ type ChatSessionSearchRequest struct {
36 Page int `json:"page,optional"` 37 Page int `json:"page,optional"`
37 Size int `json:"size,optional"` 38 Size int `json:"size,optional"`
38 Title string `json:"title,optional"` // 按标题搜索 39 Title string `json:"title,optional"` // 按标题搜索
  40 + Module int `json:"module,optional"` // 模块 1:openai chat 2:星火文档问答
39 } 41 }
40 42
41 type ChatSessionSearchResponse struct { 43 type ChatSessionSearchResponse struct {
@@ -48,6 +50,10 @@ type ChatSessionItem struct { @@ -48,6 +50,10 @@ type ChatSessionItem struct {
48 Title string `json:"title,optional,omitempty"` // 会话标题 50 Title string `json:"title,optional,omitempty"` // 会话标题
49 Abstract string `json:"abstract,optional,omitempty"` // 摘要 51 Abstract string `json:"abstract,optional,omitempty"` // 摘要
50 CreatedAt int64 `json:"createdAt,optional,omitempty"` // 创建时间 52 CreatedAt int64 `json:"createdAt,optional,omitempty"` // 创建时间
  53 + Module int `json:"module,optional,omitempty,default=1"` // 1:openai chat 2:星火文档问答
  54 + Type string `json:"type,optional,omitempty,default=chat"` // 类型 chat:普通问答 spark_dataset_chat:星火知识库问答 spark_documents_chat:星火多文档问答
  55 + DatasetId int64 `json:"datasetId,optional,omitempty"` // 知识库
  56 + DocumentIds []int64 `json:"documentIds,optional,omitempty"` // 多文档
51 } 57 }
52 58
53 type ChatModelsRequest struct { 59 type ChatModelsRequest struct {
@@ -121,3 +127,136 @@ type User struct { @@ -121,3 +127,136 @@ type User struct {
121 Name string `json:"name"` // 名称 127 Name string `json:"name"` // 名称
122 Avatar string `json:"avatar"` // 头像 128 Avatar string `json:"avatar"` // 头像
123 } 129 }
  130 +
  131 +type ChatDocumentGetRequest struct {
  132 + Id int64 `path:"id"`
  133 +}
  134 +
  135 +type ChatDocumentGetResponse struct {
  136 + ChatDocument ChatDocumentItem `json:"document"`
  137 +}
  138 +
  139 +type ChatDocumentSaveRequest struct {
  140 + FileName string `json:"fileName"`
  141 + Url string `json:"url"`
  142 + Size float64 `json:"size"` // 文件大小(KB)
  143 +}
  144 +
  145 +type ChatDocumentSaveResponse struct {
  146 + ChatDocument ChatDocumentItem `json:"document"`
  147 +}
  148 +
  149 +type ChatDocumentDeleteRequest struct {
  150 + Id int64 `path:"id"`
  151 +}
  152 +
  153 +type ChatDocumentDeleteResponse struct {
  154 +}
  155 +
  156 +type ChatDocumentUpdateRequest struct {
  157 + Id int64 `path:"id"`
  158 + ChatDocument ChatDocumentItem `json:"document"`
  159 +}
  160 +
  161 +type ChatDocumentUpdateResponse struct {
  162 +}
  163 +
  164 +type ChatDocumentSearchRequest struct {
  165 + Page int `json:"page,optional"`
  166 + Size int `json:"size,optional"`
  167 + Name string `json:"name,optional"` // 文件名匹配
  168 + FileType string `json:"fileType,optional"` // 文件类型 markdown\pdf\txt\doc&docx
  169 + Status int `json:"status,optional"` // 文件状态 1.使用中、0.待处理、2.预处理中、3.处理失败
  170 +}
  171 +
  172 +type ChatDocumentSearchResponse struct {
  173 + List []ChatDocumentItem `json:"list"`
  174 + Total int64 `json:"total"`
  175 +}
  176 +
  177 +type ChatDocumentItem struct {
  178 + Id int64 `json:"id"`
  179 + Name string `json:"name,optional"` // 文件名
  180 + FileType string `json:"fileType"` // 文件类型 markdown\pdf\txt\doc&docx
  181 + Status int `json:"status"` // 1.使用中、0.待处理、2.预处理中、3.处理失败
  182 + OriginFileName string `json:"originFileName,omitempty"` // 源文件命
  183 + Ext string `json:"ext,omitempty"` // 格式
  184 + FileId string `json:"fileId,omitempty"` // 星火文件ID
  185 + FileUrl string `json:"fileUrl,omitempty"` // 文件地址
  186 + FileSize float64 `json:"fileSize,omitempty"` // 文件大小KB
  187 + CreatedAt int64 `json:"createdAt,omitempty"` // 创建时间
  188 + UpdatedAt int64 `json:"updatedAt,omitempty"` // 更新时间
  189 +}
  190 +
  191 +type ChatDocumentRenameRequest struct {
  192 + Id int64 `json:"id"` // 文档ID
  193 + Name string `json:"name"` // 新名称
  194 +}
  195 +
  196 +type ChatDocumentRenameResponse struct {
  197 + ChatDocument ChatDocumentItem `json:"document"`
  198 +}
  199 +
  200 +type ChatDatasetGetRequest struct {
  201 + Id int64 `path:"id"`
  202 +}
  203 +
  204 +type ChatDatasetGetResponse struct {
  205 + ChatDataset ChatDatasetItem `json:"dataset"`
  206 + Documents []ChatDocumentItem `json:"documents"`
  207 +}
  208 +
  209 +type ChatDatasetSaveRequest struct {
  210 + Name string `json:"name"` // 名称
  211 + DocumentIds []int64 `json:"documentIds"` // 文档ID列表
  212 +}
  213 +
  214 +type ChatDatasetSaveResponse struct {
  215 + ChatDataset ChatDatasetItem `json:"dataset"`
  216 +}
  217 +
  218 +type ChatDatasetDeleteRequest struct {
  219 + Id int64 `path:"id"`
  220 +}
  221 +
  222 +type ChatDatasetDeleteResponse struct {
  223 +}
  224 +
  225 +type ChatDatasetUpdateRequest struct {
  226 + Id int64 `path:"id"`
  227 + ChatDataset ChatDatasetItem `json:"dataset"`
  228 +}
  229 +
  230 +type ChatDatasetUpdateResponse struct {
  231 +}
  232 +
  233 +type ChatDatasetSearchRequest struct {
  234 + Page int `json:"page,optional"`
  235 + Size int `json:"size,optional"`
  236 + Name string `json:"name,optional"` // 文件名匹配
  237 + Status int `json:"status,optional,option=0|1|2"` // 1:启用 2:禁用
  238 +}
  239 +
  240 +type ChatDatasetSearchResponse struct {
  241 + List []ChatDatasetItem `json:"list"`
  242 + Total int64 `json:"total"`
  243 +}
  244 +
  245 +type ChatDatasetItem struct {
  246 + Id int64 `json:"id,optional,omitempty"`
  247 + Name *string `json:"name,optional,omitempty"` // 名称
  248 + Desc *string `json:"desc,optional,omitempty"` // 描述
  249 + Status *int `json:"status,optional,omitempty"` // 状态 1:启用 2:禁用
  250 + CreatedAt int64 `json:"createdAt,optional,omitempty"` // 创建时间
  251 + UpdatedAt int64 `json:"updatedAt,optional,omitempty"` // 更新时间
  252 + FileNumber *int `json:"fileNumber,optional,omitempty"` // 文件数量
  253 +}
  254 +
  255 +type ChatDatasetRenameRequest struct {
  256 + Id int64 `json:"id"` // 文档ID
  257 + Name string `json:"name"` // 新名称
  258 +}
  259 +
  260 +type ChatDatasetRenameResponse struct {
  261 + ChatDataset ChatDatasetItem `json:"dataset"`
  262 +}
@@ -15,3 +15,21 @@ CREATE TABLE `chat_model` @@ -15,3 +15,21 @@ CREATE TABLE `chat_model`
15 `id` int(0) NOT NULL COMMENT '唯一标识', 15 `id` int(0) NOT NULL COMMENT '唯一标识',
16 PRIMARY KEY (`id`) USING BTREE 16 PRIMARY KEY (`id`) USING BTREE
17 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; 17 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  18 +
  19 +CREATE TABLE `chat_dataset`
  20 +(
  21 + `id` int(0) NOT NULL COMMENT '唯一标识',
  22 + PRIMARY KEY (`id`) USING BTREE
  23 +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  24 +
  25 +CREATE TABLE `chat_document`
  26 +(
  27 + `id` int(0) NOT NULL COMMENT '唯一标识',
  28 + PRIMARY KEY (`id`) USING BTREE
  29 +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  30 +
  31 +CREATE TABLE `chat_dataset_document_mapping`
  32 +(
  33 + `id` int(0) NOT NULL COMMENT '唯一标识',
  34 + PRIMARY KEY (`id`) USING BTREE
  35 +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
1 syntax = "v1" 1 syntax = "v1"
2 2
3 import "core/session.api" 3 import "core/session.api"
  4 +import "core/document.api"
  5 +import "core/dataset.api"
  1 +syntax = "v1"
  2 +
  3 +// 后台接口
  4 +@server(
  5 + prefix: v1
  6 + group: dataset
  7 + middleware: LogRequest
  8 + jwt: SystemAuth
  9 +)
  10 +service Core {
  11 + @doc "知识库-详情"
  12 + @handler chatDatasetGet
  13 + get /chat/dataset/:id (ChatDatasetGetRequest) returns (ChatDatasetGetResponse)
  14 + @doc "知识库-保存"
  15 + @handler chatDatasetSave
  16 + post /chat/dataset (ChatDatasetSaveRequest) returns (ChatDatasetSaveResponse)
  17 + @doc "知识库-删除"
  18 + @handler chatDatasetDelete
  19 + delete /chat/dataset/:id (ChatDatasetDeleteRequest) returns (ChatDatasetDeleteResponse)
  20 + @doc "知识库-更新"
  21 + @handler chatDatasetUpdate
  22 + put /chat/dataset/:id (ChatDatasetUpdateRequest) returns (ChatDatasetUpdateResponse)
  23 + @doc "知识库-重命名"
  24 + @handler chatDatasetRename
  25 + post /chat/dataset/rename (ChatDatasetRenameRequest) returns (ChatDatasetRenameResponse)
  26 + @doc "知识库-搜索"
  27 + @handler chatDatasetSearch
  28 + post /chat/dataset/search (ChatDatasetSearchRequest) returns (ChatDatasetSearchResponse)
  29 +}
  30 +
  31 +type (
  32 + ChatDatasetGetRequest {
  33 + Id int64 `path:"id"`
  34 + }
  35 + ChatDatasetGetResponse {
  36 + ChatDataset ChatDatasetItem `json:"dataset"`
  37 + Documents []ChatDocumentItem `json:"documents"`
  38 + }
  39 +
  40 + ChatDatasetSaveRequest {
  41 + Name string `json:"name"` // 名称
  42 + DocumentIds []int64 `json:"documentIds"` // 文档ID列表
  43 + }
  44 + ChatDatasetSaveResponse {
  45 + ChatDataset ChatDatasetItem `json:"dataset"`
  46 + }
  47 +
  48 + ChatDatasetDeleteRequest {
  49 + Id int64 `path:"id"`
  50 + }
  51 + ChatDatasetDeleteResponse {}
  52 +
  53 + ChatDatasetUpdateRequest {
  54 + Id int64 `path:"id"`
  55 + ChatDataset ChatDatasetItem `json:"dataset"`
  56 + }
  57 + ChatDatasetUpdateResponse {}
  58 +
  59 + ChatDatasetSearchRequest {
  60 + Page int `json:"page,optional"`
  61 + Size int `json:"size,optional"`
  62 + Name string `json:"name,optional"` // 文件名匹配
  63 + Status int `json:"status,optional,option=0|1|2"`// 1:启用 2:禁用
  64 + }
  65 + ChatDatasetSearchResponse{
  66 + List []ChatDatasetItem `json:"list"`
  67 + Total int64 `json:"total"`
  68 + }
  69 + ChatDatasetItem {
  70 + Id int64 `json:"id,optional,omitempty"`
  71 + Name *string `json:"name,optional,omitempty"` // 名称
  72 + Desc *string `json:"desc,optional,omitempty"` // 描述
  73 + Status *int `json:"status,optional,omitempty"`// 状态 1:启用 2:禁用
  74 + CreatedAt int64 `json:"createdAt,optional,omitempty"` // 创建时间
  75 + UpdatedAt int64 `json:"updatedAt,optional,omitempty"` // 更新时间
  76 + FileNumber *int `json:"fileNumber,optional,omitempty"` // 文件数量
  77 + }
  78 +)
  79 +
  80 +type(
  81 + ChatDatasetRenameRequest{
  82 + Id int64 `json:"id"` // 文档ID
  83 + Name string `json:"name"` // 新名称
  84 + }
  85 + ChatDatasetRenameResponse{
  86 + ChatDataset ChatDatasetItem `json:"dataset"`
  87 + }
  88 +)
  1 +syntax = "v1"
  2 +
  3 +// 后台接口
  4 +@server(
  5 + prefix: v1
  6 + group: document
  7 + middleware: LogRequest
  8 + jwt: SystemAuth
  9 +)
  10 +service Core {
  11 + @doc "文档-详情"
  12 + @handler chatDocumentGet
  13 + get /chat/document/:id (ChatDocumentGetRequest) returns (ChatDocumentGetResponse)
  14 + @doc "文档-保存"
  15 + @handler chatDocumentSave
  16 + post /chat/document (ChatDocumentSaveRequest) returns (ChatDocumentSaveResponse)
  17 + @doc "文档-删除"
  18 + @handler chatDocumentDelete
  19 + delete /chat/document/:id (ChatDocumentDeleteRequest) returns (ChatDocumentDeleteResponse)
  20 + @doc "文档-删除"
  21 + @handler chatDocumentRename
  22 + post /chat/document/rename (ChatDocumentRenameRequest) returns (ChatDocumentRenameResponse)
  23 +// @doc "文档-更新"
  24 +// @handler chatDocumentUpdate
  25 +// put /chat/document/:id (ChatDocumentUpdateRequest) returns (ChatDocumentUpdateResponse)
  26 + @doc "文档-搜索"
  27 + @handler chatDocumentSearch
  28 + post /chat/document/search (ChatDocumentSearchRequest) returns (ChatDocumentSearchResponse)
  29 +}
  30 +
  31 +type (
  32 + ChatDocumentGetRequest {
  33 + Id int64 `path:"id"`
  34 + }
  35 + ChatDocumentGetResponse {
  36 + ChatDocument ChatDocumentItem `json:"document"`
  37 + }
  38 +
  39 + ChatDocumentSaveRequest {
  40 + FileName string `json:"fileName"`
  41 + Url string `json:"url"`
  42 + Size float64 `json:"size"` // 文件大小(KB)
  43 + }
  44 + ChatDocumentSaveResponse {
  45 + ChatDocument ChatDocumentItem `json:"document"`
  46 + }
  47 +
  48 + ChatDocumentDeleteRequest {
  49 + Id int64 `path:"id"`
  50 + }
  51 + ChatDocumentDeleteResponse {}
  52 +
  53 + ChatDocumentUpdateRequest {
  54 + Id int64 `path:"id"`
  55 + ChatDocument ChatDocumentItem `json:"document"`
  56 + }
  57 + ChatDocumentUpdateResponse {}
  58 +
  59 + ChatDocumentSearchRequest {
  60 + Page int `json:"page,optional"`
  61 + Size int `json:"size,optional"`
  62 + Name string `json:"name,optional"` // 文件名匹配
  63 + FileType string `json:"fileType,optional"` // 文件类型 markdown\pdf\txt\doc&docx
  64 + Status int `json:"status,optional"` // 文件状态 1.使用中、0.待处理、2.预处理中、3.处理失败
  65 + }
  66 + ChatDocumentSearchResponse{
  67 + List []ChatDocumentItem `json:"list"`
  68 + Total int64 `json:"total"`
  69 + }
  70 + ChatDocumentItem {
  71 + Id int64 `json:"id"`
  72 + Name string `json:"name,optional"` // 文件名
  73 + FileType string `json:"fileType"` // 文件类型 markdown\pdf\txt\doc&docx
  74 + Status int `json:"status"` // 1.使用中、0.待处理、2.预处理中、3.处理失败
  75 + OriginFileName string `json:"originFileName,omitempty"` // 源文件命
  76 + Ext string `json:"ext,omitempty"` // 格式
  77 + FileId string `json:"fileId,omitempty"` // 星火文件ID
  78 + FileUrl string `json:"fileUrl,omitempty"` // 文件地址
  79 + FileSize float64 `json:"fileSize,omitempty"` // 文件大小KB
  80 + CreatedAt int64 `json:"createdAt,omitempty"` // 创建时间
  81 + UpdatedAt int64 `json:"updatedAt,omitempty"` // 更新时间
  82 + }
  83 +)
  84 +
  85 +type(
  86 + ChatDocumentRenameRequest{
  87 + Id int64 `json:"id"` // 文档ID
  88 + Name string `json:"name"` // 新名称
  89 + }
  90 + ChatDocumentRenameResponse{
  91 + ChatDocument ChatDocumentItem `json:"document"`
  92 + }
  93 +)
@@ -30,6 +30,13 @@ service Core { @@ -30,6 +30,13 @@ service Core {
30 @handler chatSessionConversationWs 30 @handler chatSessionConversationWs
31 get /chat/session/conversation (ChatSessionConversationRequestWs) returns (ChatSessionConversationResponse) 31 get /chat/session/conversation (ChatSessionConversationRequestWs) returns (ChatSessionConversationResponse)
32 32
  33 + @doc "星火聊天会话-我的会话"
  34 + @handler chatMySparkSessions
  35 + post /chat/session/my_spark_sessions (ChatSessionSearchRequest) returns (ChatSessionSearchResponse)
  36 + @doc "星火聊天会话-保存"
  37 + @handler chatSparkSessionSave
  38 + post /chat/spark_session (ChatSessionSaveRequest) returns (ChatSessionSaveResponse)
  39 +
33 @doc "聊天会话-对话记录列表" 40 @doc "聊天会话-对话记录列表"
34 @handler chatSessionRecords 41 @handler chatSessionRecords
35 post /chat/session/records (ChatSessionRecordsRequest) returns (ChatSessionRecordsResponse) 42 post /chat/session/records (ChatSessionRecordsRequest) returns (ChatSessionRecordsResponse)
@@ -51,7 +58,9 @@ type ( @@ -51,7 +58,9 @@ type (
51 ChatSessionSaveRequest { 58 ChatSessionSaveRequest {
52 ChatSession ChatSessionItem `json:"session"` 59 ChatSession ChatSessionItem `json:"session"`
53 } 60 }
54 - ChatSessionSaveResponse {} 61 + ChatSessionSaveResponse {
  62 + ChatSession ChatSessionItem `json:"session"`
  63 + }
55 64
56 ChatSessionDeleteRequest { 65 ChatSessionDeleteRequest {
57 Id int64 `path:"id"` 66 Id int64 `path:"id"`
@@ -68,6 +77,7 @@ type ( @@ -68,6 +77,7 @@ type (
68 Page int `json:"page,optional"` 77 Page int `json:"page,optional"`
69 Size int `json:"size,optional"` 78 Size int `json:"size,optional"`
70 Title string `json:"title,optional"` // 按标题搜索 79 Title string `json:"title,optional"` // 按标题搜索
  80 + Module int `json:"module,optional"` // 模块 1:openai chat 2:星火文档问答
71 } 81 }
72 ChatSessionSearchResponse{ 82 ChatSessionSearchResponse{
73 List []ChatSessionItem `json:"list"` 83 List []ChatSessionItem `json:"list"`
@@ -78,6 +88,11 @@ type ( @@ -78,6 +88,11 @@ type (
78 Title string `json:"title,optional,omitempty"` // 会话标题 88 Title string `json:"title,optional,omitempty"` // 会话标题
79 Abstract string `json:"abstract,optional,omitempty"` // 摘要 89 Abstract string `json:"abstract,optional,omitempty"` // 摘要
80 CreatedAt int64 `json:"createdAt,optional,omitempty"` // 创建时间 90 CreatedAt int64 `json:"createdAt,optional,omitempty"` // 创建时间
  91 +
  92 + Module int `json:"module,optional,omitempty,default=1"` // 1:openai chat 2:星火文档问答
  93 + Type string `json:"type,optional,omitempty,default=chat"` // 类型 chat:普通问答 spark_dataset_chat:星火知识库问答 spark_documents_chat:星火多文档问答
  94 + DatasetId int64 `json:"datasetId,optional,omitempty"` // 知识库
  95 + DocumentIds []int64 `json:"documentIds,optional,omitempty"` // 多文档
81 } 96 }
82 ) 97 )
83 98
@@ -15,6 +15,294 @@ @@ -15,6 +15,294 @@
15 "application/json" 15 "application/json"
16 ], 16 ],
17 "paths": { 17 "paths": {
  18 + "v1/chat/dataset": {
  19 + "post": {
  20 + "summary": "知识库-保存",
  21 + "operationId": "chatDatasetSave",
  22 + "responses": {
  23 + "200": {
  24 + "description": "A successful response.",
  25 + "schema": {
  26 + "$ref": "#/definitions/ChatDatasetSaveResponse"
  27 + }
  28 + }
  29 + },
  30 + "parameters": [
  31 + {
  32 + "name": "body",
  33 + "in": "body",
  34 + "required": true,
  35 + "schema": {
  36 + "$ref": "#/definitions/ChatDatasetSaveRequest"
  37 + }
  38 + }
  39 + ],
  40 + "requestBody": {},
  41 + "tags": [
  42 + "dataset"
  43 + ]
  44 + }
  45 + },
  46 + "v1/chat/dataset/rename": {
  47 + "post": {
  48 + "summary": "知识库-重命名",
  49 + "operationId": "chatDatasetRename",
  50 + "responses": {
  51 + "200": {
  52 + "description": "A successful response.",
  53 + "schema": {
  54 + "$ref": "#/definitions/ChatDatasetUpdateResponse"
  55 + }
  56 + }
  57 + },
  58 + "parameters": [
  59 + {
  60 + "name": "body",
  61 + "in": "body",
  62 + "required": true,
  63 + "schema": {
  64 + "$ref": "#/definitions/ChatDatasetUpdateRequest"
  65 + }
  66 + }
  67 + ],
  68 + "requestBody": {},
  69 + "tags": [
  70 + "dataset"
  71 + ]
  72 + }
  73 + },
  74 + "v1/chat/dataset/search": {
  75 + "post": {
  76 + "summary": "知识库-搜索",
  77 + "operationId": "chatDatasetSearch",
  78 + "responses": {
  79 + "200": {
  80 + "description": "A successful response.",
  81 + "schema": {
  82 + "$ref": "#/definitions/ChatDatasetSearchResponse"
  83 + }
  84 + }
  85 + },
  86 + "parameters": [
  87 + {
  88 + "name": "body",
  89 + "in": "body",
  90 + "required": true,
  91 + "schema": {
  92 + "$ref": "#/definitions/ChatDatasetSearchRequest"
  93 + }
  94 + }
  95 + ],
  96 + "requestBody": {},
  97 + "tags": [
  98 + "dataset"
  99 + ]
  100 + }
  101 + },
  102 + "v1/chat/dataset/{id}": {
  103 + "get": {
  104 + "summary": "知识库-详情",
  105 + "operationId": "chatDatasetGet",
  106 + "responses": {
  107 + "200": {
  108 + "description": "A successful response.",
  109 + "schema": {
  110 + "$ref": "#/definitions/ChatDatasetGetResponse"
  111 + }
  112 + }
  113 + },
  114 + "parameters": [
  115 + {
  116 + "name": "id",
  117 + "in": "path",
  118 + "required": true,
  119 + "type": "string"
  120 + }
  121 + ],
  122 + "requestBody": {},
  123 + "tags": [
  124 + "dataset"
  125 + ]
  126 + },
  127 + "delete": {
  128 + "summary": "知识库-删除",
  129 + "operationId": "chatDatasetDelete",
  130 + "responses": {
  131 + "200": {
  132 + "description": "A successful response.",
  133 + "schema": {
  134 + "$ref": "#/definitions/ChatDatasetDeleteResponse"
  135 + }
  136 + }
  137 + },
  138 + "parameters": [
  139 + {
  140 + "name": "id",
  141 + "in": "path",
  142 + "required": true,
  143 + "type": "string"
  144 + },
  145 + {
  146 + "name": "body",
  147 + "in": "body",
  148 + "required": true,
  149 + "schema": {
  150 + "$ref": "#/definitions/ChatDatasetDeleteRequest"
  151 + }
  152 + }
  153 + ],
  154 + "requestBody": {},
  155 + "tags": [
  156 + "dataset"
  157 + ]
  158 + },
  159 + "put": {
  160 + "summary": "知识库-更新",
  161 + "operationId": "chatDatasetUpdate",
  162 + "responses": {
  163 + "200": {
  164 + "description": "A successful response.",
  165 + "schema": {
  166 + "$ref": "#/definitions/ChatDatasetUpdateResponse"
  167 + }
  168 + }
  169 + },
  170 + "parameters": [
  171 + {
  172 + "name": "id",
  173 + "in": "path",
  174 + "required": true,
  175 + "type": "string"
  176 + },
  177 + {
  178 + "name": "body",
  179 + "in": "body",
  180 + "required": true,
  181 + "schema": {
  182 + "$ref": "#/definitions/ChatDatasetUpdateRequest"
  183 + }
  184 + }
  185 + ],
  186 + "requestBody": {},
  187 + "tags": [
  188 + "dataset"
  189 + ]
  190 + }
  191 + },
  192 + "v1/chat/document": {
  193 + "post": {
  194 + "summary": "文档-保存",
  195 + "operationId": "chatDocumentSave",
  196 + "responses": {
  197 + "200": {
  198 + "description": "A successful response.",
  199 + "schema": {
  200 + "$ref": "#/definitions/ChatDocumentSaveResponse"
  201 + }
  202 + }
  203 + },
  204 + "parameters": [
  205 + {
  206 + "name": "body",
  207 + "in": "body",
  208 + "required": true,
  209 + "schema": {
  210 + "$ref": "#/definitions/ChatDocumentSaveRequest"
  211 + }
  212 + }
  213 + ],
  214 + "requestBody": {},
  215 + "tags": [
  216 + "document"
  217 + ]
  218 + }
  219 + },
  220 + "v1/chat/document/search": {
  221 + "post": {
  222 + "summary": "文档-搜索",
  223 + "operationId": "chatDocumentSearch",
  224 + "responses": {
  225 + "200": {
  226 + "description": "A successful response.",
  227 + "schema": {
  228 + "$ref": "#/definitions/ChatDocumentSearchResponse"
  229 + }
  230 + }
  231 + },
  232 + "parameters": [
  233 + {
  234 + "name": "body",
  235 + "in": "body",
  236 + "required": true,
  237 + "schema": {
  238 + "$ref": "#/definitions/ChatDocumentSearchRequest"
  239 + }
  240 + }
  241 + ],
  242 + "requestBody": {},
  243 + "tags": [
  244 + "document"
  245 + ]
  246 + }
  247 + },
  248 + "v1/chat/document/{id}": {
  249 + "get": {
  250 + "summary": "文档-详情",
  251 + "operationId": "chatDocumentGet",
  252 + "responses": {
  253 + "200": {
  254 + "description": "A successful response.",
  255 + "schema": {
  256 + "$ref": "#/definitions/ChatDocumentGetResponse"
  257 + }
  258 + }
  259 + },
  260 + "parameters": [
  261 + {
  262 + "name": "id",
  263 + "in": "path",
  264 + "required": true,
  265 + "type": "string"
  266 + }
  267 + ],
  268 + "requestBody": {},
  269 + "tags": [
  270 + "document"
  271 + ]
  272 + },
  273 + "delete": {
  274 + "summary": "文档-删除",
  275 + "operationId": "chatDocumentDelete",
  276 + "responses": {
  277 + "200": {
  278 + "description": "A successful response.",
  279 + "schema": {
  280 + "$ref": "#/definitions/ChatDocumentDeleteResponse"
  281 + }
  282 + }
  283 + },
  284 + "parameters": [
  285 + {
  286 + "name": "id",
  287 + "in": "path",
  288 + "required": true,
  289 + "type": "string"
  290 + },
  291 + {
  292 + "name": "body",
  293 + "in": "body",
  294 + "required": true,
  295 + "schema": {
  296 + "$ref": "#/definitions/ChatDocumentDeleteRequest"
  297 + }
  298 + }
  299 + ],
  300 + "requestBody": {},
  301 + "tags": [
  302 + "document"
  303 + ]
  304 + }
  305 + },
18 "v1/chat/models": { 306 "v1/chat/models": {
19 "get": { 307 "get": {
20 "summary": "模型列表", 308 "summary": "模型列表",
@@ -64,7 +352,7 @@ @@ -64,7 +352,7 @@
64 "v1/chat/session/conversation": { 352 "v1/chat/session/conversation": {
65 "get": { 353 "get": {
66 "summary": "聊天会话-对话", 354 "summary": "聊天会话-对话",
67 - "operationId": "chatSessionConversation", 355 + "operationId": "chatSessionConversationWs",
68 "responses": { 356 "responses": {
69 "200": { 357 "200": {
70 "description": "A successful response.", 358 "description": "A successful response.",
@@ -90,195 +378,662 @@ @@ -90,195 +378,662 @@
90 "type": "integer", 378 "type": "integer",
91 "format": "int64" 379 "format": "int64"
92 }, 380 },
93 - {  
94 - "name": "contentType",  
95 - "description": " 内容类型 文本:text (图片:image 文档:document)",  
96 - "in": "query",  
97 - "required": true, 381 + {
  382 + "name": "contentType",
  383 + "description": " 内容类型 文本:text (图片:image 文档:document)",
  384 + "in": "query",
  385 + "required": true,
  386 + "type": "string"
  387 + },
  388 + {
  389 + "name": "text",
  390 + "description": " 内容文本",
  391 + "in": "query",
  392 + "required": true,
  393 + "type": "string"
  394 + }
  395 + ],
  396 + "requestBody": {},
  397 + "tags": [
  398 + "chat"
  399 + ]
  400 + },
  401 + "post": {
  402 + "summary": "聊天会话-对话",
  403 + "operationId": "chatSessionConversation",
  404 + "responses": {
  405 + "200": {
  406 + "description": "A successful response.",
  407 + "schema": {
  408 + "$ref": "#/definitions/ChatSessionConversationResponse"
  409 + }
  410 + }
  411 + },
  412 + "parameters": [
  413 + {
  414 + "name": "body",
  415 + "in": "body",
  416 + "required": true,
  417 + "schema": {
  418 + "$ref": "#/definitions/ChatSessionConversationRequest"
  419 + }
  420 + }
  421 + ],
  422 + "requestBody": {},
  423 + "tags": [
  424 + "chat"
  425 + ]
  426 + }
  427 + },
  428 + "v1/chat/session/my_spark_sessions": {
  429 + "post": {
  430 + "summary": "星火聊天会话-我的会话",
  431 + "operationId": "chatMySparkSessions",
  432 + "responses": {
  433 + "200": {
  434 + "description": "A successful response.",
  435 + "schema": {
  436 + "$ref": "#/definitions/ChatSessionSearchResponse"
  437 + }
  438 + }
  439 + },
  440 + "parameters": [
  441 + {
  442 + "name": "body",
  443 + "in": "body",
  444 + "required": true,
  445 + "schema": {
  446 + "$ref": "#/definitions/ChatSessionSearchRequest"
  447 + }
  448 + }
  449 + ],
  450 + "requestBody": {},
  451 + "tags": [
  452 + "chat"
  453 + ]
  454 + }
  455 + },
  456 + "v1/chat/session/records": {
  457 + "post": {
  458 + "summary": "聊天会话-对话记录列表",
  459 + "operationId": "chatSessionRecords",
  460 + "responses": {
  461 + "200": {
  462 + "description": "A successful response.",
  463 + "schema": {
  464 + "$ref": "#/definitions/ChatSessionRecordsResponse"
  465 + }
  466 + }
  467 + },
  468 + "parameters": [
  469 + {
  470 + "name": "body",
  471 + "in": "body",
  472 + "required": true,
  473 + "schema": {
  474 + "$ref": "#/definitions/ChatSessionRecordsRequest"
  475 + }
  476 + }
  477 + ],
  478 + "requestBody": {},
  479 + "tags": [
  480 + "chat"
  481 + ]
  482 + }
  483 + },
  484 + "v1/chat/session/search": {
  485 + "post": {
  486 + "summary": "聊天会话-搜索",
  487 + "operationId": "chatSessionSearch",
  488 + "responses": {
  489 + "200": {
  490 + "description": "A successful response.",
  491 + "schema": {
  492 + "$ref": "#/definitions/ChatSessionSearchResponse"
  493 + }
  494 + }
  495 + },
  496 + "parameters": [
  497 + {
  498 + "name": "body",
  499 + "in": "body",
  500 + "required": true,
  501 + "schema": {
  502 + "$ref": "#/definitions/ChatSessionSearchRequest"
  503 + }
  504 + }
  505 + ],
  506 + "requestBody": {},
  507 + "tags": [
  508 + "chat"
  509 + ]
  510 + }
  511 + },
  512 + "v1/chat/session/{id}": {
  513 + "get": {
  514 + "summary": "聊天会话-详情",
  515 + "operationId": "chatSessionGet",
  516 + "responses": {
  517 + "200": {
  518 + "description": "A successful response.",
  519 + "schema": {
  520 + "$ref": "#/definitions/ChatSessionGetResponse"
  521 + }
  522 + }
  523 + },
  524 + "parameters": [
  525 + {
  526 + "name": "id",
  527 + "in": "path",
  528 + "required": true,
  529 + "type": "string"
  530 + }
  531 + ],
  532 + "requestBody": {},
  533 + "tags": [
  534 + "chat"
  535 + ]
  536 + },
  537 + "delete": {
  538 + "summary": "聊天会话-删除",
  539 + "operationId": "chatSessionDelete",
  540 + "responses": {
  541 + "200": {
  542 + "description": "A successful response.",
  543 + "schema": {
  544 + "$ref": "#/definitions/ChatSessionDeleteResponse"
  545 + }
  546 + }
  547 + },
  548 + "parameters": [
  549 + {
  550 + "name": "id",
  551 + "in": "path",
  552 + "required": true,
  553 + "type": "string"
  554 + },
  555 + {
  556 + "name": "body",
  557 + "in": "body",
  558 + "required": true,
  559 + "schema": {
  560 + "$ref": "#/definitions/ChatSessionDeleteRequest"
  561 + }
  562 + }
  563 + ],
  564 + "requestBody": {},
  565 + "tags": [
  566 + "chat"
  567 + ]
  568 + },
  569 + "put": {
  570 + "summary": "聊天会话-更新",
  571 + "operationId": "chatSessionUpdate",
  572 + "responses": {
  573 + "200": {
  574 + "description": "A successful response.",
  575 + "schema": {
  576 + "$ref": "#/definitions/ChatSessionUpdateResponse"
  577 + }
  578 + }
  579 + },
  580 + "parameters": [
  581 + {
  582 + "name": "id",
  583 + "in": "path",
  584 + "required": true,
  585 + "type": "string"
  586 + },
  587 + {
  588 + "name": "body",
  589 + "in": "body",
  590 + "required": true,
  591 + "schema": {
  592 + "$ref": "#/definitions/ChatSessionUpdateRequest"
  593 + }
  594 + }
  595 + ],
  596 + "requestBody": {},
  597 + "tags": [
  598 + "chat"
  599 + ]
  600 + }
  601 + },
  602 + "v1/chat/spark_session": {
  603 + "post": {
  604 + "summary": "星火聊天会话-保存",
  605 + "operationId": "chatSparkSessionSave",
  606 + "responses": {
  607 + "200": {
  608 + "description": "A successful response.",
  609 + "schema": {
  610 + "$ref": "#/definitions/ChatSessionSaveResponse"
  611 + }
  612 + }
  613 + },
  614 + "parameters": [
  615 + {
  616 + "name": "body",
  617 + "in": "body",
  618 + "required": true,
  619 + "schema": {
  620 + "$ref": "#/definitions/ChatSessionSaveRequest"
  621 + }
  622 + }
  623 + ],
  624 + "requestBody": {},
  625 + "tags": [
  626 + "chat"
  627 + ]
  628 + }
  629 + }
  630 + },
  631 + "definitions": {
  632 + "ChatDatasetDeleteRequest": {
  633 + "type": "object",
  634 + "properties": {
  635 + "id": {
  636 + "type": "integer",
  637 + "format": "int64"
  638 + }
  639 + },
  640 + "title": "ChatDatasetDeleteRequest",
  641 + "required": [
  642 + "id"
  643 + ]
  644 + },
  645 + "ChatDatasetDeleteResponse": {
  646 + "type": "object",
  647 + "title": "ChatDatasetDeleteResponse"
  648 + },
  649 + "ChatDatasetGetRequest": {
  650 + "type": "object",
  651 + "properties": {
  652 + "id": {
  653 + "type": "integer",
  654 + "format": "int64"
  655 + }
  656 + },
  657 + "title": "ChatDatasetGetRequest",
  658 + "required": [
  659 + "id"
  660 + ]
  661 + },
  662 + "ChatDatasetGetResponse": {
  663 + "type": "object",
  664 + "properties": {
  665 + "dataset": {
  666 + "$ref": "#/definitions/ChatDatasetItem"
  667 + },
  668 + "documents": {
  669 + "type": "array",
  670 + "items": {
  671 + "$ref": "#/definitions/ChatDocumentItem"
  672 + }
  673 + }
  674 + },
  675 + "title": "ChatDatasetGetResponse",
  676 + "required": [
  677 + "dataset",
  678 + "documents"
  679 + ]
  680 + },
  681 + "ChatDatasetItem": {
  682 + "type": "object",
  683 + "properties": {
  684 + "id": {
  685 + "type": "integer",
  686 + "format": "int64"
  687 + },
  688 + "name": {
  689 + "$ref": "#/definitions/string",
  690 + "description": " 名称"
  691 + },
  692 + "desc": {
  693 + "$ref": "#/definitions/string",
  694 + "description": " 描述"
  695 + },
  696 + "status": {
  697 + "$ref": "#/definitions/int",
  698 + "description": " 状态 1:启用 2:禁用"
  699 + },
  700 + "createdAt": {
  701 + "type": "integer",
  702 + "format": "int64",
  703 + "description": " 创建时间"
  704 + },
  705 + "updatedAt": {
  706 + "type": "integer",
  707 + "format": "int64",
  708 + "description": " 更新时间"
  709 + },
  710 + "fileNumber": {
  711 + "$ref": "#/definitions/int",
  712 + "description": " 文件数量"
  713 + }
  714 + },
  715 + "title": "ChatDatasetItem",
  716 + "required": [
  717 + "id",
  718 + "name",
  719 + "desc",
  720 + "status",
  721 + "createdAt",
  722 + "updatedAt",
  723 + "fileNumber"
  724 + ]
  725 + },
  726 + "ChatDatasetSaveRequest": {
  727 + "type": "object",
  728 + "properties": {
  729 + "name": {
  730 + "type": "string",
  731 + "description": " 名称"
  732 + },
  733 + "documentIds": {
  734 + "type": "array",
  735 + "items": {
  736 + "type": "integer",
  737 + "format": "int64"
  738 + },
  739 + "description": " 文档ID列表"
  740 + }
  741 + },
  742 + "title": "ChatDatasetSaveRequest",
  743 + "required": [
  744 + "name",
  745 + "documentIds"
  746 + ]
  747 + },
  748 + "ChatDatasetSaveResponse": {
  749 + "type": "object",
  750 + "properties": {
  751 + "dataset": {
  752 + "$ref": "#/definitions/ChatDatasetItem"
  753 + }
  754 + },
  755 + "title": "ChatDatasetSaveResponse",
  756 + "required": [
  757 + "dataset"
  758 + ]
  759 + },
  760 + "ChatDatasetSearchRequest": {
  761 + "type": "object",
  762 + "properties": {
  763 + "page": {
  764 + "type": "integer",
  765 + "format": "int32"
  766 + },
  767 + "size": {
  768 + "type": "integer",
  769 + "format": "int32"
  770 + },
  771 + "name": {
  772 + "type": "string",
  773 + "description": " 文件名匹配"
  774 + },
  775 + "name": {
  776 + "type": "integer",
  777 + "format": "int32",
  778 + "description": " 1:启用 2:禁用"
  779 + }
  780 + },
  781 + "title": "ChatDatasetSearchRequest",
  782 + "required": [
  783 + "name"
  784 + ]
  785 + },
  786 + "ChatDatasetSearchResponse": {
  787 + "type": "object",
  788 + "properties": {
  789 + "list": {
  790 + "type": "array",
  791 + "items": {
  792 + "$ref": "#/definitions/ChatDatasetItem"
  793 + }
  794 + },
  795 + "total": {
  796 + "type": "integer",
  797 + "format": "int64"
  798 + }
  799 + },
  800 + "title": "ChatDatasetSearchResponse",
  801 + "required": [
  802 + "list",
  803 + "total"
  804 + ]
  805 + },
  806 + "ChatDatasetUpdateRequest": {
  807 + "type": "object",
  808 + "properties": {
  809 + "id": {
  810 + "type": "integer",
  811 + "format": "int64"
  812 + },
  813 + "dataset": {
  814 + "$ref": "#/definitions/ChatDatasetItem"
  815 + }
  816 + },
  817 + "title": "ChatDatasetUpdateRequest",
  818 + "required": [
  819 + "id",
  820 + "dataset"
  821 + ]
  822 + },
  823 + "ChatDatasetUpdateResponse": {
  824 + "type": "object",
  825 + "title": "ChatDatasetUpdateResponse"
  826 + },
  827 + "ChatDocumentDeleteRequest": {
  828 + "type": "object",
  829 + "properties": {
  830 + "id": {
  831 + "type": "integer",
  832 + "format": "int64"
  833 + }
  834 + },
  835 + "title": "ChatDocumentDeleteRequest",
  836 + "required": [
  837 + "id"
  838 + ]
  839 + },
  840 + "ChatDocumentDeleteResponse": {
  841 + "type": "object",
  842 + "title": "ChatDocumentDeleteResponse"
  843 + },
  844 + "ChatDocumentGetRequest": {
  845 + "type": "object",
  846 + "properties": {
  847 + "id": {
  848 + "type": "integer",
  849 + "format": "int64"
  850 + }
  851 + },
  852 + "title": "ChatDocumentGetRequest",
  853 + "required": [
  854 + "id"
  855 + ]
  856 + },
  857 + "ChatDocumentGetResponse": {
  858 + "type": "object",
  859 + "properties": {
  860 + "document": {
  861 + "$ref": "#/definitions/ChatDocumentItem"
  862 + }
  863 + },
  864 + "title": "ChatDocumentGetResponse",
  865 + "required": [
  866 + "document"
  867 + ]
  868 + },
  869 + "ChatDocumentItem": {
  870 + "type": "object",
  871 + "properties": {
  872 + "id": {
  873 + "type": "integer",
  874 + "format": "int64"
  875 + },
  876 + "name": {
  877 + "type": "string",
  878 + "description": " 文件名"
  879 + },
  880 + "fileType": {
  881 + "type": "string",
  882 + "description": " 文件类型 markdown\\pdf\\txt\\doc\u0026docx"
  883 + },
  884 + "status": {
  885 + "type": "integer",
  886 + "format": "int32",
  887 + "description": " 1.使用中、0.待处理、2.预处理中、3.处理失败"
  888 + },
  889 + "originFileName": {
  890 + "type": "string",
  891 + "description": " 源文件命"
  892 + },
  893 + "ext": {
  894 + "type": "string",
  895 + "description": " 格式"
  896 + },
  897 + "fileId": {
  898 + "type": "string",
  899 + "description": " 星火文件ID"
  900 + },
  901 + "fileUrl": {
  902 + "type": "string",
  903 + "description": " 文件地址"
  904 + },
  905 + "fileSize": {
  906 + "type": "number",
  907 + "format": "double",
  908 + "description": " 文件大小KB"
  909 + },
  910 + "createdAt": {
  911 + "type": "integer",
  912 + "format": "int64",
  913 + "description": " 创建时间"
  914 + },
  915 + "updatedAt": {
  916 + "type": "integer",
  917 + "format": "int64",
  918 + "description": " 更新时间"
  919 + }
  920 + },
  921 + "title": "ChatDocumentItem",
  922 + "required": [
  923 + "id",
  924 + "fileType",
  925 + "status",
  926 + "originFileName",
  927 + "ext",
  928 + "fileId",
  929 + "fileUrl",
  930 + "fileSize",
  931 + "createdAt",
  932 + "updatedAt"
  933 + ]
  934 + },
  935 + "ChatDocumentSaveRequest": {
  936 + "type": "object",
  937 + "properties": {
  938 + "fileName": {
98 "type": "string" 939 "type": "string"
99 }, 940 },
100 - {  
101 - "name": "text",  
102 - "description": " 内容文本",  
103 - "in": "query",  
104 - "required": true, 941 + "url": {
105 "type": "string" 942 "type": "string"
106 }, 943 },
107 - {  
108 - "name": "fileUrl",  
109 - "description": " 文件地址",  
110 - "in": "query",  
111 - "required": true,  
112 - "type": "string" 944 + "size": {
  945 + "type": "number",
  946 + "format": "double",
  947 + "description": " 文件大小(KB)"
113 } 948 }
114 - ],  
115 - "requestBody": {},  
116 - "tags": [  
117 - "chat" 949 + },
  950 + "title": "ChatDocumentSaveRequest",
  951 + "required": [
  952 + "fileName",
  953 + "url",
  954 + "size"
118 ] 955 ]
119 - }  
120 }, 956 },
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 - } 957 + "ChatDocumentSaveResponse": {
  958 + "type": "object",
  959 + "properties": {
  960 + "document": {
  961 + "$ref": "#/definitions/ChatDocumentItem"
131 } 962 }
132 }, 963 },
133 - "parameters": [  
134 - {  
135 - "name": "page",  
136 - "in": "query",  
137 - "required": false, 964 + "title": "ChatDocumentSaveResponse",
  965 + "required": [
  966 + "document"
  967 + ]
  968 + },
  969 + "ChatDocumentSearchRequest": {
  970 + "type": "object",
  971 + "properties": {
  972 + "page": {
138 "type": "integer", 973 "type": "integer",
139 "format": "int32" 974 "format": "int32"
140 }, 975 },
141 - {  
142 - "name": "size",  
143 - "in": "query",  
144 - "required": false, 976 + "size": {
145 "type": "integer", 977 "type": "integer",
146 "format": "int32" 978 "format": "int32"
147 }, 979 },
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 - } 980 + "name": {
  981 + "type": "string",
  982 + "description": " 文件名匹配"
161 }, 983 },
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 - } 984 + "fileType": {
  985 + "type": "string",
  986 + "description": " 文件类型 markdown\\pdf\\txt\\doc\u0026docx"
173 }, 987 },
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 - ] 988 + "status": {
  989 + "type": "integer",
  990 + "format": "int32",
  991 + "description": " 文件状态 1.使用中、0.待处理、2.预处理中、3.处理失败"
188 } 992 }
189 }, 993 },
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 - } 994 + "title": "ChatDocumentSearchRequest"
201 }, 995 },
202 - "parameters": [  
203 - {  
204 - "name": "id",  
205 - "in": "path",  
206 - "required": true,  
207 - "type": "string" 996 + "ChatDocumentSearchResponse": {
  997 + "type": "object",
  998 + "properties": {
  999 + "list": {
  1000 + "type": "array",
  1001 + "items": {
  1002 + "$ref": "#/definitions/ChatDocumentItem"
208 } 1003 }
209 - ],  
210 - "requestBody": {},  
211 - "tags": [  
212 - "chat"  
213 - ]  
214 }, 1004 },
215 - "delete": {  
216 - "summary": "聊天会话-删除",  
217 - "operationId": "chatSessionDelete",  
218 - "responses": {  
219 - "200": {  
220 - "description": "A successful response.",  
221 - "schema": {  
222 - "$ref": "#/definitions/ChatSessionDeleteResponse"  
223 - } 1005 + "total": {
  1006 + "type": "integer",
  1007 + "format": "int64"
224 } 1008 }
225 }, 1009 },
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" 1010 + "title": "ChatDocumentSearchResponse",
  1011 + "required": [
  1012 + "list",
  1013 + "total"
245 ] 1014 ]
246 }, 1015 },
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" 1016 + "ChatDocumentUpdateRequest": {
  1017 + "type": "object",
  1018 + "properties": {
  1019 + "id": {
  1020 + "type": "integer",
  1021 + "format": "int64"
264 }, 1022 },
265 - {  
266 - "name": "body",  
267 - "in": "body",  
268 - "required": true,  
269 - "schema": {  
270 - "$ref": "#/definitions/ChatSessionUpdateRequest" 1023 + "document": {
  1024 + "$ref": "#/definitions/ChatDocumentItem"
271 } 1025 }
272 - }  
273 - ],  
274 - "requestBody": {},  
275 - "tags": [  
276 - "chat" 1026 + },
  1027 + "title": "ChatDocumentUpdateRequest",
  1028 + "required": [
  1029 + "id",
  1030 + "document"
277 ] 1031 ]
278 - }  
279 - }  
280 }, 1032 },
281 - "definitions": { 1033 + "ChatDocumentUpdateResponse": {
  1034 + "type": "object",
  1035 + "title": "ChatDocumentUpdateResponse"
  1036 + },
282 "ChatModelsRequest": { 1037 "ChatModelsRequest": {
283 "type": "object", 1038 "type": "object",
284 "title": "ChatModelsRequest" 1039 "title": "ChatModelsRequest"
@@ -329,13 +1084,62 @@ @@ -329,13 +1084,62 @@
329 "sessionId", 1084 "sessionId",
330 "modelId", 1085 "modelId",
331 "contentType", 1086 "contentType",
332 - "text",  
333 - "fileUrl" 1087 + "text"
  1088 + ]
  1089 + },
  1090 + "ChatSessionConversationRequestWs": {
  1091 + "type": "object",
  1092 + "properties": {
  1093 + "sessionId": {
  1094 + "type": "integer",
  1095 + "format": "int64",
  1096 + "description": " 会话ID"
  1097 + },
  1098 + "modelId": {
  1099 + "type": "integer",
  1100 + "format": "int64",
  1101 + "description": " 模型ID"
  1102 + },
  1103 + "contentType": {
  1104 + "type": "string",
  1105 + "description": " 内容类型 文本:text (图片:image 文档:document)"
  1106 + },
  1107 + "text": {
  1108 + "type": "string",
  1109 + "description": " 内容文本"
  1110 + }
  1111 + },
  1112 + "title": "ChatSessionConversationRequestWs",
  1113 + "required": [
  1114 + "sessionId",
  1115 + "modelId",
  1116 + "contentType",
  1117 + "text"
334 ] 1118 ]
335 }, 1119 },
336 "ChatSessionConversationResponse": { 1120 "ChatSessionConversationResponse": {
337 "type": "object", 1121 "type": "object",
338 - "title": "ChatSessionConversationResponse" 1122 + "properties": {
  1123 + "record": {
  1124 + "$ref": "#/definitions/Record"
  1125 + },
  1126 + "parts": {
  1127 + "type": "array",
  1128 + "items": {
  1129 + "type": "string"
  1130 + }
  1131 + },
  1132 + "finished": {
  1133 + "type": "boolean",
  1134 + "format": "boolean"
  1135 + }
  1136 + },
  1137 + "title": "ChatSessionConversationResponse",
  1138 + "required": [
  1139 + "record",
  1140 + "parts",
  1141 + "finished"
  1142 + ]
339 }, 1143 },
340 "ChatSessionDeleteRequest": { 1144 "ChatSessionDeleteRequest": {
341 "type": "object", 1145 "type": "object",
@@ -406,6 +1210,30 @@ @@ -406,6 +1210,30 @@
406 "type": "integer", 1210 "type": "integer",
407 "format": "int64", 1211 "format": "int64",
408 "description": " 创建时间" 1212 "description": " 创建时间"
  1213 + },
  1214 + "module": {
  1215 + "type": "integer",
  1216 + "format": "int32",
  1217 + "default": "1",
  1218 + "description": " 1:openai chat 2:星火文档问答"
  1219 + },
  1220 + "type": {
  1221 + "type": "string",
  1222 + "default": "chat",
  1223 + "description": " 类型 chat:普通问答 spark_dataset_chat:星火知识库问答 spark_documents_chat:星火多文档问答"
  1224 + },
  1225 + "datasetId": {
  1226 + "type": "integer",
  1227 + "format": "int64",
  1228 + "description": " 知识库"
  1229 + },
  1230 + "documentIds": {
  1231 + "type": "array",
  1232 + "items": {
  1233 + "type": "integer",
  1234 + "format": "int64"
  1235 + },
  1236 + "description": " 多文档"
409 } 1237 }
410 }, 1238 },
411 "title": "ChatSessionItem", 1239 "title": "ChatSessionItem",
@@ -413,7 +1241,11 @@ @@ -413,7 +1241,11 @@
413 "id", 1241 "id",
414 "title", 1242 "title",
415 "abstract", 1243 "abstract",
416 - "createdAt" 1244 + "createdAt",
  1245 + "module",
  1246 + "type",
  1247 + "datasetId",
  1248 + "documentIds"
417 ] 1249 ]
418 }, 1250 },
419 "ChatSessionRecordsRequest": { 1251 "ChatSessionRecordsRequest": {
@@ -471,7 +1303,15 @@ @@ -471,7 +1303,15 @@
471 }, 1303 },
472 "ChatSessionSaveResponse": { 1304 "ChatSessionSaveResponse": {
473 "type": "object", 1305 "type": "object",
474 - "title": "ChatSessionSaveResponse" 1306 + "properties": {
  1307 + "session": {
  1308 + "$ref": "#/definitions/ChatSessionItem"
  1309 + }
  1310 + },
  1311 + "title": "ChatSessionSaveResponse",
  1312 + "required": [
  1313 + "session"
  1314 + ]
475 }, 1315 },
476 "ChatSessionSearchRequest": { 1316 "ChatSessionSearchRequest": {
477 "type": "object", 1317 "type": "object",
@@ -487,6 +1327,11 @@ @@ -487,6 +1327,11 @@
487 "title": { 1327 "title": {
488 "type": "string", 1328 "type": "string",
489 "description": " 按标题搜索" 1329 "description": " 按标题搜索"
  1330 + },
  1331 + "module": {
  1332 + "type": "integer",
  1333 + "format": "int32",
  1334 + "description": " 模块 1:openai chat 2:星火文档问答"
490 } 1335 }
491 }, 1336 },
492 "title": "ChatSessionSearchRequest" 1337 "title": "ChatSessionSearchRequest"
  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_dataset
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @doc "详情"
  19 + @handler chat_datasetGet
  20 + get /chat_dataset/:id (ChatDatasetGetRequest) returns (ChatDatasetGetResponse)
  21 + @doc "保存"
  22 + @handler chat_datasetSave
  23 + post /chat_dataset (ChatDatasetSaveRequest) returns (ChatDatasetSaveResponse)
  24 + @doc "删除"
  25 + @handler chat_datasetDelete
  26 + delete /chat_dataset/:id (ChatDatasetDeleteRequest) returns (ChatDatasetDeleteResponse)
  27 + @doc "更新"
  28 + @handler chat_datasetUpdate
  29 + put /chat_dataset/:id (ChatDatasetUpdateRequest) returns (ChatDatasetUpdateResponse)
  30 + @doc "搜索"
  31 + @handler chat_datasetSearch
  32 + post /chat_dataset/search (ChatDatasetSearchRequest) returns (ChatDatasetSearchResponse)
  33 +}
  34 +
  35 +type (
  36 + ChatDatasetGetRequest {
  37 + Id int64 `path:"id"`
  38 + }
  39 + ChatDatasetGetResponse {
  40 + ChatDataset ChatDatasetItem `json:"chat_dataset"`
  41 + }
  42 +
  43 + ChatDatasetSaveRequest {
  44 + ChatDataset ChatDatasetItem `json:"chat_dataset"`
  45 + }
  46 + ChatDatasetSaveResponse {}
  47 +
  48 + ChatDatasetDeleteRequest {
  49 + Id int64 `path:"id"`
  50 + }
  51 + ChatDatasetDeleteResponse {}
  52 +
  53 + ChatDatasetUpdateRequest {
  54 + Id int64 `path:"id"`
  55 + ChatDataset ChatDatasetItem `json:"chat_dataset"`
  56 + }
  57 + ChatDatasetUpdateResponse {}
  58 +
  59 + ChatDatasetSearchRequest {
  60 + Page int `json:"page"`
  61 + Size int `json:"size"`
  62 + }
  63 + ChatDatasetSearchResponse{
  64 + List []ChatDatasetItem `json:"list"`
  65 + Total int64 `json:"total"`
  66 + }
  67 + ChatDatasetItem {
  68 +
  69 + }
  70 +)
  71 +
  72 +// logic CRUD
  73 +// Save
  74 + //var (
  75 + // conn = l.svcCtx.DefaultDBConn()
  76 + // dm *domain.ChatDataset
  77 + //)
  78 + //// 唯一判断
  79 +
  80 + //dm = NewDomainChatDataset(req.ChatDataset)
  81 + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  82 + // dm, err = l.svcCtx.ChatDatasetRepository.Insert(l.ctx, conn, dm)
  83 + // return err
  84 + //}, true); err != nil {
  85 + // return nil, xerr.NewErrMsg("保存失败")
  86 + //}
  87 + ////resp = &types.ChatDatasetSaveResponse{}
  88 + //return
  89 +
  90 +//func NewDomainChatDataset(item types.ChatDatasetItem) *domain.ChatDataset {
  91 +// return &domain.ChatDataset{
  92 +
  93 +// }
  94 +//}
  95 +//
  96 +//func NewTypesChatDataset(item *domain.ChatDataset) types.ChatDatasetItem {
  97 +// return types.ChatDatasetItem{
  98 +// Id: item.Id,
  99 +// }
  100 +//}
  101 +
  102 +// Get
  103 + //var (
  104 + // conn = l.svcCtx.DefaultDBConn()
  105 + // dm *domain.ChatDataset
  106 + //)
  107 + //// 货号唯一
  108 + //if dm, err = l.svcCtx.ChatDatasetRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  109 + // return nil, xerr.NewErrMsgErr("不存在", err)
  110 + //}
  111 + //resp = &types.ChatDatasetGetResponse{
  112 + // ChatDataset: NewTypesChatDataset(dm),
  113 + //}
  114 + //return
  115 +
  116 +// Delete
  117 + //var (
  118 + // conn = l.svcCtx.DefaultDBConn()
  119 + // dm *domain.ChatDataset
  120 + //)
  121 + //if dm, err = l.svcCtx.ChatDatasetRepository.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.ChatDatasetRepository.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.ChatDataset
  138 + // total int64
  139 + //)
  140 + //
  141 + //queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size).
  142 + // WithKV("", "")
  143 +
  144 + //total, dms, err = l.svcCtx.ChatDatasetRepository.Find(l.ctx, conn, queryOptions)
  145 + //list := make([]types.ChatDatasetItem, 0)
  146 + //for i := range dms {
  147 + // list = append(list, NewTypesChatDataset(dms[i]))
  148 + //}
  149 + //resp = &types.ChatDatasetSearchResponse{
  150 + // List: list,
  151 + // Total: total,
  152 + //}
  153 + //return
  154 +
  155 +// Update
  156 + //var (
  157 + // conn = l.svcCtx.DefaultDBConn()
  158 + // dm *domain.ChatDataset
  159 + //)
  160 + //if dm, err = l.svcCtx.ChatDatasetRepository.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.ChatDatasetRepository.UpdateWithVersion(l.ctx, conn, dm)
  170 + // return err
  171 + //}, true); err != nil {
  172 + // return nil, xerr.NewErrMsg("更新失败")
  173 + //}
  174 + //resp = &types.ChatDatasetUpdateResponse{}
  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_dataset_document_mapping
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @doc "详情"
  19 + @handler chat_dataset_document_mappingGet
  20 + get /chat_dataset_document_mapping/:id (ChatDatasetDocumentMappingGetRequest) returns (ChatDatasetDocumentMappingGetResponse)
  21 + @doc "保存"
  22 + @handler chat_dataset_document_mappingSave
  23 + post /chat_dataset_document_mapping (ChatDatasetDocumentMappingSaveRequest) returns (ChatDatasetDocumentMappingSaveResponse)
  24 + @doc "删除"
  25 + @handler chat_dataset_document_mappingDelete
  26 + delete /chat_dataset_document_mapping/:id (ChatDatasetDocumentMappingDeleteRequest) returns (ChatDatasetDocumentMappingDeleteResponse)
  27 + @doc "更新"
  28 + @handler chat_dataset_document_mappingUpdate
  29 + put /chat_dataset_document_mapping/:id (ChatDatasetDocumentMappingUpdateRequest) returns (ChatDatasetDocumentMappingUpdateResponse)
  30 + @doc "搜索"
  31 + @handler chat_dataset_document_mappingSearch
  32 + post /chat_dataset_document_mapping/search (ChatDatasetDocumentMappingSearchRequest) returns (ChatDatasetDocumentMappingSearchResponse)
  33 +}
  34 +
  35 +type (
  36 + ChatDatasetDocumentMappingGetRequest {
  37 + Id int64 `path:"id"`
  38 + }
  39 + ChatDatasetDocumentMappingGetResponse {
  40 + ChatDatasetDocumentMapping ChatDatasetDocumentMappingItem `json:"chat_dataset_document_mapping"`
  41 + }
  42 +
  43 + ChatDatasetDocumentMappingSaveRequest {
  44 + ChatDatasetDocumentMapping ChatDatasetDocumentMappingItem `json:"chat_dataset_document_mapping"`
  45 + }
  46 + ChatDatasetDocumentMappingSaveResponse {}
  47 +
  48 + ChatDatasetDocumentMappingDeleteRequest {
  49 + Id int64 `path:"id"`
  50 + }
  51 + ChatDatasetDocumentMappingDeleteResponse {}
  52 +
  53 + ChatDatasetDocumentMappingUpdateRequest {
  54 + Id int64 `path:"id"`
  55 + ChatDatasetDocumentMapping ChatDatasetDocumentMappingItem `json:"chat_dataset_document_mapping"`
  56 + }
  57 + ChatDatasetDocumentMappingUpdateResponse {}
  58 +
  59 + ChatDatasetDocumentMappingSearchRequest {
  60 + Page int `json:"page"`
  61 + Size int `json:"size"`
  62 + }
  63 + ChatDatasetDocumentMappingSearchResponse{
  64 + List []ChatDatasetDocumentMappingItem `json:"list"`
  65 + Total int64 `json:"total"`
  66 + }
  67 + ChatDatasetDocumentMappingItem {
  68 +
  69 + }
  70 +)
  71 +
  72 +// logic CRUD
  73 +// Save
  74 + //var (
  75 + // conn = l.svcCtx.DefaultDBConn()
  76 + // dm *domain.ChatDatasetDocumentMapping
  77 + //)
  78 + //// 唯一判断
  79 +
  80 + //dm = NewDomainChatDatasetDocumentMapping(req.ChatDatasetDocumentMapping)
  81 + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  82 + // dm, err = l.svcCtx.ChatDatasetDocumentMappingRepository.Insert(l.ctx, conn, dm)
  83 + // return err
  84 + //}, true); err != nil {
  85 + // return nil, xerr.NewErrMsg("保存失败")
  86 + //}
  87 + ////resp = &types.ChatDatasetDocumentMappingSaveResponse{}
  88 + //return
  89 +
  90 +//func NewDomainChatDatasetDocumentMapping(item types.ChatDatasetDocumentMappingItem) *domain.ChatDatasetDocumentMapping {
  91 +// return &domain.ChatDatasetDocumentMapping{
  92 +
  93 +// }
  94 +//}
  95 +//
  96 +//func NewTypesChatDatasetDocumentMapping(item *domain.ChatDatasetDocumentMapping) types.ChatDatasetDocumentMappingItem {
  97 +// return types.ChatDatasetDocumentMappingItem{
  98 +// Id: item.Id,
  99 +// }
  100 +//}
  101 +
  102 +// Get
  103 + //var (
  104 + // conn = l.svcCtx.DefaultDBConn()
  105 + // dm *domain.ChatDatasetDocumentMapping
  106 + //)
  107 + //// 货号唯一
  108 + //if dm, err = l.svcCtx.ChatDatasetDocumentMappingRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  109 + // return nil, xerr.NewErrMsgErr("不存在", err)
  110 + //}
  111 + //resp = &types.ChatDatasetDocumentMappingGetResponse{
  112 + // ChatDatasetDocumentMapping: NewTypesChatDatasetDocumentMapping(dm),
  113 + //}
  114 + //return
  115 +
  116 +// Delete
  117 + //var (
  118 + // conn = l.svcCtx.DefaultDBConn()
  119 + // dm *domain.ChatDatasetDocumentMapping
  120 + //)
  121 + //if dm, err = l.svcCtx.ChatDatasetDocumentMappingRepository.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.ChatDatasetDocumentMappingRepository.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.ChatDatasetDocumentMapping
  138 + // total int64
  139 + //)
  140 + //
  141 + //queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size).
  142 + // WithKV("", "")
  143 +
  144 + //total, dms, err = l.svcCtx.ChatDatasetDocumentMappingRepository.Find(l.ctx, conn, queryOptions)
  145 + //list := make([]types.ChatDatasetDocumentMappingItem, 0)
  146 + //for i := range dms {
  147 + // list = append(list, NewTypesChatDatasetDocumentMapping(dms[i]))
  148 + //}
  149 + //resp = &types.ChatDatasetDocumentMappingSearchResponse{
  150 + // List: list,
  151 + // Total: total,
  152 + //}
  153 + //return
  154 +
  155 +// Update
  156 + //var (
  157 + // conn = l.svcCtx.DefaultDBConn()
  158 + // dm *domain.ChatDatasetDocumentMapping
  159 + //)
  160 + //if dm, err = l.svcCtx.ChatDatasetDocumentMappingRepository.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.ChatDatasetDocumentMappingRepository.UpdateWithVersion(l.ctx, conn, dm)
  170 + // return err
  171 + //}, true); err != nil {
  172 + // return nil, xerr.NewErrMsg("更新失败")
  173 + //}
  174 + //resp = &types.ChatDatasetDocumentMappingUpdateResponse{}
  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_document
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @doc "详情"
  19 + @handler chat_documentGet
  20 + get /chat_document/:id (ChatDocumentGetRequest) returns (ChatDocumentGetResponse)
  21 + @doc "保存"
  22 + @handler chat_documentSave
  23 + post /chat_document (ChatDocumentSaveRequest) returns (ChatDocumentSaveResponse)
  24 + @doc "删除"
  25 + @handler chat_documentDelete
  26 + delete /chat_document/:id (ChatDocumentDeleteRequest) returns (ChatDocumentDeleteResponse)
  27 + @doc "更新"
  28 + @handler chat_documentUpdate
  29 + put /chat_document/:id (ChatDocumentUpdateRequest) returns (ChatDocumentUpdateResponse)
  30 + @doc "搜索"
  31 + @handler chat_documentSearch
  32 + post /chat_document/search (ChatDocumentSearchRequest) returns (ChatDocumentSearchResponse)
  33 +}
  34 +
  35 +type (
  36 + ChatDocumentGetRequest {
  37 + Id int64 `path:"id"`
  38 + }
  39 + ChatDocumentGetResponse {
  40 + ChatDocument ChatDocumentItem `json:"chat_document"`
  41 + }
  42 +
  43 + ChatDocumentSaveRequest {
  44 + ChatDocument ChatDocumentItem `json:"chat_document"`
  45 + }
  46 + ChatDocumentSaveResponse {}
  47 +
  48 + ChatDocumentDeleteRequest {
  49 + Id int64 `path:"id"`
  50 + }
  51 + ChatDocumentDeleteResponse {}
  52 +
  53 + ChatDocumentUpdateRequest {
  54 + Id int64 `path:"id"`
  55 + ChatDocument ChatDocumentItem `json:"chat_document"`
  56 + }
  57 + ChatDocumentUpdateResponse {}
  58 +
  59 + ChatDocumentSearchRequest {
  60 + Page int `json:"page"`
  61 + Size int `json:"size"`
  62 + }
  63 + ChatDocumentSearchResponse{
  64 + List []ChatDocumentItem `json:"list"`
  65 + Total int64 `json:"total"`
  66 + }
  67 + ChatDocumentItem {
  68 +
  69 + }
  70 +)
  71 +
  72 +// logic CRUD
  73 +// Save
  74 + //var (
  75 + // conn = l.svcCtx.DefaultDBConn()
  76 + // dm *domain.ChatDocument
  77 + //)
  78 + //// 唯一判断
  79 +
  80 + //dm = NewDomainChatDocument(req.ChatDocument)
  81 + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  82 + // dm, err = l.svcCtx.ChatDocumentRepository.Insert(l.ctx, conn, dm)
  83 + // return err
  84 + //}, true); err != nil {
  85 + // return nil, xerr.NewErrMsg("保存失败")
  86 + //}
  87 + ////resp = &types.ChatDocumentSaveResponse{}
  88 + //return
  89 +
  90 +//func NewDomainChatDocument(item types.ChatDocumentItem) *domain.ChatDocument {
  91 +// return &domain.ChatDocument{
  92 +
  93 +// }
  94 +//}
  95 +//
  96 +//func NewTypesChatDocument(item *domain.ChatDocument) types.ChatDocumentItem {
  97 +// return types.ChatDocumentItem{
  98 +// Id: item.Id,
  99 +// }
  100 +//}
  101 +
  102 +// Get
  103 + //var (
  104 + // conn = l.svcCtx.DefaultDBConn()
  105 + // dm *domain.ChatDocument
  106 + //)
  107 + //// 货号唯一
  108 + //if dm, err = l.svcCtx.ChatDocumentRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  109 + // return nil, xerr.NewErrMsgErr("不存在", err)
  110 + //}
  111 + //resp = &types.ChatDocumentGetResponse{
  112 + // ChatDocument: NewTypesChatDocument(dm),
  113 + //}
  114 + //return
  115 +
  116 +// Delete
  117 + //var (
  118 + // conn = l.svcCtx.DefaultDBConn()
  119 + // dm *domain.ChatDocument
  120 + //)
  121 + //if dm, err = l.svcCtx.ChatDocumentRepository.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.ChatDocumentRepository.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.ChatDocument
  138 + // total int64
  139 + //)
  140 + //
  141 + //queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size).
  142 + // WithKV("", "")
  143 +
  144 + //total, dms, err = l.svcCtx.ChatDocumentRepository.Find(l.ctx, conn, queryOptions)
  145 + //list := make([]types.ChatDocumentItem, 0)
  146 + //for i := range dms {
  147 + // list = append(list, NewTypesChatDocument(dms[i]))
  148 + //}
  149 + //resp = &types.ChatDocumentSearchResponse{
  150 + // List: list,
  151 + // Total: total,
  152 + //}
  153 + //return
  154 +
  155 +// Update
  156 + //var (
  157 + // conn = l.svcCtx.DefaultDBConn()
  158 + // dm *domain.ChatDocument
  159 + //)
  160 + //if dm, err = l.svcCtx.ChatDocumentRepository.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.ChatDocumentRepository.UpdateWithVersion(l.ctx, conn, dm)
  170 + // return err
  171 + //}, true); err != nil {
  172 + // return nil, xerr.NewErrMsg("更新失败")
  173 + //}
  174 + //resp = &types.ChatDocumentUpdateResponse{}
  175 + //return
  1 +
  2 +syntax = "proto3";
  3 +
  4 +option go_package ="./pb";
  5 +
  6 +package pb;
  7 +
  8 +message ChatDatasetGetReq {
  9 + int64 Id = 1;
  10 +}
  11 +message ChatDatasetGetResp{
  12 + ChatDatasetItem ChatDataset = 1;
  13 +}
  14 +
  15 +message ChatDatasetSaveReq {
  16 +
  17 +}
  18 +message ChatDatasetSaveResp{
  19 +
  20 +}
  21 +
  22 +message ChatDatasetDeleteReq {
  23 + int64 Id = 1;
  24 +}
  25 +message ChatDatasetDeleteResp{
  26 +
  27 +}
  28 +
  29 +message ChatDatasetUpdateReq {
  30 + int64 Id = 1;
  31 +}
  32 +message ChatDatasetUpdateResp{
  33 +
  34 +}
  35 +
  36 +message ChatDatasetSearchReq {
  37 + int64 PageNumber = 1;
  38 + int64 PageSize = 2;
  39 +}
  40 +message ChatDatasetSearchResp{
  41 + repeated ChatDatasetItem List =1;
  42 + int64 Total =2;
  43 +}
  44 +message ChatDatasetItem {
  45 +
  46 +}
  47 +
  48 +service ChatDatasetService {
  49 + rpc ChatDatasetGet(ChatDatasetGetReq) returns(ChatDatasetGetResp);
  50 + rpc ChatDatasetSave(ChatDatasetSaveReq) returns(ChatDatasetSaveResp);
  51 + rpc ChatDatasetDelete(ChatDatasetDeleteReq) returns(ChatDatasetDeleteResp);
  52 + rpc ChatDatasetUpdate(ChatDatasetUpdateReq) returns(ChatDatasetUpdateResp);
  53 + rpc ChatDatasetSearch(ChatDatasetSearchReq) returns(ChatDatasetSearchResp);
  54 +}
  1 +
  2 +syntax = "proto3";
  3 +
  4 +option go_package ="./pb";
  5 +
  6 +package pb;
  7 +
  8 +message ChatDatasetDocumentMappingGetReq {
  9 + int64 Id = 1;
  10 +}
  11 +message ChatDatasetDocumentMappingGetResp{
  12 + ChatDatasetDocumentMappingItem ChatDatasetDocumentMapping = 1;
  13 +}
  14 +
  15 +message ChatDatasetDocumentMappingSaveReq {
  16 +
  17 +}
  18 +message ChatDatasetDocumentMappingSaveResp{
  19 +
  20 +}
  21 +
  22 +message ChatDatasetDocumentMappingDeleteReq {
  23 + int64 Id = 1;
  24 +}
  25 +message ChatDatasetDocumentMappingDeleteResp{
  26 +
  27 +}
  28 +
  29 +message ChatDatasetDocumentMappingUpdateReq {
  30 + int64 Id = 1;
  31 +}
  32 +message ChatDatasetDocumentMappingUpdateResp{
  33 +
  34 +}
  35 +
  36 +message ChatDatasetDocumentMappingSearchReq {
  37 + int64 PageNumber = 1;
  38 + int64 PageSize = 2;
  39 +}
  40 +message ChatDatasetDocumentMappingSearchResp{
  41 + repeated ChatDatasetDocumentMappingItem List =1;
  42 + int64 Total =2;
  43 +}
  44 +message ChatDatasetDocumentMappingItem {
  45 +
  46 +}
  47 +
  48 +service ChatDatasetDocumentMappingService {
  49 + rpc ChatDatasetDocumentMappingGet(ChatDatasetDocumentMappingGetReq) returns(ChatDatasetDocumentMappingGetResp);
  50 + rpc ChatDatasetDocumentMappingSave(ChatDatasetDocumentMappingSaveReq) returns(ChatDatasetDocumentMappingSaveResp);
  51 + rpc ChatDatasetDocumentMappingDelete(ChatDatasetDocumentMappingDeleteReq) returns(ChatDatasetDocumentMappingDeleteResp);
  52 + rpc ChatDatasetDocumentMappingUpdate(ChatDatasetDocumentMappingUpdateReq) returns(ChatDatasetDocumentMappingUpdateResp);
  53 + rpc ChatDatasetDocumentMappingSearch(ChatDatasetDocumentMappingSearchReq) returns(ChatDatasetDocumentMappingSearchResp);
  54 +}
  1 +
  2 +syntax = "proto3";
  3 +
  4 +option go_package ="./pb";
  5 +
  6 +package pb;
  7 +
  8 +message ChatDocumentGetReq {
  9 + int64 Id = 1;
  10 +}
  11 +message ChatDocumentGetResp{
  12 + ChatDocumentItem ChatDocument = 1;
  13 +}
  14 +
  15 +message ChatDocumentSaveReq {
  16 +
  17 +}
  18 +message ChatDocumentSaveResp{
  19 +
  20 +}
  21 +
  22 +message ChatDocumentDeleteReq {
  23 + int64 Id = 1;
  24 +}
  25 +message ChatDocumentDeleteResp{
  26 +
  27 +}
  28 +
  29 +message ChatDocumentUpdateReq {
  30 + int64 Id = 1;
  31 +}
  32 +message ChatDocumentUpdateResp{
  33 +
  34 +}
  35 +
  36 +message ChatDocumentSearchReq {
  37 + int64 PageNumber = 1;
  38 + int64 PageSize = 2;
  39 +}
  40 +message ChatDocumentSearchResp{
  41 + repeated ChatDocumentItem List =1;
  42 + int64 Total =2;
  43 +}
  44 +message ChatDocumentItem {
  45 +
  46 +}
  47 +
  48 +service ChatDocumentService {
  49 + rpc ChatDocumentGet(ChatDocumentGetReq) returns(ChatDocumentGetResp);
  50 + rpc ChatDocumentSave(ChatDocumentSaveReq) returns(ChatDocumentSaveResp);
  51 + rpc ChatDocumentDelete(ChatDocumentDeleteReq) returns(ChatDocumentDeleteResp);
  52 + rpc ChatDocumentUpdate(ChatDocumentUpdateReq) returns(ChatDocumentUpdateResp);
  53 + rpc ChatDocumentSearch(ChatDocumentSearchReq) returns(ChatDocumentSearchResp);
  54 +}
@@ -9,5 +9,8 @@ func Migrate(db *gorm.DB) { @@ -9,5 +9,8 @@ func Migrate(db *gorm.DB) {
9 db.AutoMigrate( 9 db.AutoMigrate(
10 &models.ChatSession{}, 10 &models.ChatSession{},
11 &models.ChatSessionRecord{}, 11 &models.ChatSessionRecord{},
  12 + &models.ChatDocument{},
  13 + &models.ChatDatasetDocumentMapping{},
  14 + &models.ChatDataset{},
12 ) 15 )
13 } 16 }
  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 ChatDataset struct {
  11 + Id int64 // 唯一标识
  12 + CompanyId int64
  13 + UserId int64
  14 + Name string // 知识库名称
  15 + Desc string // 描述
  16 + Status int // 1:启用 2:禁用
  17 + CreatedAt int64
  18 + UpdatedAt int64
  19 + DeletedAt int64
  20 + Version int
  21 + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`
  22 +}
  23 +
  24 +func (m *ChatDataset) TableName() string {
  25 + return "chat.dataset"
  26 +}
  27 +
  28 +func (m *ChatDataset) BeforeCreate(tx *gorm.DB) (err error) {
  29 + // m.CreatedAt = time.Now().Unix()
  30 + // m.UpdatedAt = time.Now().Unix()
  31 + return
  32 +}
  33 +
  34 +func (m *ChatDataset) BeforeUpdate(tx *gorm.DB) (err error) {
  35 + // m.UpdatedAt = time.Now().Unix()
  36 + return
  37 +}
  38 +
  39 +func (m *ChatDataset) CacheKeyFunc() string {
  40 + if m.Id == 0 {
  41 + return ""
  42 + }
  43 + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id)
  44 +}
  45 +
  46 +func (m *ChatDataset) CacheKeyFuncByObject(obj interface{}) string {
  47 + if v, ok := obj.(*ChatDataset); ok {
  48 + return v.CacheKeyFunc()
  49 + }
  50 + return ""
  51 +}
  52 +
  53 +func (m *ChatDataset) CachePrimaryKeyFunc() string {
  54 + if len("") == 0 {
  55 + return ""
  56 + }
  57 + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key")
  58 +}
  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 +)
  8 +
  9 +type ChatDatasetDocumentMapping struct {
  10 + Id int64 // 唯一标识
  11 + DatasetId int64
  12 + DocumentId int64
  13 + CreatedAt int64
  14 + UpdatedAt int64
  15 + Version int
  16 +}
  17 +
  18 +func (m *ChatDatasetDocumentMapping) TableName() string {
  19 + return "chat.dataset_document_mapping"
  20 +}
  21 +
  22 +func (m *ChatDatasetDocumentMapping) BeforeCreate(tx *gorm.DB) (err error) {
  23 + // m.CreatedAt = time.Now().Unix()
  24 + // m.UpdatedAt = time.Now().Unix()
  25 + return
  26 +}
  27 +
  28 +func (m *ChatDatasetDocumentMapping) BeforeUpdate(tx *gorm.DB) (err error) {
  29 + // m.UpdatedAt = time.Now().Unix()
  30 + return
  31 +}
  32 +
  33 +func (m *ChatDatasetDocumentMapping) CacheKeyFunc() string {
  34 + if m.Id == 0 {
  35 + return ""
  36 + }
  37 + return fmt.Sprintf("%v:cache:%v:id:%v", domain.ProjectName, m.TableName(), m.Id)
  38 +}
  39 +
  40 +func (m *ChatDatasetDocumentMapping) CacheKeyFuncByObject(obj interface{}) string {
  41 + if v, ok := obj.(*ChatDatasetDocumentMapping); ok {
  42 + return v.CacheKeyFunc()
  43 + }
  44 + return ""
  45 +}
  46 +
  47 +func (m *ChatDatasetDocumentMapping) CachePrimaryKeyFunc() string {
  48 + if len("") == 0 {
  49 + return ""
  50 + }
  51 + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key")
  52 +}
  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 ChatDocument struct {
  11 + Id int64 // 唯一标识
  12 + Name string
  13 + FileType string
  14 + Status int
  15 + Metadata domain.DocumentMetadata `gorm:"type:jsonb;serializer:json"`
  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 *ChatDocument) TableName() string {
  24 + return "chat.document"
  25 +}
  26 +
  27 +func (m *ChatDocument) 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 *ChatDocument) BeforeUpdate(tx *gorm.DB) (err error) {
  34 + // m.UpdatedAt = time.Now().Unix()
  35 + return
  36 +}
  37 +
  38 +func (m *ChatDocument) 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 *ChatDocument) CacheKeyFuncByObject(obj interface{}) string {
  46 + if v, ok := obj.(*ChatDocument); ok {
  47 + return v.CacheKeyFunc()
  48 + }
  49 + return ""
  50 +}
  51 +
  52 +func (m *ChatDocument) CachePrimaryKeyFunc() string {
  53 + if len("") == 0 {
  54 + return ""
  55 + }
  56 + return fmt.Sprintf("%v:cache:%v:primarykey:%v", domain.ProjectName, m.TableName(), "key")
  57 +}
@@ -13,6 +13,10 @@ type ChatSession struct { @@ -13,6 +13,10 @@ type ChatSession struct {
13 UserId int64 // 用户ID 13 UserId int64 // 用户ID
14 Title string // 会话标题 14 Title string // 会话标题
15 Abstract string // 摘要 15 Abstract string // 摘要
  16 + Module int // 1:openai chat 2:星火文档问答
  17 + Type string // 类型 chat:普通问答 spark_dataset_chat:星火知识库问答 spark_documents_chat:星火多文档问答
  18 + Metadata *domain.SessionMetadata `gorm:"type:jsonb;serializer:json"` // 元数据
  19 + Rank int64 // 排序(时间秒,置顶更新当前会话)
16 CreatedAt int64 20 CreatedAt int64
17 UpdatedAt int64 21 UpdatedAt int64
18 DeletedAt int64 22 DeletedAt int64
  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 ChatDatasetDocumentMappingRepository struct {
  15 + *cache.CachedRepository
  16 +}
  17 +
  18 +func (repository *ChatDatasetDocumentMappingRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ChatDatasetDocumentMapping) (*domain.ChatDatasetDocumentMapping, error) {
  19 + var (
  20 + err error
  21 + m = &models.ChatDatasetDocumentMapping{}
  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 *ChatDatasetDocumentMappingRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ChatDatasetDocumentMapping) (*domain.ChatDatasetDocumentMapping, error) {
  36 + var (
  37 + err error
  38 + m *models.ChatDatasetDocumentMapping
  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 *ChatDatasetDocumentMappingRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ChatDatasetDocumentMapping) (*domain.ChatDatasetDocumentMapping, error) {
  55 + var (
  56 + err error
  57 + m *models.ChatDatasetDocumentMapping
  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 *ChatDatasetDocumentMappingRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ChatDatasetDocumentMapping) (*domain.ChatDatasetDocumentMapping, error) {
  79 + var (
  80 + tx = conn.DB()
  81 + m = &models.ChatDatasetDocumentMapping{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 *ChatDatasetDocumentMappingRepository) DeleteByDataset(ctx context.Context, conn transaction.Conn, datasetId int64) error {
  94 + var (
  95 + tx = conn.DB()
  96 + m = &models.ChatDatasetDocumentMapping{}
  97 + )
  98 + queryFunc := func() (interface{}, error) {
  99 + tx = tx.Where("dataset_id = ?", datasetId).Delete(m)
  100 + return m, tx.Error
  101 + }
  102 + if _, err := repository.Query(queryFunc); err != nil {
  103 + return err
  104 + }
  105 + return nil
  106 +}
  107 +
  108 +func (repository *ChatDatasetDocumentMappingRepository) DeleteByDocument(ctx context.Context, conn transaction.Conn, documentId int64) error {
  109 + var (
  110 + tx = conn.DB()
  111 + m = &models.ChatDatasetDocumentMapping{}
  112 + )
  113 + queryFunc := func() (interface{}, error) {
  114 + tx = tx.Where("document_id = ?", documentId).Delete(m)
  115 + return m, tx.Error
  116 + }
  117 + if _, err := repository.Query(queryFunc); err != nil {
  118 + return err
  119 + }
  120 + return nil
  121 +}
  122 +
  123 +func (repository *ChatDatasetDocumentMappingRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatDatasetDocumentMapping, error) {
  124 + var (
  125 + err error
  126 + tx = conn.DB()
  127 + m = new(models.ChatDatasetDocumentMapping)
  128 + )
  129 + queryFunc := func() (interface{}, error) {
  130 + tx = tx.Model(m).Where("id = ?", id).First(m)
  131 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  132 + return nil, domain.ErrNotFound
  133 + }
  134 + return m, tx.Error
  135 + }
  136 + cacheModel := new(models.ChatDatasetDocumentMapping)
  137 + cacheModel.Id = id
  138 + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
  139 + return nil, err
  140 + }
  141 + return repository.ModelToDomainModel(m)
  142 +}
  143 +
  144 +func (repository *ChatDatasetDocumentMappingRepository) FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatDatasetDocumentMapping, error) {
  145 + var (
  146 + err error
  147 + tx = conn.DB()
  148 + m = new(models.ChatDatasetDocumentMapping)
  149 + )
  150 + queryFunc := func() (interface{}, error) {
  151 + tx = tx.Model(m).Unscoped().Where("id = ?", id).First(m)
  152 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  153 + return nil, domain.ErrNotFound
  154 + }
  155 + return m, tx.Error
  156 + }
  157 + cacheModel := new(models.ChatDatasetDocumentMapping)
  158 + cacheModel.Id = id
  159 + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
  160 + return nil, err
  161 + }
  162 + return repository.ModelToDomainModel(m)
  163 +}
  164 +
  165 +func (repository *ChatDatasetDocumentMappingRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ChatDatasetDocumentMapping, error) {
  166 + var (
  167 + tx = conn.DB()
  168 + ms []*models.ChatDatasetDocumentMapping
  169 + dms = make([]*domain.ChatDatasetDocumentMapping, 0)
  170 + total int64
  171 + )
  172 + queryFunc := func() (interface{}, error) {
  173 + tx = tx.Model(&ms).Order("id desc")
  174 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  175 + return dms, tx.Error
  176 + }
  177 + return dms, nil
  178 + }
  179 +
  180 + if _, err := repository.Query(queryFunc); err != nil {
  181 + return 0, nil, err
  182 + }
  183 +
  184 + for _, item := range ms {
  185 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  186 + return 0, dms, err
  187 + } else {
  188 + dms = append(dms, dm)
  189 + }
  190 + }
  191 + return total, dms, nil
  192 +}
  193 +
  194 +func (repository *ChatDatasetDocumentMappingRepository) FindByDataset(ctx context.Context, conn transaction.Conn, datasetIds ...int64) (int64, []*domain.ChatDatasetDocumentMapping, error) {
  195 + var (
  196 + tx = conn.DB()
  197 + ms []*models.ChatDatasetDocumentMapping
  198 + dms = make([]*domain.ChatDatasetDocumentMapping, 0)
  199 + total int64
  200 + )
  201 + queryFunc := func() (interface{}, error) {
  202 + tx = tx.Model(&ms).
  203 + Where("dataset_id in (?)", datasetIds).
  204 + Order("id desc")
  205 + if total, tx = transaction.PaginationAndCount(ctx, tx, domain.NewQueryOptions().WithFindOnly(), &ms); tx.Error != nil {
  206 + return dms, tx.Error
  207 + }
  208 + return dms, nil
  209 + }
  210 +
  211 + if _, err := repository.Query(queryFunc); err != nil {
  212 + return 0, nil, err
  213 + }
  214 +
  215 + for _, item := range ms {
  216 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  217 + return 0, dms, err
  218 + } else {
  219 + dms = append(dms, dm)
  220 + }
  221 + }
  222 + return total, dms, nil
  223 +}
  224 +
  225 +func (repository *ChatDatasetDocumentMappingRepository) ModelToDomainModel(from *models.ChatDatasetDocumentMapping) (*domain.ChatDatasetDocumentMapping, error) {
  226 + to := &domain.ChatDatasetDocumentMapping{}
  227 + err := copier.Copy(to, from)
  228 + return to, err
  229 +}
  230 +
  231 +func (repository *ChatDatasetDocumentMappingRepository) DomainModelToModel(from *domain.ChatDatasetDocumentMapping) (*models.ChatDatasetDocumentMapping, error) {
  232 + to := &models.ChatDatasetDocumentMapping{}
  233 + err := copier.Copy(to, from)
  234 + return to, err
  235 +}
  236 +
  237 +func NewChatDatasetDocumentMappingRepository(cache *cache.CachedRepository) domain.ChatDatasetDocumentMappingRepository {
  238 + return &ChatDatasetDocumentMappingRepository{CachedRepository: cache}
  239 +}
  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 ChatDatasetRepository struct {
  15 + *cache.CachedRepository
  16 +}
  17 +
  18 +func (repository *ChatDatasetRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ChatDataset) (*domain.ChatDataset, error) {
  19 + var (
  20 + err error
  21 + m = &models.ChatDataset{}
  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 *ChatDatasetRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ChatDataset) (*domain.ChatDataset, error) {
  36 + var (
  37 + err error
  38 + m *models.ChatDataset
  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 *ChatDatasetRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ChatDataset) (*domain.ChatDataset, error) {
  55 + var (
  56 + err error
  57 + m *models.ChatDataset
  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 *ChatDatasetRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ChatDataset) (*domain.ChatDataset, error) {
  79 + var (
  80 + tx = conn.DB()
  81 + m = &models.ChatDataset{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 *ChatDatasetRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatDataset, error) {
  94 + var (
  95 + err error
  96 + tx = conn.DB()
  97 + m = new(models.ChatDataset)
  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.ChatDataset)
  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 *ChatDatasetRepository) FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatDataset, error) {
  115 + var (
  116 + err error
  117 + tx = conn.DB()
  118 + m = new(models.ChatDataset)
  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.ChatDataset)
  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 *ChatDatasetRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ChatDataset, error) {
  136 + var (
  137 + tx = conn.DB()
  138 + ms []*models.ChatDataset
  139 + dms = make([]*domain.ChatDataset, 0)
  140 + total int64
  141 + )
  142 + queryFunc := func() (interface{}, error) {
  143 + tx = tx.Model(&ms).Order("id desc")
  144 + if v, ok := queryOptions["name"]; ok {
  145 + tx.Where("name like ?", v)
  146 + }
  147 + if v, ok := queryOptions["status"]; ok {
  148 + tx.Where("status = ?", v)
  149 + }
  150 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  151 + return dms, tx.Error
  152 + }
  153 + return dms, nil
  154 + }
  155 +
  156 + if _, err := repository.Query(queryFunc); err != nil {
  157 + return 0, nil, err
  158 + }
  159 +
  160 + for _, item := range ms {
  161 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  162 + return 0, dms, err
  163 + } else {
  164 + dms = append(dms, dm)
  165 + }
  166 + }
  167 + return total, dms, nil
  168 +}
  169 +
  170 +func (repository *ChatDatasetRepository) ModelToDomainModel(from *models.ChatDataset) (*domain.ChatDataset, error) {
  171 + to := &domain.ChatDataset{}
  172 + err := copier.Copy(to, from)
  173 + return to, err
  174 +}
  175 +
  176 +func (repository *ChatDatasetRepository) DomainModelToModel(from *domain.ChatDataset) (*models.ChatDataset, error) {
  177 + to := &models.ChatDataset{}
  178 + err := copier.Copy(to, from)
  179 + return to, err
  180 +}
  181 +
  182 +func NewChatDatasetRepository(cache *cache.CachedRepository) domain.ChatDatasetRepository {
  183 + return &ChatDatasetRepository{CachedRepository: cache}
  184 +}
  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 ChatDocumentRepository struct {
  15 + *cache.CachedRepository
  16 +}
  17 +
  18 +func (repository *ChatDocumentRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ChatDocument) (*domain.ChatDocument, error) {
  19 + var (
  20 + err error
  21 + m = &models.ChatDocument{}
  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 *ChatDocumentRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ChatDocument) (*domain.ChatDocument, error) {
  36 + var (
  37 + err error
  38 + m *models.ChatDocument
  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 *ChatDocumentRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ChatDocument) (*domain.ChatDocument, error) {
  55 + var (
  56 + err error
  57 + m *models.ChatDocument
  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 *ChatDocumentRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ChatDocument) (*domain.ChatDocument, error) {
  79 + var (
  80 + tx = conn.DB()
  81 + m = &models.ChatDocument{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 *ChatDocumentRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatDocument, error) {
  94 + var (
  95 + err error
  96 + tx = conn.DB()
  97 + m = new(models.ChatDocument)
  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.ChatDocument)
  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 *ChatDocumentRepository) FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*domain.ChatDocument, error) {
  115 + var (
  116 + err error
  117 + tx = conn.DB()
  118 + m = new(models.ChatDocument)
  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.ChatDocument)
  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 *ChatDocumentRepository) Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*domain.ChatDocument, error) {
  136 + var (
  137 + tx = conn.DB()
  138 + ms []*models.ChatDocument
  139 + dms = make([]*domain.ChatDocument, 0)
  140 + total int64
  141 + )
  142 + queryFunc := func() (interface{}, error) {
  143 + tx = tx.Model(&ms).Order("id desc")
  144 + if v, ok := queryOptions["name"]; ok {
  145 + tx.Where("name like ?", v)
  146 + }
  147 + if v, ok := queryOptions["fileType"]; ok {
  148 + tx.Where("file_type = ?", v)
  149 + }
  150 + if v, ok := queryOptions["status"]; ok {
  151 + tx.Where("status = ?", v)
  152 + }
  153 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  154 + return dms, tx.Error
  155 + }
  156 + return dms, nil
  157 + }
  158 +
  159 + if _, err := repository.Query(queryFunc); err != nil {
  160 + return 0, nil, err
  161 + }
  162 +
  163 + for _, item := range ms {
  164 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  165 + return 0, dms, err
  166 + } else {
  167 + dms = append(dms, dm)
  168 + }
  169 + }
  170 + return total, dms, nil
  171 +}
  172 +
  173 +func (repository *ChatDocumentRepository) ModelToDomainModel(from *models.ChatDocument) (*domain.ChatDocument, error) {
  174 + to := &domain.ChatDocument{}
  175 + err := copier.Copy(to, from)
  176 + return to, err
  177 +}
  178 +
  179 +func (repository *ChatDocumentRepository) DomainModelToModel(from *domain.ChatDocument) (*models.ChatDocument, error) {
  180 + to := &models.ChatDocument{}
  181 + err := copier.Copy(to, from)
  182 + return to, err
  183 +}
  184 +
  185 +func NewChatDocumentRepository(cache *cache.CachedRepository) domain.ChatDocumentRepository {
  186 + return &ChatDocumentRepository{CachedRepository: cache}
  187 +}
@@ -141,6 +141,15 @@ func (repository *ChatSessionRepository) Find(ctx context.Context, conn transact @@ -141,6 +141,15 @@ func (repository *ChatSessionRepository) Find(ctx context.Context, conn transact
141 ) 141 )
142 queryFunc := func() (interface{}, error) { 142 queryFunc := func() (interface{}, error) {
143 tx = tx.Model(&ms).Order("id desc") 143 tx = tx.Model(&ms).Order("id desc")
  144 + if v, ok := queryOptions["companyId"]; ok {
  145 + tx.Where("company_id = ?", v)
  146 + }
  147 + if v, ok := queryOptions["userId"]; ok {
  148 + tx.Where("user_id = ?", v)
  149 + }
  150 + if v, ok := queryOptions["module"]; ok {
  151 + tx.Where("module = ?", v)
  152 + }
144 if v, ok := queryOptions["title"]; ok { 153 if v, ok := queryOptions["title"]; ok {
145 tx.Where("title like ?", v) 154 tx.Where("title like ?", v)
146 } 155 }
  1 +package domain
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  6 +)
  7 +
  8 +type ChatDataset struct {
  9 + Id int64 // 唯一标识
  10 + CompanyId int64
  11 + UserId int64
  12 + Name string // 知识库名称
  13 + Desc string // 描述
  14 + Status int // 1:启用 2:禁用
  15 + CreatedAt int64 `json:",omitempty"`
  16 + UpdatedAt int64 `json:",omitempty"`
  17 + DeletedAt int64 `json:",omitempty"`
  18 + Version int `json:",omitempty"`
  19 +}
  20 +
  21 +func ChatDatasetId(m *ChatDataset) int64 {
  22 + return m.Id
  23 +}
  24 +
  25 +type ChatDatasetRepository interface {
  26 + Insert(ctx context.Context, conn transaction.Conn, dm *ChatDataset) (*ChatDataset, error)
  27 + Update(ctx context.Context, conn transaction.Conn, dm *ChatDataset) (*ChatDataset, error)
  28 + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ChatDataset) (*ChatDataset, error)
  29 + Delete(ctx context.Context, conn transaction.Conn, dm *ChatDataset) (*ChatDataset, error)
  30 + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ChatDataset, error)
  31 + FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*ChatDataset, error)
  32 + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ChatDataset, error)
  33 +}
  1 +package domain
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  6 +)
  7 +
  8 +type ChatDatasetDocumentMapping struct {
  9 + Id int64 // 唯一标识
  10 + DatasetId int64
  11 + DocumentId int64
  12 + CreatedAt int64 `json:",omitempty"`
  13 + UpdatedAt int64 `json:",omitempty"`
  14 + DeletedAt int64 `json:",omitempty"`
  15 + Version int `json:",omitempty"`
  16 +}
  17 +
  18 +type ChatDatasetDocumentMappingRepository interface {
  19 + Insert(ctx context.Context, conn transaction.Conn, dm *ChatDatasetDocumentMapping) (*ChatDatasetDocumentMapping, error)
  20 + Update(ctx context.Context, conn transaction.Conn, dm *ChatDatasetDocumentMapping) (*ChatDatasetDocumentMapping, error)
  21 + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ChatDatasetDocumentMapping) (*ChatDatasetDocumentMapping, error)
  22 + Delete(ctx context.Context, conn transaction.Conn, dm *ChatDatasetDocumentMapping) (*ChatDatasetDocumentMapping, error)
  23 + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ChatDatasetDocumentMapping, error)
  24 + FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*ChatDatasetDocumentMapping, error)
  25 + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ChatDatasetDocumentMapping, error)
  26 + FindByDataset(ctx context.Context, conn transaction.Conn, datasetId ...int64) (int64, []*ChatDatasetDocumentMapping, error)
  27 + DeleteByDataset(ctx context.Context, conn transaction.Conn, datasetId int64) error
  28 + DeleteByDocument(ctx context.Context, conn transaction.Conn, documentId int64) error
  29 +}
  1 +package domain
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  6 +)
  7 +
  8 +type ChatDocument struct {
  9 + Id int64 // 唯一标识
  10 + Name string // 文件命
  11 + FileType string // 文件类型 markdown\pdf\txt\doc&docx
  12 + Status int // 1.使用中、0.待处理、2.预处理中、3.处理失败
  13 + Metadata DocumentMetadata
  14 + CreatedAt int64 `json:",omitempty"`
  15 + UpdatedAt int64 `json:",omitempty"`
  16 + DeletedAt int64 `json:",omitempty"`
  17 + Version int `json:",omitempty"`
  18 +}
  19 +
  20 +const (
  21 + Enable = 1
  22 + Disable = 2
  23 +)
  24 +
  25 +const (
  26 + StatusInUsed = 1
  27 + StatusWaitProcess = 0
  28 + StatusPreProcess = 2
  29 + StatusProcessFail = 3
  30 +)
  31 +
  32 +type DocumentMetadata struct {
  33 + OriginFileName string `json:",omitempty"` // 源文件命
  34 + Ext string `json:",omitempty"` // 格式
  35 + FileId string `json:",omitempty"` // 星火文件ID
  36 + FileUrl string `json:",omitempty"` // 文件地址
  37 + FileSize float64 `json:",omitempty"` // 文件大小
  38 +}
  39 +
  40 +type ChatDocumentRepository interface {
  41 + Insert(ctx context.Context, conn transaction.Conn, dm *ChatDocument) (*ChatDocument, error)
  42 + Update(ctx context.Context, conn transaction.Conn, dm *ChatDocument) (*ChatDocument, error)
  43 + UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *ChatDocument) (*ChatDocument, error)
  44 + Delete(ctx context.Context, conn transaction.Conn, dm *ChatDocument) (*ChatDocument, error)
  45 + FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ChatDocument, error)
  46 + FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*ChatDocument, error)
  47 + Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ChatDocument, error)
  48 +}
@@ -40,11 +40,14 @@ func (list ChatModels) Match(id int64) (*ChatModel, bool) { @@ -40,11 +40,14 @@ func (list ChatModels) Match(id int64) (*ChatModel, bool) {
40 }) 40 })
41 } 41 }
42 42
  43 +const SparkChatDocModelId = 5
  44 +
43 var DefaultChatModels ChatModels = []*ChatModel{ 45 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")), 46 + NewChatModels(1, "ChatGPT 4o", openai.GPT4o, "https://tiptok.oss-cn-shanghai.aliyuncs.com/youdao-note/ChatGPT_logo.svg.png", NewModelConfig("", "sk-proj-0odTHgsYqzGpjPMWYuw2T3BlbkFJpaIsQ9I6j8kYc8P7l60H", "")),
  47 + NewChatModels(2, "ChatGPT 4-turbo", openai.GPT4Turbo, "https://tiptok.oss-cn-shanghai.aliyuncs.com/youdao-note/ChatGPT_logo.svg.png", NewModelConfig("", "sk-proj-0odTHgsYqzGpjPMWYuw2T3BlbkFJpaIsQ9I6j8kYc8P7l60H", "")),
  48 + NewChatModels(3, "ChatGPT 3.5", openai.GPT3Dot5Turbo, "https://tiptok.oss-cn-shanghai.aliyuncs.com/youdao-note/ChatGPT_logo.svg.png", NewModelConfig("", "sk-proj-0odTHgsYqzGpjPMWYuw2T3BlbkFJpaIsQ9I6j8kYc8P7l60H", "")),
  49 + NewChatModels(4, "星火大模型V3.5", "spark3.5", "https://tiptok.oss-cn-shanghai.aliyuncs.com/youdao-note/XUN_Spark.webp", NewModelConfig("4fd8694e", "4a4081a20e9ba0fb1b9686ed93221989", "NTVkM2FjNzk2NzQ5MzBkNWMwYTUwNjAz")),
  50 + NewChatModels(SparkChatDocModelId, "星火文档问答", "spark chat doc", "https://tiptok.oss-cn-shanghai.aliyuncs.com/youdao-note/logo-icon-spark-doc.png", NewModelConfig("4fd8694e", "4a4081a20e9ba0fb1b9686ed93221989", "NTVkM2FjNzk2NzQ5MzBkNWMwYTUwNjAz")),
48 } 51 }
49 52
50 type ModelConfig struct { 53 type ModelConfig struct {
@@ -11,12 +11,32 @@ type ChatSession struct { @@ -11,12 +11,32 @@ type ChatSession struct {
11 UserId int64 `json:",omitempty"` // 用户ID 11 UserId int64 `json:",omitempty"` // 用户ID
12 Title string `json:",omitempty"` // 会话标题 12 Title string `json:",omitempty"` // 会话标题
13 Abstract string `json:",omitempty"` // 摘要 13 Abstract string `json:",omitempty"` // 摘要
  14 + Module int `json:",omitempty"` // 1:openai chat 2:星火文档问答
  15 + Type string `json:",omitempty"` // 类型 chat:普通问答 spark_dataset_chat:星火知识库问答 spark_documents_chat:星火多文档问答
  16 + Metadata *SessionMetadata `json:",omitempty"` // 元数据
  17 + Rank int64 `json:",omitempty"` // 排序(时间秒,置顶更新当前会话)
14 CreatedAt int64 `json:",omitempty"` 18 CreatedAt int64 `json:",omitempty"`
15 UpdatedAt int64 `json:",omitempty"` 19 UpdatedAt int64 `json:",omitempty"`
16 DeletedAt int64 `json:",omitempty"` 20 DeletedAt int64 `json:",omitempty"`
17 Version int `json:",omitempty"` 21 Version int `json:",omitempty"`
18 } 22 }
19 23
  24 +const (
  25 + ModuleOpenaiChat = 1
  26 + ModuleSparkChat = 2
  27 +)
  28 +
  29 +const (
  30 + TypeChat = "chat"
  31 + TypeSparkDatasetChat = "spark_dataset_chat"
  32 + TypeSparkDocumentsChat = "spark_documents_chat"
  33 +)
  34 +
  35 +type SessionMetadata struct {
  36 + DatasetId int64 `json:",omitempty"` // 知识库
  37 + DocumentIds []int64 `json:",omitempty"` // 多文档
  38 +}
  39 +
20 type ChatSessionRepository interface { 40 type ChatSessionRepository interface {
21 Insert(ctx context.Context, conn transaction.Conn, dm *ChatSession) (*ChatSession, error) 41 Insert(ctx context.Context, conn transaction.Conn, dm *ChatSession) (*ChatSession, error)
22 Update(ctx context.Context, conn transaction.Conn, dm *ChatSession) (*ChatSession, error) 42 Update(ctx context.Context, conn transaction.Conn, dm *ChatSession) (*ChatSession, error)
@@ -76,7 +76,7 @@ func RoutersOpenapi(svc *svc.ServiceContext) []rest.Route { @@ -76,7 +76,7 @@ func RoutersOpenapi(svc *svc.ServiceContext) []rest.Route {
76 return []rest.Route{ 76 return []rest.Route{
77 { 77 {
78 Method: http.MethodPost, 78 Method: http.MethodPost,
79 - Path: "/openapi/sms/send-sms-code", 79 + Path: "/v1/openapi/sms/send-sms-code",
80 Handler: smslib.SendSmsCodeHandler(svc.SmsService), 80 Handler: smslib.SendSmsCodeHandler(svc.SmsService),
81 }, 81 },
82 { 82 {
  1 +package company
  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/company"
  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 SystemCompanyInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.SystemCompanyInfoRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := company.NewSystemCompanyInfoLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemCompanyInfo(&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 company
  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/company"
  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 SystemCompanyInfoUpdateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.SystemCompanyUpdateRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := company.NewSystemCompanyInfoUpdateLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemCompanyInfoUpdate(&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 SystemCompanyDepartmentsHandler(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.NewSystemCompanyDepartmentsLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemCompanyDepartments(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
@@ -5,6 +5,7 @@ import ( @@ -5,6 +5,7 @@ import (
5 "net/http" 5 "net/http"
6 6
7 auth "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/auth" 7 auth "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/auth"
  8 + company "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/company"
8 department "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/department" 9 department "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/department"
9 employee "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/employee" 10 employee "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/employee"
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/api/internal/svc"
@@ -53,6 +54,26 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -53,6 +54,26 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
53 []rest.Route{ 54 []rest.Route{
54 { 55 {
55 Method: http.MethodGet, 56 Method: http.MethodGet,
  57 + Path: "/system/company_info",
  58 + Handler: company.SystemCompanyInfoHandler(serverCtx),
  59 + },
  60 + {
  61 + Method: http.MethodPut,
  62 + Path: "/system/company_info",
  63 + Handler: company.SystemCompanyInfoUpdateHandler(serverCtx),
  64 + },
  65 + }...,
  66 + ),
  67 + rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
  68 + rest.WithPrefix("/v1"),
  69 + )
  70 +
  71 + server.AddRoutes(
  72 + rest.WithMiddlewares(
  73 + []rest.Middleware{serverCtx.LogRequest},
  74 + []rest.Route{
  75 + {
  76 + Method: http.MethodGet,
56 Path: "/system/department/:id", 77 Path: "/system/department/:id",
57 Handler: department.SystemDepartmentGetHandler(serverCtx), 78 Handler: department.SystemDepartmentGetHandler(serverCtx),
58 }, 79 },
@@ -91,6 +112,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -91,6 +112,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
91 Path: "/system/department/export", 112 Path: "/system/department/export",
92 Handler: department.SystemDepartmentExportHandler(serverCtx), 113 Handler: department.SystemDepartmentExportHandler(serverCtx),
93 }, 114 },
  115 + {
  116 + Method: http.MethodPost,
  117 + Path: "/system/company-departments",
  118 + Handler: department.SystemCompanyDepartmentsHandler(serverCtx),
  119 + },
94 }..., 120 }...,
95 ), 121 ),
96 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), 122 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
  1 +package company
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  8 +
  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 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type SystemCompanyInfoLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewSystemCompanyInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemCompanyInfoLogic {
  22 + return &SystemCompanyInfoLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *SystemCompanyInfoLogic) SystemCompanyInfo(req *types.SystemCompanyInfoRequest) (resp *types.SystemCompanyInfoResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + company *domain.SysCompany
  33 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  34 + )
  35 + if company, err = l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, token.CompanyId); err != nil {
  36 + return nil, xerr.NewErrMsgErr("公司不存在", err)
  37 + }
  38 + resp = &types.SystemCompanyInfoResponse{
  39 + Company: NewTypesSysCompany(company),
  40 + }
  41 + return
  42 +}
  43 +
  44 +func NewDomainSysCompany(item types.Company, adminId int64) *domain.SysCompany {
  45 + return &domain.SysCompany{
  46 + Id: item.Id,
  47 + Name: item.Name,
  48 + Logo: item.Logo,
  49 + AdminId: adminId,
  50 + BaseInfo: domain.CompanyBaseInfo{
  51 + UnifiedSocialCreditCode: item.UnifiedSocialCreditCode,
  52 + ContactPhone: item.ContactPhone,
  53 + ContactName: item.ContactName,
  54 + Address: item.Address,
  55 + Remark: item.Remark,
  56 + BusinessLicenseImage: item.BusinessLicenseImage,
  57 + },
  58 + Status: domain.Enable,
  59 + }
  60 +}
  61 +
  62 +func NewTypesSysCompany(item *domain.SysCompany) types.Company {
  63 + return types.Company{
  64 + Id: item.Id,
  65 + Name: item.Name,
  66 + Logo: item.Logo,
  67 + UnifiedSocialCreditCode: item.BaseInfo.UnifiedSocialCreditCode,
  68 + ContactPhone: item.BaseInfo.ContactPhone,
  69 + ContactName: item.BaseInfo.ContactName,
  70 + Address: item.BaseInfo.Address,
  71 + Remark: item.BaseInfo.Remark,
  72 + BusinessLicenseImage: item.BaseInfo.BusinessLicenseImage,
  73 + }
  74 +}
  1 +package company
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/core"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  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 +
  12 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  13 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  14 +
  15 + "github.com/zeromicro/go-zero/core/logx"
  16 +)
  17 +
  18 +type SystemCompanyInfoUpdateLogic struct {
  19 + logx.Logger
  20 + ctx context.Context
  21 + svcCtx *svc.ServiceContext
  22 +}
  23 +
  24 +func NewSystemCompanyInfoUpdateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemCompanyInfoUpdateLogic {
  25 + return &SystemCompanyInfoUpdateLogic{
  26 + Logger: logx.WithContext(ctx),
  27 + ctx: ctx,
  28 + svcCtx: svcCtx,
  29 + }
  30 +}
  31 +
  32 +func (l *SystemCompanyInfoUpdateLogic) SystemCompanyInfoUpdate(req *types.SystemCompanyUpdateRequest) (resp *types.SystemCompanyUpdateResponse, err error) {
  33 + var (
  34 + conn = l.svcCtx.DefaultDBConn()
  35 + company *domain.SysCompany
  36 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  37 + user *domain.SysUser
  38 + )
  39 + if company, err = l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, token.CompanyId); err != nil {
  40 + return nil, xerr.NewErrMsgErr("公司不存在", err)
  41 + }
  42 + if err = transaction.MustUseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  43 + // 新的管理员
  44 + if user, err = core.SaveCompanyUser(l.ctx, l.svcCtx, conn, req.Company.ContactPhone, req.Company.Name, company.Id); err != nil {
  45 + return fmt.Errorf("公司联系人不存在")
  46 + }
  47 +
  48 + company.Name = req.Company.Name
  49 + company.Logo = req.Company.Logo
  50 + company.BaseInfo.UnifiedSocialCreditCode = req.Company.UnifiedSocialCreditCode
  51 + company.BaseInfo.ContactName = req.Company.ContactName
  52 + company.BaseInfo.ContactPhone = req.Company.ContactPhone
  53 + company.BaseInfo.Address = req.Company.Address
  54 + company.BaseInfo.Remark = req.Company.Remark
  55 + company.BaseInfo.BusinessLicenseImage = req.Company.BusinessLicenseImage
  56 + company.AdminId = user.Id
  57 +
  58 + company, err = l.svcCtx.CompanyRepository.UpdateWithVersion(l.ctx, conn, company)
  59 + return err
  60 + }); err != nil {
  61 + return nil, xerr.NewErrMsgErr(err.Error(), err)
  62 + }
  63 + resp = &types.SystemCompanyUpdateResponse{
  64 + Company: NewTypesSysCompany(company),
  65 + }
  66 + return
  67 +}
  1 +package core
  2 +
  3 +import (
  4 + "context"
  5 + "errors"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  10 +)
  11 +
  12 +func SaveCompanyUser(ctx context.Context, svcCtx *svc.ServiceContext, conn transaction.Conn, phone string, name string, companyId int64) (*domain.SysUser, error) {
  13 + var (
  14 + user *domain.SysUser
  15 + err error
  16 + )
  17 + // 2.当前手机号用户
  18 + if user, err = svcCtx.UserRepository.FindOneByPhone(ctx, conn, phone); err != nil {
  19 + if errors.Is(err, domain.ErrNotFound) {
  20 + user = nil
  21 + err = nil
  22 + } else {
  23 + return nil, xerr.NewErrMsgErr("查找用户失败", err)
  24 + }
  25 + }
  26 + if user == nil {
  27 + user = domain.NewDomainSysUser(phone, name, "")
  28 + if user, err = svcCtx.UserRepository.Insert(ctx, conn, user); err != nil {
  29 + return nil, err
  30 + }
  31 + }
  32 + // 当前用户已绑定该公司
  33 + var employee *domain.SysEmployee
  34 + if employee, err = svcCtx.EmployeeRepository.FindOneByUserId(ctx, conn, companyId, user.Id); employee != nil {
  35 + return user, nil
  36 + }
  37 + // 注册默认员工
  38 + employee = &domain.SysEmployee{
  39 + UserId: user.Id,
  40 + CompanyId: companyId,
  41 + //Departments: []int64{department.Id},
  42 + AccountStatus: domain.Enable,
  43 + EmployeeType: domain.FullTime,
  44 + BaseInfo: domain.EmployeeBaseInfo{},
  45 + WorkInfo: domain.EmployeeWorkInfo{},
  46 + }
  47 + if employee, err = svcCtx.EmployeeRepository.Insert(ctx, conn, employee); err != nil {
  48 + return nil, err
  49 + }
  50 +
  51 + // 公司默认部门
  52 + var defaultDepartment *domain.SysDepartment
  53 + if defaultDepartment, err = svcCtx.DepartmentRepository.FindRootDepartmentByCompany(ctx, conn, companyId); err != nil {
  54 + return nil, err
  55 + }
  56 + // 员工部门
  57 + if err = svcCtx.UserDepartmentRepository.ResetByUser(ctx, conn, companyId, user.Id, employee.Id, []int64{defaultDepartment.Id}); err != nil {
  58 + return nil, err
  59 + }
  60 + return user, nil
  61 +}
  1 +package department
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
  8 + "strings"
  9 +
  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/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type SystemCompanyDepartmentsLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewSystemCompanyDepartmentsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemCompanyDepartmentsLogic {
  23 + return &SystemCompanyDepartmentsLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *SystemCompanyDepartmentsLogic) SystemCompanyDepartments(req *types.DepartmentSearchRequest) (resp *types.DepartmentSearchResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + departments []*domain.SysDepartment
  34 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  35 + )
  36 +
  37 + queryOptions := domain.NewQueryOptions().WithKV("name", fmt.Sprintf("%%%v%%", req.DepartmentName)).WithFindOnly()
  38 +
  39 + _, departments, err = l.svcCtx.DepartmentRepository.Find(l.ctx, conn, token.CompanyId, queryOptions)
  40 + list := make([]types.Department, 0)
  41 +
  42 + for i, department := range departments {
  43 + if req.DepartmentName != "" && !strings.Contains(department.Name, req.DepartmentName) {
  44 + continue
  45 + }
  46 + typesDepartment := NewTypesDepartment(departments[i], nil)
  47 + list = append(list, typesDepartment)
  48 + }
  49 + resp = &types.DepartmentSearchResponse{
  50 + List: list,
  51 + Total: int64(len(list)),
  52 + }
  53 + return
  54 +}
@@ -7,11 +7,6 @@ type User struct { @@ -7,11 +7,6 @@ type User struct {
7 Phone string `json:"phone,optional,omitempty"` // 用户手机号 7 Phone string `json:"phone,optional,omitempty"` // 用户手机号
8 } 8 }
9 9
10 -type Company struct {  
11 - Id int64 `json:"id,optional,omitempty"` // 唯一标识  
12 - Name string `json:"name,omitempty"` // 名称  
13 -}  
14 -  
15 type CompanyRegisterRequest struct { 10 type CompanyRegisterRequest struct {
16 Name string `json:"name"` // 公司名称 11 Name string `json:"name"` // 公司名称
17 Logo string `json:"logo"` // 公司LOGO 12 Logo string `json:"logo"` // 公司LOGO
@@ -49,6 +44,33 @@ type UserInfoResponse struct { @@ -49,6 +44,33 @@ type UserInfoResponse struct {
49 CompanyList []*Company `json:"companies"` // 拥有的公司 44 CompanyList []*Company `json:"companies"` // 拥有的公司
50 } 45 }
51 46
  47 +type SystemCompanyInfoRequest struct {
  48 +}
  49 +
  50 +type SystemCompanyInfoResponse struct {
  51 + Company Company `json:"company"`
  52 +}
  53 +
  54 +type SystemCompanyUpdateRequest struct {
  55 + Company Company `json:"company"`
  56 +}
  57 +
  58 +type SystemCompanyUpdateResponse struct {
  59 + Company Company `json:"company"`
  60 +}
  61 +
  62 +type Company struct {
  63 + Id int64 `json:"id,optional,omitempty"` // 唯一标识
  64 + Name string `json:"name,omitempty"` // 公司名称
  65 + Logo string `json:"logo,optional,omitempty"` // 公司图标
  66 + UnifiedSocialCreditCode string `json:"unifiedSocialCreditCode,optional,omitempty"` // 统一社会信用代码
  67 + ContactName string `json:"contactName,omitempty"` // 联系人
  68 + ContactPhone string `json:"contactPhone,omitempty"` // 联系人电话
  69 + Address string `json:"address,optional,omitempty"` // 惬意地址
  70 + Remark string `json:"remark,optional,omitempty"` // 备注信息
  71 + BusinessLicenseImage string `json:"businessLicenseImage,optional,omitempty"` // 营业执照-照片地址
  72 +}
  73 +
52 type DepartmentGetRequest struct { 74 type DepartmentGetRequest struct {
53 Id int64 `path:"id"` 75 Id int64 `path:"id"`
54 } 76 }
1 syntax = "v1" 1 syntax = "v1"
  2 +
  3 +
  4 +// 后台接口
  5 +@server(
  6 + prefix: v1
  7 + group: company
  8 + middleware: LogRequest
  9 + jwt: SystemAuth
  10 +)
  11 +service Core {
  12 + @doc "企业信息-详情"
  13 + @handler systemCompanyInfo
  14 + get /system/company_info (SystemCompanyInfoRequest) returns (SystemCompanyInfoResponse)
  15 + @doc "企业信息-更新"
  16 + @handler systemCompanyInfoUpdate
  17 + put /system/company_info (SystemCompanyUpdateRequest) returns (SystemCompanyUpdateResponse)
  18 +}
  19 +
  20 +// 企业信息-详情
  21 +type(
  22 + SystemCompanyInfoRequest{
  23 +
  24 + }
  25 + SystemCompanyInfoResponse{
  26 + Company Company `json:"company"`
  27 + }
  28 +)
  29 +// 企业信息-更新
  30 +type(
  31 + SystemCompanyUpdateRequest{
  32 + Company Company `json:"company"`
  33 + }
  34 + SystemCompanyUpdateResponse{
  35 + Company Company `json:"company"`
  36 + }
  37 +)
  38 +
  39 +type Company{
  40 + Id int64 `json:"id,optional,omitempty"` // 唯一标识
  41 + Name string `json:"name,omitempty"` // 公司名称
  42 + Logo string `json:"logo,optional,omitempty"` // 公司图标
  43 + UnifiedSocialCreditCode string `json:"unifiedSocialCreditCode,optional,omitempty"` // 统一社会信用代码
  44 + ContactName string `json:"contactName,omitempty"` // 联系人
  45 + ContactPhone string `json:"contactPhone,omitempty"` // 联系人电话
  46 + Address string `json:"address,optional,omitempty"` // 惬意地址
  47 + Remark string `json:"remark,optional,omitempty"` // 备注信息
  48 + BusinessLicenseImage string `json:"businessLicenseImage,optional,omitempty"` // 营业执照-照片地址
  49 +}
@@ -32,6 +32,10 @@ service Core { @@ -32,6 +32,10 @@ service Core {
32 @doc "部门-批量导出" 32 @doc "部门-批量导出"
33 @handler systemDepartmentExport 33 @handler systemDepartmentExport
34 delete /system/department/export (DepartmentSearchRequest) returns (DepartmentSearchResponse) 34 delete /system/department/export (DepartmentSearchRequest) returns (DepartmentSearchResponse)
  35 +
  36 + @doc "公司部门"
  37 + @handler systemCompanyDepartments
  38 + post /system/company-departments (DepartmentSearchRequest) returns (DepartmentSearchResponse)
35 } 39 }
36 40
37 type( 41 type(
@@ -46,11 +46,6 @@ type( @@ -46,11 +46,6 @@ type(
46 46
47 // 系统公司注册 47 // 系统公司注册
48 type( 48 type(
49 - Company{  
50 - Id int64 `json:"id,optional,omitempty"` // 唯一标识  
51 - Name string `json:"name,omitempty"` // 名称  
52 - }  
53 -  
54 CompanyRegisterRequest{ 49 CompanyRegisterRequest{
55 Name string `json:"name"` // 公司名称 50 Name string `json:"name"` // 公司名称
56 Logo string `json:"logo"` // 公司LOGO 51 Logo string `json:"logo"` // 公司LOGO
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 "application/json" 15 "application/json"
16 ], 16 ],
17 "paths": { 17 "paths": {
18 - "v1/system/auth/company_sign_up": { 18 + "v1/auth/company_sign_up": {
19 "post": { 19 "post": {
20 "summary": "公司注册", 20 "summary": "公司注册",
21 "operationId": "systemAuthRegister", 21 "operationId": "systemAuthRegister",
@@ -43,7 +43,7 @@ @@ -43,7 +43,7 @@
43 ] 43 ]
44 } 44 }
45 }, 45 },
46 - "v1/system/auth/login": { 46 + "v1/auth/login": {
47 "post": { 47 "post": {
48 "summary": "系统用户登录", 48 "summary": "系统用户登录",
49 "operationId": "systemAuthLogin", 49 "operationId": "systemAuthLogin",
@@ -71,7 +71,7 @@ @@ -71,7 +71,7 @@
71 ] 71 ]
72 } 72 }
73 }, 73 },
74 - "v1/system/auth/user_info": { 74 + "v1/auth/user_info": {
75 "post": { 75 "post": {
76 "summary": "系统用户信息", 76 "summary": "系统用户信息",
77 "operationId": "systemAuthUserInfo", 77 "operationId": "systemAuthUserInfo",
@@ -99,6 +99,78 @@ @@ -99,6 +99,78 @@
99 ] 99 ]
100 } 100 }
101 }, 101 },
  102 + "v1/system/company-departments": {
  103 + "post": {
  104 + "summary": "公司部门",
  105 + "operationId": "systemCompanyDepartments",
  106 + "responses": {
  107 + "200": {
  108 + "description": "A successful response.",
  109 + "schema": {
  110 + "$ref": "#/definitions/DepartmentSearchResponse"
  111 + }
  112 + }
  113 + },
  114 + "parameters": [
  115 + {
  116 + "name": "body",
  117 + "in": "body",
  118 + "required": true,
  119 + "schema": {
  120 + "$ref": "#/definitions/DepartmentSearchRequest"
  121 + }
  122 + }
  123 + ],
  124 + "requestBody": {},
  125 + "tags": [
  126 + "department"
  127 + ]
  128 + }
  129 + },
  130 + "v1/system/company_info": {
  131 + "get": {
  132 + "summary": "企业信息-详情",
  133 + "operationId": "systemCompanyInfo",
  134 + "responses": {
  135 + "200": {
  136 + "description": "A successful response.",
  137 + "schema": {
  138 + "$ref": "#/definitions/SystemCompanyInfoResponse"
  139 + }
  140 + }
  141 + },
  142 + "requestBody": {},
  143 + "tags": [
  144 + "company"
  145 + ]
  146 + },
  147 + "put": {
  148 + "summary": "企业信息-更新",
  149 + "operationId": "systemCompanyInfoUpdate",
  150 + "responses": {
  151 + "200": {
  152 + "description": "A successful response.",
  153 + "schema": {
  154 + "$ref": "#/definitions/SystemCompanyUpdateResponse"
  155 + }
  156 + }
  157 + },
  158 + "parameters": [
  159 + {
  160 + "name": "body",
  161 + "in": "body",
  162 + "required": true,
  163 + "schema": {
  164 + "$ref": "#/definitions/SystemCompanyUpdateRequest"
  165 + }
  166 + }
  167 + ],
  168 + "requestBody": {},
  169 + "tags": [
  170 + "company"
  171 + ]
  172 + }
  173 + },
102 "v1/system/department": { 174 "v1/system/department": {
103 "post": { 175 "post": {
104 "summary": "部门-保存", 176 "summary": "部门-保存",
@@ -641,13 +713,48 @@ @@ -641,13 +713,48 @@
641 }, 713 },
642 "name": { 714 "name": {
643 "type": "string", 715 "type": "string",
644 - "description": " 名称" 716 + "description": " 公司名称"
  717 + },
  718 + "logo": {
  719 + "type": "string",
  720 + "description": " 公司图标"
  721 + },
  722 + "unifiedSocialCreditCode": {
  723 + "type": "string",
  724 + "description": " 统一社会信用代码"
  725 + },
  726 + "contactName": {
  727 + "type": "string",
  728 + "description": " 联系人"
  729 + },
  730 + "contactPhone": {
  731 + "type": "string",
  732 + "description": " 联系人电话"
  733 + },
  734 + "address": {
  735 + "type": "string",
  736 + "description": " 惬意地址"
  737 + },
  738 + "remark": {
  739 + "type": "string",
  740 + "description": " 备注信息"
  741 + },
  742 + "businessLicenseImage": {
  743 + "type": "string",
  744 + "description": " 营业执照-照片地址"
645 } 745 }
646 }, 746 },
647 "title": "Company", 747 "title": "Company",
648 "required": [ 748 "required": [
649 "id", 749 "id",
650 - "name" 750 + "name",
  751 + "logo",
  752 + "unifiedSocialCreditCode",
  753 + "contactName",
  754 + "contactPhone",
  755 + "address",
  756 + "remark",
  757 + "businessLicenseImage"
651 ] 758 ]
652 }, 759 },
653 "CompanyRegisterRequest": { 760 "CompanyRegisterRequest": {
@@ -842,6 +949,11 @@ @@ -842,6 +949,11 @@
842 "departmentName": { 949 "departmentName": {
843 "type": "string", 950 "type": "string",
844 "description": " 部门名称" 951 "description": " 部门名称"
  952 + },
  953 + "countUserNumber": {
  954 + "type": "boolean",
  955 + "format": "boolean",
  956 + "description": " 统计用户数量"
845 } 957 }
846 }, 958 },
847 "title": "DepartmentSearchRequest" 959 "title": "DepartmentSearchRequest"
@@ -913,6 +1025,11 @@ @@ -913,6 +1025,11 @@
913 }, 1025 },
914 "description": " 部门列表" 1026 "description": " 部门列表"
915 }, 1027 },
  1028 + "accountStatus": {
  1029 + "type": "integer",
  1030 + "format": "int32",
  1031 + "description": " 账号状态 1.正常 2.已暂停"
  1032 + },
916 "employeeType": { 1033 "employeeType": {
917 "type": "string", 1034 "type": "string",
918 "description": " 人员类型 正式、实习、外包、劳务、顾问" 1035 "description": " 人员类型 正式、实习、外包、劳务、顾问"
@@ -948,6 +1065,7 @@ @@ -948,6 +1065,7 @@
948 "code", 1065 "code",
949 "phone", 1066 "phone",
950 "departments", 1067 "departments",
  1068 + "accountStatus",
951 "employeeType", 1069 "employeeType",
952 "employedDate", 1070 "employedDate",
953 "superior", 1071 "superior",
@@ -1188,6 +1306,46 @@ @@ -1188,6 +1306,46 @@
1188 "name" 1306 "name"
1189 ] 1307 ]
1190 }, 1308 },
  1309 + "SystemCompanyInfoRequest": {
  1310 + "type": "object",
  1311 + "title": "SystemCompanyInfoRequest"
  1312 + },
  1313 + "SystemCompanyInfoResponse": {
  1314 + "type": "object",
  1315 + "properties": {
  1316 + "company": {
  1317 + "$ref": "#/definitions/Company"
  1318 + }
  1319 + },
  1320 + "title": "SystemCompanyInfoResponse",
  1321 + "required": [
  1322 + "company"
  1323 + ]
  1324 + },
  1325 + "SystemCompanyUpdateRequest": {
  1326 + "type": "object",
  1327 + "properties": {
  1328 + "company": {
  1329 + "$ref": "#/definitions/Company"
  1330 + }
  1331 + },
  1332 + "title": "SystemCompanyUpdateRequest",
  1333 + "required": [
  1334 + "company"
  1335 + ]
  1336 + },
  1337 + "SystemCompanyUpdateResponse": {
  1338 + "type": "object",
  1339 + "properties": {
  1340 + "company": {
  1341 + "$ref": "#/definitions/Company"
  1342 + }
  1343 + },
  1344 + "title": "SystemCompanyUpdateResponse",
  1345 + "required": [
  1346 + "company"
  1347 + ]
  1348 + },
1191 "User": { 1349 "User": {
1192 "type": "object", 1350 "type": "object",
1193 "properties": { 1351 "properties": {
@@ -111,6 +111,25 @@ func (repository *SysDepartmentRepository) FindOne(ctx context.Context, conn tra @@ -111,6 +111,25 @@ func (repository *SysDepartmentRepository) FindOne(ctx context.Context, conn tra
111 return repository.ModelToDomainModel(m) 111 return repository.ModelToDomainModel(m)
112 } 112 }
113 113
  114 +func (repository *SysDepartmentRepository) FindRootDepartmentByCompany(ctx context.Context, conn transaction.Conn, companyId int64) (*domain.SysDepartment, error) {
  115 + var (
  116 + err error
  117 + tx = conn.DB()
  118 + m = new(models.SysDepartment)
  119 + )
  120 + queryFunc := func() (interface{}, error) {
  121 + tx = tx.Model(m).Where("company_id = ?", companyId).Where("is_root = ?", true).First(m)
  122 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  123 + return nil, domain.ErrNotFound
  124 + }
  125 + return m, tx.Error
  126 + }
  127 + if _, err = repository.Query(queryFunc); err != nil {
  128 + return nil, err
  129 + }
  130 + return repository.ModelToDomainModel(m)
  131 +}
  132 +
114 func (repository *SysDepartmentRepository) FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*domain.SysDepartment, error) { 133 func (repository *SysDepartmentRepository) FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*domain.SysDepartment, error) {
115 var ( 134 var (
116 err error 135 err error
@@ -28,6 +28,7 @@ type SysDepartmentRepository interface { @@ -28,6 +28,7 @@ type SysDepartmentRepository interface {
28 UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *SysDepartment) (*SysDepartment, error) 28 UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *SysDepartment) (*SysDepartment, error)
29 Delete(ctx context.Context, conn transaction.Conn, dm *SysDepartment) (*SysDepartment, error) 29 Delete(ctx context.Context, conn transaction.Conn, dm *SysDepartment) (*SysDepartment, error)
30 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*SysDepartment, error) 30 FindOne(ctx context.Context, conn transaction.Conn, id int64) (*SysDepartment, error)
  31 + FindRootDepartmentByCompany(ctx context.Context, conn transaction.Conn, companyId int64) (*SysDepartment, error)
31 FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*SysDepartment, error) 32 FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*SysDepartment, error)
32 Find(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*SysDepartment, error) 33 Find(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*SysDepartment, error)
33 } 34 }
@@ -11,7 +11,7 @@ import ( @@ -11,7 +11,7 @@ import (
11 11
12 func ChatGPT(gptModelCode, key string, question string, channel chan string) (answer string, err error) { 12 func ChatGPT(gptModelCode, key string, question string, channel chan string) (answer string, err error) {
13 config := openai.DefaultConfig(key) 13 config := openai.DefaultConfig(key)
14 - config.BaseURL = "https://api.openai.com/v1" // "http://47.251.84.160:8080/v1" // 14 + config.BaseURL = "http://47.251.84.160:8080/v1" // "https://api.openai.com/v1" //
15 c := openai.NewClientWithConfig(config) 15 c := openai.NewClientWithConfig(config)
16 ctx := context.Background() 16 ctx := context.Background()
17 17
@@ -52,6 +52,5 @@ func ChatGPT(gptModelCode, key string, question string, channel chan string) (an @@ -52,6 +52,5 @@ func ChatGPT(gptModelCode, key string, question string, channel chan string) (an
52 answer += content 52 answer += content
53 channel <- content 53 channel <- content
54 } 54 }
55 - close(channel)  
56 return 55 return
57 } 56 }
@@ -2,6 +2,7 @@ package ai @@ -2,6 +2,7 @@ package ai
2 2
3 import ( 3 import (
4 "crypto/hmac" 4 "crypto/hmac"
  5 + "crypto/sha1"
5 "crypto/sha256" 6 "crypto/sha256"
6 "encoding/base64" 7 "encoding/base64"
7 "encoding/json" 8 "encoding/json"
@@ -23,17 +24,18 @@ import ( @@ -23,17 +24,18 @@ import (
23 */ 24 */
24 25
25 var ( 26 var (
26 - hostUrl = "wss://spark-api.xf-yun.com/v3.5/chat" 27 + hostChatUrl = "wss://spark-api.xf-yun.com/v3.5/chat"
  28 + hostFileUploadUrl = "https://chatdoc.xfyun.cn/openapi/v1/file/upload"
  29 + hostChatDocumentUrl = "wss://chatdoc.xfyun.cn/openapi/chat"
27 ) 30 )
28 31
29 -func Spark(appid string, apiKey string, apiSecret string, question string, channel chan string) (answer string, err error) { 32 +func ChatSpark(appid string, apiKey string, apiSecret string, question string, channel chan string) (answer string, err error) {
30 // fmt.Println(HmacWithShaTobase64("hmac-sha256", "hello\nhello", "hello")) 33 // fmt.Println(HmacWithShaTobase64("hmac-sha256", "hello\nhello", "hello"))
31 // st := time.Now() 34 // st := time.Now()
32 d := websocket.Dialer{ 35 d := websocket.Dialer{
33 HandshakeTimeout: 5 * time.Second, 36 HandshakeTimeout: 5 * time.Second,
34 } 37 }
35 - //握手并建立websocket 连接  
36 - conn, resp, err := d.Dial(assembleAuthUrl1(hostUrl, apiKey, apiSecret), nil) 38 + conn, resp, err := d.Dial(assembleAuthUrl(hostChatDocumentUrl, apiKey, apiSecret), nil)
37 if err != nil { 39 if err != nil {
38 logx.Error(readResp(resp) + err.Error()) 40 logx.Error(readResp(resp) + err.Error())
39 return 41 return
@@ -43,7 +45,6 @@ func Spark(appid string, apiKey string, apiSecret string, question string, chann @@ -43,7 +45,6 @@ func Spark(appid string, apiKey string, apiSecret string, question string, chann
43 } 45 }
44 46
45 go func() { 47 go func() {
46 -  
47 data := genParams1(appid, question) 48 data := genParams1(appid, question)
48 conn.WriteJSON(data) 49 conn.WriteJSON(data)
49 50
@@ -92,7 +93,6 @@ func Spark(appid string, apiKey string, apiSecret string, question string, chann @@ -92,7 +93,6 @@ func Spark(appid string, apiKey string, apiSecret string, question string, chann
92 break 93 break
93 } 94 }
94 } 95 }
95 - close(channel)  
96 return answer, nil 96 return answer, nil
97 } 97 }
98 98
@@ -125,13 +125,8 @@ func genParams1(appid, question string) map[string]interface{} { // 根据实际 @@ -125,13 +125,8 @@ func genParams1(appid, question string) map[string]interface{} { // 根据实际
125 return data // 根据实际情况修改返回的数据结构和字段名 125 return data // 根据实际情况修改返回的数据结构和字段名
126 } 126 }
127 127
128 -type SparkUserMessage struct {  
129 - Role string `json:"role"`  
130 - Content string `json:"content"`  
131 -}  
132 -  
133 // 创建鉴权url apikey 即 hmac username 128 // 创建鉴权url apikey 即 hmac username
134 -func assembleAuthUrl1(hosturl string, appKey, apiSecret string) string { 129 +func assembleAuthUrl(hosturl string, appKey, apiSecret string) string {
135 ul, err := url.Parse(hosturl) 130 ul, err := url.Parse(hosturl)
136 if err != nil { 131 if err != nil {
137 fmt.Println(err) 132 fmt.Println(err)
@@ -145,7 +140,7 @@ func assembleAuthUrl1(hosturl string, appKey, apiSecret string) string { @@ -145,7 +140,7 @@ func assembleAuthUrl1(hosturl string, appKey, apiSecret string) string {
145 sgin := strings.Join(signString, "\n") 140 sgin := strings.Join(signString, "\n")
146 // fmt.Println(sgin) 141 // fmt.Println(sgin)
147 //签名结果 142 //签名结果
148 - sha := HmacWithShaTobase64("hmac-sha256", sgin, apiSecret) 143 + sha := HmacWithSha256base64(sgin, apiSecret)
149 // fmt.Println(sha) 144 // fmt.Println(sha)
150 //构建请求参数 此时不需要urlencoding 145 //构建请求参数 此时不需要urlencoding
151 authUrl := fmt.Sprintf(`api_key="%v", algorithm="hmac-sha256", headers="host date request-line", signature="%v"`, appKey, sha) 146 authUrl := fmt.Sprintf(`api_key="%v", algorithm="hmac-sha256", headers="host date request-line", signature="%v"`, appKey, sha)
@@ -161,13 +156,20 @@ func assembleAuthUrl1(hosturl string, appKey, apiSecret string) string { @@ -161,13 +156,20 @@ func assembleAuthUrl1(hosturl string, appKey, apiSecret string) string {
161 return callurl 156 return callurl
162 } 157 }
163 158
164 -func HmacWithShaTobase64(algorithm, data, key string) string { 159 +func HmacWithSha256base64(data, key string) string {
165 mac := hmac.New(sha256.New, []byte(key)) 160 mac := hmac.New(sha256.New, []byte(key))
166 mac.Write([]byte(data)) 161 mac.Write([]byte(data))
167 encodeData := mac.Sum(nil) 162 encodeData := mac.Sum(nil)
168 return base64.StdEncoding.EncodeToString(encodeData) 163 return base64.StdEncoding.EncodeToString(encodeData)
169 } 164 }
170 165
  166 +func HmacWithSha1base64(data, key string) string {
  167 + mac := hmac.New(sha1.New, []byte(key))
  168 + mac.Write([]byte(data))
  169 + encodeData := mac.Sum(nil)
  170 + return base64.StdEncoding.EncodeToString(encodeData)
  171 +}
  172 +
171 func readResp(resp *http.Response) string { 173 func readResp(resp *http.Response) string {
172 if resp == nil { 174 if resp == nil {
173 return "" 175 return ""
@@ -179,6 +181,11 @@ func readResp(resp *http.Response) string { @@ -179,6 +181,11 @@ func readResp(resp *http.Response) string {
179 return fmt.Sprintf("code=%d,body=%s", resp.StatusCode, string(b)) 181 return fmt.Sprintf("code=%d,body=%s", resp.StatusCode, string(b))
180 } 182 }
181 183
  184 +type SparkUserMessage struct {
  185 + Role string `json:"role"`
  186 + Content string `json:"content"`
  187 +}
  188 +
182 type Message struct { 189 type Message struct {
183 Role string `json:"role"` 190 Role string `json:"role"`
184 Content string `json:"content"` 191 Content string `json:"content"`
  1 +package ai
  2 +
  3 +import (
  4 + "encoding/json"
  5 + "fmt"
  6 + "github.com/gorilla/websocket"
  7 + "github.com/zeromicro/go-zero/core/jsonx"
  8 + "github.com/zeromicro/go-zero/core/logx"
  9 + "time"
  10 +)
  11 +
  12 +func ChatSparkDocument(appid string, apiKey string, apiSecret string, fileIds []string, question string, channel chan string) (answer string, err error) {
  13 + d := websocket.Dialer{
  14 + HandshakeTimeout: 5 * time.Second,
  15 + }
  16 + //握手并建立websocket 连接
  17 + ts := fmt.Sprintf("%d", time.Now().Unix())
  18 + conn, resp, err := d.Dial(hostChatDocumentUrl+"?"+"appId="+appid+"&timestamp="+ts+"&signature="+getSignature(appid, apiSecret, ts), nil)
  19 + if err != nil {
  20 + logx.Error(readResp(resp) + err.Error())
  21 + return
  22 + } else if resp.StatusCode != 101 {
  23 + logx.Error(readResp(resp) + err.Error())
  24 + return
  25 + }
  26 +
  27 + go func() {
  28 + data := genDocumentChatParams(fileIds, question)
  29 + logx.Info(jsonx.MarshalToString(data))
  30 + conn.WriteJSON(data)
  31 +
  32 + }()
  33 +
  34 + //获取返回的数据
  35 + for {
  36 + var msg []byte
  37 + _, msg, err = conn.ReadMessage()
  38 + if err != nil {
  39 + logx.Error("read message error:", err)
  40 + break
  41 + }
  42 +
  43 + var data SparkDocumentChatResponseMessage
  44 + err = json.Unmarshal(msg, &data)
  45 + if err != nil {
  46 + logx.Error("Error parsing JSON:", err)
  47 + return
  48 + }
  49 + logx.Info(string(msg))
  50 + // 异常时,错误信息作为回答
  51 + if data.Code != 0 {
  52 + channel <- data.Content
  53 + answer = data.Content
  54 + return
  55 + }
  56 + content := data.Content
  57 + channel <- content
  58 + if data.Status != 2 {
  59 + answer += content
  60 + } else {
  61 + answer += content
  62 + logx.Infof("收到最终结果 answer:%v", answer)
  63 + conn.Close()
  64 + break
  65 + }
  66 + }
  67 + return answer, nil
  68 +}
  69 +
  70 +/*
  71 +若返回 fileRefer 为空,提示 "抱款,在文档中没有找到与提问相关的内容,请尝试换个问题问问吧。"表示提问未匹配到文档内容,可以降低chatExtends.wikiFilterScore以降低匹配阈值,也可以开启chatExtends.sparkWhenWithoutEmbedding用大模型兜底
  72 +*/
  73 +type SparkDocumentChatResponseMessage struct {
  74 + Code int `json:"code"` // 错误码 ,0 标识成功
  75 + Content string `json:"content"` // 回答内容
  76 + FileRefer string `json:"fileRefer"` // 文档引用,status=99 的时候返回;结构是个 Map,key=文件 id,value=引用的文段列表(对应 fileTrunks 的 index
  77 + Status int `json:"status"` // 会话状态,取值为[0,1,2,99];0 代表首次结果;1 代表中间结果;2 代表最后一个结果;99 代表引用的文档及文段
  78 +}
  79 +
  80 +// 生成参数
  81 +func genDocumentChatParams(fileIds []string, question string) map[string]interface{} { // 根据实际情况修改返回的数据结构和字段名
  82 +
  83 + messages := []Message{
  84 + {Role: "user", Content: question},
  85 + }
  86 +
  87 + data := map[string]interface{}{ // 根据实际情况修改返回的数据结构和字段名
  88 + "chatExtends": map[string]interface{}{ // 根据实际情况修改返回的数据结构和字段名
  89 + "wikiPromptTpl": "请将以下内容作为已知信息:\n<wikicontent>\n请根据以上内容回答用户的问题。\n问题:<wikiquestion>\n回答:", // 根据实际情况修改返回的数据结构和字段名
  90 + "wikiFilterScore": 0.82,
  91 + "temperature": 0.5,
  92 + },
  93 + "fileIds": fileIds,
  94 + "messages": messages,
  95 + }
  96 + return data // 根据实际情况修改返回的数据结构和字段名
  97 +}
  1 +package ai
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "github.com/zeromicro/go-zero/rest/httpc"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/tool"
  8 + "net/http"
  9 + "time"
  10 +)
  11 +
  12 +func SparkUploadFile(appid string, appKey string, appSecret string, request SparkFileRequest) (id string, err error) {
  13 + var response *http.Response
  14 + request.FileType = "wiki"
  15 + request.Timestamp = fmt.Sprintf("%v", time.Now().Unix())
  16 + request.AppId = appid
  17 + request.Signature = getSignature(appid, appSecret, request.Timestamp)
  18 + if response, err = httpc.Do(context.Background(), http.MethodPost, hostFileUploadUrl, request); err != nil {
  19 + return "", err
  20 + }
  21 + var parseResponse SparkFileResponse
  22 + if err = httpc.Parse(response, &parseResponse); err != nil {
  23 + return "", err
  24 + }
  25 + if parseResponse.Code != 0 {
  26 + return "", fmt.Errorf("code:%v message:%v sid:%v", parseResponse.Code, parseResponse.Desc, parseResponse.Sid)
  27 + }
  28 + id = parseResponse.Data.FileID
  29 + return
  30 +}
  31 +
  32 +type (
  33 + SparkFileRequest struct {
  34 + AppId string `header:"appId"`
  35 + Timestamp string `header:"timestamp"`
  36 + Signature string `header:"signature"`
  37 +
  38 + Url string `form:"url"`
  39 + FileName string `form:"fileName"`
  40 + FileType string `form:"fileType"`
  41 + CallbackUrl string `form:"callbackUrl,optional"`
  42 + }
  43 + SparkFileResponse struct {
  44 + Flag bool `json:"flag,optional"`
  45 + Sid string `json:"sid,optional"`
  46 + Code int `json:"code,optional"`
  47 + Desc string `json:"desc,optional"`
  48 + Data struct {
  49 + FileID string `json:"fileId,optional"`
  50 + } `json:"data,optional"`
  51 + }
  52 +)
  53 +
  54 +func getSignature(appId, secret string, ts string) string {
  55 + auth := tool.Md5ByString(fmt.Sprintf("%v%v", appId, ts))
  56 + return HmacWithSha1base64(auth, secret)
  57 +}