sys_dict_data.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. from typing import List, Optional
  4. from flask import g
  5. from sqlalchemy import and_, func
  6. from sqlalchemy import delete, insert, select, update
  7. from ruoyi_common.domain.entity import SysDictData
  8. from ruoyi_common.sqlalchemy.model import ColumnEntityList
  9. from ruoyi_common.sqlalchemy.transaction import Transactional
  10. from ruoyi_system.domain.po import SysDictDataPo
  11. from ruoyi_admin.ext import db
  12. class SysDictDataMapper:
  13. """
  14. 字典数据访问层
  15. """
  16. # 默认查询字段(接口返回字段)
  17. default_fields = {
  18. "dict_code",
  19. # 排序
  20. "dict_sort",
  21. "dict_label", "dict_type", "dict_value", "is_default",
  22. "status", "css_class", "list_class",
  23. # 审计字段
  24. "create_by", "create_time", "update_by", "update_time",
  25. # 备注
  26. "remark",
  27. }
  28. default_columns = ColumnEntityList(SysDictDataPo, default_fields, False)
  29. @classmethod
  30. def select_dict_data_list(cls, dictdata: Optional[SysDictData]) \
  31. -> List[SysDictData]:
  32. """
  33. 根据条件,查询字典数据
  34. Args:
  35. dictdata (Optional[SysDictData]): 字典数据查询条件
  36. Returns:
  37. List[SysDictData]: 字典数据列表
  38. """
  39. criterions = []
  40. if dictdata:
  41. if dictdata.dict_type:
  42. criterions.append(
  43. SysDictDataPo.dict_type == dictdata.dict_type
  44. )
  45. if dictdata.dict_label:
  46. criterions.append(
  47. SysDictDataPo.dict_label.like(f'%{dictdata.dict_label}%')
  48. )
  49. if dictdata.status:
  50. criterions.append(SysDictDataPo.status == dictdata.status)
  51. stmt = select(*cls.default_columns) \
  52. .where(*criterions) \
  53. .order_by(SysDictDataPo.dict_sort.asc())
  54. if "page_criterian" in g:
  55. g.page_criterian[stmt] = dictdata.vo_obj
  56. else:
  57. stmt = select(*cls.default_columns) \
  58. .order_by(SysDictDataPo.dict_sort.asc())
  59. rows = db.session.execute(stmt).all()
  60. eos = list()
  61. for row in rows:
  62. eos.append(cls.default_columns.cast(row,SysDictData))
  63. return eos
  64. @classmethod
  65. def select_dict_data_by_type(cls, dict_type: str) -> List[SysDictData]:
  66. """
  67. 根据字典类型,查询字典数据
  68. Args:
  69. dict_type (str): 字典类型
  70. Returns:
  71. List[SysDictData]: 字典数据列表
  72. """
  73. stmt = select(*cls.default_columns) \
  74. .where(SysDictDataPo.dict_type == dict_type)
  75. rows = db.session.execute(stmt).all()
  76. eos = list()
  77. for row in rows:
  78. eos.append(cls.default_columns.cast(row,SysDictData))
  79. return eos
  80. @classmethod
  81. def select_dict_label(cls, dict_type: str, dict_value: str) -> Optional[str]:
  82. """
  83. 根据字典类型和字典键值,查询字典标签
  84. Args:
  85. dict_type (str): 字典类型
  86. dict_value (str): 字典键值
  87. Returns:
  88. Optional[str]: 字典标签
  89. """
  90. stmt = select(SysDictDataPo.dict_label) \
  91. .where(and_(SysDictDataPo.dict_type == dict_type,
  92. SysDictDataPo.dict_value == dict_value))
  93. return db.session.execute(stmt).scalar_one_or_none()
  94. @classmethod
  95. def select_dict_data_by_id(cls, dict_code: int) -> Optional[SysDictData]:
  96. """
  97. 根据字典数据ID,查询字典数据信息
  98. Args:
  99. dict_code (int): 字典数据ID
  100. Returns:
  101. Optional[SysDictData]: 字典数据信息
  102. """
  103. stmt = select(*cls.default_columns) \
  104. .where(SysDictDataPo.dict_code == dict_code)
  105. row = db.session.execute(stmt).one_or_none()
  106. return cls.default_columns.cast(row, SysDictData) if row else None
  107. @classmethod
  108. def count_dict_data_by_type(cls, dict_type: str) -> int:
  109. """
  110. 查询字典数据数量
  111. Args:
  112. dict_type (str): 字典类型
  113. Returns:
  114. int: 字典数据数量
  115. """
  116. stmt = select(func.count()).select_from(SysDictDataPo) \
  117. .where(SysDictDataPo.dict_type == dict_type)
  118. return db.session.execute(stmt).scalar_one()
  119. @classmethod
  120. @Transactional(db.session)
  121. def delete_dict_data_by_id(cls, dict_code: int) -> int:
  122. """
  123. 通过字典ID,删除字典数据信息
  124. Args:
  125. dict_code (int): 字典ID
  126. Returns:
  127. int: 删除的行数
  128. """
  129. stmt = delete(SysDictDataPo) \
  130. .where(SysDictDataPo.dict_code == dict_code)
  131. return db.session.execute(stmt).rowcount
  132. @classmethod
  133. @Transactional(db.session)
  134. def delete_dict_data_by_ids(cls, dict_codes: List[int]) -> int:
  135. """
  136. 批量删除字典数据信息
  137. Args:
  138. dict_codes (List[int]): 字典ID列表
  139. Returns:
  140. int: 删除的行数
  141. """
  142. stmt = delete(SysDictDataPo) \
  143. .where(SysDictDataPo.dict_code.in_(dict_codes))
  144. return db.session.execute(stmt).rowcount
  145. @classmethod
  146. @Transactional(db.session)
  147. def insert_dict_data(cls, dictdata: SysDictData) -> int:
  148. """
  149. 新增字典数据信息
  150. Args:
  151. dictdata (SysDictData): 字典数据信息
  152. Returns:
  153. int: 新增记录的ID
  154. """
  155. fields = {
  156. "dict_type", "dict_label", "dict_value", "is_default", "status",
  157. "css_class", "list_class", "dict_sort", "create_by", "create_time",
  158. "remark"
  159. }
  160. data = dictdata.model_dump(
  161. include=fields,
  162. exclude_unset=True,
  163. exclude_none=True
  164. )
  165. stmt = insert(SysDictDataPo).values(data)
  166. out = db.session.execute(stmt).inserted_primary_key
  167. return out[0] if out else 0
  168. @classmethod
  169. @Transactional(db.session)
  170. def update_dict_data(cls, dictdata: SysDictData) -> int:
  171. """
  172. 修改字典数据信息
  173. Args:
  174. dictdata (SysDictData): 字典数据信息
  175. Returns:
  176. int: 修改的行数
  177. """
  178. fields = {
  179. "dict_type", "dict_label", "dict_value", "is_default", "status",
  180. "css_class", "list_class", "dict_sort", "update_by", "update_time",
  181. "remark"
  182. }
  183. data = dictdata.model_dump(
  184. include=fields,
  185. exclude_unset=True,
  186. exclude_none=True
  187. )
  188. stmt = update(SysDictDataPo) \
  189. .where(SysDictDataPo.dict_code == dictdata.dict_code) \
  190. .values(data)
  191. return db.session.execute(stmt).rowcount
  192. @classmethod
  193. @Transactional(db.session)
  194. def update_dict_data_type(cls, old_dict_type: str, new_dict_type: str) -> int:
  195. """
  196. 同步修改字典类型
  197. Args:
  198. old_dict_type (str): 旧字典类型
  199. new_dict_type (str): 新字典类型
  200. Returns:
  201. int: 修改的行数
  202. """
  203. stmt = update(SysDictDataPo).values(dict_type=new_dict_type) \
  204. .where(SysDictDataPo.dict_type == old_dict_type)
  205. return db.session.execute(stmt).rowcount
  206. @classmethod
  207. def select_dict_data_count_by_type(cls, dict_type: str) -> int:
  208. """
  209. 查询字典数据数量
  210. Args:
  211. dict_type (str): 字典类型
  212. Returns:
  213. int: 字典数据数量
  214. """
  215. stmt = select(func.count()).select_from(SysDictDataPo) \
  216. .where(SysDictDataPo.dict_type == dict_type)
  217. return db.session.execute(stmt).scalar_one()