warehouse.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends, Query, HTTPException, status,WebSocket,WebSocketDisconnect
  4. from common.security import valid_access_token,valid_websocket_token
  5. from fastapi.responses import JSONResponse,StreamingResponse
  6. from common.db import db_czrz
  7. from sqlalchemy.orm import Session
  8. from sqlalchemy.sql import func
  9. from common.auth_user import *
  10. from sqlalchemy import text
  11. from pydantic import BaseModel
  12. from common.BigDataCenterAPI import *
  13. from database import get_db
  14. from typing import List
  15. from models import *
  16. from utils import *
  17. from utils.spatial import *
  18. from utils.ry_system_util import *
  19. from utils.resource_provision_util import *
  20. from common.websocketManager import *
  21. import json
  22. import traceback
  23. router = APIRouter()
  24. @router.post("/create")
  25. async def create_pattern(
  26. user_id=Depends(valid_access_token),
  27. body = Depends(remove_xss_json),
  28. db: Session = Depends(get_db)
  29. ):
  30. try:
  31. new_type = ResourceProvisionWarehouseInfo(
  32. warehouse_id = new_guid(),
  33. warehouse_name=body['warehouse_name'],
  34. status=body['status'],
  35. contact_person=body['contact_person'],
  36. contact_phone=body['contact_phone'],
  37. address=body['address'],
  38. type=body['type'],
  39. level=body['level'],
  40. storage_dept_id=body['storage_dept_id'],
  41. storage_dept_name='', #body['storage_dept_name']
  42. area_name=body['area_name'],
  43. longitude=body['longitude'],
  44. latitude=body['latitude'],
  45. area =body['area'],
  46. remark=body['remark'],
  47. create_by = user_id
  48. )
  49. db.add(new_type)
  50. db.commit()
  51. return {"code": 200, "msg": "创建成功", "data": None}
  52. except Exception as e:
  53. traceback.print_exc()
  54. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  55. @router.put("/update/{id}")
  56. async def update_pattern(
  57. id :str ,
  58. user_id=Depends(valid_access_token),
  59. body=Depends(remove_xss_json),
  60. db: Session = Depends(get_db)
  61. ):
  62. try:
  63. update_warehouse = warehouse_id_get_warehouse_info(db,id)
  64. if not update_warehouse:
  65. return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse not found"})
  66. update_warehouse.warehouse_name = body['warehouse_name']
  67. update_warehouse.status = body['status']
  68. update_warehouse.contact_person = body['contact_person']
  69. update_warehouse.contact_phone = body['contact_phone']
  70. update_warehouse.address = body['address']
  71. update_warehouse.type = body['type']
  72. update_warehouse.level = body['level']
  73. update_warehouse.storage_dept_id = body['storage_dept_id']
  74. update_warehouse.storage_dept_name = body['storage_dept_name']
  75. update_warehouse.area_name = body['area_name']
  76. update_warehouse.longitude = body['longitude']
  77. update_warehouse.latitude = body['latitude']
  78. update_warehouse.area = body['area']
  79. update_warehouse.remark = body['remark']
  80. update_warehouse.update_by = user_id
  81. db.commit()
  82. return {"code": 200, "msg": "更新成功"}
  83. except Exception as e:
  84. traceback.print_exc()
  85. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  86. @router.get("/info/{id}")
  87. async def get_pattern_info(
  88. id: str,
  89. user_id=Depends(valid_access_token),
  90. db: Session = Depends(get_db)
  91. ):
  92. try:
  93. info = warehouse_id_get_warehouse_info(db,id)
  94. if not info:
  95. return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse not found"})
  96. dept_info = dept_id_get_dept_info(db,info.storage_dept_id)
  97. data = {"warehouse_id": info.warehouse_id,
  98. "warehouse_name": info.warehouse_name,
  99. "status": info.status,
  100. "contact_person": info.contact_person,
  101. "contact_phone": info.contact_phone,
  102. "address": info.address,
  103. "remark": info.remark,
  104. "type": info.type,
  105. "level": info.level,
  106. "storage_dept_id": info.storage_dept_id,
  107. "storage_dept_name": dept_info.dept_name,
  108. "area_name": info.area_name,
  109. "longitude": info.longitude,
  110. "latitude": info.latitude,
  111. "create_by": info.create_by,
  112. "area":info.area,
  113. "create_time":info.create_time}
  114. return {"code": 200, "msg": "获取成功", "data": data}
  115. except Exception as e:
  116. traceback.print_exc()
  117. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  118. @router.get("/list")
  119. async def get_pattern_list(
  120. # name: str = Query(None, description='名称'),
  121. user_id=Depends(valid_access_token),
  122. page: int = Query(1, gt=0, description='页码'),
  123. pageSize: int = Query(None, gt=0, description='每页条目数量'),
  124. db: Session = Depends(get_db)
  125. ):
  126. try:
  127. query = db.query(ResourceProvisionWarehouseInfo)
  128. query = query.filter_by(del_flag='0')
  129. # if name:
  130. # query = query.filter(ResourceProvisionWarehouseInfo.material_category_name.like(f'%{name}%'))
  131. total_items = query.count()
  132. if pageSize is None:
  133. pageSize=total_items
  134. # 排序
  135. query = query.order_by(ResourceProvisionWarehouseInfo.create_time.desc())
  136. # 执行分页查询
  137. lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
  138. data = [ ]
  139. for info in lists:
  140. dept_info = dept_id_get_dept_info(db, info.storage_dept_id)
  141. data.append({"warehouse_id": info.warehouse_id,
  142. "warehouse_name": info.warehouse_name,
  143. "status": info.status,
  144. "contact_person": info.contact_person,
  145. "contact_phone": info.contact_phone,
  146. "address": info.address,
  147. "remark": info.remark,
  148. "type": info.type,
  149. "level": info.level,
  150. "storage_dept_id": info.storage_dept_id,
  151. "storage_dept_name": dept_info.dept_name,
  152. "area_name": info.area_name,
  153. "longitude": info.longitude,
  154. "latitude": info.latitude,
  155. "create_by": info.create_by,
  156. "area":info.area,
  157. "create_time":info.create_time})
  158. return {"code": 200, "msg": "查询成功", "data": data,
  159. "total": total_items,
  160. "page": page,
  161. "pageSize": pageSize,
  162. "totalPages": (total_items + pageSize - 1) // pageSize
  163. }
  164. except Exception as e:
  165. traceback.print_exc()
  166. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  167. @router.get("/export")
  168. async def export_data(
  169. request: Request,
  170. # name: str = Query(None, description='名称'),
  171. user_id=Depends(valid_access_token),
  172. auth_user: AuthUser = Depends(find_auth_user),
  173. db: Session = Depends(get_db)
  174. ):
  175. try:
  176. query = db.query(ResourceProvisionWarehouseInfo)
  177. query = query.filter_by(del_flag='0')
  178. # if name:
  179. # query = query.filter(ResourceProvisionWarehouseInfo.material_category_name.like(f'%{name}%'))
  180. # 排序
  181. query = query.order_by(ResourceProvisionWarehouseInfo.create_time.desc())
  182. # 执行分页查询
  183. lists = query.all()
  184. data = []
  185. for info in lists:
  186. dept_info = dept_id_get_dept_info(db, info.storage_dept_id)
  187. data.append({"仓库id": info.warehouse_id,
  188. "仓库": info.warehouse_name,
  189. "状态": info.status,
  190. "联系人": info.contact_person,
  191. "联系电话": info.contact_phone,
  192. "地址": info.address,
  193. "备注": info.remark,
  194. "类型": info.type,
  195. "等级": info.level,
  196. "物资保管部门id": info.storage_dept_id,
  197. "物资保管部门名称": dept_info.dept_name,
  198. "地区": info.area_name,
  199. "经度": info.longitude,
  200. "纬度": info.latitude,
  201. "创建者": info.create_by,
  202. "占地面积(平方米)":info.area,
  203. "数据创建时间":info.create_time})
  204. # 返回结果
  205. import pandas as pd
  206. from io import BytesIO
  207. # 将查询结果转换为 DataFrame
  208. df = pd.DataFrame(data)
  209. # 将 DataFrame 导出为 Excel 文件
  210. output = BytesIO()
  211. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  212. df.to_excel(writer, index=False)
  213. # 设置响应头
  214. output.seek(0)
  215. from urllib.parse import quote
  216. encoded_filename = f'仓库明细{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  217. encoded_filename = quote(encoded_filename, encoding='utf-8')
  218. headers = {
  219. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  220. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  221. }
  222. db_czrz.log(db, auth_user, "物资储备管理", f"物资储备管理仓库明细导出数据成功", request.client.host)
  223. # 返回文件流
  224. return StreamingResponse(output, headers=headers)
  225. except Exception as e:
  226. traceback.print_exc()
  227. return JSONResponse(status_code=500, content={"code": 500, "msg": f"Internal server error: {str(e)}"})
  228. @router.delete("/delete/{id}")
  229. async def delete_pattern(
  230. id: str,
  231. user_id=Depends(valid_access_token),
  232. db: Session = Depends(get_db)
  233. ):
  234. try:
  235. # 检查图案是否存在
  236. info = warehouse_id_get_warehouse_info(db, id)
  237. if not info:
  238. return JSONResponse(status_code=404, content={"code": 404, "msg": "warehouse not found"})
  239. info.del_flag='2'
  240. db.commit()
  241. return {"code": 200, "msg": "删除成功"}
  242. except Exception as e:
  243. traceback.print_exc()
  244. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")