__init__.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. from fastapi import APIRouter, Request, Depends, HTTPException, Query, Response
  2. from sqlalchemy.exc import IntegrityError
  3. from fastapi.responses import JSONResponse
  4. from database import get_db
  5. from sqlalchemy.orm import Session
  6. from models import *
  7. import json
  8. import random
  9. from sqlalchemy import create_engine, select, or_
  10. from typing import Optional,List
  11. import uuid
  12. from utils import *
  13. from common.security import valid_access_token
  14. import traceback
  15. from sqlalchemy import text, exists
  16. router = APIRouter()
  17. def get_next_yjbh_id(db: Session):
  18. while True:
  19. random_10_digit_number = random.randint(1000000000, 9999999999)
  20. yjbhId = 'YHBZ' + str(random_10_digit_number)
  21. it_exists = db.query(
  22. exists().where(TaskRegistration.task_id == yjbhId)
  23. ).scalar()
  24. if it_exists == False:
  25. return yjbhId
  26. @router.post('/create')
  27. async def create_task(
  28. request: Request,
  29. db: Session = Depends(get_db),
  30. body=Depends(remove_xss_json),
  31. user_id=Depends(valid_access_token)):
  32. try:
  33. # 验证必需的字段
  34. required_fields = ['standard_type', 'file_title']
  35. missing_fields = [field for field in required_fields if field not in body]
  36. if missing_fields:
  37. raise HTTPException(status_code=401, detail=f"Missing required fields: {', '.join(missing_fields)}")
  38. fileList = []
  39. if 'fileList' in body:
  40. fileList = body['fileList']
  41. del body['fileList']
  42. standard_type = body['standard_type']
  43. file_title = body['file_title']
  44. for file in fileList:
  45. print(file)
  46. create_time = file["create_time"]
  47. file_name = file['url']
  48. file_name_desc = file['name']
  49. status = file['status']
  50. new_file = HazardStandardsFile(
  51. file_id=new_guid(),
  52. # foreign_key=task_base.id,
  53. file_number=get_next_yjbh_id(db),
  54. from_scenario='task_file',
  55. file_name=file_name,
  56. standard_type=standard_type,
  57. file_title=file_title,
  58. file_name_desc=file_name_desc,
  59. status=status,
  60. create_time =create_time
  61. )
  62. db.add(new_file)
  63. db.commit()
  64. print(new_file)
  65. return {
  66. "code": 200,
  67. "msg": "succeed",
  68. "data": file_title
  69. }
  70. except Exception as e:
  71. db.rollback()
  72. traceback.print_exc()
  73. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  74. class DeleteFileRequest(BaseModel):
  75. file_id: List[str] # 修改为字符串列表
  76. # 删除文件接口
  77. @router.delete('/delete')
  78. async def delete_files(request_body: DeleteFileRequest, # 修改参数为请求体模型
  79. user_id=Depends(valid_access_token),
  80. db: Session = Depends(get_db)):
  81. try:
  82. # 获取文件ID列表
  83. file_ids = request_body.file_id
  84. # 查询要删除的文件
  85. hazard_files = db.query(HazardStandardsFile).filter(HazardStandardsFile.file_id.in_(file_ids)).all()
  86. # 如果没有找到任何文件,返回404错误
  87. if not hazard_files:
  88. raise HTTPException(status_code=404, detail="Files not found")
  89. # 更新删除标识
  90. for hazard_file in hazard_files:
  91. # 如果文件已经被删除,跳过并记录错误信息
  92. if hazard_file.del_flag == '2':
  93. print(f"File ID {hazard_file.file_id} already deleted.")
  94. continue
  95. hazard_file.del_flag = '2'
  96. hazard_file.update_time = datetime.now()
  97. # 提交更改到数据库
  98. db.commit()
  99. return {
  100. "code": 200,
  101. "msg": "Files marked as deleted",
  102. "data": file_ids
  103. }
  104. except Exception as e:
  105. db.rollback()
  106. traceback.print_exc()
  107. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  108. # 查询文件接口
  109. @router.post('/select')
  110. @router.get('/select')
  111. async def select_files(
  112. db: Session = Depends(get_db),
  113. file_title: str = Query(None, description="文件标题"),
  114. standard_type: str = Query(None, description="标准类型"),
  115. # sortBy: str = Query(None, description="排序字段"),
  116. # sortOrder: str = Query(None, description="排序顺序"),
  117. page: int = Query(1, gt=0, description="页码"),
  118. pageSize: int = Query(10, gt=0, le=100, description="每页大小")):
  119. try:
  120. data_query = db.query(HazardStandardsFile).filter(HazardStandardsFile.del_flag != '2')
  121. # 应用过滤条件
  122. # if file_title:
  123. # data_query = data_query.filter(HazardStandardsFile.file_title == file_title)
  124. if file_title:
  125. data_query = data_query.filter(HazardStandardsFile.file_title.like(f'%{file_title}%'))
  126. if standard_type:
  127. data_query = data_query.filter(HazardStandardsFile.standard_type == standard_type)
  128. # # 应用排序条件
  129. # if sortBy:
  130. # if hasattr(HazardStandardsFile, sortBy):
  131. # sort_attr = getattr(HazardStandardsFile, sortBy)
  132. # data_query = data_query.order_by(sort_attr.asc() if sortOrder == 'asc' else sort_attr.desc())
  133. total_count = data_query.count()
  134. offset = (page - 1) * pageSize
  135. data_query = data_query.offset(offset).limit(pageSize)
  136. rows = data_query.all()
  137. data = []
  138. for row in rows:
  139. info = {
  140. "file_id": row.file_id,
  141. "file_number": row.file_number,
  142. "file_name": row.file_name,
  143. "standard_type": row.standard_type,
  144. "file_name_desc": row.file_name_desc,
  145. "file_title": row.file_title,
  146. "create_time": row.create_time.strftime("%Y-%m-%d %H:%M:%S") # 格式化日期时间
  147. }
  148. data.append(info)
  149. return {
  150. "code": 200,
  151. "msg": "文件查询成功",
  152. "data": data,
  153. "total": total_count,
  154. "pages": (total_count + pageSize - 1) // pageSize,
  155. "current_page": page,
  156. "page_size": pageSize
  157. }
  158. except Exception as e:
  159. db.rollback()
  160. traceback.print_exc()
  161. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")