Pārlūkot izejas kodu

Merge branch 'master' of https://gogs.tjp.com.cn/maoming/python-fastapi-mm-zhcs-yj-api

libushang 10 mēneši atpakaļ
vecāks
revīzija
75a0058df0

+ 21 - 0
common/db/db_task.py

@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from sqlalchemy.orm import Session
+from sqlalchemy import text, exists, and_, or_, not_
+from sqlalchemy.sql import func
+from database import get_db
+from extensions import logger
+import random
+from models import *
+
+def get_next_event_id(db: Session):
+    while True:
+        random_10_digit_number = random.randint(1000000000, 9999999999)
+        taskId = 'task' + str(random_10_digit_number)
+
+        it_exists = db.query(
+            exists().where(TaskRegistration.task_id == taskId)
+        ).scalar()
+
+        if it_exists == False:
+            return taskId

+ 2 - 1
models/__init__.py

@@ -8,4 +8,5 @@ from .oneshare_base import *
 from .ry_sys_base import *
 from .knowledge_base import *
 from .yjya_base import *
-from .event_base import *
+from .event_base import *
+from .taskRegistration_base import *

+ 10 - 0
models/ry_sys_base.py

@@ -242,6 +242,16 @@ class SysUserRole(Base):
     class Config:
         orm_mode = True
 
+'''用户和视频关联表'''
+class SysUserVideo(Base):
+    __tablename__ = 'sys_user_video'
+    __table_args__ = (PrimaryKeyConstraint('video_code_int', 'user_id'),)
+    user_id = Column(BigInteger,  nullable=True, comment='用户ID')
+    video_code_int = Column(String(255), nullable=True, comment='视频ID')
+
+    class Config:
+        orm_mode = True
+
 '''角色和菜单关联表'''
 class SysRoleMenu(Base):
     __tablename__ = 'sys_role_menu'

+ 31 - 0
models/taskRegistration_base.py

@@ -0,0 +1,31 @@
+from sqlalchemy import Column, Integer, String, DateTime, ForeignKey,Text
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import relationship
+from datetime import datetime
+# from database import Base
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import relationship, sessionmaker
+
+
+
+# from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey
+# from sqlalchemy.orm import relationship
+
+Base = declarative_base()
+
+class TaskRegistration(Base):
+    __tablename__ = 'task_registrations'
+
+    id = Column(Integer, primary_key=True, autoincrement=True, index=True,comment='id')
+    task_id = Column(String(255), index=True,comment='任务ID')
+    unit_name = Column(String(255), nullable=False,comment='部门名称')
+    del_flag = Column(String(10),default='0', comment='是否删除')
+    task_description = Column(Text, nullable=False,comment='任务内容/描述')
+    registrar = Column(String(255), nullable=False,comment='登记人')
+    creation_time = Column(DateTime, default=datetime.utcnow,comment='创建时间')
+    update_time = Column(DateTime, default=datetime.utcnow,comment='创建时间')
+    processing_status = Column(String(50), default='处理中',comment='任务状态')
+
+    # 你可以添加更多的字段和关系,例如与用户模型的外键关系
+    # user_id = Column(Integer, ForeignKey('users.id'))
+    # user = relationship("User", back_populates="task_registrations")

+ 2 - 1
routers/api/__init__.py

@@ -15,7 +15,7 @@ from . import Knowledge
 from . import emergencyPlans
 from . import eventManagement
 from . import spatialAnalysis
-
+from . import taskRegistration
 router = APIRouter()
 
 router.include_router(login_router)
@@ -28,6 +28,7 @@ router.include_router(OneShareProxyHandler.router, prefix="/oneShare")
 router.include_router(upload_file.router, prefix="/file")
 router.include_router(videoResource.router, prefix="/videoResource")
 router.include_router(Knowledge.router, prefix="/knowledge")
+router.include_router(taskRegistration.router, prefix="/taskRegistration")
 router.include_router(emergencyPlans.router, prefix="/emergency_plan")
 
 router.include_router(eventManagement.router, prefix="/event_management", tags=["事件管理"])

+ 194 - 0
routers/api/taskRegistration/__init__.py

@@ -0,0 +1,194 @@
+import json
+import random
+from sqlalchemy import create_engine, select
+from utils.StripTagsHTMLParser import *
+from sqlalchemy.orm import Session
+import traceback
+from models import *
+from common.db import db_task
+from common.security import valid_access_token
+from datetime import datetime, timedelta
+from fastapi import APIRouter, Depends,HTTPException,Response,Query
+from database import get_db
+from pydantic import BaseModel
+
+router = APIRouter()
+
+
+@router.post('/create')
+async def create_task(
+        request: Request,
+        db: Session = Depends(get_db),
+        body=Depends(remove_xss_json),
+        user_id=Depends(valid_access_token)):
+    try:
+        # 验证必需的字段
+        required_fields = ['task_description', 'unit_name', 'registrar']
+        missing_fields = [field for field in required_fields if field not in body]
+        if missing_fields:
+            raise HTTPException(status_code=401, detail=f"Missing required fields: {', '.join(missing_fields)}")
+
+        # eventId = db_event_management.get_next_event_id(db)
+        task_id =db_task.get_next_event_id(db)
+
+        task_base = TaskRegistration(
+            **body,
+            task_id = task_id
+        )
+        db.add(task_base)
+        db.commit()
+
+        return {
+            "code": 200,
+            "msg": "任务创建成功",
+            "data": task_id
+        }
+
+    except Exception as e:
+        db.rollback()
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+class TaskQuery(BaseModel):
+    task_id: str = None
+    task_description: str = None
+    unit_name: str = None
+    registrar: str = None
+    creation_time: str = None
+    processing_status: str = None
+
+@router.post('/select')
+@router.get('/select')
+async def select_tasks(
+    request: Request,
+    db: Session = Depends(get_db),
+    query: TaskQuery = Depends(),
+    user_id=Depends(valid_access_token),
+    pageNum: int = Query(1, gt=0, description="页码"),
+    pageSize: int = Query(10, gt=0, le=100, description="每页大小")):
+    try:
+        data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2')
+
+        if query.task_id:
+            data_query = data_query.filter(TaskRegistration.task_id == query.task_id)
+        if query.task_description:
+            data_query = data_query.filter(TaskRegistration.task_description == query.task_description)
+        if query.unit_name:
+            data_query = data_query.filter(TaskRegistration.unit_name == query.unit_name)
+        if query.registrar:
+            data_query = data_query.filter(TaskRegistration.registrar == query.registrar)
+        if query.creation_time:
+            data_query = data_query.filter(TaskRegistration.creation_time == query.creation_time)
+        if query.processing_status:
+            data_query = data_query.filter(TaskRegistration.processing_status == query.processing_status)
+
+        # 计算分页的偏移量
+        offset = (pageNum - 1) * pageSize
+        # 应用分页
+        data_query = data_query.offset(offset).limit(pageSize)
+
+        tasks = data_query.all()
+        total_count = data_query.count()
+
+        return {
+            "code": 200,
+            "msg": "任务查询成功",
+            "data": tasks,
+            "total": total_count,
+            "pages": (total_count + pageSize - 1) // pageSize,
+            "current_page": pageNum,
+            "page_size": pageSize
+        }
+
+    except Exception as e:
+        db.rollback()
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+
+
+
+@router.put('/update')
+async def update_task_status(
+    request: Request,
+    db: Session = Depends(get_db),
+    user_id=Depends(valid_access_token)):  # 确保用户已验证
+    try:
+        body = await request.json()
+        task_id_to_use = body.get('task_id')
+        processing_status = body.get('processing_status')
+
+        if not task_id_to_use:
+            return Response(content="Missing required parameter 'task_id'", status_code=400)
+        if processing_status not in ['已完成', '未完成']:
+            return Response(content="processing_status must be '已完成' or '未完成'", status_code=400)
+
+        # 查询要更新的任务
+        # data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2')
+        task_entry = db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id_to_use).first()
+        print(task_entry)
+        print(not task_entry)
+        if not task_entry:
+            raise HTTPException(status_code=404, detail="任务不存在")
+
+        # 更新任务状态
+        task_entry.processing_status = processing_status
+        task_entry.update_time = datetime.now()  # 更新时间
+
+        # 提交数据库事务
+        db.commit()
+        return {
+            "code": 200,
+            "msg": "任务状态更新成功",
+            "data": {
+                "task_id": task_id_to_use,
+                "processing_status": task_entry.processing_status,
+                "update_time": task_entry.update_time.isoformat()
+            }
+        }
+
+
+
+    except Exception as e:
+        db.rollback()
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+@router.delete('/delete')
+async def delete_task(
+    request: Request,
+    db: Session = Depends(get_db),
+    user_id=Depends(valid_access_token)):  # 确保用户已验证
+    try:
+        body = await request.json()
+        task_id_to_use = body.get('taskID')
+        if not task_id_to_use:
+            raise HTTPException(status_code=400, detail="Missing required parameter 'taskID'")
+
+        # 查询要删除的任务
+        task_entry = db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id_to_use).first()
+        if not task_entry:
+            raise HTTPException(status_code=404, detail="任务不存在")
+
+        # 将找到的任务的 del_flag 改为 '2'
+        task_entry.del_flag = '2'
+
+        try:
+            db.commit()
+            return {
+                "code": 200,
+                "msg": "任务删除成功",
+                "data": {
+                    "task_id": task_entry.task_id
+                }
+            }
+        except Exception as e:
+            db.rollback()
+            raise HTTPException(status_code=500, detail=f"An error occurred while deleting the task: {str(e)}")
+
+    except HTTPException as e:
+        # 如果捕获到HTTP异常,直接抛出
+        raise e
+    except Exception as e:
+        db.rollback()
+        raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}")

+ 95 - 53
routers/prod_api/system/user/__init__.py

@@ -216,60 +216,7 @@ async def userlist( deptId: int = Query(None ,description='部门id'),
         traceback.print_exc()
         raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
 
-@router.get('/{user_id_1}')
-async def userlist( user_id_1: int = Query(None ,description='用户id'),
-                    db: Session = Depends(get_db),
-                    user_id: int = Depends(valid_access_token)):
-    try:
-
-        user = user_id_get_user_info(db,user_id_1)
-        # 将查询结果转换为列表形式的字典
-        roleIds = user_id_get_user_roleIds(db, user_id_1)
-        user_roles = role_id_list_get_user_role(db,roleIds)
 
-        user_list = {
-                "userId": user.user_id,
-                "tenantId": user.tenant_id,
-                "deptId": user.dept_id,
-                "userName": user.user_name,
-                "nickName": user.nick_name,
-                "userType": user.user_type,
-                "email": user.email,
-                "phonenumber": user.phonenumber,
-                "sex": user.sex,
-                "avatar": user.avatar,
-                "status": user.status,
-                "loginIp": user.login_ip,
-                "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
-                "remark": user.remark,
-                "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
-                "deptName": user.dept_name,
-                "roles": user_roles,
-                "roleIds": None,
-                "postIds": None,
-                "roleId": None
-            }
-
-        roles = get_role(db)
-
-
-        # 返回结果
-        return {
-            "code": 200,
-            "msg": "成功用户列表",
-            "data": {
-                "user":user_list,
-                "roleIds":roleIds,
-                "roles":roles,
-                "postIds":[],
-                "posts":[]
-            }
-        }
-
-
-    except Exception as e:
-        traceback.print_exc()
-        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
 
 @router.get('/list/dept/{dept_id}')
 async def get_dept_user_list(
@@ -367,4 +314,99 @@ async def delete_dept(
         "msg": "操作成功"
     }
 
+@router.get('/videoPoints')
+async def get_user_video_points(
+        db: Session = Depends(get_db),
+        body = Depends(remove_xss_json),
+        user_id = Depends(valid_access_token)):
+    try:
+        videoIds = user_id_get_user_videoIds(db,user_id)
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data": [i.video_code_int for i in videoIds]
+        }
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
 
+@router.put('/videoPoints')
+async def get_user_video_points(
+        db: Session = Depends(get_db),
+        body = Depends(remove_xss_json),
+        user_id = Depends(valid_access_token)):
+    try:
+        query = db.query(SysUserVideo)
+        query = query.filter(SysUserVideo.user_id == user_id)
+        query.delete(synchronize_session=False)
+        db.commit()
+        for video in body:
+            new_user_video = SysUserVideo(
+                user_id=user_id,
+                video_code_int = video
+            )
+            db.add(new_user_video)
+        db.commit()
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data":None
+        }
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+@router.get('/{user_id_1}')
+async def userlist( user_id_1: int = Query(None ,description='用户id'),
+                    db: Session = Depends(get_db),
+                    user_id: int = Depends(valid_access_token)):
+    try:
+
+        user = user_id_get_user_info(db,user_id_1)
+        # 将查询结果转换为列表形式的字典
+        roleIds = user_id_get_user_roleIds(db, user_id_1)
+        user_roles = role_id_list_get_user_role(db,roleIds)
+
+        user_list = {
+                "userId": user.user_id,
+                "tenantId": user.tenant_id,
+                "deptId": user.dept_id,
+                "userName": user.user_name,
+                "nickName": user.nick_name,
+                "userType": user.user_type,
+                "email": user.email,
+                "phonenumber": user.phonenumber,
+                "sex": user.sex,
+                "avatar": user.avatar,
+                "status": user.status,
+                "loginIp": user.login_ip,
+                "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
+                "remark": user.remark,
+                "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
+                "deptName": user.dept_name,
+                "roles": user_roles,
+                "roleIds": None,
+                "postIds": None,
+                "roleId": None
+            }
+
+        roles = get_role(db)
+
+
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "成功用户列表",
+            "data": {
+                "user":user_list,
+                "roleIds":roleIds,
+                "roles":roles,
+                "postIds":[],
+                "posts":[]
+            }
+        }
+
+
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")

+ 7 - 0
utils/ry_system_util.py

@@ -19,6 +19,13 @@ def user_id_get_user_roleIds(db,user_id):
     resutl = query.all()
     return [i.role_id for i in resutl]
 
+def user_id_get_user_videoIds(db,user_id):
+    query = db.query(SysUserVideo)
+    # query = query.filter(SysUserRole.del_flag != '2')
+    query = query.filter(SysUserVideo.user_id == user_id)
+    resutl = query.all()
+    return resutl
+
 def role_list_to_dict(roles):
     return [
         {