package jnpf.base.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import jnpf.base.controller.SuperController; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import jnpf.base.ActionResult; import jnpf.base.entity.DictionaryDataEntity; import jnpf.base.entity.SuperBaseEntity; import jnpf.base.model.dblink.*; import jnpf.base.service.DbLinkService; import jnpf.base.service.DictionaryDataService; import jnpf.base.service.DictionaryTypeService; import jnpf.base.vo.ListVO; import jnpf.base.vo.PageListVO; import jnpf.base.vo.PaginationVO; import jnpf.constant.MsgCode; import jnpf.database.model.entity.DbLinkEntity; import jnpf.database.util.DataSourceUtil; import jnpf.exception.DataException; import jnpf.permission.entity.UserEntity; import jnpf.permission.service.UserService; import jnpf.util.JsonUtil; import jnpf.util.XSSEscape; import jnpf.util.enums.DictionaryDataEnum; import jnpf.util.treeutil.SumTree; import jnpf.util.treeutil.newtreeutil.TreeDotUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.validation.Valid; import java.util.*; import java.util.stream.Collectors; /** * 数据连接 * * @author JNPF开发平台组 * @version V3.1.0 * @copyright 引迈信息技术有限公司 * @date 2019年9月27日 上午9:18 */ @Tag(name = "数据连接", description = "DataSource") @RestController @RequestMapping("/api/system/DataSource") public class DbLinkController extends SuperController { @Autowired private DbLinkService dblinkService; @Autowired private UserService userService; @Autowired private DictionaryDataService dictionaryDataService; @Autowired private DictionaryTypeService dictionaryTypeService; @Autowired private DataSourceUtil dataSourceUtil; /** * 列表 * * @param type 类型 * @return */ @GetMapping("/Selector") @Operation(summary = "获取数据连接下拉框列表") public ActionResult> selectorList(String type) { List modelAll = new LinkedList<>(); List dbLinkList = dblinkService.getList(); List dictionaryDataList = dictionaryDataService.getList(dictionaryTypeService.getInfoByEnCode(DictionaryDataEnum.SYSTEM_DBLINK.getDictionaryTypeId()).getId()); // 1、连接中字典目录 for (DictionaryDataEntity entity : dictionaryDataList) { long num = dbLinkList.stream().filter(t -> t.getDbType().equals(entity.getEnCode())).count(); if (num > 0){ DbLinkModel model = new DbLinkModel(); model.setNum(num); model.setFullName(entity.getFullName()); model.setParentId("-1"); model.setId(entity.getId()); modelAll.add(model); } } // 2、字典中的连接集合 for (DbLinkEntity entity : dbLinkList) { dictionaryDataList.stream().filter(t -> t.getEnCode().equals(entity.getDbType())).findFirst().ifPresent((dataEntity)->{ DbLinkModel model = JsonUtil.getJsonToBean(entity, DbLinkModel.class); model.setParentId(dataEntity.getId()); modelAll.add(model); }); } List> trees = TreeDotUtils.convertListToTreeDot(modelAll.stream().sorted(Comparator.comparing(DbLinkModel::getFullName)).collect(Collectors.toList())); List list = new ArrayList<>(); // type为空时返回默认库 if(type == null){ DbLinkListVO dbLink = new DbLinkListVO(); dbLink.setFullName("默认数据库"); dbLink.setId("0"); dbLink.setDbType(dataSourceUtil.getDbType()); DbLinkSelectorListVO defaultDb = new DbLinkSelectorListVO(); defaultDb.setFullName(""); defaultDb.setChildren(Collections.singletonList(dbLink)); list.add(defaultDb); } list.addAll(JsonUtil.getJsonToList(trees, DbLinkSelectorListVO.class)); return ActionResult.success(new ListVO<>(list)); } /** * 2:列表 * * @param page 关键字 * @return ignore */ @GetMapping @Operation(summary = "获取数据连接列表") public ActionResult> getList(PaginationDbLink page) { List data = dblinkService.getList(page); List userId = data.stream().map(SuperBaseEntity.SuperCBaseEntity::getCreatorUserId).collect(Collectors.toList()); List lastUserId = data.stream().map(SuperBaseEntity.SuperCUBaseEntity::getLastModifyUserId).collect(Collectors.toList()); List userEntities = userService.getUserName(userId); List lastUserIdEntities = userService.getUserName(lastUserId); List typeList = dictionaryDataService.getList(dictionaryTypeService.getInfoByEnCode(DictionaryDataEnum.SYSTEM_DBLINK.getDictionaryTypeId()).getId()); List jsonToList = JsonUtil.getJsonToList(data, DbLinkListVO.class); for (DbLinkListVO vo : jsonToList) { //存在类型的字典对象 DictionaryDataEntity dataEntity = typeList.stream().filter(t -> t.getEnCode().equals(vo.getDbType())).findFirst().orElse(null); if (dataEntity != null) { vo.setDbType(dataEntity.getFullName()); } else { vo.setDbType(""); } //创建者 UserEntity creatorUser = userEntities.stream().filter(t -> t.getId().equals(vo.getCreatorUser())).findFirst().orElse(null); vo.setCreatorUser(creatorUser != null ? creatorUser.getRealName() + "/" + creatorUser.getAccount() : vo.getCreatorUser()); //修改人 UserEntity lastModifyUser = lastUserIdEntities.stream().filter(t -> t.getId().equals(vo.getLastModifyUser())).findFirst().orElse(null); vo.setLastModifyUser(lastModifyUser != null ? lastModifyUser.getRealName() + "/" + lastModifyUser.getAccount() : vo.getLastModifyUser()); } PaginationVO paginationVO = JsonUtil.getJsonToBean(page, PaginationVO.class); return ActionResult.page(jsonToList , paginationVO); } /** * 列表分组 * * @param page 查询条件 * @return 数据源分组列表 */ @GetMapping("/getGroup") @Operation(summary = "获取数据连接列表") public ActionResult>> getGroup(PaginationDbLink page) { ActionResult> result = getList(page); List voList = result.getData().getList(); // host分组 Set hostSet = voList.stream().sorted(Comparator.comparing(DbLinkListVO::getHost)) .map(DbLinkListVO::getHost).collect(Collectors.toSet()); List> groupList = new ArrayList<>(); for (String host : hostSet) { Map groupMap = new HashMap<>(); groupMap.put("host", host); groupMap.put("options", voList.stream().filter(vo->vo.getHost().equals(host)).toArray()); groupList.add(groupMap); } return ActionResult.success(groupList); } /** * 3:单条数据连接 * * @param id 主键 * @return ignore * @throws DataException ignore */ @GetMapping("/{id}") @Operation(summary = "获取数据连接") @Parameters({ @Parameter(name = "id", description = "主键") }) @SaCheckPermission("dataCenter.dataSource") public ActionResult get(@PathVariable("id") String id) throws DataException { return ActionResult.success(new DbLinkInfoVO().getDbLinkInfoVO(dblinkService.getInfo(XSSEscape.escape(id)))); } /** * 4:新建数据连接 * * @param dbLinkCreUpForm 新建数据连接表单对象 * @return ignore */ @PostMapping @Operation(summary = "添加数据连接") @Parameters({ @Parameter(name = "dbLinkCreUpForm", description = "新建数据连接表单对象", required = true) }) @SaCheckPermission("dataCenter.dataSource") public ActionResult create(@RequestBody @Valid DbLinkCreUpForm dbLinkCreUpForm) { DbLinkEntity entity = dbLinkCreUpForm.getDbLinkEntity(dbLinkCreUpForm); if (dblinkService.isExistByFullName(entity.getFullName(), entity.getId())) { return ActionResult.fail(MsgCode.EXIST001.get()); } dblinkService.create(entity); return ActionResult.success(MsgCode.SU001.get()); } /** * 5:更新数据连接 * * @param id 主键 * @param dbLinkCreUpForm dto实体 * @return ignore */ @PutMapping("/{id}") @Operation(summary = "修改数据连接") @Parameters({ @Parameter(name = "id", description = "主键", required = true), @Parameter(name = "dbLinkCreUpForm", description = "新建数据连接表单对象", required = true) }) @SaCheckPermission("dataCenter.dataSource") public ActionResult update(@PathVariable("id") String id, @RequestBody @Valid DbLinkCreUpForm dbLinkCreUpForm) { id = XSSEscape.escape(id); DbLinkEntity entity = dbLinkCreUpForm.getDbLinkEntity(dbLinkCreUpForm); if (dblinkService.isExistByFullName(entity.getFullName(), id)) { return ActionResult.fail(MsgCode.EXIST001.get()); } if (!dblinkService.update(id, entity)) { return ActionResult.fail(MsgCode.FA002.get()); } return ActionResult.success(MsgCode.SU004.get()); } /** * 6:删除 * * @param id 主键 * @return ignore */ @DeleteMapping("/{id}") @Operation(summary = "删除数据连接") @Parameters({ @Parameter(name = "id", description = "主键", required = true) }) @SaCheckPermission("dataCenter.dataSource") public ActionResult delete(@PathVariable("id") String id) { DbLinkEntity entity = dblinkService.getInfo(id); if (entity != null) { dblinkService.delete(entity); return ActionResult.success(MsgCode.SU003.get()); } return ActionResult.fail(MsgCode.FA003.get()); } /** * 7:测试连接 * * @param dbLinkBaseForm 数据连接参数 * @return ignore * @throws DataException ignore */ @PostMapping("/Actions/Test") @Operation(summary = "测试连接") @Parameters({ @Parameter(name = "dbLinkBaseForm", description = "数据连接参数", required = true) }) @SaCheckPermission("dataCenter.dataSource") public ActionResult test(@RequestBody DbLinkBaseForm dbLinkBaseForm) throws Exception { boolean data = dblinkService.testDbConnection(dbLinkBaseForm.getDbLinkEntity(dbLinkBaseForm)); if (data) { return ActionResult.success(MsgCode.DB301.get()); } else { return ActionResult.fail(MsgCode.DB302.get()); } } }