controller.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. # -*- coding: utf-8 -*-
  2. import httpx
  3. from fastapi import APIRouter, Depends, UploadFile, Body, Path, Query
  4. from fastapi.responses import StreamingResponse, JSONResponse
  5. from redis.asyncio import Redis
  6. from app.common.response import SuccessResponse, StreamResponse
  7. from app.config.setting import settings
  8. from app.core.dependencies import AuthPermission, redis_getter
  9. from app.api.v1.module_system.auth.schema import AuthSchema
  10. from app.core.base_params import PaginationQueryParam
  11. from app.utils.common_util import bytes2file_response
  12. from app.core.logger import log
  13. from app.core.base_schema import BatchSetAvailable
  14. from .service import BizCraneService
  15. from .schema import BizCraneCreateSchema, BizCraneUpdateSchema, BizCraneQueryParam
  16. BizCraneRouter = APIRouter(prefix='/crane', tags=["行车信息模块"])
  17. @BizCraneRouter.get("/detail/{id}", summary="获取行车信息详情", description="获取行车信息详情")
  18. async def get_crane_detail_controller(
  19. id: int = Path(..., description="ID"),
  20. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:query"]))
  21. ) -> JSONResponse:
  22. """获取行车信息详情接口"""
  23. result_dict = await BizCraneService.detail_crane_service(auth=auth, id=id)
  24. log.info(f"获取行车信息详情成功 {id}")
  25. return SuccessResponse(data=result_dict, msg="获取行车信息详情成功")
  26. @BizCraneRouter.get("/detailForNo/{crane_no}", summary="获取行车信息详情", description="获取行车信息详情")
  27. async def get_crane_detail_controller(
  28. crane_no: str = Path(..., description="CraneNo"),
  29. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:query"]))
  30. ) -> JSONResponse:
  31. """获取行车信息详情接口"""
  32. result_dict = await BizCraneService.detail_crane_service_for_no(auth=auth, crane_no=crane_no)
  33. log.info(f"获取行车信息详情成功 {id}")
  34. return SuccessResponse(data=result_dict, msg="获取行车信息详情成功")
  35. @BizCraneRouter.get("/list", summary="查询行车信息列表", description="查询行车信息列表")
  36. async def get_crane_list_controller(
  37. page: PaginationQueryParam = Depends(),
  38. search: BizCraneQueryParam = Depends(),
  39. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:query"]))
  40. ) -> JSONResponse:
  41. """查询行车信息列表接口(数据库分页)"""
  42. result_dict = await BizCraneService.page_crane_service(
  43. auth=auth,
  44. page_no=page.page_no if page.page_no is not None else 1,
  45. page_size=page.page_size if page.page_size is not None else 10,
  46. search=search,
  47. order_by=page.order_by
  48. )
  49. log.info("查询行车信息列表成功")
  50. return SuccessResponse(data=result_dict, msg="查询行车信息列表成功")
  51. @BizCraneRouter.get("/list_status", summary="查询行车信息列表", description="查询行车信息列表")
  52. async def get_crane_list_status_controller(
  53. page: PaginationQueryParam = Depends(),
  54. search: BizCraneQueryParam = Depends(),
  55. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:query"]))
  56. ) -> JSONResponse:
  57. """查询行车信息列表接口(数据库分页)"""
  58. result_dict = await BizCraneService.page_crane_service(
  59. auth=auth,
  60. page_no=page.page_no if page.page_no is not None else 1,
  61. page_size=page.page_size if page.page_size is not None else 10,
  62. search=search,
  63. order_by=page.order_by
  64. )
  65. #请求采集接口获取状态信息
  66. async with httpx.AsyncClient() as client:
  67. response = await client.get(
  68. url=settings.COLLECT_DATA_FULL,
  69. params={},
  70. timeout=2
  71. )
  72. if response.status_code == 200:
  73. json_data = response.json()
  74. if json_data['code'] == 200 and json_data['data']:
  75. for item in result_dict['items']:
  76. crane_no = item['crane_no']
  77. crane_data = json_data.get('data').get(crane_no)
  78. if crane_data:
  79. item['work_status'] = crane_data.get('data').get('status').get('status')
  80. log.info("查询行车信息列表成功")
  81. return SuccessResponse(data=result_dict, msg="查询行车信息列表成功")
  82. @BizCraneRouter.post("/create", summary="创建行车信息", description="创建行车信息")
  83. async def create_crane_controller(
  84. data: BizCraneCreateSchema,
  85. redis: Redis = Depends(redis_getter),
  86. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:create"]))
  87. ) -> JSONResponse:
  88. """创建行车信息接口"""
  89. result_dict = await BizCraneService.create_crane_service(auth=auth, data=data,redis=redis)
  90. log.info("创建行车信息成功")
  91. return SuccessResponse(data=result_dict, msg="创建行车信息成功")
  92. @BizCraneRouter.put("/update/{id}", summary="修改行车信息", description="修改行车信息")
  93. async def update_crane_controller(
  94. data: BizCraneUpdateSchema,
  95. id: int = Path(..., description="ID"),
  96. redis: Redis = Depends(redis_getter),
  97. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:update"]))
  98. ) -> JSONResponse:
  99. """修改行车信息接口"""
  100. result_dict = await BizCraneService.update_crane_service(auth=auth, id=id, data=data,redis=redis)
  101. log.info("修改行车信息成功")
  102. return SuccessResponse(data=result_dict, msg="修改行车信息成功")
  103. @BizCraneRouter.delete("/delete", summary="删除行车信息", description="删除行车信息")
  104. async def delete_crane_controller(
  105. ids: list[int] = Body(..., description="ID列表"),
  106. redis: Redis = Depends(redis_getter),
  107. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:delete"]))
  108. ) -> JSONResponse:
  109. """删除行车信息接口"""
  110. await BizCraneService.delete_crane_service(auth=auth, ids=ids,redis=redis)
  111. log.info(f"删除行车信息成功: {ids}")
  112. return SuccessResponse(msg="删除行车信息成功")
  113. @BizCraneRouter.patch("/available/setting", summary="批量修改行车信息状态", description="批量修改行车信息状态")
  114. async def batch_set_available_crane_controller(
  115. data: BatchSetAvailable,
  116. redis: Redis = Depends(redis_getter),
  117. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:patch"]))
  118. ) -> JSONResponse:
  119. """批量修改行车信息状态接口"""
  120. await BizCraneService.set_available_crane_service(auth=auth, data=data,redis=redis)
  121. log.info(f"批量修改行车信息状态成功: {data.ids}")
  122. return SuccessResponse(msg="批量修改行车信息状态成功")
  123. @BizCraneRouter.post('/export', summary="导出行车信息", description="导出行车信息")
  124. async def export_crane_list_controller(
  125. search: BizCraneQueryParam = Depends(),
  126. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:export"]))
  127. ) -> StreamingResponse:
  128. """导出行车信息接口"""
  129. result_dict_list = await BizCraneService.list_crane_service(search=search, auth=auth)
  130. export_result = await BizCraneService.batch_export_crane_service(obj_list=result_dict_list)
  131. log.info('导出行车信息成功')
  132. return StreamResponse(
  133. data=bytes2file_response(export_result),
  134. media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  135. headers={
  136. 'Content-Disposition': 'attachment; filename=biz_crane.xlsx'
  137. }
  138. )
  139. @BizCraneRouter.post('/import', summary="导入行车信息", description="导入行车信息")
  140. async def import_crane_list_controller(
  141. file: UploadFile,
  142. auth: AuthSchema = Depends(AuthPermission(["module_business:crane:import"]))
  143. ) -> JSONResponse:
  144. """导入行车信息接口"""
  145. batch_import_result = await BizCraneService.batch_import_crane_service(file=file, auth=auth, update_support=True)
  146. log.info("导入行车信息成功")
  147. return SuccessResponse(data=batch_import_result, msg="导入行车信息成功")
  148. @BizCraneRouter.post('/download/template', summary="获取行车信息导入模板", description="获取行车信息导入模板", dependencies=[Depends(AuthPermission(["module_business:crane:download"]))])
  149. async def export_crane_template_controller() -> StreamingResponse:
  150. """获取行车信息导入模板接口"""
  151. import_template_result = await BizCraneService.import_template_download_crane_service()
  152. log.info('获取行车信息导入模板成功')
  153. return StreamResponse(
  154. data=bytes2file_response(import_template_result),
  155. media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  156. headers={'Content-Disposition': 'attachment; filename=biz_crane_template.xlsx'}
  157. )