package jnpf.base.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import com.alibaba.fastjson.JSONObject; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.Operation; import jnpf.base.ActionResult; import jnpf.base.ActionResultCode; import jnpf.base.DataSourceApi; import jnpf.base.UserInfo; import jnpf.base.entity.DictionaryDataEntity; 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.config.ConfigValueUtil; import jnpf.constant.MsgCode; import jnpf.database.util.DataSourceUtil; import jnpf.database.util.TenantDataSourceUtil; import jnpf.exception.DataException; import jnpf.database.model.entity.DbLinkEntity; import jnpf.permission.UserApi; import jnpf.permission.entity.UserEntity; import jnpf.util.JsonUtil; import jnpf.util.NoDataSourceBind; 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 引迈信息技术有限公司(https://www.jnpfsoft.com) * @date 2019年9月27日 上午9:18 */ @Tag(name = "数据连接", description = "DataSource") @RestController @RequestMapping("/DataSource") public class DbLinkController extends SuperController implements DataSourceApi { @Autowired private DbLinkService dblinkService; @Autowired private UserApi userApi; @Autowired private DictionaryDataService dictionaryDataService; @Autowired private DictionaryTypeService dictionaryTypeService; @Autowired private DataSourceUtil dataSourceUtil; @Autowired private ConfigValueUtil configValueUtil; /** * 列表 * * @param type 类型 * @return */ @GetMapping("/Selector") @Parameters({ @Parameter(name = "type", description = "类型") }) @Operation(summary = "获取数据连接下拉框列表") public ActionResult> selectorList(@RequestParam(value = "type", required = false) String type) { List modelAll = new LinkedList<>(); //将主节点添加到容器当中======= List data = dblinkService.getList(); //连接中类型所对应的字典集合 List dataEntityList = dictionaryDataService.getList(dictionaryTypeService.getInfoByEnCode(DictionaryDataEnum.SYSTEM_DBLINK.getDictionaryTypeId()).getId()); for (DictionaryDataEntity entity : dataEntityList) { DbLinkModel model = new DbLinkModel(); model.setFullName(entity.getFullName()); model.setParentId("-1"); model.setId(entity.getId()); Long num = data.stream().filter(t -> t.getDbType().equals(entity.getEnCode())).count(); model.setNum(num); if (num > 0) { modelAll.add(model); } } //字典里存在则添加到容器当中======= for (DbLinkEntity entity : data) { DbLinkModel model = JsonUtil.getJsonToBean(entity, DbLinkModel.class); DictionaryDataEntity dataEntity = dataEntityList.stream().filter(t -> t.getEnCode().equals(entity.getDbType())).findFirst().orElse(null); if (dataEntity != null) { model.setParentId(dataEntity.getId()); modelAll.add(model); } } List> trees = TreeDotUtils.convertListToTreeDot(modelAll); List list = new ArrayList<>(); // type不为空时不返回默认库 if(type == null){ DbLinkSelectorListVO defaultDb = new DbLinkSelectorListVO(); defaultDb.setFullName(""); DbLinkListVO dbLink = new DbLinkListVO(); dbLink.setFullName("默认数据库"); dbLink.setId("0"); dbLink.setDbType(dataSourceUtil.getDbType()); defaultDb.setChildren(Collections.singletonList(dbLink)); list.add(defaultDb); } list.addAll(JsonUtil.getJsonToList(trees, DbLinkSelectorListVO.class)); ListVO vo = new ListVO<>(); vo.setList(list); return ActionResult.success(vo); } /** * 2:列表 * * @param page 关键字 * @return ignore */ @GetMapping @Operation(summary = "获取数据连接列表") public ActionResult> getList(PaginationDbLink page) { List data = dblinkService.getList(page); List userId = data.stream().map(t -> t.getCreatorUserId()).collect(Collectors.toList()); List lastUserId = data.stream().map(t -> t.getLastModifyUserId()).collect(Collectors.toList()); List userEntities = userApi.getUserName(userId); List lastUserIdEntities = userApi.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); } /** * 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()); } } /** * 信息 * @param id 主键 * @return */ @Override @GetMapping("/{id}/info") public DbLinkEntity getInfo(@PathVariable("id") String id) { DbLinkEntity entity = dblinkService.getInfo(id); return entity; } @Override @GetMapping("/info/{id}/{tenantId}") public Object getInfo(@PathVariable("id") String id, @PathVariable("tenantId") String tenantId) { // 判断是否为多租户 if (configValueUtil.isMultiTenancy()) { //切换成租户库 try{ TenantDataSourceUtil.switchTenant(tenantId); }catch (Exception e){ return ActionResult.fail(ActionResultCode.SessionOverdue.getMessage()); } } return dblinkService.getInfo(id) != null ? dblinkService.getInfo(id) : JsonUtil.getJsonToBean(dataSourceUtil, DbLinkEntity.class); } @Override @GetMapping("/infoByFullName") public DbLinkEntity getInfoByFullName(String fullName) { return dblinkService.getInfoByFullName(fullName); } @Override @NoDataSourceBind @GetMapping("/getResource") public DbLinkEntity getResource(@RequestParam("dbLinkId") String dbLinkId, @RequestParam(name = "tenantId", required = false) String tenantId) throws Exception { // 判断是否为多租户 if (configValueUtil.isMultiTenancy()) { TenantDataSourceUtil.switchTenant(tenantId); } return dblinkService.getResource(dbLinkId); } }