libushang пре 8 месеци
родитељ
комит
6d9d9b4660
3 измењених фајлова са 175 додато и 1 уклоњено
  1. 18 0
      models/event_base.py
  2. 4 1
      routers/api/eventManagement/__init__.py
  3. 153 0
      routers/api/eventManagement/checkin.py

+ 18 - 0
models/event_base.py

@@ -65,3 +65,21 @@ class EventFile(Base):
 
     class Config:
         orm_mode = True
+
+
+class EventCheckin(Base):
+    __tablename__ = 'event_checkin'
+
+    id = Column(Integer, autoincrement=True, primary_key=True)
+    event_id = Column(String, default="", comment='事件编号')
+    user_id = Column(Integer, default=0, comment='用户ID')
+    user_name = Column(String, default="", comment='用户账号')
+    nick_name = Column(String, default="", comment='用户昵称')
+    dept_id = Column(Integer, default=0, comment='部门ID')
+    dept_name = Column(String, default="", comment='部门名称')
+    sign_time = Column(DateTime, default=datetime.now, comment='签名时间')
+    yzy_account = Column(String, default="", comment='粤政易账号')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+
+    class Config:
+        orm_mode = True

+ 4 - 1
routers/api/eventManagement/__init__.py

@@ -1,8 +1,11 @@
 from fastapi import APIRouter
 from . import event
 from . import event_xp
+from . import checkin
 
 router = APIRouter()
 
 router.include_router(event.router, prefix="/event", tags=["事件增删改"])
-router.include_router(event_xp.router, prefix="/event_xp", tags=["小屏"])
+router.include_router(event_xp.router, prefix="/event_xp", tags=["小屏"])
+
+router.include_router(checkin.router, prefix="/checkin", tags=["签到"])

+ 153 - 0
routers/api/eventManagement/checkin.py

@@ -0,0 +1,153 @@
+from fastapi import APIRouter, Request, Depends, HTTPException, Query
+from sqlalchemy.exc import IntegrityError
+from fastapi.responses import HTMLResponse, FileResponse, StreamingResponse
+from fastapi.responses import JSONResponse
+from database import get_db
+from sqlalchemy import text, exists, and_, or_, not_
+from sqlalchemy.orm import Session
+from models import *
+import json
+import random
+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
+import qrcode
+from PIL import Image
+from io import BytesIO
+
+router = APIRouter()
+
+@router.get('/qrcode', response_class=StreamingResponse)
+async def get_event_list(
+    event_id: str,
+    db: Session = Depends(get_db)
+):
+    qrcode_str = f"http://19.155.220.209/api/event_management/event?event_id={event_id}"
+
+    qr = qrcode.QRCode(
+        version=1,
+        error_correction=qrcode.constants.ERROR_CORRECT_M,
+        box_size=10,
+        border=0,
+    )
+    qr.add_data(qrcode_str)
+    qr.make(fit=True)
+    image = qr.make_image()
+
+    buf = BytesIO()
+    image.save(buf, 'png')
+    img_data = buf.getvalue()
+    return StreamingResponse(BytesIO(img_data), media_type="image/png")
+
+
+@router.post("/check")
+async def check(
+    request: Request, 
+    db: Session = Depends(get_db), 
+    body = Depends(remove_xss_json), 
+    user_id = Depends(valid_access_token)
+):
+    row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
+    user_info = get_model_dict(row)
+    dept_id = user_info['dept_id']
+
+    row = db.query(SysDept).filter(SysDept.dept_id == dept_id).first()
+    dept_info = get_model_dict(row)
+    dept_name = dept_info['dept_name']
+
+    event_id = body['event_id']
+    yzy_account = body['yzy_account']
+
+    row = db.query(EventCheckin).filter(and_(EventCheckin.event_id == event_id, EventCheckin.user_id == user_id)).first()
+    if row is None:
+        event_checkin = EventCheckin(
+            event_id = event_id,
+            user_id = user_id,
+            user_name = user_info['user_name'],
+            nick_name = user_info['nick_name'],
+            dept_id = dept_id,
+            dept_name = dept_name,
+            sign_time = datetime.now(),
+            yzy_account = yzy_account,
+            del_flag = '0'
+        )
+        db.add(event_checkin)
+        db.commit()
+
+        return {
+            'code': 200,
+            'msg': '签名成功'
+        }
+    
+    else:
+        if row.del_flag == '0':
+            row.sign_time = datetime.now()
+            row.del_flag = '1'
+            db.commit()
+
+            return {
+                'code': 200,
+                'msg': '签出成功'
+            }
+            
+        else:
+            row.sign_time = datetime.now()
+            row.del_flag = '0'
+            db.commit()
+
+            return {
+                'code': 200,
+                'msg': '签名成功'
+            }
+
+    
+@router.get('/list')
+async def get_event_list(
+    event_id: str,
+    page: int = Query(1, gt=0, description='页码'),
+    page_size: int = Query(10, gt=0, description='pageSize'),
+    db: Session = Depends(get_db)
+):
+    try:
+        # 应用查询条件
+        where = and_(EventCheckin.del_flag == '0', EventCheckin.event_id == event_id)
+        # 计算总条目数
+        q = db.query(func.count(EventCheckin.id))
+        q = q.filter(where)
+        total = q.scalar()
+        
+        # 执行分页查询
+        q = db.query(EventCheckin)
+        q = q.filter(where)
+        rows = q.order_by(EventCheckin.id.desc()).offset((page - 1) * page_size).limit(page_size).all()
+        data = [
+            {
+                "event_id": row.event_id,
+                "user_id": row.user_id,
+                "user_name": row.user_name,
+                "nick_name": row.nick_name,
+                "dept_id": row.dept_id,
+                "dept_name": row.dept_name,
+                "sign_time": get_datetime_str(row.sign_time),
+                "yzy_account": row.yzy_account
+            }
+            for row in rows
+        ]
+
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "查询成功",
+            "data": data,
+            "total": total
+        }
+
+    except Exception as e:
+        # 处理异常
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=str(e))