Kaynağa Gözat

增加事件管理

libushang 9 ay önce
ebeveyn
işleme
4c242dd90d

+ 6 - 1
models/Incident_base.py

@@ -8,6 +8,7 @@ class Incident(Base):
     __tablename__ = 'incidents'
 
     id = Column(Integer, autoincrement=True, primary_key=True)
+    code = Column(String(50), nullable=False, comment='事件编号')
     title = Column(String(255), nullable=False, comment='事件标题')
     incident_type = Column(String(100), nullable=False, comment='事件类型')
     incident_level = Column(String(50), comment='事件等级')
@@ -24,6 +25,7 @@ class Incident(Base):
     summary = Column(Text, comment='事件概要')
     recorded_by = Column(String(50), comment='记录用户ID')
     del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    contact = Column(String(50), comment='联系人')
 
     class Config:
         orm_mode = True
@@ -54,4 +56,7 @@ class IncidentFile(Base):
     from_scenario = Column(String(50), comment='对应标识 --技术字段')
     create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
     update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='数据更新时间')
-    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')  # 更新预案信息的时候 先将原有的进行备注删除
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')  # 更新预案信息的时候 先将原有的进行备注删除
+
+    class Config:
+        orm_mode = True

+ 1 - 1
models/__init__.py

@@ -7,5 +7,5 @@ from .monitor_base import *
 from .oneshare_base import *
 from .ry_sys_base import *
 from .knowledge_base import *
-from .yjya import *
+from .yjya_base import *
 from .Incident_base import *

+ 4 - 1
routers/api/__init__.py

@@ -12,6 +12,8 @@ from . import upload_file
 from . import videoResource
 from . import Knowledge
 from . import emergencyPlans
+from . import incident
+
 router = APIRouter()
 
 router.include_router(login_router)
@@ -24,4 +26,5 @@ router.include_router(OneShareProxyHandler.router, prefix="/oneShare")
 router.include_router(upload_file.router, prefix="/file")
 router.include_router(videoResource.router, prefix="/videoResource")
 router.include_router(Knowledge.router, prefix="/knowledge")
-router.include_router(emergencyPlans.router, prefix="/emergency_plan")
+router.include_router(emergencyPlans.router, prefix="/emergency_plan")
+router.include_router(incident.router, prefix="/incident")

+ 174 - 0
routers/api/event/__init__.py

@@ -0,0 +1,174 @@
+from fastapi import APIRouter, Request, Depends, HTTPException, Query
+from sqlalchemy.exc import IntegrityError
+
+from fastapi.responses import JSONResponse
+from database import get_db
+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 *
+
+router = APIRouter()
+
+@router.post('/create')
+async def create_event(request: Request, db: Session = Depends(get_db), body = Depends(remove_xss_json)):
+    try:
+        # 验证必需的字段
+        required_fields = ['eventTitle', 'eventType', 'eventLevel', 'eventStatus', 'eventTime', 'reportTime',
+                           'deaths', 'injuries', "missing", "eventSource", "longitude", "latitude", "eventDescription", "address"]
+        missing_fields = [field for field in required_fields if field not in body]
+        print('missing_fields',missing_fields)
+        if missing_fields:
+            raise HTTPException(status_code=401, detail=f"Missing required fields: {', '.join(missing_fields)}")
+        
+        random_10_digit_number = random.randint(1000000000, 9999999999)
+        eventId = 'YJSJ' + str(random_10_digit_number)
+        username = "..."
+
+        # 创建 事件 实例
+        incident_base = Incident(
+            code = eventId,
+            title = body["eventTitle"],
+            incident_type = body["eventType"],
+            incident_level = body["eventLevel"],
+            status = body["eventStatus"],
+            occurrence_time = body["eventTime"],
+            report_time = body["reportTime"],
+            fatalities = body["deaths"],
+            injuries = body["injuries"],
+            missing = body["missing"],
+            source = body["eventSource"],
+            location = body["address"],
+            longitude = body["longitude"],
+            latitude = body["latitude"],
+            summary = body["eventDescription"],
+            recorded_by = username,
+            del_flag = "0"
+        )
+        db.add(incident_base)
+        return {
+            "code": 200,
+            "msg": "事件创建成功",
+            "status": "success",
+            "data": eventId
+        }
+        
+    except json.JSONDecodeError:
+        raise HTTPException(status_code=400, detail="Invalid JSON data")
+    except IntegrityError as e:
+        db.rollback()
+        raise HTTPException(status_code=409, detail=f"Database error: {str(e)}")
+    except Exception as e:
+        db.rollback()
+        print(e)
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+@router.get('/list')
+async def get_event_list(
+    eventType: str = Query(None, description='事件类型的字典键值'),
+    eventLevel: str = Query(None, description='事件等级的字典键值'),
+    eventStatus: str = Query(None, description='事件状态的字典键值'),
+    eventTime: str = Query(None, description='事发时间'),
+    regionCode: str = Query(None, description='行政区划代码'),
+    searchTerm: str = Query(None, description='根据事件标题或描述中的关键字进行模糊搜索'),
+    
+    sortBy: str = Query(None, description='排序字段'),
+    sortOrder: str = Query("asc", description='排序方式'),
+    page: int = Query(1, gt=0, description='页码'),
+    pageSize: int = Query(10, gt=0, description='pageSize'),
+    db: Session = Depends(get_db)
+):
+    try:
+        # 构建查询
+        query = db.query(Incident)
+        query = query.filter(Incident.del_flag != '2')
+        # 应用查询条件
+
+        # 计算总条目数
+        total_items = query.count()
+        # 执行分页查询
+        rows = query.offset((page - 1) * pageSize).limit(pageSize).all()
+        data = [
+            {
+                "eventId": row.code,
+                "eventTitle": row.title,
+                "eventType": row.type,
+                "eventLevel": row.level,
+                "eventStatus": row.status,
+                "latitude": row.latitude,
+                "longitude": row.longitude,
+                "address": row.location,
+                "eventTime": row.occurrence_time.strftime("%Y-%m-%d %H:%M")
+            }
+            for row in rows
+        ]
+
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data": data,
+            "total": total_items,
+            "currentPage": page,
+            "pageSize": pageSize,
+            "totalPages": (total_items + pageSize - 1) // pageSize
+        }
+
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+@router.get('/detail')
+async def get_event_detail(
+    request: Request, 
+    eventId: str, 
+    db: Session = Depends(get_db)):
+    
+    try: 
+        # 构建查询
+        query = db.query(Incident)
+        query = query.filter(Incident.code == eventId)
+
+        # 执行查询
+        row = query.first()
+        if row is not None:
+            eventTimeline = []
+            commandRecords = []
+            return {
+                "code": 500,
+                "msg": "查询失败",
+                "data": {
+                    "eventId": row.code,
+                    "eventTitle": row.title,
+                    "eventType": row.type,
+                    "eventLevel": row.level,
+                    "eventStatus": row.status,
+                    "eventSource": row.source,
+                    "eventTime": row.occurrence_time.strftime("%Y-%m-%d %H:%M"),
+                    "reportTime": row.report_time.strftime("%Y-%m-%d %H:%M"),
+                    "deaths": row.fatalities,
+                    "injuries": row.injuries,
+                    "missing": row.missing,
+                    "reportedBy": row.recorded_by,
+                    "contact": row.contact,
+                    "eventDescription": row.summary,
+                    "latitude": row.latitude,
+                    "longitude": row.longitude,
+                    "address": row.location,
+                    "eventTimeline": eventTimeline,
+                    "commandRecords": commandRecords
+                }
+            }
+        else:
+            return {
+                "code": 500,
+                "msg": "查询失败"
+            }
+
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))