From 226202d6eee6480f3386c6295be26fad42940cc8 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期五, 28 三月 2025 09:41:39 +0800
Subject: [PATCH] 知识库分享,历史记录文件

---
 app/service/v2/chat.py         |   11 +-
 app/api/knowledge.py           |   59 +++++++++++---
 app/models/knowledge_model.py  |   43 ++++++++++
 app/models/v2/session_model.py |   11 ++
 app/config/env_conf/admin.yaml |    6 
 app/service/knowledge.py       |   54 +++++++++++++
 app/api/user.py                |    7 +
 app/models/v2/chat.py          |    8 +
 8 files changed, 171 insertions(+), 28 deletions(-)

diff --git a/app/api/knowledge.py b/app/api/knowledge.py
index acc454c..ef67a98 100644
--- a/app/api/knowledge.py
+++ b/app/api/knowledge.py
@@ -2,41 +2,48 @@
 
 from fastapi import APIRouter, Depends, Query, HTTPException
 from app.api import Response, get_current_user, ResponseList
-from app.models import klgParameter, klgIcon
+from app.models import klgParameter, klgIcon, KlgOwner
 from app.models.base_model import get_db
 from app.models.user_model import UserModel
 from app.service.knowledge import get_knowledge_list, create_knowledge_service, sync_knowledge_service, \
-    delete_knowledge_service, update_knowledge_icon_service
+    delete_knowledge_service, update_knowledge_icon_service, get_knowledge_users_service, set_knowledge_owner_service, \
+    add_knowledge_user_service
 from typing import Optional
+
 knowledge_router = APIRouter()
+
 
 @knowledge_router.get("/list", response_model=Response)
 async def knowledge_list(
         current: int,
         pageSize: int,
-        keyword: str="",
-        status: str="",
-        knowledge: str="1",
-        location: str="",
+        keyword: str = "",
+        status: str = "",
+        knowledge: str = "1",
+        location: str = "",
         current_user: UserModel = Depends(get_current_user),
         db=Depends(get_db)):
     if current and not pageSize:
         return ResponseList(code=400, msg="缂哄皯鍙傛暟")
-    getknowledgelist = await get_knowledge_list(db, current_user.id, keyword, pageSize, current, status, knowledge, location)
+    getknowledgelist = await get_knowledge_list(db, current_user.id, keyword, pageSize, current, status, knowledge,
+                                                location)
 
     return Response(code=200, msg="", data=getknowledgelist)
 
 
 @knowledge_router.post("/create", response_model=Response)
-async def create_knowledge_api(klg: klgParameter, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
-    is_create = await create_knowledge_service(db, klg.id, klg.name, klg.description, klg.icon, klg.klgType, current_user.id)
+async def create_knowledge_api(klg: klgParameter, current_user: UserModel = Depends(get_current_user),
+                               db=Depends(get_db)):
+    is_create = await create_knowledge_service(db, klg.id, klg.name, klg.description, klg.icon, klg.klgType,
+                                               current_user.id)
     if not is_create:
         return Response(code=500, msg="role knowledge failure", data={})
     return Response(code=200, msg="role knowledge success", data={})
 
 
 @knowledge_router.get("/update", response_model=Response)
-async def change_knowledge_api(knowledgeId: str, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+async def change_knowledge_api(knowledgeId: str, current_user: UserModel = Depends(get_current_user),
+                               db=Depends(get_db)):
     # is_create = await update_dialog_status_service(db, dialog.id, dialog.status)
     # if not is_create:
     #     return Response(code=500, msg="dialog update failure", data={})
@@ -59,10 +66,38 @@
     return Response(code=200, msg="knowledge delete success", data={})
 
 
-
 @knowledge_router.put("/update_icon", response_model=Response)
 async def change_dialog_icon(klg: klgIcon, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
     is_create = await update_knowledge_icon_service(db, klg.id, klg.icon)
     if not is_create:
         return Response(code=500, msg="knowledge update failure", data={})
-    return Response(code=200, msg="knowledge update success", data={})
\ No newline at end of file
+    return Response(code=200, msg="knowledge update success", data={})
+
+
+@knowledge_router.get("/{knowledgeId}/users", response_model=Response)
+async def get_kb_users(knowledgeId: str,
+                       current: int,
+                       pageSize: int,
+                       member:int = 0,
+                       current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    kb_user = await get_knowledge_users_service(db, knowledgeId, current_user.id, current, pageSize, member)
+
+    return Response(code=200, msg="knowledge user success", data={"rows": kb_user})
+
+
+@knowledge_router.post("/transfer/owner", response_model=Response)
+async def transfer_kb_owner(klgOwner: KlgOwner,
+                       current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    is_update = await set_knowledge_owner_service(db, klgOwner.knowledgeId, klgOwner.UserId, current_user.id)
+    if not is_update:
+        return Response(code=500, msg="knowledge update failure", data={})
+    return Response(code=200, msg="knowledge update success", data={})
+
+
+@knowledge_router.get("/{knowledgeId}/join", response_model=Response)
+async def join_kb_user(knowledgeId: str,
+                       current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    is_add = await add_knowledge_user_service(db, knowledgeId, current_user.id)
+    if not is_add:
+        return Response(code=500, msg="knowledge join failure", data={})
+    return Response(code=200, msg="knowledge join success", data={})
\ No newline at end of file
diff --git a/app/api/user.py b/app/api/user.py
index 3dca8be..0213ddc 100644
--- a/app/api/user.py
+++ b/app/api/user.py
@@ -154,4 +154,9 @@
     is_edit = await edit_user_dept(db, user.userId, user.depts)
     if not is_edit:
         return Response(code=500, msg="user edit failure", data={})
-    return Response(code=200, msg="user edit successfully", data={})
\ No newline at end of file
+    return Response(code=200, msg="user edit successfully", data={})
+
+
+@user_router.get("/ping", response_model=Response)
+async def user_ping(current_user: UserModel = Depends(get_current_user)):
+    return Response(code=200, msg="", data={})
\ No newline at end of file
diff --git a/app/config/env_conf/admin.yaml b/app/config/env_conf/admin.yaml
index 7c12711..9d8259a 100644
--- a/app/config/env_conf/admin.yaml
+++ b/app/config/env_conf/admin.yaml
@@ -3,9 +3,9 @@
   password: gAAAAABnvAq8bErFiR9x_ZcODjUeOdrDo8Z5UVOzyqo6SxIhAvLpw81kciQN0frwIFVfY9wrxH1WqrpTICpEwfH7r2SkLjS7SQ==
 
 chat_server:
-  id: 2c039666c29d11efa4670242ac1b0006
-  account: zhao1@example.com
-  password: gAAAAABnpFLtotY2OIRH12BJh4MzMgn5Zil7-DVpIeuqlFwvr0g6g_n4ULogn-LNhCbtk6cCDkzZlqAHvBSX2e_zf7AsoyzbiQ==
+  id: e7f1b3a6062911f0a9650242ac120004
+  account: 1528276425@qq.com
+  password: gAAAAABn4MzQzoGBSFI6Gx1Nz1RdEY31E0exNFwUtD7q0iWtaUeFCgA6ruDxjLxA7sNgP_lV_Un_SgN0xnaCdwd9a_XH3VAHMg==
 
 workflow_server:
   account: admin@basic.com
diff --git a/app/models/knowledge_model.py b/app/models/knowledge_model.py
index c3c5bb2..a7f0494 100644
--- a/app/models/knowledge_model.py
+++ b/app/models/knowledge_model.py
@@ -30,7 +30,7 @@
     def get_id(self):
         return str(self.id)
 
-    def to_json(self):
+    def to_json(self, user_id=""):
         return {
             'id': self.id,
             'name': self.name,
@@ -42,7 +42,8 @@
             'status': self.status,
             'documents': self.documents if self.documents else 0,
             'icon': self.icon,
-            'embd_id': self.embd_id
+            'embd_id': self.embd_id,
+            'link': True if (self.tenant_id == user_id or user_id == "admin" ) and self.permission == "team" else False,
         }
     def __repr__(self):
         return '<Knowledge name:%r url:%r>\n' % (self.name, self.id)
@@ -59,4 +60,40 @@
 
 class klgIcon(BaseModel):
     id: str
-    icon: str
\ No newline at end of file
+    icon: str
+
+
+
+class KnowledgeUserModel(Base):
+    __tablename__ = 'knowledgebase_user'
+
+    id = Column(Integer, primary_key=True)  # id
+    kb_id = Column(String(36))
+    user_id = Column(Integer)
+    create_date = Column(DateTime, default=datetime.now())             # 鍒涘缓鏃堕棿
+    update_date = Column(DateTime, default=datetime.now(), onupdate=datetime.now())             # 鏇存柊鏃堕棿
+    status = Column(Integer)  # 鐘舵��
+
+
+
+    def get_id(self):
+        return str(self.id)
+
+    def to_json(self, user_id=""):
+        return {
+            'id': self.id,
+            'kb_id': self.kb_id,
+            'create_time': self.create_date.strftime('%Y-%m-%d %H:%M:%S'),
+            'update_time': self.update_date.strftime('%Y-%m-%d %H:%M:%S'),
+            'user_id': self.user_id,
+            'status': self.status,
+            'owner': True if str(self.user_id) == user_id else False,
+        }
+    def __repr__(self):
+        return '<Knowledge name:%r url:%r>\n' % (self.name, self.id)
+
+
+
+class KlgOwner(BaseModel):
+    knowledgeId: str
+    UserId: int
\ No newline at end of file
diff --git a/app/models/v2/chat.py b/app/models/v2/chat.py
index e7fa060..1397edc 100644
--- a/app/models/v2/chat.py
+++ b/app/models/v2/chat.py
@@ -177,16 +177,17 @@
         }
 
     def log_to_json(self):
+        query = {}
+        if self.query:
+            query = json.loads(self.query)
         if self.message_type == 1:
             return {
                 'id': self.id,
                 'role': "user",
                 'content': self.content,
+                'files': query.get("files", []),
             }
         else:
-            query = {}
-            if self.query:
-                query = json.loads(self.query)
 
             res = {
                 'id': self.id,
@@ -195,6 +196,7 @@
                 'chat_mode': self.chat_mode,
                 "parentId": query.get("parentId"),
                 "isDeep": query.get("isDeep", 1),
+                "mindmap": True if self.mindmap else False,
             }
             if self.chat_mode == complex_knowledge_chat:
                 res['reference'] = json.loads(self.node_data) if self.node_data else {}
diff --git a/app/models/v2/session_model.py b/app/models/v2/session_model.py
index 3fa4eef..c1ec605 100644
--- a/app/models/v2/session_model.py
+++ b/app/models/v2/session_model.py
@@ -82,6 +82,17 @@
 
 
 
+    def to_dict(self):
+        res = {"files": [], "inputs": {}}
+        if hasattr(self, 'files'):
+            res['files'] = self.files
+        if hasattr(self, 'inputs'):
+            res['inputs'] = self.inputs
+        return res
+
+
+
+
 class ChatSessionDao:
     def __init__(self, db: Session):
         self.db = db
diff --git a/app/service/knowledge.py b/app/service/knowledge.py
index f6250b7..880b68b 100644
--- a/app/service/knowledge.py
+++ b/app/service/knowledge.py
@@ -2,7 +2,7 @@
 
 from sqlalchemy import or_
 
-from app.models import KnowledgeModel, group_knowledge_table
+from app.models import KnowledgeModel, group_knowledge_table, KnowledgeUserModel
 from app.models.user_model import UserModel
 from Log import logger
 from app.task.fetch_agent import get_one_from_ragflow_knowledge
@@ -15,6 +15,9 @@
     query = db.query(KnowledgeModel).filter(KnowledgeModel.knowledge_type==knowledge)
     if user.permission != "admin":
         klg_list = [j.id for i in user.groups for j in i.knowledges]
+        for i in db.query(KnowledgeUserModel).filter(KnowledgeUserModel.user_id == user_id, KnowledgeUserModel.status == 1).all():
+            if i.kb_id not in klg_list:
+                klg_list.append(i.kb_id)
         query = query.filter(or_(KnowledgeModel.id.in_(klg_list), KnowledgeModel.tenant_id == str(user_id)))
 
         if location:
@@ -25,13 +28,16 @@
     total = query.count()
     if page_size:
         query = query.order_by(KnowledgeModel.update_date.desc()).limit(page_size).offset((page_index - 1) * page_size)
-    return {"total":  total, "rows": [kld.to_json() for kld in query.all()]}
+    return {"total":  total, "rows": [kld.to_json(str(user_id) if user.permission != "admin" else "admin") for kld in query.all()]}
 
 
 async def create_knowledge_service(db, klg_id, name, description, icon, klg_type, user_id):
     try:
         dialog_model = KnowledgeModel(id=klg_id,name=name, description=description,icon=icon, knowledge_type=klg_type, tenant_id=user_id,update_date=datetime.now(),create_date=datetime.now())
         db.add(dialog_model)
+        kb_user = KnowledgeUserModel(kb_id=klg_id, user_id=user_id, status=1, update_date=datetime.now(),
+                                     create_date=datetime.now())
+        db.add(kb_user)
         db.commit()
         db.refresh(dialog_model)
     except Exception as e:
@@ -87,3 +93,47 @@
         return False
     return True
 
+
+
+async def get_knowledge_users_service(db, kb_id, user_id, page, page_size, member):
+    kb_user_list = []
+    user_ids = []
+    kb_info = db.query(KnowledgeModel).filter(KnowledgeModel.id == kb_id).first()
+    query = db.query(KnowledgeUserModel).filter(KnowledgeUserModel.kb_id == kb_id)
+    if member:
+        query = query.filter(KnowledgeUserModel.user_id != user_id)
+    total = query.count()
+
+    for kld in query.limit(page_size).offset((page - 1) * page_size).all():
+        user_ids.append(kld.user_id)
+        print(kb_info.tenant_id)
+        kb_user_list.append(kld.to_json(kb_info.tenant_id))
+    user = {i.id: i.username for i in db.query(UserModel).filter(UserModel.id.in_(user_ids)).all()}
+    for kld in kb_user_list:
+        kld["username"] = user.get(kld["user_id"], "")
+    return {"total": total, "rows": kb_user_list}
+
+
+async def set_knowledge_owner_service(db, kb_id, user_id, u_id):
+    try:
+        db.query(KnowledgeModel).filter_by(id=kb_id).update({"tenant_id": str(user_id), "update_date": datetime.now()})
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
+
+async def add_knowledge_user_service(db, kb_id, user_id):
+    try:
+
+        kb_user = KnowledgeUserModel(kb_id=kb_id, user_id=user_id, status=1, update_date=datetime.now(),
+                                     create_date=datetime.now())
+        db.add(kb_user)
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
\ No newline at end of file
diff --git a/app/service/v2/chat.py b/app/service/v2/chat.py
index 3982bdc..0919b08 100644
--- a/app/service/v2/chat.py
+++ b/app/service/v2/chat.py
@@ -14,7 +14,7 @@
 from app.config.config import settings
 from app.config.const import *
 from app.models import DialogModel, ApiTokenModel, UserTokenModel, ComplexChatSessionDao, ChatDataRequest, \
-    ComplexChatDao, KnowledgeModel, UserModel
+    ComplexChatDao, KnowledgeModel, UserModel, KnowledgeUserModel
 from app.models.v2.session_model import ChatSessionDao, ChatData
 from app.service.v2.app_driver.chat_agent import ChatAgent
 from app.service.v2.app_driver.chat_data import ChatBaseApply
@@ -34,7 +34,7 @@
 
 
 async def add_session_log(db, session_id: str, question: str, chat_id: str, user_id, event_type: str,
-                          conversation_id: str, agent_type):
+                          conversation_id: str, agent_type, query: dict=None):
     try:
         session = await ChatSessionDao(db).update_or_insert_by_id(
             session_id=session_id,
@@ -42,7 +42,7 @@
             agent_id=chat_id,
             agent_type=agent_type,
             tenant_id=user_id,
-            message={"role": "user", "content": question},
+            message={"role": "user", "content": question, "query": query},
             conversation_id=conversation_id,
             event_type=event_type
         )
@@ -97,6 +97,9 @@
     query = db.query(KnowledgeModel)
     if user.permission != "admin":
         klg_list = [j.id for i in user.groups for j in i.knowledges]
+        for i in db.query(KnowledgeUserModel).filter(KnowledgeUserModel.user_id == user_id, KnowledgeUserModel.status == 1).all():
+            if i.kb_id not in klg_list:
+                klg_list.append(i.kb_id)
         query = query.filter(or_(KnowledgeModel.id.in_(klg_list), KnowledgeModel.tenant_id == str(user_id)))
         kb_list= query.all()
         for kb in kb_list:
@@ -204,7 +207,7 @@
     else:
         query = "start new conversation"
     session = await add_session_log(db, session_id, query if query else "start new conversation", chat_id, user_id,
-                                    mode, conversation_id, DF_TYPE)
+                                    mode, conversation_id, DF_TYPE, chat_data.to_dict())
     if session:
         conversation_id = session.conversation_id
     try:

--
Gitblit v1.8.0