From 91062dda27e06bf29eaa78eff47ba505ad19b7a2 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期三, 18 十二月 2024 16:00:31 +0800
Subject: [PATCH] 机构接口优化

---
 app/models/organization_model.py |   12 ++
 app/service/organization.py      |   63 ++++++++++++++-
 app/api/organization.py          |   22 +++--
 app/api/chat.py                  |    2 
 app/config/const.py              |   10 ++
 app/task/fetch_agent.py          |    8 +-
 app/service/user.py              |   73 ++++++++++-------
 7 files changed, 136 insertions(+), 54 deletions(-)

diff --git a/app/api/chat.py b/app/api/chat.py
index 90c8b4a..a824acd 100644
--- a/app/api/chat.py
+++ b/app/api/chat.py
@@ -235,7 +235,7 @@
                 if not question:
                     await websocket.send_json({"message": "Invalid request", "type": "error"})
                     continue
-                logger.error(agent.type)
+                # logger.error(agent.type)
                 if chat_type == "questionTalk":
 
                     try:
diff --git a/app/api/organization.py b/app/api/organization.py
index a660c16..eab77c7 100644
--- a/app/api/organization.py
+++ b/app/api/organization.py
@@ -1,11 +1,11 @@
 from fastapi import APIRouter, Depends
 from app.api import Response, pwd_context, get_current_user
-from app.models import DeptList, DeptInfo, DeptParent
+from app.models import DeptList, DeptInfo, DeptParent, DeptStatus
 from app.models.base_model import get_db
 from app.models.user import PageParameter, UserStatus, UserInfo, LoginData
 from app.models.user_model import UserModel
 from app.service.organization import get_organization_list, create_dept, edit_dept_data, edit_dept_parent, \
-    get_organization_info, delete_organization_info
+    get_organization_info, delete_organization_info, edit_organization_status
 
 dept_router = APIRouter()
 
@@ -54,15 +54,17 @@
 
 @dept_router.delete("/{deptId}", response_model=Response)
 async def delete_dept(deptId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
-    is_edit = await delete_organization_info(db, deptId)
-    if not is_edit:
-        return Response(code=500, msg="dept delete failure", data={})
+    msg = await delete_organization_info(db, deptId)
+    if msg:
+        return Response(code=400, msg=f"{msg}", data={})
     return Response(code=200, msg="dept delete successfully", data={})
 
 
-@dept_router.delete("/{deptId}", response_model=Response)
-async def delete_dept(deptId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
-    is_edit = await delete_organization_info(db, deptId)
-    if not is_edit:
-        return Response(code=500, msg="dept delete failure", data={})
+@dept_router.put("/status", response_model=Response)
+async def edit_status_api(dept: DeptStatus, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    if dept.status not in ["0", '1']:
+        return Response(code=400, msg="鏈煡鐘舵�侊紒", data={})
+    msg = await edit_organization_status(db, dept.deptId, dept.status)
+    if msg:
+        return Response(code=400, msg=f"{msg}", data={})
     return Response(code=200, msg="dept delete successfully", data={})
diff --git a/app/config/const.py b/app/config/const.py
index 96f0829..800ebf0 100644
--- a/app/config/const.py
+++ b/app/config/const.py
@@ -22,4 +22,12 @@
 USER_STATSU_ON = "1"
 USER_STATSU_OFF = "0"
 
-Dialog_STATSU_DELETE = "2"
\ No newline at end of file
+Dialog_STATSU_DELETE = "2"
+
+DEPT_STATUS_DELETE = "2"
+DEPT_STATUS_ON = "1"
+DEPT_STATUS_OFF = "0"
+
+ROLE_STATUS_DELETE = "2"
+ROLE_STATUS_ON = "1"
+ROLE_STATUS_OFF = "0"
\ No newline at end of file
diff --git a/app/models/organization_model.py b/app/models/organization_model.py
index 43a9354..b780496 100644
--- a/app/models/organization_model.py
+++ b/app/models/organization_model.py
@@ -5,6 +5,7 @@
 from sqlalchemy import Column, Integer, String, Table, ForeignKey, DateTime
 from sqlalchemy.orm import relationship, backref
 
+from app.config.const import DEPT_STATUS_DELETE
 from app.models.base_model import Base
 
 # organization_group_table = Table('organization_group', Base.metadata,
@@ -29,7 +30,7 @@
     leader = Column(String(255))
     phone = Column(String(32))
     email = Column(String(64))
-    status = Column(String(10), nullable=False, default="0")
+    status = Column(String(10), nullable=False, default="1")
 
     # groups = relationship('GroupModel',
     #                             secondary=organization_group_table,
@@ -65,7 +66,7 @@
             'roles': [self.role_json(role) for role in self.roles],
             # 'groups': [self.group_json(group) for group in self.groups],
             'children': [
-                org.to_json() for org in self.children
+                org.to_json() for org in self.children if org.status != DEPT_STATUS_DELETE
             ]
         }
 
@@ -168,7 +169,7 @@
     orderNum: int
     address: Optional[str] = ""
     parentId: Optional[str] = ""
-    status: str
+    status:  Optional[str] = ""
     roles: Optional[list] = []
     groups: Optional[list] = []
 
@@ -177,3 +178,8 @@
     deptId: str
     parentId: str
     orderNum: int
+
+
+class DeptStatus(BaseModel):
+    deptId: str
+    status: str
\ No newline at end of file
diff --git a/app/service/organization.py b/app/service/organization.py
index 13b9d08..db4152c 100644
--- a/app/service/organization.py
+++ b/app/service/organization.py
@@ -1,6 +1,7 @@
 import uuid
 
 from Log import logger
+from app.config.const import DEPT_STATUS_DELETE, DEPT_STATUS_ON, DEPT_STATUS_OFF
 from app.models import OrganizationModel
 from app.models.role_model import RoleModel
 
@@ -40,7 +41,7 @@
         dept_model.address = address
         dept_model.phone = phone
         dept_model.leader = leader
-        dept_model.status = status
+        # dept_model.status = status
         dept_model.seq = order_num
         # if parent_id:
         #     dept_model.parent = db.get(OrganizationModel, parent_id)
@@ -75,15 +76,67 @@
 async def get_organization_info(db, dept_id: str):
     dept = db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).first()
 
-    return {"total": 0, "data":  dept.to_json()}
+    return {"total": 0, "data":  dept.to_dict()}
 
 
 async def delete_organization_info(db, dept_id: str):
+    delete_list = []
+    dept_list = []
+    next_dept_list = []
+    base_dept = db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).first()
+    dept_list.append(base_dept)
+    while dept_list:
+        for dept in dept_list:
+            delete_list.append(dept.id)
+            if dept.roles:
+                return "閮ㄩ棬锛歿}宸查厤缃鑹诧紝涓嶅厑璁稿垹闄わ紒".format(dept.name)
+            for child_dept in dept.children:
+                next_dept_list.append(child_dept)
+
+        dept_list = next_dept_list
+        next_dept_list = []
+
+
     try:
-        db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).delete()
+        db.query(OrganizationModel).filter(OrganizationModel.id.in_(delete_list)).update({"status": DEPT_STATUS_DELETE})
         db.commit()
     except Exception as e:
         logger.error(e)
         db.rollback()
-        return False
-    return True
\ No newline at end of file
+        return '鏈嶅姟寮傚父 锛�'
+    return ""
+
+
+async def edit_organization_status(db, dept_id: str, status:str):
+    delete_list = []
+    dept_list = []
+    next_dept_list = []
+    base_dept = db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).first()
+    if status == DEPT_STATUS_ON:
+        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)
+                if dept.roles:
+                    return "閮ㄩ棬锛歿}宸查厤缃鑹诧紝涓嶅厑璁革紒".format(dept.name)
+                for child_dept in dept.children:
+                    next_dept_list.append(child_dept)
+
+            dept_list = next_dept_list
+            next_dept_list = []
+        try:
+            db.query(OrganizationModel).filter(OrganizationModel.id.in_(delete_list)).update({"status": DEPT_STATUS_OFF})
+            db.commit()
+        except Exception as e:
+            logger.error(e)
+            db.rollback()
+            return '鏈嶅姟寮傚父 锛�'
+    return ""
\ No newline at end of file
diff --git a/app/service/user.py b/app/service/user.py
index 09a82ad..0cf305c 100644
--- a/app/service/user.py
+++ b/app/service/user.py
@@ -4,8 +4,9 @@
 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
-from app.models import RoleModel, GroupModel, AgentType, role_resource_table, DialogModel, OrganizationModel
+from app.config.const import RAGFLOW, BISHENG, DIFY, USER_STATSU_DELETE, ROLE_STATUS_ON, DEPT_STATUS_ON
+from app.models import RoleModel, GroupModel, AgentType, role_resource_table, DialogModel, OrganizationModel, \
+    ResourceModel
 from app.models.menu_model import WebMenuModel, MenuCapacityModel
 from app.models.user_model import UserModel, UserAppModel
 from Log import logger
@@ -168,6 +169,8 @@
     user = db.query(UserModel).filter(UserModel.id==user_id,UserModel.status !=USER_STATSU_DELETE).first()
     await role_resource(role_set, roles, permissions, user.roles)
     for ogt in user.organizations:
+        if ogt.status != DEPT_STATUS_ON:
+            continue
         dept.append(ogt.to_json())
         if ogt.roles:
             await role_resource(role_set, roles, permissions, user.roles)
@@ -185,11 +188,11 @@
 
 async def role_resource(role_set, role_list, permissions, roles):
     for role in roles:
-        if role.id not in role_set:
+        if role.id not in role_set and role.status == ROLE_STATUS_ON:
             role_set.add(role.id)
             role_list.append(role.to_dict())
             for r in role.resources:
-                if r.resource_type_id == "1":
+                if r.resource_type_id == "1" and r.status==DEPT_STATUS_ON:
                     permissions.add(r.perms)
 
 
@@ -199,33 +202,43 @@
     dept_set = set()
     user = db.query(UserModel).filter_by(id=user_id).first()
     parent_id = ""
-
-    async def role_resource(role_set, permissions, roles):
-        nonlocal parent_id
-        for role in roles:
-            if role.id not in role_set:
-                role_set.add(role.id)
-
-                for r in role.resources:
-                    if r.resource_type_id != "1":
-                        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)
-        parent_ogt = ogt.parent
-        while parent_ogt:
-            if parent_ogt.id not in dept_set:
-                await role_resource(role_set, permissions, parent_ogt.roles)
-                dept_set.add(parent_ogt.id)
-                parent_ogt = parent_ogt.parent
-            else:
-                break
     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()
+    else:
+        async def role_resource(role_set, permissions, roles):
+            nonlocal parent_id
+            for role in roles:
+                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()
+
+        await role_resource(role_set, permissions, user.roles)
+        for ogt in user.organizations:
+            if ogt.status != DEPT_STATUS_ON:
+                continue
+            if ogt.roles:
+                await role_resource(role_set, permissions, user.roles)
+            parent_ogt = ogt.parent
+            while parent_ogt:
+                if parent_ogt.id not in dept_set:
+                    await role_resource(role_set, permissions, parent_ogt.roles)
+                    dept_set.add(parent_ogt.id)
+                    parent_ogt = parent_ogt.parent
+                else:
+                    break
+
     for permission in permissions.values():
         tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) + [permission]
 
diff --git a/app/task/fetch_agent.py b/app/task/fetch_agent.py
index ea9a2e6..6373653 100644
--- a/app/task/fetch_agent.py
+++ b/app/task/fetch_agent.py
@@ -318,9 +318,9 @@
                 dify_data = get_data_from_dify_v2([])
                 if dify_data:
                     update_ids_in_local_v2(dify_data, "4")
-        print("Agents synchronized successfully")
+        print("v2 Agents synchronized successfully")
     except Exception as e:
-        print(f"Failed to sync agents: {str(e)}")
+        print(f"v2 Failed to sync agents: {str(e)}")
 
 def update_ids_in_local_knowledge(data, klg_type):
     type_dict = {"1": RAGFLOW, "2": BISHENG, "4": DIFY}
@@ -380,9 +380,9 @@
             # elif app["id"] == DIFY:
             #     dify_data = get_data_from_dify_v2([])
             #     update_ids_in_local_v2(dify_data, "4")
-        print("Agents synchronized successfully")
+        print("sync knowledge successfully")
     except Exception as e:
-        print(f"Failed to sync agents: {str(e)}")
+        print(f"Failed to sync knowledge: {str(e)}")
 
 
 if __name__ == "__main__":

--
Gitblit v1.8.0