checkin.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. from fastapi import APIRouter, Request, Depends, HTTPException, Query
  2. from sqlalchemy.exc import IntegrityError
  3. from fastapi.responses import HTMLResponse, FileResponse, StreamingResponse
  4. from fastapi.responses import JSONResponse
  5. from database import get_db
  6. from sqlalchemy import text, exists, and_, or_, not_
  7. from sqlalchemy.orm import Session
  8. from models import *
  9. import json
  10. import random
  11. from sqlalchemy import create_engine, select
  12. from typing import Optional
  13. from utils.StripTagsHTMLParser import *
  14. from common.db import db_event_management, db_user, db_area, db_emergency_plan
  15. from common.security import valid_access_token
  16. import traceback
  17. from utils import *
  18. from datetime import datetime, timedelta
  19. import qrcode
  20. from PIL import Image
  21. from io import BytesIO
  22. from config import settings
  23. from common import YzyApi
  24. from extensions import logger
  25. router = APIRouter()
  26. @router.get('/qrcode', response_class=StreamingResponse)
  27. async def get_event_list(
  28. event_id: str,
  29. db: Session = Depends(get_db)
  30. ):
  31. redirect_url = "{}/#/signPage?event_id={}".format(settings.YJXP_WEB_ROOT_PATH, event_id) # 业务页面
  32. # qrcode_str = f"http://19.155.220.209/api/event_management/event?event_id={event_id}"
  33. detail_url = YzyApi.format_redirect_url(redirect_url)
  34. qr = qrcode.QRCode(
  35. version=1,
  36. error_correction=qrcode.constants.ERROR_CORRECT_M,
  37. box_size=10,
  38. border=0,
  39. )
  40. qr.add_data(detail_url)
  41. qr.make(fit=True)
  42. image = qr.make_image()
  43. buf = BytesIO()
  44. image.save(buf, 'png')
  45. img_data = buf.getvalue()
  46. return StreamingResponse(BytesIO(img_data), media_type="image/png")
  47. @router.post("/getInfo")
  48. async def getInfo(
  49. request: Request,
  50. db: Session = Depends(get_db),
  51. body = Depends(remove_xss_json),
  52. user_id = Depends(valid_access_token)
  53. ):
  54. event_id = body['event_id']
  55. row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
  56. user_info = get_model_dict(row)
  57. row = db.query(SysDept).filter(SysDept.dept_id == user_info['dept_id']).first()
  58. dept_info = get_model_dict(row)
  59. user_name = user_info['user_name']
  60. nick_name = user_info['nick_name']
  61. dept_id = user_info['dept_id']
  62. dept_name = dept_info['dept_name']
  63. duties = ''
  64. sign_time = ''
  65. phone = user_info['phonenumber']
  66. row = db.query(EventCheckin).filter(and_(EventCheckin.event_id == event_id, EventCheckin.user_id == user_id, EventCheckin.del_flag == '0')).first()
  67. if row is not None:
  68. check_info = get_model_dict(row)
  69. user_name = check_info['user_name']
  70. nick_name = check_info['nick_name']
  71. dept_id = check_info['dept_id']
  72. dept_name = check_info['dept_name']
  73. duties = check_info['duties']
  74. sign_time = get_datetime_str(check_info['sign_time'])
  75. phone = check_info['phone']
  76. print('---------------', sign_time)
  77. return {
  78. 'code': 200,
  79. 'msg': '查询成功',
  80. 'data': {
  81. 'user_id': user_info['user_id'],
  82. 'user_name': user_name,
  83. 'nick_name': nick_name,
  84. 'dept_id': dept_id,
  85. 'dept_name': dept_name,
  86. 'duties': duties,
  87. 'sign_time': sign_time,
  88. 'phone': phone
  89. }
  90. }
  91. @router.post("/check")
  92. async def check(
  93. request: Request,
  94. db: Session = Depends(get_db),
  95. body = Depends(remove_xss_json),
  96. user_id = Depends(valid_access_token)
  97. ):
  98. time.sleep(3)
  99. row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
  100. user_info = get_model_dict(row)
  101. dept_id = user_info['dept_id']
  102. yzy_account = user_info['yzy_account']
  103. row = db.query(SysDept).filter(SysDept.dept_id == dept_id).first()
  104. dept_info = get_model_dict(row)
  105. dept_name = dept_info['dept_name']
  106. event_id = body['event_id']
  107. phone = body['phone']
  108. duties = body['duties']
  109. row = db.query(EventCheckin).filter(and_(EventCheckin.event_id == event_id, EventCheckin.user_id == user_id)).first()
  110. if row is None:
  111. event_checkin = EventCheckin(
  112. event_id = event_id,
  113. user_id = user_id,
  114. user_name = user_info['user_name'],
  115. nick_name = user_info['nick_name'],
  116. dept_id = dept_id,
  117. dept_name = dept_name,
  118. sign_time = datetime.now(),
  119. yzy_account = yzy_account,
  120. duties = duties,
  121. phone = phone,
  122. del_flag = '0'
  123. )
  124. db.add(event_checkin)
  125. db.commit()
  126. return {
  127. 'code': 200,
  128. 'msg': '签到成功'
  129. }
  130. else:
  131. if row.del_flag == '0':
  132. row.sign_time = datetime.now()
  133. row.duties = duties,
  134. row.phone = phone,
  135. row.del_flag = '1'
  136. db.commit()
  137. return {
  138. 'code': 200,
  139. 'msg': '签退成功'
  140. }
  141. else:
  142. row.sign_time = datetime.now()
  143. row.duties = duties,
  144. row.phone = phone,
  145. row.del_flag = '0'
  146. db.commit()
  147. return {
  148. 'code': 200,
  149. 'msg': '签到成功'
  150. }
  151. @router.get('/list')
  152. async def get_event_list(
  153. event_id: str,
  154. page: int = Query(1, gt=0, description='页码'),
  155. page_size: int = Query(10, gt=0, description='pageSize'),
  156. db: Session = Depends(get_db)
  157. ):
  158. try:
  159. # 应用查询条件
  160. where = and_(EventCheckin.del_flag == '0', EventCheckin.event_id == event_id)
  161. # 计算总条目数
  162. q = db.query(func.count(EventCheckin.id))
  163. q = q.filter(where)
  164. total = q.scalar()
  165. # 执行分页查询
  166. q = db.query(EventCheckin)
  167. q = q.filter(where)
  168. rows = q.order_by(EventCheckin.id.desc()).offset((page - 1) * page_size).limit(page_size).all()
  169. data = [
  170. {
  171. "event_id": row.event_id,
  172. "user_id": row.user_id,
  173. "user_name": row.user_name,
  174. "nick_name": row.nick_name,
  175. "dept_id": row.dept_id,
  176. "dept_name": row.dept_name,
  177. "sign_time": get_datetime_str(row.sign_time),
  178. "yzy_account": row.yzy_account,
  179. "duties": row.duties
  180. }
  181. for row in rows
  182. ]
  183. # 返回结果
  184. return {
  185. "code": 200,
  186. "msg": "查询成功",
  187. "data": data,
  188. "total": total
  189. }
  190. except Exception as e:
  191. # 处理异常
  192. traceback.print_exc()
  193. raise HTTPException(status_code=500, detail=str(e))