checkin.py 7.8 KB

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