__init__.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. # @FileName: __init__.py
  4. import json
  5. from typing import List, Optional, Tuple
  6. from datetime import datetime
  7. from ruoyi_common.utils import DateUtil, StringUtil
  8. from ruoyi_generator.domain.entity import GenTable, GenTableColumn
  9. from ruoyi_generator.mapper import gen_table_mapper, gen_table_column_mapper
  10. from ruoyi_generator.util import GenUtils, to_underscore
  11. from ruoyi_generator.config import GeneratorConfig
  12. class GenTableService:
  13. def select_gen_table_list(self, gen_table: GenTable) -> Tuple[List[GenTable], int]:
  14. """
  15. 查询代码生成表列表
  16. Args:
  17. gen_table (GenTable): 代码生成表对象
  18. Returns:
  19. Tuple[List[GenTable], int]: 代码生成表列表和总数
  20. """
  21. # 查询列表
  22. gen_tables = gen_table_mapper.select_list(gen_table)
  23. # 查询总数
  24. # 注意:这里需要根据实际需求实现总数查询逻辑
  25. total = len(gen_tables)
  26. return gen_tables, total
  27. def select_db_table_list(self, gen_table: GenTable) -> Tuple[List[GenTable], int]:
  28. """
  29. 查询数据库表列表
  30. Args:
  31. gen_table (GenTable): 代码生成表对象
  32. Returns:
  33. Tuple[List[GenTable], int]: 数据库表列表和总数
  34. """
  35. # 查询列表
  36. gen_tables = gen_table_mapper.select_db_list(gen_table)
  37. # 查询总数
  38. # 注意:这里需要根据实际需求实现总数查询逻辑
  39. total = len(gen_tables)
  40. return gen_tables, total
  41. def select_gen_table_by_id(self, table_id: int) -> Optional[GenTable]:
  42. """
  43. 根据ID查询代码生成表
  44. Args:
  45. table_id (int): 表ID
  46. Returns:
  47. Optional[GenTable]: 代码生成表对象
  48. """
  49. gen_table = gen_table_mapper.select_by_id(table_id)
  50. if gen_table:
  51. gen_table.columns = gen_table_column_mapper.select_list_by_table_id(table_id)
  52. return gen_table
  53. def select_gen_table_by_name(self, table_name: str) -> Optional[GenTable]:
  54. """
  55. 根据表名查询代码生成表
  56. Args:
  57. table_name (str): 表名
  58. Returns:
  59. Optional[GenTable]: 代码生成表对象
  60. """
  61. return gen_table_mapper.select_by_table_name(table_name)
  62. def delete_gen_table_by_id(self, table_id: int):
  63. """
  64. 根据ID删除代码生成表
  65. Args:
  66. table_id (int): 表ID
  67. """
  68. # 先删除字段信息
  69. gen_table_column_mapper.delete_by_table_id(table_id)
  70. # 再删除表信息
  71. gen_table_mapper.delete_by_id(table_id)
  72. def delete_gen_table_by_ids(self, table_ids: List[int]):
  73. """
  74. 批量删除代码生成表
  75. Args:
  76. table_ids (List[int]): 表ID列表
  77. """
  78. for table_id in table_ids:
  79. # 先删除字段信息
  80. gen_table_column_mapper.delete_by_table_id(table_id)
  81. # 再删除表信息
  82. gen_table_mapper.delete_by_id(table_id)
  83. def import_gen_table(self, table_names: List[str]) -> int:
  84. """
  85. 导入代码生成表
  86. Args:
  87. table_names (List[str]): 表名列表
  88. Returns:
  89. int: 导入的表数量
  90. """
  91. success_count = 0
  92. for table_name in table_names:
  93. # 检查表是否已存在
  94. if gen_table_mapper.exists_table(table_name):
  95. continue
  96. # 创建GenTable对象
  97. table = GenTable()
  98. # 设置默认值
  99. table.table_name = table_name
  100. clean_table_name = GenUtils.remove_table_prefix(
  101. table_name) if GeneratorConfig.auto_remove_pre else table_name
  102. table.class_name = to_underscore(clean_table_name)
  103. table.business_name = GenUtils.get_business_name(clean_table_name)
  104. table.package_name = GeneratorConfig.package_name
  105. # 使用配置中的 modelName 作为模块名
  106. table.module_name = GeneratorConfig.model_name
  107. # 获取表注释
  108. try:
  109. result = gen_table_mapper.select_db_table_comment_by_name(table_name)
  110. table.table_comment = result if result else table_name
  111. except:
  112. table.table_comment = table_name
  113. table.function_name = table.table_comment
  114. table.function_author = GeneratorConfig.author
  115. table.create_by = "admin"
  116. table.create_time = datetime.now()
  117. # 保存表信息
  118. table_id = gen_table_mapper.insert(table)
  119. if table_id > 0:
  120. # 保存列信息
  121. columns = gen_table_mapper.select_db_table_columns_by_name(table_name)
  122. if not columns:
  123. print(f"警告:表 {table_name} 没有字段信息,可能表不存在或查询失败")
  124. else:
  125. print(f"表 {table_name} 找到 {len(columns)} 个字段")
  126. for column in columns:
  127. try:
  128. column.table_id = table_id
  129. column.create_by = "admin"
  130. column.create_time = datetime.now()
  131. # 确保 java_field 已设置
  132. if not column.java_field:
  133. column.java_field = GenUtils.to_camel_case(column.column_name)
  134. gen_table_column_mapper.insert(column)
  135. except Exception as e:
  136. print(f"插入字段 {column.column_name} 失败: {e}")
  137. continue
  138. success_count += 1
  139. return success_count
  140. def update_gen_table(self, gen_table: GenTable):
  141. """
  142. 更新代码生成表
  143. Args:
  144. gen_table (GenTable): 代码生成表对象
  145. """
  146. print("更新代码生成表:", gen_table.columns)
  147. # 获取列信息
  148. columns = gen_table.columns
  149. if columns:
  150. # 处理列信息
  151. for column in columns:
  152. print("处理列信息:", column)
  153. # 确保column是GenTableColumn对象而不是dict
  154. column_obj = None
  155. if isinstance(column, dict):
  156. # 直接使用字典数据创建对象,避免手动字段映射
  157. # 前端传过来的已经是正确的字符串格式,直接使用
  158. print("原始列数据:", column)
  159. # 使用 model_validate 方法处理别名字段
  160. column_obj = GenTableColumn.model_validate(column)
  161. print("处理后列对象:", column_obj.model_dump())
  162. else:
  163. column_obj = column
  164. # 设置表ID
  165. column_obj.table_id = gen_table.table_id
  166. column_obj.update_time = datetime.now()
  167. # 如果有column_id则更新,否则插入
  168. if hasattr(column_obj, 'column_id') and column_obj.column_id:
  169. # 更新列信息
  170. gen_table_column_mapper.update(column_obj)
  171. else:
  172. # 插入列信息
  173. column_obj.create_by = "admin"
  174. column_obj.create_time = datetime.now()
  175. gen_table_column_mapper.insert(column_obj)
  176. # 更新表信息
  177. gen_table.update_time = datetime.now()
  178. gen_table_mapper.update(gen_table)
  179. def synch_db(self, table_name: str):
  180. """
  181. 同步数据库表结构
  182. Args:
  183. table_name (str): 表名
  184. """
  185. try:
  186. # 查询表信息
  187. gen_table = gen_table_mapper.select_by_table_name(table_name)
  188. if not gen_table:
  189. raise Exception(f"表{table_name}不存在")
  190. # 查询数据库表列信息
  191. db_columns = gen_table_mapper.select_db_table_columns_by_name(table_name)
  192. # 查询代码生成表列信息
  193. gen_columns = gen_table_column_mapper.select_list_by_table_id(gen_table.table_id)
  194. # 处理新增和更新的列
  195. for db_column in db_columns:
  196. exist_column = None
  197. for gen_column in gen_columns:
  198. if db_column.column_name == gen_column.column_name:
  199. exist_column = gen_column
  200. break
  201. if exist_column:
  202. # 更新列信息
  203. exist_column.column_comment = db_column.column_comment
  204. exist_column.column_type = db_column.column_type
  205. exist_column.java_type = db_column.java_type
  206. exist_column.java_field = db_column.java_field
  207. exist_column.is_pk = db_column.is_pk
  208. exist_column.is_increment = db_column.is_increment
  209. exist_column.is_required = db_column.is_required
  210. exist_column.update_by = "admin"
  211. exist_column.update_time = datetime.now()
  212. gen_table_column_mapper.update(exist_column)
  213. else:
  214. # 新增列信息
  215. db_column.table_id = gen_table.table_id
  216. db_column.create_by = "admin"
  217. db_column.create_time = datetime.now()
  218. gen_table_column_mapper.insert(db_column)
  219. # 处理删除的列
  220. for gen_column in gen_columns:
  221. exist_column = False
  222. for db_column in db_columns:
  223. if gen_column.column_name == db_column.column_name:
  224. exist_column = True
  225. break
  226. if not exist_column:
  227. # 删除列信息
  228. gen_table_column_mapper.delete_by_id(gen_column.column_id)
  229. return True
  230. except Exception as e:
  231. print(f"同步数据库失败: {e}")
  232. raise e
  233. def generator_code(self, table_name: str) -> bytes:
  234. """
  235. 生成代码
  236. Args:
  237. table_name (str): 表名
  238. Returns:
  239. bytes: 生成的代码文件
  240. """
  241. # 查询表信息
  242. gen_table = gen_table_mapper.select_by_table_name(table_name)
  243. if not gen_table:
  244. raise Exception(f"表{table_name}不存在")
  245. # 查询列信息
  246. gen_table.columns = gen_table_column_mapper.select_list_by_table_id(gen_table.table_id)
  247. # 设置列的 list_index 属性
  248. GenUtils.set_column_list_index(gen_table)
  249. # 设置主键列
  250. pk_columns = [column for column in gen_table.columns if column.is_pk == '1']
  251. if pk_columns:
  252. gen_table.pk_column = pk_columns[0]
  253. else:
  254. gen_table.pk_column = None
  255. # 生成代码
  256. return GenUtils.generator_code(gen_table).getvalue()
  257. def batch_generator_code(self, table_names: List[str]) -> bytes:
  258. """
  259. 批量生成代码
  260. Args:
  261. table_names (List[str]): 表名列表
  262. Returns:
  263. bytes: 生成的代码文件
  264. """
  265. gen_tables = []
  266. for table_name in table_names:
  267. # 查询表信息
  268. gen_table = gen_table_mapper.select_by_table_name(table_name)
  269. if gen_table:
  270. # 查询列信息
  271. gen_table.columns = gen_table_column_mapper.select_list_by_table_id(gen_table.table_id)
  272. # 设置列的 list_index 属性
  273. GenUtils.set_column_list_index(gen_table)
  274. # 设置主键列
  275. pk_columns = [column for column in gen_table.columns if column.is_pk == '1']
  276. if pk_columns:
  277. gen_table.pk_column = pk_columns[0]
  278. else:
  279. gen_table.pk_column = None
  280. gen_tables.append(gen_table)
  281. # 生成代码
  282. return GenUtils.batch_generator_code(gen_tables).getvalue()
  283. def preview_code(self, table_id: int) -> dict:
  284. """
  285. 预览代码
  286. Args:
  287. table_id (int): 表ID
  288. Returns:
  289. dict: 预览代码
  290. """
  291. # 查询表信息
  292. gen_table = gen_table_mapper.select_by_id(table_id)
  293. if not gen_table:
  294. raise Exception(f"表ID{table_id}不存在")
  295. # 查询列信息
  296. gen_table.columns = gen_table_column_mapper.select_list_by_table_id(table_id)
  297. # 设置列的 list_index 属性
  298. GenUtils.set_column_list_index(gen_table)
  299. # 设置主键列
  300. pk_columns = [column for column in gen_table.columns if column.is_pk == '1']
  301. if pk_columns:
  302. gen_table.pk_column = pk_columns[0]
  303. else:
  304. gen_table.pk_column = None
  305. # 预览代码
  306. return GenUtils.preview_code(gen_table)
  307. def select_db_table_comment_by_name(self, table_name: str) -> Optional[str]:
  308. """
  309. 根据表名查询数据库表注释
  310. Args:
  311. table_name (str): 表名
  312. Returns:
  313. Optional[str]: 表注释
  314. """
  315. try:
  316. result = gen_table_mapper.session.execute(
  317. text(
  318. "SELECT table_comment FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = :table_name"),
  319. {"table_name": table_name}
  320. ).fetchone()
  321. return result[0] if result else None
  322. except Exception:
  323. return None
  324. # 实例化Service
  325. gen_table_service = GenTableService()