zhaoqingang
2024-12-23 633a8ed975625851f23398f896594581c179f612
mysql链接数量
15个文件已修改
386 ■■■■■ 已修改文件
app/api/agent.py 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/dialog.py 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/organization.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/resource.py 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/config/const.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/base_model.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/dialog_model.py 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/resource_model.py 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/user_model.py 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/service/dialog.py 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/service/organization.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/service/resource.py 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/service/user.py 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/task/fetch_agent.py 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
env_conf/menu_conf.json 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/agent.py
@@ -9,6 +9,7 @@
from app.api import Response, get_current_user, ResponseList, process_files
from app.api.user import reset_user_pwd
from app.config.config import settings
from app.models import DialogModel, MenuCapacityModel
from app.models.agent_model import AgentType, AgentModel
from app.models.base_model import get_db
from app.models.session_model import SessionModel
@@ -17,6 +18,7 @@
from app.service.dialog import get_session_history
from app.service.ragflow import RagflowService
from app.service.service_token import get_ragflow_token, get_bisheng_token
from app.task.fetch_agent import initialize_agents
router = APIRouter()
@@ -35,25 +37,24 @@
        limit: int = Query(1000, ge=1, le=1000),
        db: Session = Depends(get_db),
        current_user: UserModel = Depends(get_current_user)):
    print(111)
    agent = db.query(AgentModel).filter(AgentModel.id == agent_id).first()
    # agent = db.query(AgentModel).filter(AgentModel.id == agent_id).first()
    agent = db.query(MenuCapacityModel).filter(MenuCapacityModel.chat_id == agent_id).first()
    if not agent:
        return ResponseList(code=404, msg="Agent not found")
    if agent.agent_type == AgentType.RAGFLOW:
        print(222)
    agent_type = int(agent.capacity_type)
    if agent_type == AgentType.RAGFLOW:
        ragflow_service = RagflowService(base_url=settings.fwr_base_url)
        try:
            token = await get_ragflow_token(db, current_user.id)
            result = await ragflow_service.get_chat_sessions(token, agent_id)
            if not result:
                result = await get_session_history(db, current_user.id, agent_id)
                result = await get_session_history(db, current_user.id, agent_id, page, limit)
        except Exception as e:
            print(e)
            raise HTTPException(status_code=500, detail=str(e))
        return ResponseList(code=200, msg="", data=result)
    elif agent.agent_type == AgentType.BISHENG:
    elif agent_type == AgentType.BISHENG:
        bisheng_service = BishengService(base_url=settings.sgb_base_url)
        try:
            token = await get_bisheng_token(db, current_user.id)
@@ -62,13 +63,13 @@
            raise HTTPException(status_code=500, detail=str(e))
        return ResponseList(code=200, msg="", data=result)
    elif agent.agent_type == AgentType.BASIC:
    elif agent_type == AgentType.BASIC:
        offset = (page - 1) * limit
        records = db.query(SessionModel).filter(SessionModel.agent_id == agent_id, SessionModel.tenant_id==current_user.id).order_by(SessionModel.create_date.desc()).offset(offset).limit(limit).all()
        result = [item.to_dict() for item in records]
        return ResponseList(code=200, msg="", data=result)
    elif agent.agent_type == AgentType.DIFY:
    elif agent_type == AgentType.DIFY:
        offset = (page - 1) * limit
        records = db.query(SessionModel).filter(SessionModel.agent_id == agent_id, SessionModel.tenant_id==current_user.id).order_by(SessionModel.create_date.desc()).offset(offset).limit(limit).all()
        result = [item.to_dict() for item in records]
@@ -253,8 +254,8 @@
@router.get("/get-chat-id/{agent_id}", response_model=Response)
async def get_chat_id(agent_id: str, db: Session = Depends(get_db)):
    agent = db.query(AgentModel).filter(AgentModel.id == agent_id).first()
    if not agent:
        return Response(code=404, msg="Agent not found")
    # agent = db.query(AgentModel).filter(AgentModel.id == agent_id).first()
    # if not agent:
    #     return Response(code=404, msg="Agent not found")
    return Response(code=200, msg="", data={"chat_id": uuid.uuid4().hex})
app/api/dialog.py
@@ -2,11 +2,11 @@
from fastapi import APIRouter, Depends
from app.api import Response, get_current_user, ResponseList
from app.models.dialog_model import dialogData, dialogDataUpdate
from app.models.dialog_model import dialogData, dialogDataUpdate, dialogList
from app.models.base_model import get_db
from app.models.user_model import UserModel
from app.service.dialog import get_dialog_list, create_dialog_service, update_dialog_status_service, \
    delete_dialog_service, update_dialog_icon_service
    delete_dialog_service, update_dialog_icon_service, get_dialog_manage_list
dialog_router = APIRouter()
@@ -63,4 +63,11 @@
    is_create = await update_dialog_icon_service(db, dialog.id, dialog.icon)
    if not is_create:
        return Response(code=500, msg="dialog update failure", data={})
    return Response(code=200, msg="dialog update success", data={})
    return Response(code=200, msg="dialog update success", data={})
@dialog_router.post("/dialog_list", response_model=Response)
async def dialog_list_api(dialog:dialogList,
                      current_user: UserModel = Depends(get_current_user),
                      db=Depends(get_db)):
    return Response(code=200, msg="", data=await get_dialog_manage_list(db, current_user.id, dialog.keyword, dialog.label, dialog.status, dialog.pageSize, dialog.current, dialog.mode))
app/api/organization.py
@@ -67,4 +67,4 @@
    msg = await edit_organization_status(db, dept.deptId, str(dept.status))
    if msg:
        return Response(code=400, msg=f"{msg}", data={})
    return Response(code=200, msg="dept delete successfully", data={})
    return Response(code=200, msg="dept status update successfully", data={})
app/api/resource.py
@@ -21,10 +21,11 @@
@menu_router.delete("/{menuId}", response_model=Response)
async def delete_resource(menuId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
    is_edit = await delete_resource_info(db, menuId)
    if not is_edit:
        return Response(code=500, msg="menu delete failure", data={})
    msg = await delete_resource_info(db, menuId)
    if msg:
        return Response(code=400, msg=f"{msg}", data={})
    return Response(code=200, msg="menu delete successfully", data={})
@menu_router.post("/add_menu", response_model=Response)
@@ -47,15 +48,16 @@
        return Response(code=400, msg="The status cannot be {}!".format(menu.status))
    is_create = await edit_resource_data(db, menu.menuId, menu.menuName, menu.component, menu.path, menu.orderNum, menu.perms, menu.menuType, menu.description, menu.parentId, menu.status,menu.icon)
    if not is_create:
        return Response(code=500, msg="dept edit failure", data={})
    return Response(code=200, msg="dept edit successfully", data={})
        return Response(code=500, msg="menu edit failure", data={})
    return Response(code=200, msg="menu edit successfully", data={})
@menu_router.put("/status", response_model=Response)
async def resource_edit_status(menu: MenuStatus, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
    if menu.status not in ["0", "1"]:
        return Response(code=400, msg="The status cannot be {}!".format(menu.status))
    is_create = await edit_resource_status(db, menu.menuId, menu.status)
    if not is_create:
        return Response(code=500, msg="dept status edit failure", data={})
    return Response(code=200, msg="dept status edit success", data={})
    # is_create = await edit_resource_status(db, menu.menuId, menu.status)
    msg = await edit_resource_status(db, menu.menuId, str(menu.status))
    if msg:
        return Response(code=400, msg=f"{msg}", data={})
    return Response(code=200, msg="menu status update successfully", data={})
app/config/const.py
@@ -23,6 +23,8 @@
USER_STATSU_OFF = "0"
Dialog_STATSU_DELETE = "2"
Dialog_STATSU_ON = "1"
Dialog_STATSU_OFF = "0"
DEPT_STATUS_DELETE = "2"
DEPT_STATUS_ON = "1"
@@ -30,4 +32,8 @@
ROLE_STATUS_DELETE = "2"
ROLE_STATUS_ON = "1"
ROLE_STATUS_OFF = "0"
ROLE_STATUS_OFF = "0"
RESOURCE_STATUS_DELETE = "2"
RESOURCE_STATUS_ON = "1"
RESOURCE_STATUS_OFF = "0"
app/models/base_model.py
@@ -8,7 +8,7 @@
DATABASE_URL = os.getenv('DATABASE_URL') or settings.database_url
engine = create_engine(DATABASE_URL)
engine = create_engine(DATABASE_URL, pool_size=20, max_overflow=50)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
app/models/dialog_model.py
@@ -81,4 +81,13 @@
class dialogDataUpdate(BaseModel):
    id: str
    status: Optional[str] = "1"
    icon: Optional[str] = ""
    icon: Optional[str] = ""
class dialogList(BaseModel):
    current: Optional[int] = 1
    pageSize: Optional[int] = 10
    keyword: Optional[str] = ""
    label: Optional[list] = []
    status: Optional[str] = ""
    mode: Optional[str] = ""
app/models/resource_model.py
@@ -5,6 +5,7 @@
from sqlalchemy import Column, Integer, String, DateTime, Table, ForeignKey
from sqlalchemy.orm import relationship, backref
from app.config.const import RESOURCE_STATUS_DELETE
from app.models.base_model import Base
class ResourceModel(Base):
@@ -58,7 +59,7 @@
            'menuType': self.resource_type_id,
            'parentId': self.get_pid(),
            'parentName': self.get_pName(),
            'children': [res.to_tree_select_json() for res in self.children]
            'children': [res.to_tree_select_json() for res in self.children if res if res.status != RESOURCE_STATUS_DELETE]
        }
    def to_router_json(self):
@@ -94,11 +95,13 @@
        router = {
            'id': self.id,
            'name': self.path.capitalize() if self.path else '',
            # 'name': self.name,
            'path': self.path,
            'hidden': bool(self.hidden),
            'redirect': 'noRedirect',
            'component': self.url,
            'alwaysShow': True,
            'perms': self.perms,
            'resourceType': self.get_type_json(),
            'meta': {
                'title': self.name,
app/models/user_model.py
@@ -112,25 +112,26 @@
        # if len(self.roles) > 0:
        roles = {role.id: role.to_dict() for role in self.roles}
        ogt_set = set()
        for ogt in self.organizations:
            if ogt.id in ogt_set:
                continue
            print(ogt.id)
            ogt_set.add(ogt.id)
            for role in ogt.roles:
                roles[role.id] = role.to_dict()
            parent_ogt = ogt.parent
            while parent_ogt:
                if parent_ogt.id not in ogt_set:
                    ogt_set.add(ogt.id)
                    for role in parent_ogt.roles:
                        roles[role.id] = role.to_dict()
                    parent_ogt = parent_ogt.parent
                else:
                    break
        # ogt_set = set()
        # for ogt in self.organizations:
        #     if ogt.id in ogt_set:
        #         continue
        #     print(ogt.id)
        #     ogt_set.add(ogt.id)
        #     for role in ogt.roles:
        #         roles[role.id] = role.to_dict()
        #     parent_ogt = ogt.parent
        #     while parent_ogt:
        #         if parent_ogt.id not in ogt_set:
        #             ogt_set.add(ogt.id)
        #             for role in parent_ogt.roles:
        #                 roles[role.id] = role.to_dict()
        #             parent_ogt = parent_ogt.parent
        #         else:
        #             break
        json['roles'] = list(roles.values())
        json['depts'] = [i.to_base_json() for i in self.organizations]
        return json
app/service/dialog.py
@@ -83,10 +83,10 @@
            db.rollback()
async def get_session_history(db, user_id, dialog_id):
async def get_session_history(db, user_id, dialog_id,  page, limit):
    session_list = db.query(ConversationModel).filter(ConversationModel.tenant_id.__eq__(user_id),
                                                      ConversationModel.dialog_id.__eq__(dialog_id)).order_by(
        ConversationModel.update_time.desc()).all()
        ConversationModel.update_time.desc()).limit(limit).offset((page - 1) * limit).all()
    return [i.to_json() for i in session_list]
@@ -134,4 +134,52 @@
        logger.error(e)
        db.rollback()
        return False
    return True
    return True
async def get_dialog_manage_list(db, user_id, keyword, label, status, page_size, page_index, mode):
    user = db.query(UserModel).filter(UserModel.id == user_id).first()
    if user is None:
        return {"rows": []}
    query = db.query(DialogModel).filter(DialogModel.status != Dialog_STATSU_DELETE)
    id_list = []
    if label:
        id_list = set([i.object_id for i in db.query(LabelWorkerModel).filter(LabelWorkerModel.label_id.in_(label)).all()])
    if user.permission != "admin":
        dia_list = [j.id for i in user.groups for j in i.dialogs if not label or j.id in id_list]
        query = query.filter(or_(DialogModel.tenant_id == user_id, DialogModel.id.in_(dia_list)))
    else:
        if label:
            query = query.filter(or_(DialogModel.id.in_(id_list)))
    if keyword:
        query = query.filter(DialogModel.name.like('%{}%'.format(keyword)))
    if status:
        # print(status)
        query = query.filter(DialogModel.status == status)
    if mode:
        query = query.filter(DialogModel.mode == mode)
    query = query.order_by(DialogModel.update_date.desc())
    total = query.count()
    if page_size:
        query = query.limit(page_size).offset((page_index - 1) * page_size)
    rows = []
    user_id_set = set()
    dialog_id_set = set()
    label_dict = {}
    for kld in query.all():
        user_id_set.add(kld.tenant_id)
        dialog_id_set.add(kld.id)
        rows.append(kld.to_json())
    user_dict = {str(i.id): i.to_dict() for i in db.query(UserModel).filter(UserModel.id.in_(user_id_set)).all()}
    for i in db.query(LabelModel.id, LabelModel.name, LabelWorkerModel.object_id).outerjoin(LabelWorkerModel,
                                                                LabelModel.id == LabelWorkerModel.label_id).filter(
            LabelWorkerModel.object_id.in_(dialog_id_set)).all():
        label_dict[i.object_id] = label_dict.get(i.object_id, []) +[{"labelId": i.id, "labelName": i.name}]
    for r in rows:
        r["user"] = user_dict.get(r["user_id"], {})
        r["label"] = label_dict.get(r["id"], [])
    return {"total":  total, "rows": rows}
app/service/organization.py
@@ -113,6 +113,10 @@
    next_dept_list = []
    base_dept = db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).first()
    if status == DEPT_STATUS_ON:
        print(11)
        print(base_dept.name)
        if base_dept.parent and base_dept.parent.status != DEPT_STATUS_ON:
            return '上级节点状态异常!'
        try:
            base_dept.status=status
            db.commit()
app/service/resource.py
@@ -1,6 +1,7 @@
import uuid
from Log import logger
from app.config.const import RESOURCE_STATUS_ON, RESOURCE_STATUS_OFF, RESOURCE_STATUS_DELETE
from app.models import ResourceModel
@@ -17,14 +18,28 @@
async def delete_resource_info(db, menu_id):
    delete_list = []
    dept_list = []
    next_dept_list = []
    base_dept = db.query(ResourceModel).filter(ResourceModel.id.__eq__(menu_id)).first()
    dept_list.append(base_dept)
    while dept_list:
        for dept in dept_list:
            delete_list.append(dept.id)
            for child_dept in dept.children:
                next_dept_list.append(child_dept)
        dept_list = next_dept_list
        next_dept_list = []
    try:
        db.query(ResourceModel).filter(ResourceModel.id.__eq__(menu_id)).delete()
        db.query(ResourceModel).filter(ResourceModel.id.in_(delete_list)).update({"status": RESOURCE_STATUS_DELETE})
        db.commit()
    except Exception as e:
        logger.error(e)
        db.rollback()
        return False
    return True
        return '服务异常 !'
    return ""
async def create_menu(db, menu_name, component, path, order_num, perms, menu_type, description, parent_id, status, icon):
@@ -66,13 +81,36 @@
async def edit_resource_status(db, menu_id, status):
    try:
        dept_model = db.query(ResourceModel).filter(ResourceModel.id == menu_id).first()
        dept_model.status = status
        db.commit()
        db.refresh(dept_model)
    except Exception as e:
        logger.error(e)
        db.rollback()
        return False
    return True
    delete_list = []
    dept_list = []
    next_dept_list = []
    base_dept = db.query(ResourceModel).filter(ResourceModel.id.__eq__(menu_id)).first()
    if status == RESOURCE_STATUS_ON:
        if base_dept.parent and base_dept.parent.status != RESOURCE_STATUS_ON:
            return '上级节点状态异常!'
        try:
            base_dept.status = status
            db.commit()
        except Exception as e:
            logger.error(e)
            db.rollback()
            return '服务异常 !'
    else:
        dept_list.append(base_dept)
        while dept_list:
            for dept in dept_list:
                delete_list.append(dept.id)
                for child_dept in dept.children:
                    next_dept_list.append(child_dept)
            dept_list = next_dept_list
            next_dept_list = []
        try:
            db.query(ResourceModel).filter(ResourceModel.id.in_(delete_list)).update(
                {"status": RESOURCE_STATUS_OFF})
            db.commit()
        except Exception as e:
            logger.error(e)
            db.rollback()
            return '服务异常 !'
    return ""
app/service/user.py
@@ -1,10 +1,12 @@
import time
from datetime import datetime
from traceback import print_tb
from app.api import pwd_context
from app.api.dialog import dialog_list
from app.config.config import settings
from app.config.const import RAGFLOW, BISHENG, DIFY, USER_STATSU_DELETE, ROLE_STATUS_ON, DEPT_STATUS_ON
from app.config.const import RAGFLOW, BISHENG, DIFY, USER_STATSU_DELETE, ROLE_STATUS_ON, DEPT_STATUS_ON, \
    Dialog_STATSU_ON
from app.models import RoleModel, GroupModel, AgentType, role_resource_table, DialogModel, OrganizationModel, \
    ResourceModel
from app.models.menu_model import WebMenuModel, MenuCapacityModel
@@ -107,6 +109,8 @@
async def edit_user_data(db, user_id, email, phone, login_name, roles, groups):
    try:
        print(121221)
        print(roles)
        user = db.query(UserModel).filter(UserModel.id == user_id).first()
        user.email = email
        user.phone = phone
@@ -116,6 +120,7 @@
        user.roles = [db.get(RoleModel, roleId) for roleId in roles]
        # user.groups = [db.get(GroupModel, groupId) for groupId in groups]
        db.commit()
        print(4343)
    except Exception as e:
        logger.error(e)
        db.rollback()
@@ -201,35 +206,37 @@
    role_set = set()
    dept_set = set()
    user = db.query(UserModel).filter_by(id=user_id).first()
    parent_resource = db.query(ResourceModel).filter(ResourceModel.status == DEPT_STATUS_ON, ResourceModel.resource_id == None).first()
    parent_id = ""
    print(user_id)
    if parent_resource:
        parent_id = parent_resource.id
    tmp_dit = {}
    if user.permission == "admin":
        dept_list = db.query(ResourceModel).filter(ResourceModel.status==DEPT_STATUS_ON, ResourceModel.resource_type_id != "1").all()
        for dept in dept_list:
            if not dept.resource_id:
                parent_id = dept.id
                continue
            permissions[dept.id] = dept.to_router_dict()
            permissions[dept.id] = dept
    else:
        async def role_resource(role_set, permissions, roles):
            nonlocal parent_id
            for role in roles:
                print(role.name)
                if role.id not in role_set and role.status == ROLE_STATUS_ON:
                    role_set.add(role.id)
                    for r in role.resources:
                        if r.resource_type_id != "1" and r.status==DEPT_STATUS_ON:
                            if not r.resource_id:
                                parent_id = r.id
                                continue
                            permissions[r.id] = r.to_router_dict()
                            permissions[r.id] = r
        await role_resource(role_set, permissions, user.roles)
        for ogt in user.organizations:
            print(ogt.name)
            if ogt.status != DEPT_STATUS_ON:
                continue
            print(ogt.name)
            if ogt.roles:
                await role_resource(role_set, permissions, user.roles)
                print(9877)
                await role_resource(role_set, permissions,ogt.roles)
            parent_ogt = ogt.parent
            while parent_ogt:
                if parent_ogt.id not in dept_set:
@@ -238,12 +245,29 @@
                    parent_ogt = parent_ogt.parent
                else:
                    break
    # print(permissions.keys())
    def get_parent(parent, permissions):
        # print(parent.id)
        # nonlocal permissions
        if parent.id not in permissions:
    for permission in permissions.values():
            permissions[parent.id] = parent  # .to_router_dict()
            # print(permissions.keys())
            parent = parent.parent
            if parent:
                get_parent(parent, permissions)
    # permission_list = []
    for permission in list(permissions.values()):
        if permission.parent:
            get_parent(permission.parent, permissions)
    permission_list = [p.to_router_dict() for p in permissions.values()]
    for permission in permission_list:
        tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) + [permission]
    # print(permissions.keys())
    def get_child(parent_id):
        res = permissions[parent_id]
        # if parent_id in tmp_dit:
        res = permissions[parent_id].to_router_dict()
        res["children"] = [get_child(i["id"]) for i in tmp_dit.get(parent_id, [])]
        return res
@@ -256,12 +280,17 @@
    res = []
    # print(user_id)
    user = db.query(UserModel).filter_by(id=user_id).first()
    for group in user.groups:
        for dialog in group.dialogs:
            dialog_list.append(dialog.id)
    if user.permission == "admin":
        dialog_list = [i.id for i in db.query(DialogModel).filter(DialogModel.status==Dialog_STATSU_ON).all()]
    else:
        for group in user.groups:
            for dialog in group.dialogs:
                dialog_list.append(dialog.id)
    # print(dialog_list)
    menu_list = db.query(WebMenuModel.id, WebMenuModel.title, WebMenuModel.describe, WebMenuModel.icon, WebMenuModel.desc,WebMenuModel.rank,
                         WebMenuModel.img, MenuCapacityModel.capacity_id, MenuCapacityModel.capacity_type, MenuCapacityModel.chat_id.label("agentId")).outerjoin(
                         WebMenuModel.img, MenuCapacityModel.capacity_id, MenuCapacityModel.capacity_type, MenuCapacityModel.chat_id.label("agentId"), MenuCapacityModel.chat_type).outerjoin(
        MenuCapacityModel, WebMenuModel.id == MenuCapacityModel.menu_id).outerjoin(
        DialogModel, MenuCapacityModel.capacity_id == DialogModel.id).filter(DialogModel.status=="1").all()
@@ -277,14 +306,16 @@
                break
        else:
            res.append({
            'id': menus[0].id,
            'title': menus[0].title,
            'menuId': menus[0].id,
            'name': menus[0].title,
            'icon': menus[0].icon,
            'img': menus[0].img,
            'desc': menus[0].desc,
            'dialog': menus[0].describe,
            'agentId': menus[0].agentId,
            'rank': menus[0].rank
            'id': menus[0].agentId,
            'rank': menus[0].rank,
            'agent_type': menus[0].capacity_type,
            'type': menus[0].chat_type
        })
    return sorted(res, key=lambda x: x['rank'], reverse=True)
@@ -307,15 +338,15 @@
                for r in role.resources:
                    if r.resource_type_id != "1":
                        if not r.resource_id:
                            parent_id = r.id
                            continue
                    #     if not r.resource_id:
                    #         parent_id = r.id
                    #         continue
                        permissions[r.id] = r.to_router_dict()
    await role_resource(role_set, permissions, user.roles)
    for ogt in user.organizations:
        if ogt.roles:
            await role_resource(role_set, permissions, user.roles)
            await role_resource(role_set, permissions, ogt.roles)
        parent_ogt = ogt.parent
        while parent_ogt:
@@ -327,16 +358,17 @@
            else:
                break
    tmp_dit = {}
    for permission in permissions.values():
        tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) + [permission]
    # tmp_dit = {}
    # for permission in permissions.values():
    #     tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) + [permission]
    #
    # def get_child(parent_id):
    #     res = permissions[parent_id]
    #     res["children"] = [get_child(i["id"]) for i in tmp_dit.get(parent_id, [])]
    #     return res
    def get_child(parent_id):
        res = permissions[parent_id]
        res["children"] = [get_child(i["id"]) for i in tmp_dit.get(parent_id, [])]
        return res
    res["menus"] = [get_child(i["id"]) for i in tmp_dit.get(parent_id, [])]
    # res["menus"] = [get_child(i["id"]) for i in tmp_dit.get(parent_id, [])]
    res["menus"] = list(permissions.values())
    for group in user.groups:
        for klg in group.knowledges:
            knowledge_dict[klg.id] = klg.to_json()
app/task/fetch_agent.py
@@ -49,6 +49,7 @@
    status = Column(String(16), nullable=False)
    description = Column(Text, nullable=False)
    tenant_id = Column(String(36), nullable=False)
    mode = Column(String(36), nullable=False)
class RgKnowledge(Base):
@@ -210,14 +211,14 @@
    try:
        if names:
            query = db.query(Flow.id, Flow.name, Flow.description, Flow.status, Flow.user_id) \
                .filter(Flow.name.in_(names))
                .filter(Flow.name.in_(names), Flow.status=="1")
        else:
            query = db.query(Flow.id, Flow.name, Flow.description, Flow.status, Flow.user_id)
            query = db.query(Flow.id, Flow.name, Flow.description, Flow.status, Flow.user_id).filter(Flow.status=="1")
        results = query.all()
        # print(f"Executing query: {query}")
        # 格式化id为UUID
        formatted_results = [{"id":format_uuid(row[0]), "name": row[1], "description": row[2], "status": "1" if row[3] ==2 else "0", "user_id": str(row[4])} for row in results]
        formatted_results = [{"id":row[0], "name": row[1], "description": row[2], "status": row[3], "user_id": str(row[4]), "mode": "agent-dialog"} for row in results]
        return formatted_results
    finally:
        db.close()
@@ -233,8 +234,8 @@
        results = query.all()
        formatted_results = [
            {"id": format_uuid(row[0]), "name": row[1], "description": row[2], "status": str(row[3]) if row[3]  ==1 else "2",
             "user_id": str(row[4])} for row in results]
            {"id": row[0], "name": row[1], "description": row[2], "status": "1" if row[3]  == "1" else "2",
             "user_id": str(row[4]), "mode": "agent-dialog"} for row in results]
        return formatted_results
    finally:
        db.close()
@@ -244,15 +245,15 @@
    db = SessionDify()
    try:
        if names:
            query = db.query(DfApps.id, DfApps.name, DfApps.description, DfApps.status, DfApps.tenant_id) \
            query = db.query(DfApps.id, DfApps.name, DfApps.description, DfApps.status, DfApps.tenant_id, DfApps.mode) \
                .filter( DfApps.name.in_(names))
        else:
            query = db.query(DfApps.id, DfApps.name, DfApps.description, DfApps.status, DfApps.tenant_id)
            query = db.query(DfApps.id, DfApps.name, DfApps.description, DfApps.status, DfApps.tenant_id, DfApps.mode)
        results = query.all()
        formatted_results = [
            {"id": str(row[0]), "name": row[1], "description": row[2], "status": "1",
             "user_id": str(row[4])} for row in results]
             "user_id": str(row[4]), "mode": row[5]} for row in results]
        return formatted_results
    finally:
        db.close()
@@ -269,15 +270,17 @@
            existing_agent = db.query(DialogModel).filter_by(id=row["id"]).first()
            if existing_agent:
                existing_agent.name = row["name"]
                existing_agent.status = row["status"]
                existing_agent.description = row["description"]
                existing_agent.status = row["status"]
                existing_agent.mode = row["mode"]
                # existing_agent.tenant_id = get_rag_user_id(db, row["user_id"], type_dict[dialog_type])
            else:
                existing = DialogModel(id=row["id"], status=row["status"], name=row["name"], description=row["description"], tenant_id=get_rag_user_id(db, row["user_id"], type_dict[dialog_type]), dialog_type=dialog_type)
                existing = DialogModel(id=row["id"], status=row["status"], name=row["name"], description=row["description"], tenant_id=get_rag_user_id(db, row["user_id"], type_dict[dialog_type]), dialog_type=dialog_type, mode=row["mode"])
                db.add(existing)
        db.commit()
        for dialog in db.query(DialogModel).filter_by(dialog_type=dialog_type).all():
            if dialog.id not in agent_id_list:
                # print(dialog.id)
                db.query(DialogModel).filter_by(id=dialog.id).update({"status": "2"})
                db.commit()
    except IntegrityError:
@@ -343,7 +346,7 @@
                                       knowledge_type=1, permission=row["permission"], documents=row["doc_num"])
                db.add(existing)
        db.commit()
        for dialog in db.query(KnowledgeModel).filter_by(knowledge_type=type_dict[klg_type]).all():
        for dialog in db.query(KnowledgeModel).filter_by(knowledge_type=klg_type).all():
            if dialog.id not in agent_id_list:
                db.query(KnowledgeModel).filter_by(id=dialog.id).delete()
                db.commit()
env_conf/menu_conf.json
@@ -44,8 +44,8 @@
      "rank": 98,
      "dialog": [
        {
          "id": "42e4fcdc-9bea-11ef-ac30-0242ac160006",
          "chat_id": "42e4fcdc-9bea-11ef-ac30-0242ac160006",
          "id": "e476db7cbdbb11ef82b50242ac130006",
          "chat_id": "e476db7cbdbb11ef82b50242ac130006",
          "chat_type": "knowledgeQA",
          "agentType": 1
        }
@@ -61,10 +61,10 @@
      "rank": 97,
      "dialog": [
        {
          "id": "c684bab4-f05b-423e-8727-f50497e73ebf",
          "chat_id": "c684bab4-f05b-423e-8727-f50497e73ebf",
          "chat_type": "report",
          "agentType": 2
          "id": "7638f006-38a2-4c21-a68e-c6c49b304a35",
          "chat_id": "7638f006-38a2-4c21-a68e-c6c49b304a35",
          "chat_type": "documentIa",
          "agentType": 4
        }
      ]
    },
@@ -78,8 +78,8 @@
      "rank": 96,
      "dialog": [
        {
          "id": "90d53372-9c02-11ef-bf6b-0242ac160006",
          "chat_id": "90d53372-9c02-11ef-bf6b-0242ac160006",
          "id": "90d533729c0211efbf6b0242ac160006",
          "chat_id": "90d533729c0211efbf6b0242ac160006",
          "chat_type": "chat",
          "agentType": 1
        }
@@ -98,7 +98,7 @@
          "id": "basic_excel_talk",
          "chat_id": "basic_excel_talk",
          "chat_type": "excelTalk",
          "agentType": 1
          "agentType": 3
        }
      ]
    },