libushang 8 mēneši atpakaļ
vecāks
revīzija
9ce80f3dfc

+ 4 - 2
jobs/yzy_job.py

@@ -17,7 +17,7 @@ def proc():
     if redis_lock(lock_key):
         logger.info(datetime.now())
 
-        redirect_url = "{}/#/leader/index".format(settings.YJXP_WEB_ROOT_PATH) # 业务页面
+        redirect_url = "{}/leader/index".format(settings.YJXP_WEB_ROOT_PATH) # 业务页面
         detail_url = YzyApi.format_redirect_url(redirect_url, "eb4kehgy6wj4qn0jhx1dk6")
         
         yzy_user_id = "eb4kehgy6wj4qn0jhx1dk6"  # 暂时写死梦梅的账号
@@ -37,7 +37,9 @@ def proc():
         }
 
         db = get_db_local()
-        YzyApi.add_to_msg_queue(db, data)
+
+        if settings.IS_STAGE:
+            YzyApi.add_to_msg_queue(db, data)
         db.close()
 
         redis_unlock(lock_key)

+ 2 - 1
models/__init__.py

@@ -17,4 +17,5 @@ from .rain_base import *
 from .geojson_base import *
 from .xxfb_base import *
 from .addressbook_base import *
-from .risk_management import *
+from .risk_management import *
+from .online_roll_call import *

+ 50 - 0
models/online_roll_call.py

@@ -0,0 +1,50 @@
+from sqlalchemy import Column, BigInteger, String, Text, DateTime, CHAR,Integer,Float
+from database import Base
+from datetime import datetime
+
+class OnlineRollCallBase(Base):
+    """
+    在线点名表
+    """
+    __tablename__ = 'online_roll_call_base'
+
+    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='ID')
+    call_type = Column(Integer, default=0, server_default='0', comment='点名类型 1 一键点名全市至区县 2 一键点名全市至镇街 3 分区/县点名')
+    recorded_by = Column(Integer, default=0, server_default='0', comment='记录用户ID')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    end_time = Column(DateTime, comment='结束时间')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    user_count = Column(Integer, default=0, server_default='0', comment='用户数')
+    ack_count = Column(Integer, default=0, server_default='0', comment='应答数')
+    unack_count = Column(Integer, default=0, server_default='0', comment='未应答数')
+    remark = Column(String, default='', server_default='', comment='备注')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
+
+    class Config:
+        orm_mode = True
+
+
+class OnlineRollCallDetail(Base):
+    """
+    在线点名明细表
+    """
+    __tablename__ = 'online_roll_call_detail'
+
+    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='ID')
+    pid = Column(BigInteger, default=0, server_default='0', comment='关联主表ID')
+    user_id = Column(Integer, default=0, server_default='0', comment='关联用户ID')
+    dept_id = Column(Integer, default=0, server_default='0', comment='关联用户所在部门ID')
+    nick_name = Column(String, default='', server_default='', comment='用户姓名')
+    dept_name = Column(String, default='', server_default='', comment='部门名称')
+    onduty_user = Column(String, default='', server_default='', comment='值班员(显示)')
+    onduty_leader = Column(String, default='', server_default='', comment='值班领导(显示)')
+    video_url = Column(String, default='', server_default='', comment='视频URL')
+    call_url = Column(String, default='', server_default='', comment='电话URL')
+    ack_status = Column(Integer, default=0, server_default='0', comment='应答状态 0 未应答 1 已应答')
+    act_time = Column(DateTime, comment='应答时间')
+    create_time = Column(DateTime, default=datetime.now, comment='数据创建时间')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    ack_type = Column(Integer, default=0, server_default='0', comment='应答方式 1 视频  2 电话')
+
+    class Config:
+        orm_mode = True

+ 5 - 1
routers/api/__init__.py

@@ -22,6 +22,8 @@ from . import pattern
 from . import rainfall
 from . import infoPublish
 from . import riskManagement
+from . import onlineRollCall
+
 from routers.prod_api import system
 from routers.prod_api import auth
 
@@ -54,4 +56,6 @@ router.include_router(rainfall.router, prefix="/rainfall", tags=["雨情分析"]
 
 router.include_router(infoPublish.router, prefix="/info_publish")
 
-router.include_router(riskManagement.router, prefix="/riskManagement", tags=["风险防控"])
+router.include_router(riskManagement.router, prefix="/riskManagement", tags=["风险防控"])
+
+router.include_router(onlineRollCall.router, prefix="/online_roll_call", tags=["在线点名"])

+ 1 - 1
routers/api/eventManagement/event.py

@@ -838,7 +838,7 @@ async def send_emergency_plan_task_by_yzy(
         '''
         
         # redirect_url = "http://19.155.220.206/yjxp/#/leader/index" # 业务页面
-        redirect_url = "{}/#/leader/index".format(settings.YJXP_WEB_ROOT_PATH) # 业务页面
+        redirect_url = "{}/leader/index".format(settings.YJXP_WEB_ROOT_PATH) # 业务页面
         detail_url = YzyApi.format_redirect_url(redirect_url, "eb4kehgy6wj4qn0jhx1dk6")
 
         send_queue.append({

+ 1 - 1
routers/api/infoPublish/back.py

@@ -95,7 +95,7 @@ async def create_emergency_plan(
             send_user_name = ''
             send_dept_name = ''
 
-            user_row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
+            user_row = db.query(SysUser).filter(SysUser.user_id == send_user_id).first()
             if user_row is not None:
                 send_user_name = user_row.user_name
                 send_dept_row = db.query(SysDept).filter(SysDept.dept_id == user_row.dept_id).first()

+ 8 - 0
routers/api/onlineRollCall/__init__.py

@@ -0,0 +1,8 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+ 
+from fastapi import APIRouter
+from . import call
+
+router = APIRouter()
+router.include_router(call.router, prefix="/call", tags=["常规操作"])

+ 251 - 0
routers/api/onlineRollCall/call.py

@@ -0,0 +1,251 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+ 
+from fastapi import APIRouter, Request, Depends, Query, HTTPException
+from database import get_db
+from sqlalchemy import text, exists, and_, or_, not_
+from sqlalchemy.orm import Session
+from models import *
+import json
+import os
+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 import YzyApi
+from common.db import db_dict
+from urllib.parse import quote
+import base64
+from config import settings
+
+router = APIRouter()
+
+@router.post("/create")
+async def create_all(
+    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()
+        user_name = user_row.user_name
+        nick_name = user_row.nick_name
+        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_call = OnlineRollCallBase(
+            call_type = body['call_type'],
+            recorded_by = user_id,
+            create_time = datetime.now,
+            del_flag = '0',
+            call_status = 1,
+            user_count = body['user_count'],
+            ack_count = 0,
+            unack_count = 0,
+            remark = body['remark'],
+            update_time = datetime.now()
+        )
+        db.add(new_call)
+        db.commit()
+        db.refresh(new_call)
+        new_call_id = new_call.id
+
+        for u in body['users']:
+            call_user_id = u['user_id']
+            call_dept_id = 0
+            call_nick_name = ''
+            call_dept_name = ''
+            user_row = db.query(SysUser).filter(SysUser.user_id == call_user_id).first()
+            if user_row is not None:
+                call_nick_name = user_row.nick_name
+                call_dept_row = db.query(SysDept).filter(SysDept.dept_id == user_row.dept_id).first()
+                call_dept_id = call_dept_row.dept_id
+                call_dept_name = call_dept_row.dept_name
+
+                # 关联值班班获取值班人员信息
+                onduty_user = "-1"
+                onduty_leader = "-1"
+                video_url = "..."
+                call_url = "..."
+
+                new_detail = OnlineRollCallDetail(
+                    pid = new_call_id,
+                    user_id = call_user_id,
+                    dept_id = call_dept_id,
+                    nick_name = call_nick_name,
+                    dept_name = call_dept_name,
+                    onduty_user = onduty_user,
+                    onduty_leader = onduty_leader,
+                    video_url = video_url,
+                    call_url = call_url,
+                    ack_status = 0,
+                    act_time = None,
+                    create_time = datetime.now(),
+                    del_flag = '0',
+                    ack_type = 0
+                )
+                db.add(new_detail)
+                db.commit()
+            else:
+                raise Exception("用户不存在")
+
+        return {
+            "code": 200,
+            "msg": "点名创建成功",
+            "data": new_call_id
+        }
+
+    except Exception as e:
+        traceback.print_exc()
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+    
+# 结束应答
+@router.post("/end")
+async def end_call(
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    call_id = body['call_id']
+
+    row = db.query(OnlineRollCallBase).filter(and_(OnlineRollCallBase.id == call_id, OnlineRollCallBase.del_flag == '0')).first()
+    if row is None:
+        return {
+            "code": 500,
+            "msg": "点名记录不存在"
+        }
+    
+    if row.call_status != 1:
+        return {
+            "code": 500,
+            "msg": "点名记录状态已结束"
+        }
+
+    
+    row.end_time = datetime.now()
+    row.call_status = 2 # 结束
+    row.update_time = datetime.now()
+    db.commit()
+
+    return {
+        "code": 200,
+        "msg": "点名结束成功"
+    }
+
+    
+# 标记用户已应答
+@router.post("/ack")
+async def ack_all(
+    db: Session = Depends(get_db),
+    body = Depends(remove_xss_json),
+    user_id = Depends(valid_access_token)
+):
+    call_id = body['call_id']
+    ack_type = body['ack_type']
+
+    base_row = db.query(OnlineRollCallBase).filter(OnlineRollCallBase.id == call_id).first()
+    if base_row is None:
+        return {
+            "code": 500,
+            "msg": "点名记录不存在"
+        }
+    
+    detail_row = db.query(OnlineRollCallDetail).filter(and_(OnlineRollCallDetail.pid == call_id, OnlineRollCallDetail.user_id == user_id)).first()
+    if detail_row is None:
+        return {
+            "code": 500,
+            "msg": "点名记录不存在!"
+        }
+    
+    detail_row.ack_type = ack_type
+    detail_row.act_time = datetime.now()
+    db.commit()
+
+    # 统计应答数
+    ack_count = db.query(OnlineRollCallDetail).filter(and_(OnlineRollCallDetail.pid == call_id, OnlineRollCallDetail.ack_status == 1)).count()
+    # 统计未应答数
+    unack_count = db.query(OnlineRollCallDetail).filter(and_(OnlineRollCallDetail.pid == call_id, OnlineRollCallDetail.ack_status == 2)).count()
+
+    db.query(OnlineRollCallBase).filter(OnlineRollCallBase.id == call_id).update({
+        "ack_count": ack_count, "unack_count": unack_count, "update_time": datetime.now()
+    })
+    db.commit()
+
+    return {
+        "code": 200,
+        "msg": "应答成功"
+    }
+
+# 查询是否有我的待应答记录(提醒)
+@router.post("/mycall")
+async def query_mycall(
+    db: Session = Depends(get_db),
+    user_id = Depends(valid_access_token)
+):
+    rows = db.query(OnlineRollCallDetail).filter(and_(OnlineRollCallDetail.user_id == user_id, OnlineRollCallDetail.ack_status == 0)).all()
+    data = []
+    for row in rows:
+        call_id = row.pid
+        base_row = db.query(OnlineRollCallBase).filter(and_(OnlineRollCallBase.id == call_id, OnlineRollCallBase.del_flag == '0')).first()
+
+        data.append({
+            "call_id": call_id,
+            "create_time": get_datetime_str(base_row.create_time)
+        })
+    
+    return {
+        "code": 200,
+        "msg": "查询成功",
+        "data": data,
+        "total": len(data)
+    }
+
+#应答详情
+@router.get('/detail')
+async def get_event_detail(
+    request: Request, 
+    call_id: str = Query(None, description='点名ID'),
+    db: Session = Depends(get_db)):
+
+    try:
+        base_row = db.query(OnlineRollCallBase).filter(OnlineRollCallBase.id == call_id).first()
+        if base_row is None:
+            return {
+                "code": 500,
+                "msg": "点名记录不存在"
+            }
+        
+        data = get_model_dict(base_row)
+        data['create_time'] = get_datetime_str(data['create_time'])
+        data['update_time'] = get_datetime_str(data['update_time'])
+    
+        detail_rows = db.query(OnlineRollCallDetail).filter(OnlineRollCallDetail.pid == call_id).all()
+        users = []
+        for row in detail_rows:
+            detail_info = get_model_dict(row)
+            detail_info['create_time'] = get_datetime_str(detail_info['create_time'])
+            detail_info['act_time'] = get_datetime_str(detail_info['act_time'])
+            users.append(detail_info)
+
+        data['users'] = users
+
+        return {
+            "code": 200,
+            "msg": "查询成功",
+            "data": data
+        }
+    
+    except Exception as e:
+        # 处理异常
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=str(e))