123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- #!/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))
|