DbLinkController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package jnpf.base.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import io.swagger.v3.oas.annotations.Parameter;
  4. import io.swagger.v3.oas.annotations.Parameters;
  5. import jnpf.base.controller.SuperController;
  6. import io.swagger.v3.oas.annotations.tags.Tag;
  7. import io.swagger.v3.oas.annotations.Operation;
  8. import jnpf.base.ActionResult;
  9. import jnpf.base.entity.DictionaryDataEntity;
  10. import jnpf.base.entity.SuperBaseEntity;
  11. import jnpf.base.model.dblink.*;
  12. import jnpf.base.service.DbLinkService;
  13. import jnpf.base.service.DictionaryDataService;
  14. import jnpf.base.service.DictionaryTypeService;
  15. import jnpf.base.vo.ListVO;
  16. import jnpf.base.vo.PageListVO;
  17. import jnpf.base.vo.PaginationVO;
  18. import jnpf.constant.MsgCode;
  19. import jnpf.database.model.entity.DbLinkEntity;
  20. import jnpf.database.util.DataSourceUtil;
  21. import jnpf.exception.DataException;
  22. import jnpf.permission.entity.UserEntity;
  23. import jnpf.permission.service.UserService;
  24. import jnpf.util.JsonUtil;
  25. import jnpf.util.XSSEscape;
  26. import jnpf.util.enums.DictionaryDataEnum;
  27. import jnpf.util.treeutil.SumTree;
  28. import jnpf.util.treeutil.newtreeutil.TreeDotUtils;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.web.bind.annotation.*;
  31. import jakarta.validation.Valid;
  32. import java.util.*;
  33. import java.util.stream.Collectors;
  34. /**
  35. * 数据连接
  36. *
  37. * @author JNPF开发平台组
  38. * @version V3.1.0
  39. * @copyright 引迈信息技术有限公司
  40. * @date 2019年9月27日 上午9:18
  41. */
  42. @Tag(name = "数据连接", description = "DataSource")
  43. @RestController
  44. @RequestMapping("/api/system/DataSource")
  45. public class DbLinkController extends SuperController<DbLinkService, DbLinkEntity> {
  46. @Autowired
  47. private DbLinkService dblinkService;
  48. @Autowired
  49. private UserService userService;
  50. @Autowired
  51. private DictionaryDataService dictionaryDataService;
  52. @Autowired
  53. private DictionaryTypeService dictionaryTypeService;
  54. @Autowired
  55. private DataSourceUtil dataSourceUtil;
  56. /**
  57. * 列表
  58. *
  59. * @param type 类型
  60. * @return
  61. */
  62. @GetMapping("/Selector")
  63. @Operation(summary = "获取数据连接下拉框列表")
  64. public ActionResult<ListVO<DbLinkSelectorListVO>> selectorList(String type) {
  65. List<DbLinkModel> modelAll = new LinkedList<>();
  66. List<DbLinkEntity> dbLinkList = dblinkService.getList();
  67. List<DictionaryDataEntity> dictionaryDataList = dictionaryDataService.getList(dictionaryTypeService.getInfoByEnCode(DictionaryDataEnum.SYSTEM_DBLINK.getDictionaryTypeId()).getId());
  68. // 1、连接中字典目录
  69. for (DictionaryDataEntity entity : dictionaryDataList) {
  70. long num = dbLinkList.stream().filter(t -> t.getDbType().equals(entity.getEnCode())).count();
  71. if (num > 0){
  72. DbLinkModel model = new DbLinkModel();
  73. model.setNum(num);
  74. model.setFullName(entity.getFullName());
  75. model.setParentId("-1");
  76. model.setId(entity.getId());
  77. modelAll.add(model);
  78. }
  79. }
  80. // 2、字典中的连接集合
  81. for (DbLinkEntity entity : dbLinkList) {
  82. dictionaryDataList.stream().filter(t -> t.getEnCode().equals(entity.getDbType())).findFirst().ifPresent((dataEntity)->{
  83. DbLinkModel model = JsonUtil.getJsonToBean(entity, DbLinkModel.class);
  84. model.setParentId(dataEntity.getId());
  85. modelAll.add(model);
  86. });
  87. }
  88. List<SumTree<DbLinkModel>> trees = TreeDotUtils.convertListToTreeDot(modelAll.stream().sorted(Comparator.comparing(DbLinkModel::getFullName)).collect(Collectors.toList()));
  89. List<DbLinkSelectorListVO> list = new ArrayList<>();
  90. // type为空时返回默认库
  91. if(type == null){
  92. DbLinkListVO dbLink = new DbLinkListVO();
  93. dbLink.setFullName("默认数据库");
  94. dbLink.setId("0");
  95. dbLink.setDbType(dataSourceUtil.getDbType());
  96. DbLinkSelectorListVO defaultDb = new DbLinkSelectorListVO();
  97. defaultDb.setFullName("");
  98. defaultDb.setChildren(Collections.singletonList(dbLink));
  99. list.add(defaultDb);
  100. }
  101. list.addAll(JsonUtil.getJsonToList(trees, DbLinkSelectorListVO.class));
  102. return ActionResult.success(new ListVO<>(list));
  103. }
  104. /**
  105. * 2:列表
  106. *
  107. * @param page 关键字
  108. * @return ignore
  109. */
  110. @GetMapping
  111. @Operation(summary = "获取数据连接列表")
  112. public ActionResult<PageListVO<DbLinkListVO>> getList(PaginationDbLink page) {
  113. List<DbLinkEntity> data = dblinkService.getList(page);
  114. List<String> userId = data.stream().map(SuperBaseEntity.SuperCBaseEntity::getCreatorUserId).collect(Collectors.toList());
  115. List<String> lastUserId = data.stream().map(SuperBaseEntity.SuperCUBaseEntity::getLastModifyUserId).collect(Collectors.toList());
  116. List<UserEntity> userEntities = userService.getUserName(userId);
  117. List<UserEntity> lastUserIdEntities = userService.getUserName(lastUserId);
  118. List<DictionaryDataEntity> typeList = dictionaryDataService.getList(dictionaryTypeService.getInfoByEnCode(DictionaryDataEnum.SYSTEM_DBLINK.getDictionaryTypeId()).getId());
  119. List<DbLinkListVO> jsonToList = JsonUtil.getJsonToList(data, DbLinkListVO.class);
  120. for (DbLinkListVO vo : jsonToList) {
  121. //存在类型的字典对象
  122. DictionaryDataEntity dataEntity = typeList.stream().filter(t -> t.getEnCode().equals(vo.getDbType())).findFirst().orElse(null);
  123. if (dataEntity != null) {
  124. vo.setDbType(dataEntity.getFullName());
  125. } else {
  126. vo.setDbType("");
  127. }
  128. //创建者
  129. UserEntity creatorUser = userEntities.stream().filter(t -> t.getId().equals(vo.getCreatorUser())).findFirst().orElse(null);
  130. vo.setCreatorUser(creatorUser != null ? creatorUser.getRealName() + "/" + creatorUser.getAccount() : vo.getCreatorUser());
  131. //修改人
  132. UserEntity lastModifyUser = lastUserIdEntities.stream().filter(t -> t.getId().equals(vo.getLastModifyUser())).findFirst().orElse(null);
  133. vo.setLastModifyUser(lastModifyUser != null ? lastModifyUser.getRealName() + "/" + lastModifyUser.getAccount() : vo.getLastModifyUser());
  134. }
  135. PaginationVO paginationVO = JsonUtil.getJsonToBean(page, PaginationVO.class);
  136. return ActionResult.page(jsonToList , paginationVO);
  137. }
  138. /**
  139. * 列表分组
  140. *
  141. * @param page 查询条件
  142. * @return 数据源分组列表
  143. */
  144. @GetMapping("/getGroup")
  145. @Operation(summary = "获取数据连接列表")
  146. public ActionResult<List<Map<String, Object>>> getGroup(PaginationDbLink page) {
  147. ActionResult<PageListVO<DbLinkListVO>> result = getList(page);
  148. List<DbLinkListVO> voList = result.getData().getList();
  149. // host分组
  150. Set<String> hostSet = voList.stream().sorted(Comparator.comparing(DbLinkListVO::getHost))
  151. .map(DbLinkListVO::getHost).collect(Collectors.toSet());
  152. List<Map<String, Object>> groupList = new ArrayList<>();
  153. for (String host : hostSet) {
  154. Map<String, Object> groupMap = new HashMap<>();
  155. groupMap.put("host", host);
  156. groupMap.put("options", voList.stream().filter(vo->vo.getHost().equals(host)).toArray());
  157. groupList.add(groupMap);
  158. }
  159. return ActionResult.success(groupList);
  160. }
  161. /**
  162. * 3:单条数据连接
  163. *
  164. * @param id 主键
  165. * @return ignore
  166. * @throws DataException ignore
  167. */
  168. @GetMapping("/{id}")
  169. @Operation(summary = "获取数据连接")
  170. @Parameters({
  171. @Parameter(name = "id", description = "主键")
  172. })
  173. @SaCheckPermission("dataCenter.dataSource")
  174. public ActionResult<DbLinkInfoVO> get(@PathVariable("id") String id) throws DataException {
  175. return ActionResult.success(new DbLinkInfoVO().getDbLinkInfoVO(dblinkService.getInfo(XSSEscape.escape(id))));
  176. }
  177. /**
  178. * 4:新建数据连接
  179. *
  180. * @param dbLinkCreUpForm 新建数据连接表单对象
  181. * @return ignore
  182. */
  183. @PostMapping
  184. @Operation(summary = "添加数据连接")
  185. @Parameters({
  186. @Parameter(name = "dbLinkCreUpForm", description = "新建数据连接表单对象", required = true)
  187. })
  188. @SaCheckPermission("dataCenter.dataSource")
  189. public ActionResult<String> create(@RequestBody @Valid DbLinkCreUpForm dbLinkCreUpForm) {
  190. DbLinkEntity entity = dbLinkCreUpForm.getDbLinkEntity(dbLinkCreUpForm);
  191. if (dblinkService.isExistByFullName(entity.getFullName(), entity.getId())) {
  192. return ActionResult.fail(MsgCode.EXIST001.get());
  193. }
  194. dblinkService.create(entity);
  195. return ActionResult.success(MsgCode.SU001.get());
  196. }
  197. /**
  198. * 5:更新数据连接
  199. *
  200. * @param id 主键
  201. * @param dbLinkCreUpForm dto实体
  202. * @return ignore
  203. */
  204. @PutMapping("/{id}")
  205. @Operation(summary = "修改数据连接")
  206. @Parameters({
  207. @Parameter(name = "id", description = "主键", required = true),
  208. @Parameter(name = "dbLinkCreUpForm", description = "新建数据连接表单对象", required = true)
  209. })
  210. @SaCheckPermission("dataCenter.dataSource")
  211. public ActionResult<String> update(@PathVariable("id") String id, @RequestBody @Valid DbLinkCreUpForm dbLinkCreUpForm) {
  212. id = XSSEscape.escape(id);
  213. DbLinkEntity entity = dbLinkCreUpForm.getDbLinkEntity(dbLinkCreUpForm);
  214. if (dblinkService.isExistByFullName(entity.getFullName(), id)) {
  215. return ActionResult.fail(MsgCode.EXIST001.get());
  216. }
  217. if (!dblinkService.update(id, entity)) {
  218. return ActionResult.fail(MsgCode.FA002.get());
  219. }
  220. return ActionResult.success(MsgCode.SU004.get());
  221. }
  222. /**
  223. * 6:删除
  224. *
  225. * @param id 主键
  226. * @return ignore
  227. */
  228. @DeleteMapping("/{id}")
  229. @Operation(summary = "删除数据连接")
  230. @Parameters({
  231. @Parameter(name = "id", description = "主键", required = true)
  232. })
  233. @SaCheckPermission("dataCenter.dataSource")
  234. public ActionResult<String> delete(@PathVariable("id") String id) {
  235. DbLinkEntity entity = dblinkService.getInfo(id);
  236. if (entity != null) {
  237. dblinkService.delete(entity);
  238. return ActionResult.success(MsgCode.SU003.get());
  239. }
  240. return ActionResult.fail(MsgCode.FA003.get());
  241. }
  242. /**
  243. * 7:测试连接
  244. *
  245. * @param dbLinkBaseForm 数据连接参数
  246. * @return ignore
  247. * @throws DataException ignore
  248. */
  249. @PostMapping("/Actions/Test")
  250. @Operation(summary = "测试连接")
  251. @Parameters({
  252. @Parameter(name = "dbLinkBaseForm", description = "数据连接参数", required = true)
  253. })
  254. @SaCheckPermission("dataCenter.dataSource")
  255. public ActionResult<String> test(@RequestBody DbLinkBaseForm dbLinkBaseForm) throws Exception {
  256. boolean data = dblinkService.testDbConnection(dbLinkBaseForm.getDbLinkEntity(dbLinkBaseForm));
  257. if (data) {
  258. return ActionResult.success(MsgCode.DB301.get());
  259. } else {
  260. return ActionResult.fail(MsgCode.DB302.get());
  261. }
  262. }
  263. }