Ver código fonte

241228-1代码。

baoyubo 6 meses atrás
pai
commit
2b807e8fbc

+ 2 - 1
models/__init__.py

@@ -22,4 +22,5 @@ from .online_roll_call import *
 from .duty_base import *
 from .datafilling_base import *
 from .company_management_base import *
-from .resource_provision_base import *
+from .resource_provision_base import *
+from .three_proofing_responsible_base import *

+ 51 - 0
models/three_proofing_responsible_base.py

@@ -0,0 +1,51 @@
+from sqlalchemy import create_engine, Column, BigInteger, String, Text, DateTime, CHAR,Integer,Float
+from database import Base
+from datetime import datetime
+
+class ThreeProofingResponsiblePerson(Base):
+    __tablename__ = 'three_proofing_responsible_person'
+
+    id = Column(Integer, primary_key=True, autoincrement=True)
+    unit_id = Column(Integer, comment='单位ID')
+    unit_name = Column(String(255), nullable=False, comment='单位名称')
+    name = Column(String(255), nullable=False, comment='联系人')
+    area_code = Column(String(255), nullable=False, comment='区划编码')
+    position = Column(String(255), nullable=True, comment='职务')
+    phone = Column(String(50), nullable=True, comment='手机号码')
+    order_num = Column(Integer, default=100, comment='排序顺序')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
+    create_dept = Column(BigInteger, default=None, comment='创建部门')
+    create_by = Column(BigInteger, default=None, comment='创建者')
+    update_by = Column(BigInteger, default=None, comment='更新者')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+
+
+class ThreeProofingResponsibleType(Base):
+    __tablename__ = 'three_proofing_responsible_type'
+
+    id = Column(Integer, primary_key=True, autoincrement=True)
+    type_parent_id = Column(String(255), comment='责任类型id')
+    type_name = Column(String(255), nullable=False, comment='责任类别')
+    order_num = Column(Integer, default=100, comment='排序顺序')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
+    create_dept = Column(BigInteger, default=None, comment='创建部门')
+    create_by = Column(BigInteger, default=None, comment='创建者')
+    update_by = Column(BigInteger, default=None, comment='更新者')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+
+
+class ThreeProofingResponsiblePersonType(Base):
+    __tablename__ = 'three_proofing_responsible_person_type'
+
+    id = Column(Integer, primary_key=True, autoincrement=True)
+    type_id = Column(String(255), comment='责任类别id')
+    type_parent_id = Column(String(255), nullable=False, comment='责任类型id')
+    person_id = Column(Integer, nullable=False, comment='责任人id')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
+    create_dept = Column(BigInteger, default=None, comment='创建部门')
+    create_by = Column(BigInteger, default=None, comment='创建者')
+    update_by = Column(BigInteger, default=None, comment='更新者')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')

+ 13 - 0
routers/api/ThreeProofingResponsible/__init__.py

@@ -0,0 +1,13 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from fastapi import APIRouter, Request, Depends
+
+from . import person
+from . import type_data
+
+router = APIRouter()
+
+router.include_router(person.router, prefix="/person", tags=["人员管理"])
+
+router.include_router(type_data.router, prefix="/type_data", tags=["类型管理"])

+ 432 - 0
routers/api/ThreeProofingResponsible/person.py

@@ -0,0 +1,432 @@
+from fastapi import APIRouter, Request, Depends, HTTPException, Query
+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
+import os
+from sqlalchemy import create_engine, select
+from typing import Optional
+from utils.StripTagsHTMLParser import *
+from utils.three_proofing_responsible_util import *
+from utils.ry_system_util 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
+import pandas as pd
+from common.db import db_dept
+from exceptions import AppException
+
+router = APIRouter()
+
+
+@router.post('/create')
+async def create_contact(
+        db: Session = Depends(get_db),
+        body=Depends(remove_xss_json),
+        user_id=Depends(valid_access_token)
+):
+    try:
+        # 提取请求数据
+        unit_name = body['unit_name']
+        name = body['name']
+        area_code = body['area_code']
+        position = body['position']
+        phone = body['phone']
+        order_num = -1
+        if 'order_num'in body:
+            order_num=body['order_num']
+        unit_id = db_dept.get_dept_id_by_name(db, unit_name)
+
+        # 创建新的预案记录
+        new_person = ThreeProofingResponsiblePerson(
+            unit_id=unit_id,
+            unit_name=unit_name,
+            name=name,
+            area_code=area_code,
+            position=position,
+            phone=phone,
+            order_num=order_num,
+            create_by=user_id
+        )
+        # 添加到数据库会话并提交
+        db.add(new_person)
+        db.commit()
+        type_list = body['type_list']
+        for type_id in type_list:
+            type_parent_id = get_type_parent_id_by_type_id(db,type_id)
+            new_person_type = ThreeProofingResponsiblePersonType(
+                type_parent_id = type_parent_id,
+                type_id = type_id,
+                person_id = new_person.id,
+                create_by=user_id
+            )
+            db.add(new_person_type)
+
+        db.commit()
+        # 返回创建成功的响应
+        return {
+            "code": 200,
+            "msg": "创建成功",
+            "data": None
+        }
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+@router.put('/update')
+async def update_contact(
+        db: Session = Depends(get_db),
+        body=Depends(remove_xss_json),
+        user_id=Depends(valid_access_token)
+):
+    try:
+        # 提取请求数据
+        id = body['id']
+        person = get_person_info_by_id(db,id)
+
+        if not person:
+            return JSONResponse(status_code=404, content={
+                'errcode': 404,
+                'errmsg': '责任人不存在'
+            })
+
+        person.unit_name = body['unit_name']
+        person.name = body['name']
+        person.area_code = body['area_code']
+        person.position = body['position']
+        person.phone = body['phone']
+        person.order_num = body['order_num']
+        person.unit_id = db_dept.get_dept_id_by_name(db, body['unit_name'])
+        type_list = body['type_list']
+        old_person_type_list=get_person_type_by_person_id(db,person.id)
+        for old_person_type in old_person_type_list:
+            old_person_type.del_flag='2'
+        for type_id in type_list:
+            type_parent_id = get_type_parent_id_by_type_id(db, type_id)
+            new_person_type = ThreeProofingResponsiblePersonType(
+                type_parent_id=type_parent_id,
+                type_id=type_id,
+                person_id=person.id,
+                create_by=user_id
+            )
+            db.add(new_person_type)
+        # 更新到数据库会话并提交
+        db.commit()
+
+        # 返回创建成功的响应
+        return {
+            "code": 200,
+            "msg": "更新成功",
+            "data": None
+        }
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+@router.get('/list')
+async def get_emergency_contact_list(
+        type_parent_id: str = Query(None, description='单位名称'),
+        Name: str = Query(None, description='联系人'),
+        page: int = Query(1, gt=0, description='页码'),
+        pageSize: int = Query(10, gt=0, description='每页条目数量'),
+        db: Session = Depends(get_db),
+        user_id=Depends(valid_access_token)
+):
+    try:
+        # 构建查询
+        query = db.query(ThreeProofingResponsiblePerson)
+        query = query.filter(ThreeProofingResponsiblePerson.del_flag == '0')
+        # 应用查询条件
+        if type_parent_id:
+            person_list = get_person_list_by_type_parent_id(db,type_parent_id)
+            query = query.filter(ThreeProofingResponsiblePerson.id.in_(person_list))
+        if Name:
+            query = query.filter(ThreeProofingResponsiblePerson.name.like(f'%{Name}%'))
+
+        # 计算总条目数
+        total_items = query.count()
+
+        # 排序
+
+        query = query.order_by(ThreeProofingResponsiblePerson.order_num.asc())
+        # 执行分页查询
+        contact_infos = query.offset((page - 1) * pageSize).limit(pageSize).all()
+
+        # 将查询结果转换为列表形式的字典
+        contact_infos_list = []
+        for info in contact_infos:
+            type_parent_id_list = get_type_parent_id_by_person_id(db,info.id)
+            type_parent_list = []
+            for type_parent in type_parent_id_list:
+                dict_data = get_dict_data_info(db,'three_proofing',type_parent)
+                type_parent_list.append({"type_parent_id":type_parent,"type_parent":dict_data.dict_label})
+            contact_infos_list.append({
+                "id": info.id,
+                "unit_id": info.unit_id,
+                "unit_name": info.unit_name,
+                "name": info.name,
+                "area_code": info.area_code,
+                "position": info.position,
+                "phone": info.phone,
+                "order_num":info.order_num,
+                "create_time": info.create_time.strftime('%Y-%m-%d'),
+                "type_parent_list":type_parent_list
+            })
+        # 返回结果+
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data": contact_infos_list,
+            "total": total_items
+        }
+
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+@router.get('/info/{id}')
+async def get_emergency_contact_id_info(
+        id: str,
+        db: Session = Depends(get_db),
+        user_id=Depends(valid_access_token)
+):
+    try:
+
+        contact = get_person_info_by_id(db,id)
+        if not contact:
+            return JSONResponse(status_code=404, content={
+                'errcode': 404,
+                'errmsg': '联系人不存在'
+            })
+        # 将查询结果转换为列表形式的字典
+
+        contact_result = {
+            "id": contact.id,
+            "unit_id": contact.unit_id,
+            "unit_name": contact.unit_name,
+            "name": contact.name,
+            "area_code":contact.area_code,
+            "position": contact.position,
+            "phone": contact.phone,
+            "order_num":contact.order_num,
+            "create_time": contact.create_time.strftime('%Y-%m-%d'),
+            "type_list":[]
+        }
+
+        type_list = get_person_type_by_person_id(db,contact.id)
+        for type_info in type_list:
+            dict_data = get_dict_data_info(db, 'three_proofing', type_info.type_parent_id)
+            type_data = get_type_info_by_id(db,type_info.type_id)
+            type_data = {"type_parent_id": type_info.type_parent_id, "type_parent": dict_data.dict_label,"type_id":type_info.type_id,"type_name":type_data.type_name}
+
+            contact_result['type_list'].append(type_data)
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data": contact_result
+        }
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+
+
+@router.delete('/delete')
+async def delete_emergency_plans(
+        ids: list,
+        db: Session = Depends(get_db),
+        body=Depends(remove_xss_json),
+        user_id=Depends(valid_access_token)
+):
+    try:
+        # 提取请求数据
+        query = db.query(ThreeProofingResponsiblePerson)
+        query = query.filter(ThreeProofingResponsiblePerson.del_flag != '2')
+        query = query.filter(ThreeProofingResponsiblePerson.id.in_(ids))
+        contacts = query.all()
+        if not contacts:
+            return JSONResponse(status_code=404, content={
+                'errcode': 404,
+                'errmsg': '联系人不存在'
+            })
+        for contact in contacts:
+            contact.del_flag = '2'
+            contact.create_by = user_id
+        # 更新到数据库会话并提交
+        db.commit()
+
+        # 返回创建成功的响应
+        return {
+            "code": 200,
+            "msg": "删除成功",
+            "data": None
+        }
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+@router.delete('/delete/{id}')
+async def delete_emergency_plans(
+        id: int,
+        db: Session = Depends(get_db),
+        body=Depends(remove_xss_json),
+        user_id=Depends(valid_access_token)
+):
+    try:
+        contact = get_person_info_by_id(db, id)
+        if not contact:
+            return JSONResponse(status_code=404, content={
+                'errcode': 404,
+                'errmsg': '联系人不存在'
+            })
+        contact.del_flag = '2'
+        contact.create_by = user_id
+        # 更新到数据库会话并提交
+        db.commit()
+
+        # 返回创建成功的响应
+        return {
+            "code": 200,
+            "msg": "删除成功",
+            "data": None
+        }
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+#
+# @router.post('/createImport')
+# async def create_contact(
+#         db: Session = Depends(get_db),
+#         body=Depends(remove_xss_json),
+#         user_id=Depends(valid_access_token)
+# ):
+#     try:
+#         # 提取请求数据
+#         filename = body['filename']
+#         if len(filename) == 0:
+#             raise Exception()
+#
+#         file_name = filename[0]['url']
+#         file_path = f'/data/upload/mergefile/uploads/{file_name}'
+#
+#         # 检查文件是否存在
+#         if not os.path.isfile(file_path):
+#             return JSONResponse(status_code=404, content={
+#                 'errcode': 404,
+#                 'errmsg': f'{file_name}不存在'
+#             })
+#
+#         # 定义预期的列名和对应的最大长度
+#         expected_columns = {
+#             '单位名称': 255,
+#             '联系人': 255,
+#             '职务': 255,
+#             '粤政易手机号码': 20
+#         }
+#         try:
+#             df = pd.read_excel(file_path, engine='openpyxl', header=0)
+#         except Exception as e:
+#             raise AppException(500, "请按模板上传!")
+#
+#         # 读取Excel文件
+#         # try:
+#         #     df = pd.read_excel(file_path, engine='openpyxl', header=0)
+#         # except Exception as e:
+#         #     return f"读取Excel文件时出错: {e}"
+#
+#         # 获取前两行的数据
+#         first_two_rows = df
+#         # print(first_two_rows)
+#         # 检查列名是否匹配
+#         actual_columns = first_two_rows.columns.tolist()
+#         # print('actual_columns', actual_columns)
+#         missing_columns = [col for col in expected_columns.keys() if col not in actual_columns]
+#
+#         if len(missing_columns) > 0:
+#             raise AppException(500, "请按模板上传")
+#
+#         head1 = df.head(1)
+#         head1data = head1.to_dict(orient='records')[0]
+#         print(head1data)
+#         if head1data['单位名称'] == '填写单位名称' and head1data['联系人'] == '填写单位联系人' and head1data['职务'] == '填写联系人职务' and \
+#                 head1data['粤政易手机号码'] == '填写联系人的粤政易注册手机号码':
+#             df = df.drop(index=0)
+#         else:
+#             raise AppException(500, "请按模板上传。")
+#
+#         # 检查前两行的字段长度
+#         for index, row in first_two_rows.iterrows():
+#             for col, max_length in expected_columns.items():
+#                 # if pd.isna(row[col]):
+#                 #     return f"第{index + 1}行的'{col}'字段不能为空。"
+#                 if pd.notna(row[col]) and len(str(row[col])) > max_length:
+#                     raise AppException(500, f"第{index + 1}行的'{col}'字段长度超过{max_length}字符。")
+#
+#         data = df.to_dict(orient='records')
+#         # print(data)
+#         infos = []
+#         for info in data:
+#             if pd.isna(info['单位名称']) and pd.isna(info['联系人']) and pd.isna(info['粤政易手机号码']):
+#                 continue
+#             if pd.isna(info['单位名称']) or pd.isna(info['联系人']) or pd.isna(info['粤政易手机号码']):
+#                 return "单位名称、联系人、粤政易手机号码为必填"
+#             if pd.isna(info['职务']):
+#                 info['职务'] = None
+#             infos.append(info)
+#
+#         # 创建新的预案记录
+#         for contact in infos:
+#             unit_id = db_dept.get_dept_id_by_name(db, contact['单位名称'])
+#             if unit_id == '':
+#                 raise AppException(500, "单位名称不正确")
+#
+#             # 删除之前同一个部门的人员
+#             db.query(EmergencyContactInfo).filter(
+#                 and_(EmergencyContactInfo.del_flag == "0", EmergencyContactInfo.unit_id == unit_id, )).update(
+#                 {"del_flag": "2"})
+#
+#             new_contact = EmergencyContactInfo(
+#                 unit_id=unit_id,
+#                 unit_name=contact['单位名称'],
+#                 contact_name=contact['联系人'],
+#                 position=contact['职务'],
+#                 yue_gov_ease_phone=contact['粤政易手机号码'],
+#                 create_by=user_id
+#             )
+#
+#             # 添加到数据库会话
+#             db.add(new_contact)
+#         # 提交
+#         db.commit()
+#
+#         # 返回创建成功的响应
+#         return {
+#             "code": 200,
+#             "msg": "创建成功",
+#             "data": None
+#         }
+#
+#     except AppException as e:
+#         return {
+#             "code": 500,
+#             "msg": e.msg
+#         }
+#
+#     except Exception as e:
+#         traceback.print_exc()
+#         # 处理异常
+#         raise HTTPException(status_code=500, detail=str(e))

+ 258 - 0
routers/api/ThreeProofingResponsible/type_data.py

@@ -0,0 +1,258 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from fastapi import APIRouter, Request, Depends, Query, HTTPException, status
+from common.security import valid_access_token
+from fastapi.responses import JSONResponse
+from sqlalchemy.orm import Session
+from sqlalchemy import and_, or_
+from sqlalchemy.sql import func
+from common.auth_user import *
+from pydantic import BaseModel
+from database import get_db
+from typing import List
+from models import *
+from utils import *
+from utils.ry_system_util import *
+from utils.three_proofing_responsible_util import *
+import traceback
+import json
+
+router = APIRouter()
+
+@router.get('/list')
+async def get_dict_data_by_type(
+    type_parent_id: str = Query(None, max_length=100),
+    pageNum: int = Query(1, gt=0),
+    pageSize: int = Query(10, gt=0),
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        # 根据 dict_type 查询字典数据
+        # dict_data = db.query(SysDictData).filter_by(dict_type=dictType).all()
+        query = db.query(ThreeProofingResponsibleType)
+
+        query = query.filter(ThreeProofingResponsibleType.del_flag != '2')
+        # 添加查询条件
+        if type_parent_id:
+            query = query.filter(ThreeProofingResponsibleType.type_parent_id==type_parent_id)
+
+        # 计算总记录数
+        total_count = query.count()
+
+        # 计算分页
+        offset = (pageNum - 1) * pageSize
+        dict_data = query.offset(offset).limit(pageSize).all()
+
+        # 转换为字典
+        dict_data_list = []
+        for d in dict_data:
+            dict_data = get_dict_data_info(db, 'three_proofing', d.type_parent_id)
+            dict_data_list.append({
+                "id": d.id,
+                "type_parent_id": d.type_parent_id,
+                "type_parent":dict_data.dict_data.dict_label,
+                "type_name": d.type_name,
+                "order_num": d.order_num,
+                "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else ''
+            })
+        # 构建返回结果
+        result = {
+            "total": total_count,
+            "rows": dict_data_list,
+            "code": 200,
+            "msg": "查询成功"
+        }
+        return result
+
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
+
+@router.get('/info/{id}')
+async def get_dict_data_by_type(
+    id: str ,
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        # 根据 dict_type 查询字典数据
+        # dict_data = db.query(SysDictData).filter_by(dict_type=dictType).all()
+        query = db.query(ThreeProofingResponsibleType)
+
+        # 添加查询条件
+        # if dictType:
+        query = query.filter(ThreeProofingResponsibleType.id==id)
+        query = query.filter(ThreeProofingResponsibleType.del_flag != '2')
+
+
+        d = query.first()
+        dict_data = get_dict_data_info(db, 'three_proofing', d.type_parent_id)
+        # 转换为字典
+        dict_data_list = {
+                "id": d.id,
+                "type_parent_id": d.type_parent_id,
+                "type_parent":dict_data.dict_data.dict_label,
+                "type_name": d.type_name,
+                "order_num": d.order_num,
+                "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else ''
+            }
+
+        # 构建返回结果
+        result = {
+            "data": dict_data_list,
+            "code": 200,
+            "msg": "查询成功"
+        }
+        return result
+
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
+
+
+@router.post('/create')
+async def create_dict_data(
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        # 创建一个新的 SysDictData 实例
+        new_dict_data = ThreeProofingResponsibleType(
+            type_parent_id=body['type_parent_id'],
+            type_name=body['type_name'],
+            order_num=body['order_num'],
+            create_by=user_id
+        )
+
+        # 添加到会话并提交
+        db.add(new_dict_data)
+        db.commit()
+        db.refresh(new_dict_data)  # 可选,如果需要刷新实例状态
+
+        # 构建返回结果
+        result = {
+            "code": 200,
+            "msg": "操作成功",
+            "data": None
+        }
+        return result
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
+
+@router.put("/update")
+async def updata_dict_type(
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        # 从请求数据创建一个新的 SysDictType 实例
+        query = db.query(ThreeProofingResponsibleType)
+        query = query.filter(ThreeProofingResponsibleType.id == body['id'])
+        query = query.filter(ThreeProofingResponsibleType.del_flag != '2')
+
+        # query = db.query(SysDictData).filter(SysDictData.dict_code == form_data.dictCode)
+        # query = db.query(SysDictData).filter(SysDictData.del_flag != '2')
+
+        dict_data = query.first()
+        if not dict_data:
+            return JSONResponse(status_code=404, content={
+                'errcode': 404,
+                'errmsg': 'type不存在'
+            })
+        dict_data.type_parent_id=body['type_parent_id']
+        dict_data.type_name = body['type_name']
+        dict_data.order_num = body['order_num']
+        dict_data.update_by = user_id
+        # 添加到数据库会话并提交
+        db.commit()
+        # db.refresh(new_dict_type)  # 可选,如果需要刷新实例状态
+
+        # 构建并返回响应
+        return {
+            "code": 200,
+            "msg": "操作成功",
+            "data": None  # 根据你的响应示例,data 为 null
+        }
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+@router.delete("/delete/{id}")  # 使用 ID 来标识要删除的接口
+async def delete_dict_data(
+    id: str,
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        # 从数据库中获取要删除的 OneShareApiEntity 实例
+        query = db.query(ThreeProofingResponsibleType)
+        query = query.filter(ThreeProofingResponsibleType.id == id)
+        query = query.filter(ThreeProofingResponsibleType.del_flag != '2')
+        dict_data = query.first()
+        # dict_data = db.query(SysDictData).filter(SysDictData.dict_code == dictCode and SysDictData.del_flag != '2').first()
+
+        if not dict_data:
+            return JSONResponse(status_code=404, content={
+                'errcode': 404,
+                'errmsg': 'type不存在'
+            })
+        dict_data.del_flag = '2'
+        # 删除实例
+        # db.delete(api)
+        db.commit()
+
+        # 构建并返回响应
+        return {
+            "code": 200,
+            "msg": "操作成功",
+            "data": None
+        }
+    except Exception as e:
+
+        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
+
+@router.delete("/data/{dictCode}")  # 使用 ID 来标识要删除的接口
+async def delete_dict_data(
+    dictCode: str,
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        # 从数据库中获取要删除的 OneShareApiEntity 实例
+        query = db.query(ThreeProofingResponsibleType)
+        query = query.filter(ThreeProofingResponsibleType.del_flag != '2')
+        dictCodeList = dictCode.split(',')
+        query = query.filter(ThreeProofingResponsibleType.id.in_(dictCodeList))
+        dict_data = query.all()
+        # dict_data = db.query(SysDictData).filter(SysDictData.dict_code == dictCode and SysDictData.del_flag != '2').first()
+
+        if not dict_data:
+            return JSONResponse(content={"msg":"type不存在"},status_code=404)
+            # detail = "dict不存在"
+            # raise HTTPException(status_code=404, detail="dict不存在")
+        for dict in dict_data:
+            dict.del_flag = '2'
+        # 删除实例
+        # db.delete(api)
+        db.commit()
+
+        # 构建并返回响应
+        return {
+            "code": 200,
+            "msg": "操作成功",
+            "data": None
+        }
+    except Exception as e:
+        # 处理异常
+        traceback.print_exc()
+        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))

+ 2 - 0
routers/api/__init__.py

@@ -31,6 +31,7 @@ from . import companyManagement
 from . import resourceProvison
 from . import yst
 from . import comprehensive_search
+from . import ThreeProofingResponsible
 from extensions import logger
 from routers.prod_api import system
 from routers.prod_api import auth
@@ -85,5 +86,6 @@ router.include_router(companyManagement.router, prefix="/companyManagement", tag
 router.include_router(yst.router, prefix="/yst", tags=["粤商通"])
 
 router.include_router(comprehensive_search.router, prefix="/comprehensive/search", tags=["全局搜索"])
+router.include_router(ThreeProofingResponsible.router, prefix="/ThreeProofingResponsible", tags=["三防责任人管理"])
 
 

+ 46 - 3
routers/prod_api/system/user/__init__.py

@@ -291,6 +291,50 @@ async def deptTree(request: Request,db: Session = Depends(get_db), user_id: int
 
 
 @router.get('/avcon/deptTree')
+async def deptTree(request: Request,label: str = Query(None, description='部门名称'),db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
+    def build_dept_tree(depts, parent_dept):
+        dept_tree = []
+        for dept_info in depts:
+            dept = {
+                "id": dept_info.dept_id,
+                "label": dept_info.dept_name,
+                # "parentId": dept_info.parent_id,
+                # "weight": dept_info.order_num
+            }
+            # print(dept_info.dept_id)
+            children = parent_id_get_dept_info(db, dept_info.dept_id)
+            if len(children) > 0:
+                children_depts = build_dept_tree(children, dept)
+                dept["children"] = children_depts
+                # userlist=dept_id_get_user_info(db,dept_info.dept_id)
+                # if userlist:
+                #     for user_info in userlist:
+                #         dept["children"].append({"id":user_info.user_id,"label":user_info.nick_name,"isLeaf":True})
+            else:
+                dept['isLeaf']=True
+                # userlist = dept_id_get_user_info(db, dept_info.dept_id)
+                # if userlist:
+                #     for user_info in userlist:
+                #         dept["children"].append({"id": user_info.user_id, "label": user_info.nick_name, "isLeaf": True})
+            dept_tree.append(dept)
+        return dept_tree
+
+    # result = []
+    if label:
+        query = db.query(SysDept)
+        query = query.filter(SysDept.del_flag != '2')
+        query = query.filter(SysDept.dept_name.like(f'%{label}%'))
+        # for dept_info in :
+        result=build_dept_tree(query.all(), None)
+    else:
+        result=build_dept_tree(parent_id_get_dept_info(db, 0),None)
+    return {
+        "code": 200,
+        "msg": "操作成功",
+        "data": result
+    }
+
+@router.get('/avcon/deptUserTree')
 async def deptTree(request: Request,label: str = Query(None, description='部门名称'),db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
     def build_dept_tree(depts, parent_dept):
         dept_tree = []
@@ -309,13 +353,13 @@ async def deptTree(request: Request,label: str = Query(None, description='部门
                 userlist=dept_id_get_user_info(db,dept_info.dept_id)
                 if userlist:
                     for user_info in userlist:
-                        dept["children"].append({"id":user_info.user_id,"label":user_info.nick_name,"isLeaf":True})
+                        dept["children"].append({"id":user_info.user_id,"label":user_info.nick_name,"isUser":True,"isLeaf":True})
             else:
                 dept['isLeaf']=True
                 userlist = dept_id_get_user_info(db, dept_info.dept_id)
                 if userlist:
                     for user_info in userlist:
-                        dept["children"].append({"id": user_info.user_id, "label": user_info.nick_name, "isLeaf": True})
+                        dept["children"].append({"id": user_info.user_id, "label": user_info.nick_name,"isUser":True, "isLeaf": True})
             dept_tree.append(dept)
         return dept_tree
 
@@ -333,7 +377,6 @@ async def deptTree(request: Request,label: str = Query(None, description='部门
         "msg": "操作成功",
         "data": result
     }
-
 @router.get('/avcon/list/dept/{dept_id}')
 async def get_dept_user_list(
     # request: Request,

+ 28 - 0
utils/three_proofing_responsible_util.py

@@ -0,0 +1,28 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from models import *
+
+def get_person_info_by_id(db,id):
+    query = db.query(ThreeProofingResponsiblePerson)
+    query = query.filter_by(id = id,del_flag = '0')
+    return query.first()
+def get_type_info_by_id(db,id):
+    query = db.query(ThreeProofingResponsibleType)
+    query = query.filter_by(id = id,del_flag = '0')
+    return query.first()
+def get_type_parent_id_by_type_id(db,type_id):
+    query = db.query(ThreeProofingResponsiblePersonType)
+    query = query.filter_by(type_id = type_id,del_flag = '0')
+    return query.first().type_parent_id
+def get_person_type_by_person_id(db,person_id):
+    query = db.query(ThreeProofingResponsiblePersonType)
+    query = query.filter_by(person_id = person_id,del_flag = '0')
+    return query.all()
+def get_person_list_by_type_parent_id(db,type_parent_id):
+    query = db.query(ThreeProofingResponsiblePersonType)
+    query = query.filter_by(type_parent_id = type_parent_id,del_flag = '0')
+    return [info.person_id for info in query.all()]
+def get_type_parent_id_by_person_id(db,person_id):
+    query = db.query(ThreeProofingResponsiblePersonType)
+    query = query.filter_by(person_id=person_id, del_flag='0')
+    return [info.type_parent_id for info in query.all()]