瀏覽代碼

通信录

xuguoyang 7 月之前
父節點
當前提交
7f887329a1

+ 64 - 0
models/ry_sys_base.py

@@ -283,6 +283,70 @@ class SysUserPost(Base):
     class Config:
         orm_mode = True
 
+
+
+'''用户信息标签表(临时)'''
+class SysUserTag(Base):
+    __tablename__ = 'sys_user_tag'
+    __table_args__ = (PrimaryKeyConstraint('user_id', 'tag_id'),)
+    user_id = Column(BigInteger,nullable=False,comment="用户ID")
+    tag_id = Column(BigInteger,nullable=False,comment="标签ID")
+    class Config:
+        orm_mode = True
+
+class SysTag(Base):
+    __tablename__ = 'sys_tag'
+    __table_args__ = (PrimaryKeyConstraint('tag_id','parent_id', 'tag_name'),)
+    tag_id = Column(BigInteger, nullable=False, comment="标签ID")
+    parent_id = Column(BigInteger, nullable=False, comment="父级标签ID")
+    tag_name = Column(String(255), nullable=False, comment="标签名字")
+
+'''部门信息标签表(临时)'''
+
+class SysDeptTag(Base):
+    __tablename__ = 'sys_dept_tag'
+    __table_args__ = (PrimaryKeyConstraint('dept_id', 'tag_id'),)
+    dept_id = Column(BigInteger, nullable=False, comment="部门ID")
+    tag_id = Column(BigInteger, nullable=False, comment="标签ID")
+
+    class Config:
+        orm_mode = True
+
+class DeptTag(Base):
+    __tablename__ = 'dept_tag'
+    __table_args__ = (PrimaryKeyConstraint('tag_id', 'tag_name'),)
+    tag_id = Column(BigInteger, nullable=False, comment="标签ID")
+    tag_name = Column(String(255), nullable=False, comment="标签名字")
+
+
+    class Config:
+        orm_mode = True
+
+
+'''用户常用名单标签表'''
+class Sys_Common_List_Tags(Base):
+    __tablename__ = 'sys_common_list_tag'
+    __table_args__ = (PrimaryKeyConstraint('user_id', 'tag_id'),)
+    user_id = Column(BigInteger, nullable=False, comment="部门ID")
+    tag_id = Column(BigInteger, nullable=False, comment="标签ID")
+
+    class Config:
+        orm_mode = True
+
+class Common_List_Tags(Base):
+    __tablename__ = 'common_list_tag'
+    __table_args__ = (PrimaryKeyConstraint('tag_id', 'tag_name'),)
+    tag_id = Column(BigInteger, nullable=False,autoincrement=True, comment="标签ID")
+    tag_name = Column(String(255), nullable=False, comment="标签名字")
+
+    class Config:
+        orm_mode = True
+
+
+
+
+
+
 '''操作日志记录'''
 
 

+ 3 - 1
routers/api/infoPublish/__init__.py

@@ -4,7 +4,9 @@
 from fastapi import APIRouter, Request, Depends
 
 from . import back
+from . import addressbook
 
 router = APIRouter()
 
-router.include_router(back.router, prefix="/back", tags=["增删改"])
+router.include_router(back.router, prefix="/back", tags=["增删改"])
+router.include_router(addressbook.router, prefix="/addressbook", tags=["通信录"])

+ 306 - 0
routers/api/infoPublish/addressbook.py

@@ -0,0 +1,306 @@
+from fastapi import APIRouter, Request, Depends, HTTPException, Query, Body
+from sqlalchemy.exc import IntegrityError
+from fastapi.responses import HTMLResponse, FileResponse
+from fastapi.responses import JSONResponse
+from database import get_db
+from sqlalchemy import text, exists, and_, or_, not_
+from sqlalchemy.orm import Session
+from models import *
+import json
+import random
+from sqlalchemy import create_engine, select
+from typing import Optional
+from utils.StripTagsHTMLParser import *
+from common.db import db_event_management, db_user, db_area, db_emergency_plan
+from common.security import valid_access_token
+import traceback
+from utils import *
+from datetime import datetime, timedelta
+from common.db import db_dict
+from urllib.parse import quote
+import base64
+from config import settings
+from pydantic import BaseModel
+
+from typing import List, Dict,Set
+
+router = APIRouter()
+
+
+
+
+
+def get_dept_tree(db: Session, dept_id: int, tag_ids: Optional[Set[int]] = None) -> Dict:
+    dept = db.query(SysDept).filter(SysDept.dept_id == dept_id).first()
+    if not dept:
+        return None
+
+    # 收集祖先部门名称
+    ancestors_names = []
+    current_dept = dept
+    while current_dept:
+        ancestors_names.append(current_dept.dept_name)
+        current_dept = db.query(SysDept).filter(SysDept.dept_id == current_dept.parent_id).first()
+    ancestors_names.reverse()
+
+    # 获取部门标签
+    dept_tags = db.query(SysDeptTag).filter(SysDeptTag.dept_id == dept.dept_id).all()
+    dept_tags_info = [{"tag_id": tag.tag_id, "tag_name": tag.tag_name} for tag in db.query(DeptTag).filter(DeptTag.tag_id.in_([tag.tag_id for tag in dept_tags])).all()]
+
+    # 如果提供了标签ID参数,检查部门是否有匹配的标签
+    if tag_ids and not any(tag['tag_id'] in tag_ids for tag in dept_tags_info):
+        # 如果没有匹配的标签,检查子部门是否有匹配的标签
+        child_with_tag = False
+        for child in db.query(SysDept).filter(SysDept.parent_id == dept.dept_id).all():
+            if get_dept_tree(db, child.dept_id, tag_ids) is not None:
+                child_with_tag = True
+                break
+        if not child_with_tag:
+            return None  # 如果子部门也没有匹配的标签,则不包含该部门
+
+    # 获取用户标签
+    def get_user_tags(user_id):
+        user_tags_subquery = db.query(SysUserTag.tag_id).filter(SysUserTag.user_id == user_id).subquery()
+        tags = db.query(SysTag).filter(SysTag.tag_id.in_(user_tags_subquery)).all()
+        return [{"tag_id": tag.tag_id, "tag_name": tag.tag_name} for tag in tags]
+
+    # 获取部门下的用户
+    users_info = []
+    for user in db.query(SysUser).filter(SysUser.dept_id == dept.dept_id).all():
+        user_tags_info = get_user_tags(user.user_id)
+        # 如果提供了标签ID参数,检查用户是否有匹配的标签
+        if tag_ids and not any(tag['tag_id'] in tag_ids for tag in user_tags_info):
+            continue  # 如果用户没有匹配的标签,则不包含该用户
+        users_info.append({
+            "user_id": user.user_id,
+            "dept_id": user.dept_id,
+            "position": "无",
+            "user_name": user.user_name,
+            "email": user.email,
+            "user_tags": user_tags_info
+        })
+
+    # 构建子部门树
+    child_trees = [get_dept_tree(db, child.dept_id, tag_ids) for child in db.query(SysDept).filter(SysDept.parent_id == dept.dept_id).all()]
+    child_trees = [child for child in child_trees if child]
+
+    dept_info = {
+        "dept_id": dept.dept_id,
+        "parent_id": dept.parent_id,
+        "ancestors": '/'.join(ancestors_names),
+        "dept_name": dept.dept_name,
+        "tags": dept_tags_info,
+        "users": users_info,
+        "children": child_trees
+    }
+
+    return dept_info
+
+
+
+@router.get("/alldepts", response_model=Dict)
+def read_all_depts(db: Session = Depends(get_db), tag_ids: List[int] = Query(None, title="Tag IDs")):
+    tag_ids_set = set(tag_ids) if tag_ids else None
+    top_level_depts = get_dept_tree(db, 3, tag_ids_set)
+    if not top_level_depts:
+        raise HTTPException(status_code=404, detail="Department not found")
+    # return [top_level_depts]
+
+    return {
+        "code": 200,
+        "msg": "成功",
+        "data": top_level_depts
+}
+
+
+class DeptTagInfo(BaseModel):
+    tag_id: int
+    tag_name: str
+
+
+@router.get("/depts", response_model=Dict)
+def get_dept(db: Session = Depends(get_db)):
+    dept_tags  = db.query(DeptTag).all()
+    # 如果没有找到记录,返回404错误
+    if not dept_tags:
+        raise HTTPException(status_code=404, detail="No dept tags found")
+    dept_tags_data = [
+        DeptTagInfo(tag_id=dept_tag.tag_id,tag_name=dept_tag.tag_name)
+        for dept_tag in dept_tags
+    ]
+    return {
+        "code": 200,
+        "msg": "成功",
+        "data": dept_tags_data
+    }
+
+
+
+
+
+
+
+
+class User(BaseModel):
+    user_id: int
+    user_name: str
+    # nick_name: str
+
+class TagIDs(BaseModel):
+    tag_ids: List[int]
+
+
+
+@router.post("/users_by_tags")
+def read_users_by_tags(
+    db: Session = Depends(get_db),
+    tag_ids_data: TagIDs = Body(...)
+):
+    # 提取tag_ids
+    tag_ids = tag_ids_data.tag_ids
+
+    if not tag_ids:
+        raise HTTPException(status_code=400, detail="Tag IDs are required")
+
+    # 构建查询条件
+    conditions = [SysUserTag.tag_id == tag_id for tag_id in tag_ids]
+    query = db.query(SysUser).join(SysUserTag, SysUser.user_id == SysUserTag.user_id).filter(or_(*conditions))
+
+    distinct_user_count = db.query(SysUserTag.user_id).filter(SysUserTag.tag_id.in_(tag_ids)).count()
+    # 执行查询并去重 这里的去重只是单纯的用户标签去重,如果有多用户的得看到时候实际数据再规划如何去重
+    users_with_tags = query.distinct().all()
+
+    non_distinct_user_count  = len(users_with_tags)
+    print(distinct_user_count,non_distinct_user_count)
+
+    # 如果没有找到用户,返回404错误
+    if not users_with_tags:
+        raise HTTPException(status_code=404, detail="No users found for the given tag IDs")
+
+    # 将用户模型转换为User Pydantic模型列表
+    users_data = [
+        User(user_id=user.user_id, user_name=user.user_name)
+        for user in users_with_tags
+    ]
+
+    return {
+        "code": 200,
+        "msg": "成功",
+        "distinct_user_count":distinct_user_count,
+        "non_distinct_user_count":non_distinct_user_count,
+        "data": users_data
+}
+
+
+
+
+
+class TagTree(BaseModel):
+    tag_id: int
+    tag_name: str
+    parent_id: int
+    children: List['TagTree'] = []
+
+# 递归构建树形结构
+def build_tree(tags, parent_id=0):
+    tree = []
+    for tag in tags:
+        if tag.parent_id == parent_id:
+            children = build_tree(tags, tag.tag_id)
+            tree.append(TagTree(tag_id=tag.tag_id, tag_name=tag.tag_name, parent_id=tag.parent_id, children=children))
+    return tree
+
+@router.post("/tags_tree")
+def get_tag_tree(
+    db: Session = Depends(get_db),
+    tag_ids_data: TagIDs = Body(...)
+):
+    # 提取tag_ids
+    tag_ids = tag_ids_data.tag_ids
+
+    if not tag_ids:
+        raise HTTPException(status_code=400, detail="Tag IDs are required")
+
+    # 查询所有相关的标签
+    tags = db.query(SysTag).filter(SysTag.tag_id.in_(tag_ids)).all()
+
+    # 如果没有找到标签,返回404错误
+    if not tags:
+        raise HTTPException(status_code=404, detail="Tags not found for the given tag IDs")
+
+    # 构建标签树
+    tag_tree = build_tree(tags)
+
+    return {
+        "code": 200,
+        "msg": "成功",
+        "data": tag_tree
+}
+
+
+
+class TagData(BaseModel):
+    user_ids: List[int]
+    tag_name: str
+
+@router.post("/add_common_list_tags")
+def add_common_list_tags(
+    db: Session = Depends(get_db),
+    data: TagData = Body(...)
+):
+    user_ids = data.user_ids
+    tag_name = data.tag_name
+
+    if not user_ids or not tag_name:
+        raise HTTPException(status_code=tag_name, detail="User IDs and Tag Name are required")
+
+    # 查询标签是否存在
+    tag = db.query(Common_List_Tags).filter(Common_List_Tags.tag_name == tag_name).first()
+    print(tag)
+    # print(tag.tag_id)
+    # 如果标签不存在,则创建新标签
+    if not tag:
+        tag = Common_List_Tags(tag_name=tag_name)
+        db.add(tag)
+        db.commit()
+        tag_id = tag.tag_id
+    else:
+        tag_id = tag.tag_id
+
+    # 为每个用户ID插入记录,如果已存在则跳过
+    for user_id in user_ids:
+        existing_record = db.query(Sys_Common_List_Tags).filter_by(user_id=user_id, tag_id=tag_id).first()
+        if not existing_record:
+            db.add(Sys_Common_List_Tags(user_id=user_id, tag_id=tag_id))
+
+    db.commit()
+
+    return {"code": 200,"msg": "操作成功", "tag_id": tag_id}
+
+
+class TagUserCount(BaseModel):
+    tag_id: int
+    tag_name: str
+    user_count: int
+
+@router.get("/tags_user_count", response_model=Dict)
+def get_tags_user_count(db: Session = Depends(get_db)):
+    # 查询所有标签
+    tags = db.query(Common_List_Tags).all()
+
+    # 如果没有找到标签,返回404错误
+    if not tags:
+        raise HTTPException(status_code=404, detail="No tags found")
+
+    # 构建结果列表
+    result = []
+    for tag in tags:
+        # 查询与标签相关的用户数量
+        user_count = db.query(Sys_Common_List_Tags).filter(Sys_Common_List_Tags.tag_id == tag.tag_id).count()
+        result.append(TagUserCount(tag_id=tag.tag_id, tag_name=tag.tag_name, user_count=user_count))
+
+    return {
+        "code": 200,
+        "msg": "成功",
+        "data": result
+    }

+ 1 - 1
routers/api/riskMonitor/forest_fire_condition.py

@@ -64,7 +64,7 @@ def get_warning_description(level):
     elif level == 4:
         return "高度危险"
     elif level == 5:
-        return "度危险"
+        return "度危险"
 
 
 @router.post('/forest_warrning')