doc.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. from fastapi import APIRouter, Request, Depends, HTTPException, Query
  2. from sqlalchemy.exc import IntegrityError
  3. from fastapi.responses import HTMLResponse, FileResponse
  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 models import *
  9. import json
  10. import os
  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 xlrd
  21. router = APIRouter()
  22. # 目录在文档上传接口写死
  23. UPLOAD_mergefile_PATH = '/data/upload/mergefile'
  24. # 获取预案结构化文档
  25. @router.post('/detail')
  26. async def doc(
  27. request: Request,
  28. db: Session = Depends(get_db),
  29. body = Depends(remove_xss_json),
  30. user_id = Depends(valid_access_token)
  31. ):
  32. plan_id = body['plan_id']
  33. items = []
  34. rows = db.query(EmergencyDoc).filter(and_(EmergencyDoc.pid == 0, EmergencyDoc.plan_id == plan_id)).all()
  35. for row in rows:
  36. items.append(get_item_data(db, row.id, 1))
  37. return {
  38. 'code': 200,
  39. 'msg': '查询成功',
  40. 'data': items
  41. }
  42. def get_item_data(db: Session, id: int, level: int):
  43. data = []
  44. row = db.query(EmergencyDoc).filter(EmergencyDoc.id == id).first()
  45. if row is not None:
  46. pid = row.id
  47. data = get_model_dict(row)
  48. data['level'] = level
  49. if data['value'] is None:
  50. data['value'] = ''
  51. data['items'] = []
  52. rows = db.query(EmergencyDoc).filter(EmergencyDoc.pid == pid).all()
  53. for row in rows:
  54. item = get_item_data(db, row.id, level + 1)
  55. data['items'].append(item)
  56. if len(data['items']) == 0 and level == 2:
  57. del data['items']
  58. data['id'] = data['plan_id']+str(data['id'])
  59. data['href'] = "#" + data['id']
  60. data['containerRef'] = "containerRef" + data['id']
  61. data['value'] = data['value'].replace("\r\n", "<br/>")
  62. return data
  63. @router.post('/import')
  64. async def import_doc(
  65. request: Request,
  66. db: Session = Depends(get_db),
  67. body = Depends(remove_xss_json),
  68. user_id = Depends(valid_access_token)
  69. ):
  70. print(body)
  71. try:
  72. plan_id = body['plan_id']
  73. filename = body['filename']
  74. if len(filename) == 0:
  75. raise Exception()
  76. file = filename[0]
  77. url = file['url']
  78. file_path = f"{UPLOAD_mergefile_PATH}/uploads/{url}"
  79. file_path = os.path.abspath(file_path)
  80. print(file_path)
  81. book = xlrd.open_workbook(file_path)
  82. sheet = book.sheet_by_index(0)
  83. data = []
  84. for i in range(9, sheet.nrows):
  85. # 预案名称
  86. plan_name = sheet.cell(i, 0).value
  87. # 一级目录
  88. title1 = sheet.cell(i, 1).value
  89. # 二级目录
  90. title2 = sheet.cell(i, 2).value
  91. # 正文
  92. content = sheet.cell(i, 3).value
  93. if len(plan_name) < 1 and len(title1) < 1 and len(title2) < 1 and len(content) < 1 :
  94. break
  95. data.append({
  96. 'plan_name': plan_name,
  97. 'title1': title1,
  98. 'title2': title2,
  99. 'content': content,
  100. })
  101. if len(data) > 0:
  102. db.query(EmergencyDoc).filter(EmergencyDoc.plan_id == plan_id).delete()
  103. db.commit()
  104. title1 = ''
  105. content = ''
  106. docs = []
  107. for n in data:
  108. if n['title1'] != '':
  109. if len(docs) > 0:
  110. add_doc(db, title1, content, docs, plan_id)
  111. docs = []
  112. title1 = n['title1']
  113. content = n['content']
  114. if n['title2'] != '':
  115. docs.append(n)
  116. continue
  117. docs.append(n)
  118. if len(docs) > 0:
  119. add_doc(db, title1, content, docs, plan_id)
  120. return {
  121. 'code': 200,
  122. 'msg': '导入成功'
  123. }
  124. except Exception:
  125. traceback.print_exc()
  126. return {
  127. 'code': 500,
  128. 'msg': '导入发生异常'
  129. }
  130. def add_doc(db: Session, title: str, content: str, docs: list, plan_id: str):
  131. main_entity = EmergencyDoc(title = title, value= content, pid = 0, plan_id = plan_id)
  132. db.add(main_entity)
  133. db.commit()
  134. db.refresh(main_entity)
  135. main_id = main_entity.id
  136. for n in docs:
  137. sub_entity = EmergencyDoc(title = n['title2'], value= n['content'], pid = main_id, plan_id = plan_id)
  138. db.add(sub_entity)
  139. db.commit()