__init__.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. from fastapi import APIRouter, Request, Depends, HTTPException, Query, Header
  2. from sqlalchemy.exc import IntegrityError
  3. from fastapi.responses import HTMLResponse, FileResponse, StreamingResponse, RedirectResponse
  4. from fastapi.responses import JSONResponse
  5. from starlette.requests import HTTPConnection
  6. from database import get_db
  7. from sqlalchemy import text, exists, and_, or_, not_
  8. from sqlalchemy.orm import Session
  9. from sqlalchemy.sql import func
  10. from models import *
  11. import json
  12. import random
  13. from sqlalchemy import create_engine, select
  14. from typing import Optional
  15. from utils.StripTagsHTMLParser import *
  16. from common.db import db_event_management, db_user, db_area, db_emergency_plan
  17. from common.security import valid_access_token
  18. import traceback
  19. from utils import *
  20. from datetime import datetime, timedelta
  21. import qrcode
  22. from PIL import Image
  23. from io import BytesIO
  24. from config import settings
  25. from common import YzyApi
  26. from extensions import logger
  27. from common.enc import mpfun
  28. from urllib.parse import quote
  29. from utils.redis_util import *
  30. router = APIRouter()
  31. @router.get('/event/checkin', response_class=StreamingResponse)
  32. async def get_qrcode(
  33. request: Request,
  34. event_id: str,
  35. db: Session = Depends(get_db)
  36. ):
  37. url = str(request.url)
  38. print('url:', url)
  39. url = settings.YZY_WEB_ROOT + f"/api/qrcode/event/checkin2?event_id={event_id}&r="+rnd()
  40. # url = url.replace("http://" + request.url.hostname, settings.YZY_WEB_ROOT)
  41. logger.info('替换到互联网ip: {}', url)
  42. qr = qrcode.QRCode(
  43. version=1,
  44. error_correction=qrcode.constants.ERROR_CORRECT_M,
  45. box_size=10,
  46. border=0,
  47. )
  48. qr.add_data(url)
  49. qr.make(fit=True)
  50. image = qr.make_image()
  51. buf = BytesIO()
  52. image.save(buf, 'png')
  53. img_data = buf.getvalue()
  54. return StreamingResponse(BytesIO(img_data), media_type="image/png")
  55. @router.get('/event/checkin2')
  56. async def get_qrcode2(
  57. event_id: str,
  58. user_agent: str = Header(default=''),
  59. db: Session = Depends(get_db)
  60. ):
  61. print('user_agent:', user_agent)
  62. if "wxworklocal" in user_agent:
  63. logger.info("粤政易扫码")
  64. # 因为用户不一定是本系统的用户,只是为了拿到用户的粤政易信息而已
  65. redirect_uri = quote(f"{settings.YZY_WEB_ROOT}/api/qrcode/event/callback?event_id={event_id}")
  66. state = "signin"
  67. # detail_url = f"https://open.weixin.qq.com/connect/Oauth2/authorize?appid=wl2bee594e73&redirect_uri={redirect_uri}&response_type=code&scope=snsapi_base&agentid=1004000&state={state}#wechat_redirect"
  68. # 粤政易用户授权页面
  69. detail_url = f"https://xtbg.gdzwfw.gov.cn/zwwxgzt/pf/userpermit/index.html?redirect_uri={redirect_uri}&response_type=code&appid={settings.YZY_AGENTID}&state={state}"
  70. # redirect_url = "/signPage?event_id={}".format(event_id)
  71. # detail_url = YzyApi.format_redirect_url(redirect_url)
  72. else:
  73. logger.info("微信扫码")
  74. redirect_url = f"/yjxp/#/signPage?event_id={event_id}" # 业务页面
  75. detail_url = f"{settings.YZY_WEB_ROOT}{redirect_url}"
  76. logger.info("detail_url: {}", detail_url)
  77. return RedirectResponse(detail_url)
  78. @router.get('/event/callback')
  79. async def get_qrcode2(
  80. event_id: str,
  81. state: str,
  82. code: str,
  83. db: Session = Depends(get_db)
  84. ):
  85. # 获取用户的userId
  86. # resp = YzyApi.get_user_info(code)
  87. #if resp['errcode'] != 0:
  88. # return {
  89. # "code": 500,
  90. # "msg": "Code异常"
  91. # }
  92. #user_id = resp['UserId']
  93. uuid_str = new_guid()
  94. # 默认空值
  95. redis_val = {
  96. "event_id": event_id,
  97. "nick_name": '',
  98. "dept_name": '',
  99. "phone": '',
  100. "duties": '',
  101. "sign_time": ''
  102. }
  103. # 管理中心通过授权码获取用户信息接口
  104. # 获取用户基本信息
  105. result = YzyApi.getuserbycode(code)
  106. errcode = int(result['errcode'])
  107. if errcode == 0:
  108. data = result['data']
  109. dept_list = []
  110. for unit in data['units']:
  111. unitid = unit['unitid']
  112. new_dept = {
  113. "dept": unit['unitname'],
  114. "position": ""
  115. }
  116. for dept in data['depts']:
  117. unitidpath = dept['unitidpath']
  118. if unitidpath.find(unitid) != -1:
  119. new_dept['position'] = dept['position']
  120. dept_list.append(new_dept)
  121. phone = ''
  122. try:
  123. # 敏感数据加密算法(DES 对称加密)
  124. phone = YzyApi.desDecryptValue(settings.YZY_CORPSECRET, data['mobile'])
  125. except:
  126. traceback.print_exc()
  127. dept_name = dept_list[0]['dept'] if len(dept_list) > 0 else ''
  128. duties = dept_list[0]['position'] if len(dept_list) > 0 else ''
  129. redis_val = {
  130. "event_id": event_id,
  131. "user_id": data['userid'],
  132. "nick_name": data['username'],
  133. "phone": phone,
  134. "dept_name": dept_name,
  135. "duties": duties,
  136. "sign_time": '',
  137. "dept_list": dept_list
  138. }
  139. redis_set_json(f"yzy_user_{uuid_str}", redis_val, 60)
  140. redirect_url = f"/yjxp/#/signPage?event_id={event_id}&uuid={uuid_str}" # 业务页面
  141. detail_url = f"{settings.YZY_WEB_ROOT}{redirect_url}"
  142. logger.info("detail_url: {}", detail_url)
  143. return RedirectResponse(detail_url)
  144. @router.get("/yzy_user_info")
  145. async def yzy_user_info(
  146. request: Request,
  147. uuid: str,
  148. db: Session = Depends(get_db),
  149. body = Depends(remove_xss_json)
  150. ):
  151. redis_val = redis_get_json(f"yzy_user_{uuid}")
  152. if redis_val is not None:
  153. logger.info(redis_val)
  154. return {
  155. "code": 0,
  156. "msg": "",
  157. "data": redis_val
  158. }
  159. @router.post("/check")
  160. async def check(
  161. request: Request,
  162. db: Session = Depends(get_db),
  163. body = Depends(remove_xss_json)
  164. ):
  165. time.sleep(2.0)
  166. event_id = body['event_id']
  167. nick_name = body['nick_name']
  168. dept_name = body['dept_name']
  169. phone = body['phone']
  170. duties = body['duties']
  171. type_ = body['type']
  172. dept_id = 0
  173. yzy_account = ''
  174. contact_info = db.query(EmergencyContactInfo).filter(and_(EmergencyContactInfo.del_flag == "0", EmergencyContactInfo.yue_gov_ease_phone == mpfun.enc_data(phone))).first()
  175. if contact_info is not None:
  176. yzy_account = phone
  177. contact_info = get_model_dict(contact_info)
  178. dept_id = contact_info['unit_id']
  179. if type_ == '1':
  180. # 签名
  181. row = db.query(EventCheckin).filter(and_(EventCheckin.event_id == event_id, EventCheckin.phone == phone)).first()
  182. if row is None:
  183. row = EventCheckin(
  184. event_id = event_id,
  185. user_id = 0,
  186. user_name = '',
  187. nick_name = nick_name,
  188. dept_id = dept_id,
  189. dept_name = dept_name,
  190. sign_time = datetime.now(),
  191. yzy_account = yzy_account,
  192. duties = duties,
  193. phone = phone,
  194. del_flag = '0'
  195. )
  196. db.add(row)
  197. db.commit()
  198. db.refresh(row)
  199. else:
  200. row.sign_time = datetime.now()
  201. row.nick_name = nick_name
  202. row.dept_name = dept_name
  203. row.duties = duties
  204. row.phone = phone
  205. row.del_flag = '0'
  206. db.commit()
  207. return {
  208. 'code': 200,
  209. 'msg': '签到成功',
  210. 'data': {
  211. 'sign_time': get_datetime_str(row.sign_time)
  212. }
  213. }
  214. elif type_ == '2':
  215. # 取消签名
  216. row = db.query(EventCheckin).filter(and_(EventCheckin.event_id == event_id, EventCheckin.phone == phone)).first()
  217. if row is None:
  218. return {
  219. 'code': 200,
  220. 'msg': '签退成功'
  221. }
  222. row.sign_time = datetime.now()
  223. row.del_flag = '1'
  224. db.commit()
  225. return {
  226. 'code': 200,
  227. 'msg': '签退成功'
  228. }