dict_item_view.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. """
  2. 字典项管理API路由
  3. """
  4. import sys
  5. import os
  6. import logging
  7. from datetime import datetime, timezone
  8. sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../..'))
  9. from fastapi import APIRouter, Depends, HTTPException
  10. from app.schemas.base import ApiResponse
  11. from app.system.schemas.dict_item_schema import (
  12. DictItemCreate, DictItemUpdate, DictItemListRequest, DictItemBatchDeleteRequest
  13. )
  14. from app.services.dict_item_service import DictItemService
  15. from app.utils.auth_dependency import get_current_user_with_refresh
  16. logger = logging.getLogger(__name__)
  17. router = APIRouter(prefix="/dict/item", tags=["字典项管理"])
  18. @router.post("/list")
  19. async def get_item_list(
  20. request: DictItemListRequest,
  21. current_user: dict = Depends(get_current_user_with_refresh)
  22. ):
  23. """
  24. 获取字典项列表(分页)
  25. """
  26. try:
  27. service = DictItemService()
  28. items, total = await service.get_item_list(
  29. page=request.page,
  30. page_size=request.page_size,
  31. category_id=request.category_id,
  32. keyword=request.keyword,
  33. enable_flag=request.enable_flag
  34. )
  35. return ApiResponse(
  36. code="000000",
  37. message="成功",
  38. data={
  39. "list": items,
  40. "total": total,
  41. "page": request.page,
  42. "page_size": request.page_size
  43. },
  44. timestamp=datetime.now(timezone.utc).isoformat()
  45. ).model_dump()
  46. except Exception as e:
  47. logger.exception("获取字典项列表错误")
  48. return ApiResponse(
  49. code="500001",
  50. message="服务器内部错误",
  51. timestamp=datetime.now(timezone.utc).isoformat()
  52. ).model_dump()
  53. @router.get("/{dict_id}")
  54. async def get_item_detail(
  55. dict_id: int,
  56. current_user: dict = Depends(get_current_user_with_refresh)
  57. ):
  58. """
  59. 获取字典项详情
  60. """
  61. try:
  62. service = DictItemService()
  63. item = await service.get_item_by_id(dict_id)
  64. if not item:
  65. return ApiResponse(
  66. code="300001",
  67. message="字典项不存在",
  68. timestamp=datetime.now(timezone.utc).isoformat()
  69. ).model_dump()
  70. return ApiResponse(
  71. code="000000",
  72. message="成功",
  73. data=item,
  74. timestamp=datetime.now(timezone.utc).isoformat()
  75. ).model_dump()
  76. except Exception as e:
  77. logger.exception(f"获取字典项详情错误: dict_id={dict_id}")
  78. return ApiResponse(
  79. code="500001",
  80. message="服务器内部错误",
  81. timestamp=datetime.now(timezone.utc).isoformat()
  82. ).model_dump()
  83. @router.post("")
  84. async def create_item(
  85. item: DictItemCreate,
  86. current_user: dict = Depends(get_current_user_with_refresh)
  87. ):
  88. """
  89. 创建字典项
  90. """
  91. try:
  92. user_id = current_user.get("sub")
  93. service = DictItemService()
  94. success, message, dict_id = await service.create_item(
  95. item.model_dump(),
  96. user_id
  97. )
  98. if success:
  99. return ApiResponse(
  100. code="000000",
  101. message=message,
  102. data={"dict_id": dict_id},
  103. timestamp=datetime.now(timezone.utc).isoformat()
  104. ).model_dump()
  105. else:
  106. return ApiResponse(
  107. code="400001",
  108. message=message,
  109. timestamp=datetime.now(timezone.utc).isoformat()
  110. ).model_dump()
  111. except Exception as e:
  112. logger.exception("创建字典项错误")
  113. return ApiResponse(
  114. code="500001",
  115. message="服务器内部错误",
  116. timestamp=datetime.now(timezone.utc).isoformat()
  117. ).model_dump()
  118. @router.put("/{dict_id}")
  119. async def update_item(
  120. dict_id: int,
  121. item: DictItemUpdate,
  122. current_user: dict = Depends(get_current_user_with_refresh)
  123. ):
  124. """
  125. 更新字典项
  126. """
  127. try:
  128. user_id = current_user.get("sub")
  129. service = DictItemService()
  130. success, message = await service.update_item(
  131. dict_id,
  132. item.model_dump(exclude_none=True),
  133. user_id
  134. )
  135. if success:
  136. return ApiResponse(
  137. code="000000",
  138. message=message,
  139. timestamp=datetime.now(timezone.utc).isoformat()
  140. ).model_dump()
  141. else:
  142. return ApiResponse(
  143. code="400001",
  144. message=message,
  145. timestamp=datetime.now(timezone.utc).isoformat()
  146. ).model_dump()
  147. except Exception as e:
  148. logger.exception(f"更新字典项错误: dict_id={dict_id}")
  149. return ApiResponse(
  150. code="500001",
  151. message="服务器内部错误",
  152. timestamp=datetime.now(timezone.utc).isoformat()
  153. ).model_dump()
  154. @router.delete("/{dict_id}")
  155. async def delete_item(
  156. dict_id: int,
  157. current_user: dict = Depends(get_current_user_with_refresh)
  158. ):
  159. """
  160. 删除字典项
  161. """
  162. try:
  163. service = DictItemService()
  164. success, message = await service.delete_item(dict_id)
  165. if success:
  166. return ApiResponse(
  167. code="000000",
  168. message=message,
  169. timestamp=datetime.now(timezone.utc).isoformat()
  170. ).model_dump()
  171. else:
  172. return ApiResponse(
  173. code="400001",
  174. message=message,
  175. timestamp=datetime.now(timezone.utc).isoformat()
  176. ).model_dump()
  177. except Exception as e:
  178. logger.exception(f"删除字典项错误: dict_id={dict_id}")
  179. return ApiResponse(
  180. code="500001",
  181. message="服务器内部错误",
  182. timestamp=datetime.now(timezone.utc).isoformat()
  183. ).model_dump()
  184. @router.post("/batch-delete")
  185. async def batch_delete_items(
  186. request: DictItemBatchDeleteRequest,
  187. current_user: dict = Depends(get_current_user_with_refresh)
  188. ):
  189. """
  190. 批量删除字典项
  191. """
  192. try:
  193. service = DictItemService()
  194. success, message = await service.batch_delete_items(request.dict_ids)
  195. if success:
  196. return ApiResponse(
  197. code="000000",
  198. message=message,
  199. timestamp=datetime.now(timezone.utc).isoformat()
  200. ).model_dump()
  201. else:
  202. return ApiResponse(
  203. code="400001",
  204. message=message,
  205. timestamp=datetime.now(timezone.utc).isoformat()
  206. ).model_dump()
  207. except Exception as e:
  208. logger.exception("批量删除字典项错误")
  209. return ApiResponse(
  210. code="500001",
  211. message="服务器内部错误",
  212. timestamp=datetime.now(timezone.utc).isoformat()
  213. ).model_dump()
  214. @router.put("/{dict_id}/toggle-status")
  215. async def toggle_item_status(
  216. dict_id: int,
  217. enable_flag: str,
  218. current_user: dict = Depends(get_current_user_with_refresh)
  219. ):
  220. """
  221. 切换字典项启用状态
  222. """
  223. try:
  224. user_id = current_user.get("sub")
  225. service = DictItemService()
  226. success, message = await service.toggle_item_status(dict_id, enable_flag, user_id)
  227. if success:
  228. return ApiResponse(
  229. code="000000",
  230. message=message,
  231. timestamp=datetime.now(timezone.utc).isoformat()
  232. ).model_dump()
  233. else:
  234. return ApiResponse(
  235. code="400001",
  236. message=message,
  237. timestamp=datetime.now(timezone.utc).isoformat()
  238. ).model_dump()
  239. except Exception as e:
  240. logger.exception(f"切换字典项状态错误: dict_id={dict_id}")
  241. return ApiResponse(
  242. code="500001",
  243. message="服务器内部错误",
  244. timestamp=datetime.now(timezone.utc).isoformat()
  245. ).model_dump()