controller.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. # -*- coding: utf-8 -*-
  2. from fastapi import APIRouter, Body, Depends, Path
  3. from fastapi.responses import JSONResponse, StreamingResponse
  4. from redis.asyncio.client import Redis
  5. from app.common.response import StreamResponse, SuccessResponse
  6. from app.common.request import PaginationService
  7. from app.core.base_params import PaginationQueryParam
  8. from app.core.base_schema import BatchSetAvailable
  9. from app.core.dependencies import AuthPermission, redis_getter
  10. from app.core.logger import log
  11. from app.core.router_class import OperationLogRoute
  12. from app.utils.common_util import bytes2file_response
  13. from ..auth.schema import AuthSchema
  14. from .service import DictTypeService, DictDataService
  15. from .schema import (
  16. DictTypeCreateSchema,
  17. DictTypeUpdateSchema,
  18. DictDataCreateSchema,
  19. DictDataUpdateSchema,
  20. DictDataQueryParam,
  21. DictTypeQueryParam
  22. )
  23. DictRouter = APIRouter(route_class=OperationLogRoute, prefix="/dict", tags=["字典管理"])
  24. @DictRouter.get("/type/detail/{id}", summary="获取字典类型详情", description="获取字典类型详情")
  25. async def get_type_detail_controller(
  26. id: int = Path(..., description="字典类型ID", ge=1),
  27. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_type:query"]))
  28. ) -> JSONResponse:
  29. """
  30. 获取字典类型详情
  31. 参数:
  32. - id (int): 字典类型ID
  33. - auth (AuthSchema): 认证信息模型
  34. 返回:
  35. - JSONResponse: 包含字典类型详情的响应模型
  36. 异常:
  37. - CustomException: 获取字典类型详情失败时抛出异常。
  38. """
  39. result_dict = await DictTypeService.get_obj_detail_service(id=id, auth=auth)
  40. log.info(f"获取字典类型详情成功 {id}")
  41. return SuccessResponse(data=result_dict, msg="获取字典类型详情成功")
  42. @DictRouter.get("/type/list", summary="查询字典类型", description="查询字典类型")
  43. async def get_type_list_controller(
  44. page: PaginationQueryParam = Depends(),
  45. search: DictTypeQueryParam = Depends(),
  46. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_type:query"]))
  47. ) -> JSONResponse:
  48. """
  49. 查询字典类型
  50. 参数:
  51. - page (PaginationQueryParam): 分页参数模型
  52. - search (DictTypeQueryParam): 查询参数模型
  53. - auth (AuthSchema): 认证信息模型
  54. 返回:
  55. - JSONResponse: 包含查询字典类型结果的响应模型
  56. 异常:
  57. - CustomException: 查询字典类型失败时抛出异常。
  58. """
  59. result_dict_list = await DictTypeService.get_obj_list_service(auth=auth, search=search, order_by=page.order_by)
  60. result_dict = await PaginationService.paginate(data_list= result_dict_list, page_no= page.page_no, page_size = page.page_size)
  61. log.info(f"查询字典类型列表成功")
  62. return SuccessResponse(data=result_dict, msg="查询字典类型列表成功")
  63. @DictRouter.get("/type/optionselect", summary="获取全部字典类型", description="获取全部字典类型")
  64. async def get_type_loptionselect_controller(
  65. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_type:query"]))
  66. ) -> JSONResponse:
  67. """
  68. 获取全部字典类型
  69. 参数:
  70. - auth (AuthSchema): 认证信息模型
  71. 返回:
  72. - JSONResponse: 包含全部字典类型的响应模型
  73. 异常:
  74. - CustomException: 获取字典类型列表失败时抛出异常。
  75. """
  76. result_dict_list = await DictTypeService.get_obj_list_service(auth=auth)
  77. log.info(f"获取字典类型列表成功")
  78. return SuccessResponse(data=result_dict_list, msg="获取字典类型列表成功")
  79. @DictRouter.post("/type/create", summary="创建字典类型", description="创建字典类型")
  80. async def create_type_controller(
  81. data: DictTypeCreateSchema,
  82. redis: Redis = Depends(redis_getter),
  83. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_type:create"]))
  84. ) -> JSONResponse:
  85. """
  86. 创建字典类型
  87. 参数:
  88. - data (DictTypeCreateSchema): 创建字典类型的入参模型
  89. - redis (Redis): Redis数据库连接
  90. - auth (AuthSchema): 认证信息模型
  91. 返回:
  92. - JSONResponse: 包含创建字典类型结果的响应模型
  93. 异常:
  94. - CustomException: 创建字典类型失败时抛出异常。
  95. """
  96. result_dict = await DictTypeService.create_obj_service(auth=auth, redis=redis, data=data)
  97. log.info(f"创建字典类型成功: {result_dict}")
  98. return SuccessResponse(data=result_dict, msg="创建字典类型成功")
  99. @DictRouter.put("/type/update/{id}", summary="修改字典类型", description="修改字典类型")
  100. async def update_type_controller(
  101. data: DictTypeUpdateSchema,
  102. redis: Redis = Depends(redis_getter),
  103. id: int = Path(..., description="字典类型ID", ge=1),
  104. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_type:update"]))
  105. ) -> JSONResponse:
  106. """
  107. 修改字典类型
  108. 参数:
  109. - data (DictTypeUpdateSchema): 修改字典类型的入参模型
  110. - redis (Redis): Redis数据库连接
  111. - id (int): 字典类型ID
  112. - auth (AuthSchema): 认证信息模型
  113. 返回:
  114. - JSONResponse: 包含修改字典类型结果的响应模型
  115. 异常:
  116. - CustomException: 修改字典类型失败时抛出异常。
  117. """
  118. result_dict = await DictTypeService.update_obj_service(auth=auth, redis=redis, id=id, data=data)
  119. log.info(f"修改字典类型成功: {result_dict}")
  120. return SuccessResponse(data=result_dict, msg="修改字典类型成功")
  121. @DictRouter.delete("/type/delete", summary="删除字典类型", description="删除字典类型")
  122. async def delete_type_controller(
  123. redis: Redis = Depends(redis_getter),
  124. ids: list[int] = Body(..., description="ID列表"),
  125. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_type:delete"]))
  126. ) -> JSONResponse:
  127. """
  128. 删除字典类型
  129. 参数:
  130. - redis (Redis): Redis数据库连接
  131. - ids (list[int]): 字典类型ID列表
  132. - auth (AuthSchema): 认证信息模型
  133. 返回:
  134. - JSONResponse: 包含删除字典类型结果的响应模型
  135. 异常:
  136. - CustomException: 删除字典类型失败时抛出异常。
  137. """
  138. await DictTypeService.delete_obj_service(auth=auth, redis=redis, ids=ids)
  139. log.info(f"删除字典类型成功: {ids}")
  140. return SuccessResponse(msg="删除字典类型成功")
  141. @DictRouter.patch("/type/available/setting", summary="批量修改字典类型状态", description="批量修改字典类型状态")
  142. async def batch_set_available_dict_type_controller(
  143. data: BatchSetAvailable,
  144. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_type:patch"]))
  145. ) -> JSONResponse:
  146. """
  147. 批量修改字典类型状态
  148. 参数:
  149. - data (BatchSetAvailable): 批量修改字典类型状态负载模型
  150. - auth (AuthSchema): 认证信息模型
  151. 返回:
  152. - JSONResponse: 包含批量修改字典类型状态结果的响应模型
  153. 异常:
  154. - CustomException: 批量修改字典类型状态失败时抛出异常。
  155. """
  156. await DictTypeService.set_obj_available_service(auth=auth, data=data)
  157. log.info(f"批量修改字典类型状态成功: {data.ids}")
  158. return SuccessResponse(msg="批量修改字典类型状态成功")
  159. @DictRouter.post('/type/export', summary="导出字典类型", description="导出字典类型")
  160. async def export_type_list_controller(
  161. search: DictTypeQueryParam = Depends(),
  162. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_type:export"]))
  163. ) -> StreamingResponse:
  164. """
  165. 导出字典类型
  166. 参数:
  167. - search (DictTypeQueryParam): 查询参数模型
  168. - auth (AuthSchema): 认证信息模型
  169. 返回:
  170. - StreamingResponse: 包含导出字典类型结果的响应模型
  171. 异常:
  172. - CustomException: 导出字典类型失败时抛出异常。
  173. """
  174. # 获取全量数据
  175. result_dict_list = await DictTypeService.get_obj_list_service(search=search, auth=auth)
  176. export_result = await DictTypeService.export_obj_service(data_list=result_dict_list)
  177. log.info('导出字典类型成功')
  178. return StreamResponse(
  179. data=bytes2file_response(export_result),
  180. media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  181. headers = {
  182. 'Content-Disposition': 'attachment; filename=dict_type.xlsx'
  183. }
  184. )
  185. @DictRouter.get("/data/detail/{id}", summary="获取字典数据详情", description="获取字典数据详情")
  186. async def get_data_detail_controller(
  187. id: int = Path(..., description="字典数据ID", ge=1),
  188. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_data:query"]))
  189. ) -> JSONResponse:
  190. """
  191. 获取字典数据详情
  192. 参数:
  193. - id (int): 字典数据ID
  194. - auth (AuthSchema): 认证信息模型
  195. 返回:
  196. - JSONResponse: 包含字典数据详情的响应模型
  197. 异常:
  198. - CustomException: 获取字典数据详情失败时抛出异常。
  199. """
  200. result_dict = await DictDataService.get_obj_detail_service(id=id, auth=auth)
  201. log.info(f"获取字典数据详情成功 {id}")
  202. return SuccessResponse(data=result_dict, msg="获取字典数据详情成功")
  203. @DictRouter.get("/data/list", summary="查询字典数据", description="查询字典数据")
  204. async def get_data_list_controller(
  205. page: PaginationQueryParam = Depends(),
  206. search: DictDataQueryParam = Depends(),
  207. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_data:query"]))
  208. ) -> JSONResponse:
  209. """
  210. 查询字典数据
  211. 参数:
  212. - page (PaginationQueryParam): 分页查询参数模型
  213. - search (DictDataQueryParam): 查询参数模型
  214. - auth (AuthSchema): 认证信息模型
  215. 返回:
  216. - JSONResponse: 包含字典数据列表的响应模型
  217. 异常:
  218. - CustomException: 查询字典数据列表失败时抛出异常。
  219. """
  220. order_by = [{"order": "asc"}]
  221. if page.order_by:
  222. order_by = page.order_by
  223. result_dict_list = await DictDataService.get_obj_list_service(auth=auth, search=search, order_by=order_by)
  224. result_dict = await PaginationService.paginate(data_list= result_dict_list, page_no= page.page_no, page_size = page.page_size)
  225. log.info(f"查询字典数据列表成功")
  226. return SuccessResponse(data=result_dict, msg="查询字典数据列表成功")
  227. @DictRouter.post("/data/create", summary="创建字典数据", description="创建字典数据")
  228. async def create_data_controller(
  229. data: DictDataCreateSchema,
  230. redis: Redis = Depends(redis_getter),
  231. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_data:create"]))
  232. ) -> JSONResponse:
  233. """
  234. 创建字典数据
  235. 参数:
  236. - data (DictDataCreateSchema): 创建字典数据负载模型
  237. - redis (Redis): Redis数据库连接
  238. - auth (AuthSchema): 认证信息模型
  239. 返回:
  240. - JSONResponse: 包含创建字典数据结果的响应模型
  241. 异常:
  242. - CustomException: 创建字典数据失败时抛出异常。
  243. """
  244. result_dict = await DictDataService.create_obj_service(auth=auth, redis=redis, data=data)
  245. log.info(f"创建字典数据成功: {result_dict}")
  246. return SuccessResponse(data=result_dict, msg="创建字典数据成功")
  247. @DictRouter.put("/data/update/{id}", summary="修改字典数据", description="修改字典数据")
  248. async def update_data_controller(
  249. data: DictDataUpdateSchema,
  250. redis: Redis = Depends(redis_getter),
  251. id: int = Path(..., description="字典数据ID"),
  252. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_data:update"]))
  253. ) -> JSONResponse:
  254. """
  255. 修改字典数据
  256. 参数:
  257. - data (DictDataUpdateSchema): 修改字典数据负载模型
  258. - redis (Redis): Redis数据库连接
  259. - id (int): 字典数据ID
  260. - auth (AuthSchema): 认证信息模型
  261. 返回:
  262. - JSONResponse: 包含修改字典数据结果的响应模型
  263. 异常:
  264. - CustomException: 修改字典数据失败时抛出异常。
  265. """
  266. result_dict = await DictDataService.update_obj_service(auth=auth, redis=redis, id=id, data=data)
  267. log.info(f"修改字典数据成功: {result_dict}")
  268. return SuccessResponse(data=result_dict, msg="修改字典数据成功")
  269. @DictRouter.delete("/data/delete", summary="删除字典数据", description="删除字典数据")
  270. async def delete_data_controller(
  271. redis: Redis = Depends(redis_getter),
  272. ids: list[int] = Body(..., description="ID列表"),
  273. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_data:delete"]))
  274. ) -> JSONResponse:
  275. """
  276. 删除字典数据
  277. 参数:
  278. - redis (Redis): Redis数据库连接
  279. - ids (list[int]): 字典数据ID列表
  280. - auth (AuthSchema): 认证信息模型
  281. 返回:
  282. - JSONResponse: 包含删除字典数据结果的响应模型
  283. 异常:
  284. - CustomException: 删除字典数据失败时抛出异常。
  285. """
  286. await DictDataService.delete_obj_service(auth=auth, redis=redis, ids=ids)
  287. log.info(f"删除字典数据成功: {ids}")
  288. return SuccessResponse(msg="删除字典数据成功")
  289. @DictRouter.patch("/data/available/setting", summary="批量修改字典数据状态", description="批量修改字典数据状态")
  290. async def batch_set_available_dict_data_controller(
  291. data: BatchSetAvailable,
  292. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_data:patch"]))
  293. ) -> JSONResponse:
  294. """
  295. 批量修改字典数据状态
  296. 参数:
  297. - data (BatchSetAvailable): 批量修改字典数据状态负载模型
  298. - auth (AuthSchema): 认证信息模型
  299. 返回:
  300. - JSONResponse: 包含批量修改字典数据状态结果的响应模型
  301. 异常:
  302. - CustomException: 批量修改字典数据状态失败时抛出异常。
  303. """
  304. await DictDataService.set_obj_available_service(auth=auth, data=data)
  305. log.info(f"批量修改字典数据状态成功: {data.ids}")
  306. return SuccessResponse(msg="批量修改字典数据状态成功")
  307. @DictRouter.post('/data/export', summary="导出字典数据", description="导出字典数据")
  308. async def export_data_list_controller(
  309. search: DictDataQueryParam = Depends(),
  310. page: PaginationQueryParam = Depends(),
  311. auth: AuthSchema = Depends(AuthPermission(["module_system:dict_data:export"]))
  312. ) -> StreamingResponse:
  313. """
  314. 导出字典数据
  315. 参数:
  316. - search (DictDataQueryParam): 查询参数模型
  317. - page (PaginationQueryParam): 分页参数模型
  318. - auth (AuthSchema): 认证信息模型
  319. 返回:
  320. - StreamingResponse: 包含导出字典数据结果的响应模型
  321. 异常:
  322. - CustomException: 导出字典数据失败时抛出异常。
  323. """
  324. result_dict_list = await DictDataService.get_obj_list_service(auth=auth, search=search, order_by=page.order_by)
  325. export_result = await DictDataService.export_obj_service(data_list=result_dict_list)
  326. log.info('导出字典数据成功')
  327. return StreamResponse(
  328. data=bytes2file_response(export_result),
  329. media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  330. headers = {
  331. 'Content-Disposition': 'attachment; filename=dice_data.xlsx'
  332. }
  333. )
  334. @DictRouter.get('/data/info/{dict_type}', summary="根据字典类型获取数据", description="根据字典类型获取数据")
  335. async def get_init_dict_data_controller(
  336. dict_type: str,
  337. redis: Redis = Depends(redis_getter)
  338. ) -> JSONResponse:
  339. """
  340. 根据字典类型获取数据
  341. 参数:
  342. - dict_type (str): 字典类型
  343. - redis (Redis): Redis数据库连接
  344. 返回:
  345. - JSONResponse: 包含根据字典类型获取数据结果的响应模型
  346. 异常:
  347. - CustomException: 根据字典类型获取数据失败时抛出异常。
  348. """
  349. dict_data_query_result = await DictDataService.get_init_dict_service(
  350. redis=redis, dict_type=dict_type
  351. )
  352. log.info(f"获取初始化字典数据成功:{dict_data_query_result}")
  353. return SuccessResponse(data=dict_data_query_result, msg="获取初始化字典数据成功")