|
@@ -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))
|