sys_dict_data.py 7.7 KB

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