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