浏览代码

Merge branch 'master' of https://gogs.tjp.com.cn/maoming/python-fastapi-mm-zhcs-yj-api

baoyubo 10 月之前
父节点
当前提交
8b09edd0df

+ 20 - 1
common/db/db_emergency_plan.py

@@ -13,4 +13,23 @@ def get_plan_name_by_id(db: Session, plan_id: int) -> str:
     if row is not None:
         return row.plan_name
     
-    return ''
+    return ''
+
+def get_plan_file_list(db: Session, plan_number: str):
+    row = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_number).first()
+    if row is None:
+        return []
+
+    plan_id = row.plan_id
+    file_query = db.query(EmergencyFile)
+    file_query = file_query.filter(EmergencyFile.del_flag != '2')
+    file_query = file_query.filter(EmergencyFile.from_scenario == 'emergencyPlans_plan')
+    file_query = file_query.filter(EmergencyFile.foreign_key == plan_id)
+    files = file_query.all()
+    result = [{
+        "uid": file.file_id,
+        "status": file.status,
+        "name": file.file_name_desc,
+        "url":  file.file_name
+    } for file in files]
+    return result

+ 7 - 2
common/db/db_event_management.py

@@ -10,6 +10,7 @@ from utils import *
 import random
 from . import db_user
 import copy
+from sqlalchemy import text, exists, and_, or_, not_
 
 EVENT_TRACK_LIST = [
         {"title": "事件登记", "event_status": "0", "tracking_time": "", "event_level": "", "recorded_by": ""}, 
@@ -77,8 +78,12 @@ def get_summary_file_list(db: Session, event_id: int):
     data = [
         {
             "file_name": row.file_name,
-            "url": "/api/event_management/event/download_file?file_id="+str(row.id)+"&event_id="+str(row.event_id)
+            # "url": "/api/event_management/event/download_file?file_id="+str(row.id)+"&event_id="+str(row.event_id)
+            "url": row.storage_file_name
         }
         for row in rows
     ]
-    return data
+    return data
+
+def get_emergency_notify_count(db: Session, event_id: str):
+    return db.query(EventEmergencyNotify).filter(EventEmergencyNotify.event_id == event_id).count()

+ 10 - 10
models/event_base.py

@@ -8,28 +8,28 @@ class EventBase(Base):
     __tablename__ = 'event_base'
 
     id = Column(Integer, autoincrement=True, primary_key=True)
-    event_code = Column(String(50), nullable=False, comment='事件编号')
-    event_title = Column(String(255), nullable=False, comment='事件标题')
-    event_type = Column(String(100), nullable=False, comment='事件类型')
-    event_level = Column(String(50), comment='事件等级')
+    event_code = Column(String(50), default='', server_default='', nullable=False, comment='事件编号')
+    event_title = Column(String(255), default='', server_default='', nullable=False, comment='事件标题')
+    event_type = Column(String(100), default='', server_default='', nullable=False, comment='事件类型')
+    event_level = Column(String(50), default='', server_default='', comment='事件等级')
     event_status = Column(String(50), default='active', comment='事件状态')
     event_time = Column(DateTime, comment='事发时间')
     report_time = Column(DateTime, default=datetime.now, comment='上报时间')
     deaths = Column(Integer, default=0, comment='死亡人数')
     injuries = Column(Integer, default=0, comment='受伤人数')
     missing = Column(Integer, default=0, comment='失联人数')
-    event_source = Column(String(255), comment='事件来源')
-    address = Column(String(255), comment='事发地点')
-    longitude = Column(String(20), default='', comment='经度')
+    event_source = Column(String(255), default='', server_default='', comment='事件来源')
+    address = Column(String(255), default='', server_default='', comment='事发地点')
+    longitude = Column(String(20), default='', server_default='', comment='经度')
     latitude = Column(String(20), default='', comment='纬度')
     event_description = Column(Text, comment='事件概要')
     recorded_by = Column(Integer, nullable=False, comment='记录用户ID')
     del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
     contact = Column(String(50), comment='联系人')
     region_code = Column(String(50), comment='地区代码')
-    plan_id = Column(String(50), comment='匹配预案ID')
+    plan_id = Column(String(50), default='', server_default='', comment='匹配预案ID')
     casualties = Column(String(1), default='0', comment='伤亡情况上报(0未上报 1已上报)')
-    response_level = Column(String(2), default='', comment='响应等级')
+    response_level = Column(String(2), default='', server_default='', comment='响应等级')
 
     class Config:
         orm_mode = True
@@ -55,7 +55,7 @@ class EventFile(Base):
     id = Column(Integer, autoincrement=True, primary_key=True)
     event_id = Column(Integer, nullable=False, comment='事件ID')
     file_name = Column(String(255), nullable=False, comment='文件名称')
-    file_name_desc = Column(String(255), nullable=False, comment='文件名称原名')
+    storage_file_name = Column(String(255), nullable=False, comment='文件名称原名')
     file_path = Column(String(255), nullable=False, comment='文件存储路径')
     file_size = Column(String(50), comment='文件大小')
     foreign_key = Column(String(50), comment='文件外键 --技术字段')

+ 20 - 1
models/xxfb_base.py

@@ -19,6 +19,7 @@ class InfoPublishBase(Base):
     add_time = Column(DateTime, default=datetime.now, comment='录入时间')
     response_type = Column(Integer, default='0', server_default='0', comment='消息反馈方式')
     publish_time = Column(DateTime, default=datetime.now, comment='发布时间')
+    publish_type = Column(Integer, default='0', server_default='0', comment='发布类型')
     examine_by = Column(String, default='', server_default='', comment='审核人')
     publish_status = Column(Integer, default='0', server_default='0', comment='发布状态')
     examine_status = Column(Integer, default='0', server_default='0', comment='审批状态')
@@ -39,7 +40,7 @@ class InfoPublishResponses(Base):
     # 定义字段
     id = Column(Integer, autoincrement=True, primary_key=True)  # 主键
     publish_id = Column(Integer, default='0', server_default='0', comment='主表ID')
-    user_id = Column(Integer, default='0', server_default='0', comment='主表ID')
+    user_id = Column(Integer, default='0', server_default='0', comment='账号ID')
     user_name = Column(String, default='', server_default='', comment='账号名称')
     nick_name = Column(String, default='', server_default='', comment='用户姓名')
     dept_name = Column(String, default='', server_default='', comment='部门名称')
@@ -48,6 +49,7 @@ class InfoPublishResponses(Base):
     sent_time = Column(DateTime, default=datetime.now, comment='发送时间')
     response_type = Column(Integer, default='0', server_default='0', comment='反馈方式')
     response_time = Column(DateTime, default=datetime.now, comment='反馈时间')
+    publish_channel = Column(String, default='', server_default='', comment='推送渠道')
 
     class Config:
         orm_mode = True
@@ -71,5 +73,22 @@ class InfoPublishFile(Base):
     create_by = Column(Integer, default=None, comment='创建者')
     del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)') #更新预案信息的时候 先将原有的进行备注删除
 
+    class Config:
+        orm_mode = True
+
+
+class InfoPublishExamine(Base):
+    __tablename__ = 'infopublish_examine'
+
+    id = Column(Integer, autoincrement=True, primary_key=True)
+    publish_id = Column(Integer, default='0', server_default='0', comment='主表ID')
+    examine_type = Column(Integer, default='0', server_default='0', comment='审核类型 0 草稿 10 提交 20 领导审批 30 重新提交')
+    examine_sub_type = Column(Integer, default='0', server_default='0', comment='审核类型 0 草稿 10 提交 20 待审批 21 审批通过 22 审批不通过 30 重新提交')
+    examine_time = Column(DateTime, default=datetime.now, comment='审批时间')
+    user_id = Column(Integer, default='0', server_default='0', comment='主表ID')
+    user_name = Column(String, default='', server_default='', comment='审批账号')
+    nick_name = Column(String, default='', server_default='', comment='审批姓名')
+    del_flag = Column(String, default='0', comment='删除标志(0代表存在 2代表删除)')
+
     class Config:
         orm_mode = True

+ 2 - 2
routers/api/emergencyPlans/__init__.py

@@ -282,7 +282,7 @@ async def create_emergency_plan(
         publish_date = form_data.publishDate  # 如果没有提供发布日期,则使用当前时间
         organizing_unit = form_data.organizingUnit  # 使用用户位置作为编制单位
         document_number = form_data.document
-        event_type = form.event_type
+        event_type = form_data.event_type
 
         # 创建新的预案记录
         new_plan = EmergencyPlan(
@@ -388,7 +388,7 @@ async def delete_emergency_plans(
         # 提取请求数据
         query = db.query(EmergencyPlan)
         query = query.filter(EmergencyPlan.del_flag != '2')
-        query = query.filter(EmergencyPlan.plan_id.in_(planUids))
+        query = query.filter(EmergencyPlan.plan_number.in_(planUids))
         plans = query.all()
         if not plans:
             detail = "预案不存在"

+ 5 - 0
routers/api/emergencyPlans/event.py

@@ -48,6 +48,11 @@ async def unit_task(
         }
         for row in rows
     ]
+    if len(rows) == 0:
+        return {
+            "code": 500,
+            "msg": "暂无该预案的应急预单位职责信息,请联系管理员配置。"
+        }
 
     # 返回结果
     return {

+ 149 - 17
routers/api/eventManagement/event.py

@@ -1,4 +1,4 @@
-from fastapi import APIRouter, Request, Depends, HTTPException, Query
+from fastapi import APIRouter, Request, Depends, HTTPException, Query, BackgroundTasks
 from sqlalchemy.exc import IntegrityError
 from fastapi.responses import HTMLResponse, FileResponse
 from fastapi.responses import JSONResponse
@@ -21,6 +21,7 @@ from common.db import db_dict
 from urllib.parse import quote
 import base64
 from config import settings
+from extensions import logger
 
 router = APIRouter()
 
@@ -253,15 +254,23 @@ async def get_event_detail(
                     "latitude": row.latitude,
                     "longitude": row.longitude,
                     "address": row.address,
+                    
+                    # 关联预案
                     "plan_id": row.plan_id,
                     "plan_name": db_emergency_plan.get_plan_name_by_id(db, row.plan_id),
+                    "plan_files": db_emergency_plan.get_plan_file_list(db, row.plan_id),
+
                     "del_flag": row.del_flag,
+
+                    # 总结报告
                     "summary_file": db_event_management.get_summary_file_list(db, row.id),
 
                     # 事件跟踪
                     "event_status_tracks": db_event_management.get_event_status_track(db, row.id),
                     # 事件等级
-                    "event_level_tracks": db_event_management.get_event_level_track(db, row.id)
+                    "event_level_tracks": db_event_management.get_event_level_track(db, row.id),
+                    # 预案通知下发
+                    "emergency_notify_count": db_event_management.get_emergency_notify_count(db, row.event_code)
                 }
             }
         else:
@@ -353,6 +362,24 @@ async def close_event(
             db.add(event_tracking)
             db.commit()
 
+        if 'fileName' in body:
+            event_files = [
+                EventFile(
+                    event_id=event_base.id,
+                    file_name=fileName["name"],  # 使用 fileName["name"] 作为文件名
+                    file_path=f'/data/upload/mergefile/{fileName["url"]}',
+                    storage_file_name=fileName["url"],
+                    foreign_key=event_base.event_code,
+                    from_scenario="event_summary_file",
+                    update_time=datetime.now(),
+                    create_time=datetime.now(),
+                    del_flag='0'
+                )
+                for fileName in body['fileNames']  # body['fileNames'] 现在是一个包含对象的数组,每个对象都有 'name' 和 'url' 属性
+            ]
+            db.add_all(event_files)
+            db.commit()
+
         return {
             "code": 200,
             "msg": '关闭事件成功'
@@ -472,6 +499,36 @@ async def list_registered(
         "data": data
     }
 
+# 列出有个不分页的查询 不是临时事件、未结束、未关闭的事件列表接口
+@router.post("/list_active")
+async def list_active(
+    request: Request,  
+    db: Session = Depends(get_db)
+):
+    where = and_(EventBase.del_flag == '0', EventBase.event_title != '', EventBase.event_status.in_(['0', '1']))
+    rows = db.query(EventBase).filter(where).order_by(EventBase.event_time.desc()).all()
+    data = [
+        {
+            "event_id": row.event_code,
+            "event_title": row.event_title,
+            "event_type": row.event_type,
+            "event_level": row.event_level,
+            "event_status": row.event_status,
+            "latitude": row.latitude,
+            "longitude": row.longitude,
+            "address": row.address,
+            "event_time": get_datetime_str(row.event_time)
+        }
+        for row in rows
+    ]
+
+    # 返回结果
+    return {
+        "code": 200,
+        "msg": "查询成功",
+        "data": data
+    }
+
 # 将临时事件绑定成正式事件
 @router.post("/update_event_id")
 async def update_event_id(
@@ -574,8 +631,24 @@ async def martch_emergency_plan(
         }
 
     event_type = row.event_type
-    plan_id = ""
-    response_level = ""
+    plan_id = row.plan_id
+    response_level = row.response_level
+
+    # 如果已事件已匹配预案,直接返回
+    if plan_id != '' and response_level != '':
+        row = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).filter(EmergencyPlan.del_flag == "0").first()
+        if row is not None:
+            plan_name = row.plan_name
+            return {
+                "code": 200,
+                "msg": "匹配预案成功",
+                "data": {
+                    "eventId": eventId,
+                    "plan_id": plan_id,
+                    "plan_name": plan_name,
+                    "response_level": response_level
+                }
+            }
 
     '''
     匹配到事件类型
@@ -621,6 +694,12 @@ async def lauch_emergency_plan(
             "msg": "事件编号不存在"
         }
     
+    if event_row.plan_id != '' and event_row.response_level != '':
+        return {
+            "code": 500,
+            "msg": "预案已启动"
+        }
+    
     plan_row = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).first()
     if plan_row is None:
         return {
@@ -645,10 +724,11 @@ async def lauch_emergency_plan(
 @router.post("/send_emergency_plan_task_by_yzy")
 async def send_emergency_plan_task_by_yzy(
     request: Request,  
+    background_tasks: BackgroundTasks, 
     body = Depends(remove_xss_json), 
     db: Session = Depends(get_db)
 ):
-    time.sleep(3)
+    time.sleep(1.0)
     
     eventId = body['eventId']
     
@@ -659,6 +739,13 @@ async def send_emergency_plan_task_by_yzy(
             "msg": "事件编号不存在"
         }
     
+    c1 = db.query(EventEmergencyNotify).filter(EventEmergencyNotify.event_id == eventId).count()
+    if c1 > 0:
+        return {
+            "code": 500,
+            "msg": "预案任务已下发"
+        }
+    
     event_info = get_model_dict(event_row)
     plan_id = event_info['plan_id']
     response_level = db_dict.get_dict_label(db, "response_level", event_info['response_level'])
@@ -679,12 +766,19 @@ async def send_emergency_plan_task_by_yzy(
     plan_info = get_model_dict(row)
     plan_name = plan_info['plan_name']
 
+    send_queue = []
     rows = db.query(EmergencyUnit).filter(EmergencyUnit.plan_id == plan_id).order_by(EmergencyUnit.dept_order.asc()).all()
-    for row in rows:
+    if len(rows) == 0:
+        return {
+            "code": 500,
+            "msg": "该预案没有相关通知人员"
+        }
 
+    for row in rows:
         dept_id = row.dept_id
         dept_name = row.dept_name
 
+        # 已下发的过滤掉,避免重发
         row_exists = db.query(EventEmergencyNotify).filter(and_(EventEmergencyNotify.plan_id == plan_id, EventEmergencyNotify.event_id == eventId, EventEmergencyNotify.dept_id == dept_id)).first()
         if row_exists is not None:
             continue
@@ -697,7 +791,11 @@ async def send_emergency_plan_task_by_yzy(
         nick_name = contact_row.contact_name
         
         yzy_user_row = db.query(YzyOrgUserEntity).filter(YzyOrgUserEntity.telephonenumber == yzy_account).first()
-        yzy_user_id = yzy_user_row.userid
+        if yzy_user_row is None:
+            logger.info("粤政易人员ID不存在", yzy_account)
+            yzy_user_id = ""
+        else:
+            yzy_user_id = yzy_user_row.userid
 
 
         # 通过通讯录匹配相关负责人
@@ -742,21 +840,37 @@ async def send_emergency_plan_task_by_yzy(
         redirect_url = "{}/#/leader/index".format(settings.YJXP_WEB_ROOT_PATH) # 业务页面
         detail_url = YzyApi.format_redirect_url(redirect_url)
 
-        try:
-            resp = YzyApi.send_textcard_message([yzy_user_id], "预案响应消息", description, detail_url)
-            if resp['errcode'] == 0:
-                event_emergency_notify.sent_status = 1 # 发送成功
-            else:
-                event_emergency_notify.sent_status = 9 # 发送失败
-            db.commit()
-
-        except Exception:
-            pass
+        send_queue.append({
+            id: event_emergency_notify.id,
+            yzy_user_id: yzy_user_id,
+            description: description,
+            detail_url: detail_url
+        })
+    
+    background_tasks.add_task(async_send_yzy_msg, db, send_queue)
 
     return {
         "code": 200,
         "msg": "预案任务下发成功"
     }
+
+def async_send_yzy_msg(db: Session, queue: dict):
+    for i in queue:
+        event_emergency_notify = db.query(EventEmergencyNotify).filter(EventEmergencyNotify.id == i['id']).first()
+        if event_emergency_notify is not None and event_emergency_notify.sent_status == 0:
+            yzy_user_id = i['yzy_user_id']
+            description = i['description']
+            detail_url = i['detail_url']
+            try:
+                resp = YzyApi.send_textcard_message([yzy_user_id], "预案响应消息", description, detail_url)
+                if resp['errcode'] == 0:
+                    event_emergency_notify.sent_status = 1 # 发送成功
+                else:
+                    event_emergency_notify.sent_status = 9 # 发送失败
+                db.commit()
+
+            except Exception:
+                pass
         
 # 获取预案通知
 @router.post("/emergency_plan_task_list")
@@ -831,6 +945,24 @@ async def upload_casualties(
     db.query(EventBase).filter(EventBase.event_code == eventId).update(body)
     db.commit()
 
+    if 'fileNames' in body:
+        event_files = [
+            EventFile(
+                event_id=event_base.id,
+                file_name=fileName["name"],  # 使用 fileName["name"] 作为文件名
+                file_path=f'/data/upload/mergefile/{fileName["url"]}',
+                storage_file_name=fileName["url"],
+                foreign_key=event_base.event_code,
+                from_scenario="event_summary_file",
+                update_time=datetime.now(),
+                create_time=datetime.now(),
+                del_flag='0'
+            )
+            for fileName in body['fileNames']  # body['fileNames'] 现在是一个包含对象的数组,每个对象都有 'name' 和 'url' 属性
+        ]
+        db.add_all(event_files)
+        db.commit()
+
     return {
         "code": 200,
         "msg": "保存事件伤亡情况成功"

+ 227 - 0
routers/api/infoPublish/back.py

@@ -27,6 +27,93 @@ from config import settings
 
 router = APIRouter()
 
+# 信息发布创建
+@router.post('/create')
+async def create_emergency_plan(
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        dept_id = 0
+        dept_name = ''
+
+        user_row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
+        dept_id = user_row.dept_id
+
+        dept_row = db.query(SysDept).filter(SysDept.dept_id == dept_id).first()
+        dept_name = dept_row.dept_name
+
+        new_publish = InfoPublishBase(
+            title = body['title'],
+            publish_group = body['publish_group'],
+            template_id = body['template_id'],
+            content = body['content'],
+            recorded_by = user_id,
+            del_flag = '0',
+            dept_id = dept_id,
+            dept_name = dept_name,
+            add_time = datetime.now(),
+            response_type = body['response_type'],
+            publish_time = body['publish_time'],
+            examine_by = body['examine_by'],
+            publish_status = 0,
+            examine_status = 0,
+            publish_channel = body['publish_channel'],
+            user_count = body['user_count'],
+            user_ok_count = 0,
+            user_err_count = 0,
+            user_sending_count = 0
+        )
+        db.add(new_publish)
+        db.commit()
+        db.refresh(new_publish)
+        new_publish_id = new_publish.id
+
+        # 发送人员
+        for u in body['users']:
+            user_id = u['user_id']
+
+            user_row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
+            dept_id = user_row.dept_id
+
+            dept_row = db.query(SysDept).filter(SysDept.dept_id == dept_id).first()
+            dept_name = dept_row.dept_name
+            
+            new_resp = InfoPublishResponses(
+                publish_id = new_publish_id,
+                user_id = user_id,
+                user_name = user_row.user_name,
+                nick_name = user_row.nick_name,
+                dept_name = dept_row.dept_name,
+                sent_status = 0,
+                response_type = body['response_type']
+            )
+            db.add(new_resp)
+            db.commit()
+        
+        # 附件
+        if 'attachs' in body:
+            for n in body['attachs']:
+                pass
+        
+        # 审批附件
+        if 'examine_attachs' in body:
+            for n in body['examine_attachs']:
+                pass
+        
+        return {
+            "code": 200,
+            "msg": "信息创建成功",
+            "data": new_publish_id
+        }
+
+    except Exception as e:
+        traceback.print_exc()
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+# 信息发布分页查询
 @router.get('/list')
 async def get_publish_list(
     publish_group: str = Query('', description='发布单位'),
@@ -115,3 +202,143 @@ async def get_publish_list(
         # 处理异常
         traceback.print_exc()
         raise HTTPException(status_code=500, detail=str(e))
+
+# 信息发布查看
+@router.get('/edit')
+async def get_edit_info(
+    request: Request, 
+    info_id: str = Query(None, description='信息ID'),
+    db: Session = Depends(get_db)):
+
+    row = db.query(InfoPublishBase).filter(InfoPublishBase.id == info_id).first()
+    data = get_model_dict(row)
+    data['add_time'] = get_datetime_str(data['add_time'])
+    data['publish_time'] = get_datetime_str(data['publish_time'])
+
+    data["examines"] = []
+    rows = db.query(InfoPublishBase).filter(InfoPublishExamine.publish_id == info_id).filter(InfoPublishExamine.del_flag == '0').all()
+    for row in rows:
+        data["examines"].append({
+            "examine_type": row.examine_type,
+            "examine_sub_type": row.examine_sub_type,
+            "content": row.content,
+            "examine_time": get_datetime_str(row.examine_time),
+            "user_id": row.user_id,
+            "user_name": row.user_name,
+            "nick_name": row.nick_name
+        })
+    return {
+        "code": 200,
+        "msg": "查询成功",
+        "data": data
+    }
+
+# 信息发布编辑保存
+@router.post('/edit')
+async def post_edit_info(
+    request: Request, 
+    body = Depends(remove_xss_json), 
+    db: Session = Depends(get_db),
+    user_id = Depends(valid_access_token)):
+
+    try:
+        id = body['id']
+        remove_req_param(body, 'info_id')
+
+        examines = body['examines']
+        remove_req_param(body, 'examines')
+
+        body['recorded_by'] = user_id
+
+        db.query(InfoPublishBase).filter(InfoPublishBase.id == id).update(body)
+        db.commit()
+
+        return {
+            "code": 200,
+            "msg": "保存信息成功"
+        }
+
+    except Exception as e:
+        # 处理异常
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=str(e))
+
+# 信息发布提交审核
+@router.post('/examine')
+async def post_examine_info(
+    request: Request, 
+    body = Depends(remove_xss_json), 
+    db: Session = Depends(get_db),
+    user_id = Depends(valid_access_token)):
+
+    user_row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
+
+    new_examine = InfoPublishExamine(
+        pubish_id = body['info_id'],
+        examine_type = body['examine_type'],
+        examine_sub_type = body['examine_sub_type'],
+        content = body['content'],
+        examine_time = datetime.now(),
+        user_id = user_id,
+        user_name = user_row.user_name,
+        nick_name = user_row.nick_name
+    )
+    
+    db.add(new_examine)
+    db.commit()
+
+    return {
+        "code": 200,
+        "msg": "保存审批记录成功"
+    }
+
+# 信息发布查看发送列表
+@router.get("send_list")
+async def get_send_list(
+    info_id: str = Query('', description='信息ID'),
+    keywords: str = Query('', description='关键字'),
+    sort_by: str = Query('', description='排序字段'),
+    sort_order: str = Query("asc", description='排序方式'),
+    page: int = Query(1, gt=0, description='页码'),
+    page_size: int = Query(10, gt=0, description='pageSize'),
+    db: Session = Depends(get_db)
+):
+    try:
+        # 应用查询条件
+        where = ()
+        where = and_(where, InfoPublishResponses.publish_id == info_id)
+
+        # 计算总条目数
+        q = db.query(func.count(InfoPublishResponses.id))
+        q = q.filter(where)
+        total = q.scalar()
+        
+        # 执行分页查询
+        q = db.query(InfoPublishResponses)
+        q = q.filter(where)
+        rows = q.order_by(InfoPublishResponses.id.desc()).offset((page - 1) * page_size).limit(page_size).all()
+
+        data = []
+        for row in rows:
+            data.append({
+                "user_id": row.user_id,
+                "user_name": row.user_name,
+                "nick_name": row.nick_name,
+                "dept_name": row.dept_name,
+                "sent_status": row.sent_status,
+                "sent_time": get_datetime_str(row.sent_time),
+                "response_type": row.response_type
+            })
+
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "查询成功",
+            "data": data,
+            "total": total
+        }
+
+    except Exception as e:
+        # 处理异常
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=str(e))

+ 2 - 2
routers/api/taskRegistration/__init__.py

@@ -76,7 +76,7 @@ async def select_tasks(
         pageSize: int = Query(10, gt=0, le=100, description="每页大小")):
     try:
         missing_event_code = db.query(EventBase).filter(EventBase.event_code == event_code).first()
-        print(missing_event_code)
+        # print(missing_event_code)
         if not missing_event_code:
             return Response(content="事件不存在", status_code=400)
 
@@ -98,7 +98,7 @@ async def select_tasks(
         if query.processing_status:
             data_query = data_query.filter(TaskRegistration.processing_status == query.processing_status)
 
-        print(TaskRegistration,sortBy)
+        # print(TaskRegistration,sortBy)
         if sortBy:
             if hasattr(TaskRegistration, sortBy):
                 print("xx")

+ 3 - 0
utils/StripTagsHTMLParser.py

@@ -7,6 +7,7 @@ from html.parser import HTMLParser
 from fastapi import Request
 import json
 from exceptions import XssException
+from extensions import logger
 
 class StripTagsHTMLParser(HTMLParser):
     data = ""
@@ -28,6 +29,8 @@ async def remove_xss_json(request: Request) -> dict:
         parser.feed(body)
         data = parser.getData()
         data = json.loads(data)
+        print("remove_xss_json>>>>>")
+        logger.info(data)
         return data
     except:
         raise XssException()

+ 4 - 0
utils/__init__.py

@@ -77,6 +77,10 @@ def get_req_param_optional(params: dict, name: str) -> any:
         return ''
     return params[name]
 
+def remove_req_param(params: dict, name: str) -> None:
+    if name in params:
+        del params[name]
+
 
 # 下发时间超过一个月的数据,删除字段“核处情况”、“身份证件号码”、“手机号码”
 def need_tuomin(xfsj: datetime):