...
 
Commits (10)
......@@ -4,6 +4,7 @@ target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
......@@ -36,3 +37,5 @@ build/
### Mac OS ###
.DS_Store
/.idea/
/.mvn/
......@@ -39,6 +39,10 @@
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- Hive JDBC 驱动 -->
......@@ -119,22 +123,112 @@
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.3.4</version>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-jdbc</artifactId>
<version>0.293</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.4</version>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.2.2</version>
</dependency>
<!-- &lt;!&ndash; Hive JDBC 驱动 &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.apache.hive</groupId>-->
<!-- <artifactId>hive-jdbc</artifactId>-->
<!-- <version>3.1.2</version>-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>org.slf4j</groupId>-->
<!-- <artifactId>slf4j-log4j12</artifactId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <groupId>log4j</groupId>-->
<!-- <artifactId>log4j</artifactId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>log4j-1.2-api</artifactId>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>log4j-slf4j-impl</artifactId>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>log4j-web</artifactId>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>commons-logging</artifactId>-->
<!-- <groupId>commons-logging</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>jdk.tools</artifactId>-->
<!-- <groupId>jdk.tools</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <groupId>org.eclipse.jetty.aggregate</groupId>-->
<!-- <artifactId>*</artifactId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <groupId>org.eclipse.jetty</groupId>-->
<!-- <artifactId>jetty-runner</artifactId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>servlet-api</artifactId>-->
<!-- <groupId>javax.servlet</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>javax.servlet.jsp-api</artifactId>-->
<!-- <groupId>javax.servlet.jsp</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>javax.servlet.jsp</artifactId>-->
<!-- <groupId>org.glassfish.web</groupId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <artifactId>junit</artifactId>-->
<!-- <groupId>junit</groupId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.hadoop</groupId>-->
<!-- <artifactId>hadoop-common</artifactId>-->
<!-- <version>3.3.4</version>-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <artifactId>commons-logging</artifactId>-->
<!-- <groupId>commons-logging</groupId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.hadoop</groupId>-->
<!-- <artifactId>hadoop-hdfs</artifactId>-->
<!-- <version>3.3.4</version>-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <artifactId>commons-logging</artifactId>-->
<!-- <groupId>commons-logging</groupId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.hadoop</groupId>-->
<!-- <artifactId>hadoop-client</artifactId>-->
<!-- <version>3.3.4</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
......@@ -153,4 +247,17 @@
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
......@@ -5,7 +5,10 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.ediagnosis.cdr.dao.mapper")
@MapperScan(basePackages = {
"com.ediagnosis.cdr.*.dao.mapper",
"com.ediagnosis.cdr.dao.mapper"
})
public class CdrApplication {
public static void main(String[] args) {
......
package com.ediagnosis.cdr.cache;
import java.util.Optional;
public interface CacheExecutor {
void put(String key, Object value);
<T> Optional<T> get(String key, Class<T> clazz);
}
package com.ediagnosis.cdr.cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional;
// todo: 待扩展,按需缓存策略进行缓存
@Component
public class CacheFacade {
private static final Logger log = LoggerFactory.getLogger(CacheFacade.class);
private final List<CacheExecutor> cacheExecutors;
public CacheFacade(List<CacheExecutor> cacheExecutors) {
this.cacheExecutors = cacheExecutors;
CacheStrategyHolder.initCacheStrategy();
}
public <T> Optional<T> getCache(String key, Class<T> clazz) {
if (cacheExecutors.isEmpty()) {
log.warn("没有可用的缓存执行器");
return Optional.empty();
}
for (CacheExecutor executor : cacheExecutors) {
Optional<T> optional = executor.get(key, clazz);
if (optional.isPresent()) {
return optional;
}
}
return Optional.empty();
}
public void putCache(String key, String value) {
if (cacheExecutors.isEmpty()) {
log.warn("没有可用的缓存执行器");
}
for (CacheExecutor executor : cacheExecutors) {
executor.put(key, value);
}
}
}
package com.ediagnosis.cdr.cache;
import com.ediagnosis.cdr.context.JsonProcessor;
import java.util.Map;
import java.util.Optional;
public class CacheStrategyHolder {
private static Map cacheStrategy;
public static void initCacheStrategy() {
String CACHE_STRATEGY_PATH = "classpath:cache-strategy.json";
Optional<Map> optionalMap = JsonProcessor.readJsonFileToObject(CACHE_STRATEGY_PATH, Map.class);
optionalMap.ifPresent(map -> cacheStrategy = map);
}
public static Object getStrategy(String key) {
return cacheStrategy.get(key);
}
}
package com.ediagnosis.cdr.cache;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
@Component
@Order(1)
public class CaffeineCacheExecutor implements CacheExecutor {
private static final Logger log = LoggerFactory.getLogger(CaffeineCacheExecutor.class);
private final Cache<String, Object> cache;
public CaffeineCacheExecutor() {
this.cache = Caffeine.newBuilder()
.expireAfterWrite(3, TimeUnit.MINUTES)
.maximumSize(10_000)
.build();
}
@Override
public void put(String key, Object value) {
log.info("put cache key:{}", key);
cache.put(key, value);
}
@Override
public <T> Optional<T> get(String key, Class<T> clazz) {
Object object = cache.getIfPresent(key);
if (object != null) {
if (clazz.isInstance(object)) {
return Optional.of(clazz.cast(object));
} else {
// 类型不匹配,可以记录警告或直接返回 empty
log.warn("Cached object type mismatch for key '{}': expected {}, got {}",
key, clazz.getName(), object.getClass().getName());
return Optional.empty();
}
}
log.warn("Cache miss for key '{}'", key);
return Optional.empty();
}
}
......@@ -4,7 +4,10 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import java.io.File;
import java.io.IOException;
import java.util.Optional;
......@@ -15,24 +18,66 @@ public class JsonProcessor {
public static <T> Optional<T> toObject(String json, Class<T> clazz) {
T value = null;
T value;
try {
value = objectMapper.readValue(json, clazz);
} catch (Exception e) {
log.error("json to object error", e);
return Optional.empty();
}
return Optional.ofNullable(value);
}
public static Optional<String> toJson(Object object) {
String value = "";
String value;
try {
value = objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
log.error("object to json error", e);
return Optional.empty();
}
return Optional.ofNullable(value);
}
public static void print(Object object) {
toJson(object).ifPresent(System.out::println);
}
public static <T> Optional<T> readJsonFileToObject(String path, Class<T> clazz) {
T value;
if (path.startsWith("classpath:")) {
path = path.substring("classpath:".length());
ClassPathResource resource = new ClassPathResource(path);
if (!resource.exists()) {
log.error("classpath resource not exists: {}", path);
return Optional.empty();
}
try {
value = objectMapper.readValue(resource.getInputStream(), clazz);
} catch (IOException e) {
log.error("read json file error", e);
return Optional.empty();
}
return Optional.ofNullable(value);
}else {
File file = new File(path);
if (!file.exists()) {
log.error("file not exists: {}", path);
return Optional.empty();
}
try {
value = objectMapper.readValue(file, clazz);
} catch (IOException e) {
log.error("read json file error", e);
return Optional.empty();
}
}
return Optional.ofNullable(value);
}
}
package com.ediagnosis.cdr.context;
import com.ediagnosis.cdr.context.values.PageVo;
import com.mybatisflex.core.paginate.Page;
import org.springframework.beans.BeanUtils;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author monojun
* @description 拷贝工具
* @createTime 2025年07月03日
*/
public class PageConvertUtils {
/**
* 拷贝 Page<T> 到 PageVo<R>
*
* @param source 原始分页数据
* @param function 转换函数 T -> R
* @param <T> 源类型
* @param <R> 目标类型
* @return PageInfo<R>
*/
public static <T, R> PageVo<R> copyPageInfo(Page<T> source, Function<T, R> function) {
PageVo<R> result = new PageVo<>();
// 拷贝分页信息(排除list)
BeanUtils.copyProperties(source, result, "list");
result.setPageNo(source.getPageNumber());
result.setPageSize(source.getPageSize());
result.setTotalCount(source.getTotalRow());
result.setTotalPage(source.getTotalPage());
List<R> collect = source.getRecords().stream()
.map(function)
.collect(Collectors.toList());
result.setContent(collect);
return result;
}
}
/**
* 存放具有公共使用属性的组件。
* 额外开放的包:values 存放值对象
*/
package com.ediagnosis.cdr.context;
package com.ediagnosis.cdr.value;
package com.ediagnosis.cdr.context.values;
import java.util.List;
public class Page<T> {
public class PageVo<T> {
private long pageNo;
private long pageSize;
private long totalCount;
private List<T> content;
private long totalPage;
public Page() {
public PageVo() {
}
public Page(long pageNo, long pageSize,
public PageVo(long pageNo, long pageSize,
long totalCount, List<T> content) {
this.pageNo = pageNo;
this.pageSize = pageSize;
......
package com.ediagnosis.cdr.value;
package com.ediagnosis.cdr.context.values;
import java.io.Serializable;
......
package com.ediagnosis.cdr.dao;
import com.ediagnosis.cdr.dao.entity.DimDataSummaryEntity;
import com.ediagnosis.cdr.dao.mapper.DimDataSummaryMapper;
import com.ediagnosis.cdr.domain.DimDataSummary;
import com.ediagnosis.cdr.context.TimeUtil;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
@Repository
public class DimDataSummaryRepository {
private final DimDataSummaryMapper dimDataSummaryMapper;
public DimDataSummaryRepository(DimDataSummaryMapper dimDataSummaryMapper) {
this.dimDataSummaryMapper = dimDataSummaryMapper;
}
public List<DimDataSummary> getAllDimDataSummary() {
List<DimDataSummaryEntity> entityList = dimDataSummaryMapper.selectAll();
return entityList.stream().map(this::convertToDimDataSummary).toList();
}
private DimDataSummary convertToDimDataSummary(DimDataSummaryEntity entity) {
Optional<LocalDateTime> timeOptional = TimeUtil.toLocalDateTime(entity.getUpdateTime());
return new DimDataSummary(
entity.getName(),
entity.getCode(),
entity.getValue(),
timeOptional.orElse(null)
);
}
}
package com.ediagnosis.cdr.dataIntegration;
import com.ediagnosis.cdr.context.PageConvertUtils;
import com.ediagnosis.cdr.context.values.PageVo;
import com.ediagnosis.cdr.context.values.Response;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizDataSourceDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizDataSourceQueryDTO;
import com.ediagnosis.cdr.dataIntegration.inner.BizSourceRepository;
import com.ediagnosis.cdr.dataIntegration.value.BizDataSourceVo;
import com.ediagnosis.cdr.dataIntegration.value.param.BizSourceAddOrUpdateParam;
import com.ediagnosis.cdr.dataIntegration.value.param.BizSourceQueryParam;
import com.ediagnosis.cdr.dataIntegration.value.param.BizSystemDeleteParam;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author monojun
* @description 数据源
* @createTime 2025年08月06日
*/
@RestController
@RequestMapping("/bizSource")
@RequiredArgsConstructor
public class BizSourceController {
private final BizSourceRepository sourceRepository;
@PostMapping("/addOrUpdate")
public Response<Integer> addOrUpdate(@RequestBody BizSourceAddOrUpdateParam addOrUpdateParam) {
BizDataSourceDTO addDTO = new BizDataSourceDTO();
BeanUtils.copyProperties(addOrUpdateParam, addDTO);
Integer id = sourceRepository.addDataSource(addDTO);
return Response.success(id);
}
@PostMapping("/page")
public Response<PageVo<BizDataSourceVo>> page(@RequestBody BizSourceQueryParam queryParam) {
BizDataSourceQueryDTO queryDTO = new BizDataSourceQueryDTO();
BeanUtils.copyProperties(queryParam, queryDTO);
Page<BizDataSourceDTO> dataSystemPage = sourceRepository.queryPage(queryDTO);
PageVo<BizDataSourceVo> systemVoPageInfo = PageConvertUtils.copyPageInfo(dataSystemPage, dataSystem -> {
BizDataSourceVo vo = new BizDataSourceVo();
BeanUtils.copyProperties(dataSystem, vo);
return vo;
});
return Response.success(systemVoPageInfo);
}
@PostMapping("/delete")
public Response<List<Integer>> delete(@RequestBody BizSystemDeleteParam deleteParam) {
sourceRepository.deleteDataSource(deleteParam.getIds());
return Response.success(deleteParam.getIds());
}
}
package com.ediagnosis.cdr.dataIntegration;
import com.ediagnosis.cdr.context.PageConvertUtils;
import com.ediagnosis.cdr.context.values.PageVo;
import com.ediagnosis.cdr.context.values.Response;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizSystemDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizSystemQueryDTO;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizSystem;
import com.ediagnosis.cdr.dataIntegration.inner.BizSystemRepository;
import com.ediagnosis.cdr.dataIntegration.value.BizSystemVo;
import com.ediagnosis.cdr.dataIntegration.value.param.BizSystemAddOrUpdateParam;
import com.ediagnosis.cdr.dataIntegration.value.param.BizSystemDeleteParam;
import com.ediagnosis.cdr.dataIntegration.value.param.BizSystemQueryParam;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author monojun
* @description 业务系统
* @createTime 2025年08月06日
*/
@RestController
@RequestMapping("/bizSystem")
@RequiredArgsConstructor
public class BizSystemController {
private final BizSystemRepository systemRepository;
@PostMapping("/addOrUpdate")
public Response<Integer> addOrUpdate(@RequestBody BizSystemAddOrUpdateParam addOrUpdateParam) {
BizSystemDTO addDTO = new BizSystemDTO();
BeanUtils.copyProperties(addOrUpdateParam, addDTO);
Integer id = systemRepository.addBizSystem(addDTO);
return Response.success(id);
}
@PostMapping("/page")
public Response<PageVo<BizSystemVo>> page(@RequestBody BizSystemQueryParam queryParam) {
BizSystemQueryDTO queryDTO = new BizSystemQueryDTO();
BeanUtils.copyProperties(queryParam, queryDTO);
Page<BizSystem> dataSystemPage = systemRepository.queryPage(queryDTO);
PageVo<BizSystemVo> systemVoPageInfo = PageConvertUtils.copyPageInfo(dataSystemPage, dataSystem -> {
BizSystemVo vo = new BizSystemVo();
BeanUtils.copyProperties(dataSystem, vo);
return vo;
});
return Response.success(systemVoPageInfo);
}
@PostMapping("/delete")
public Response<List<Integer>> delete(@RequestBody BizSystemDeleteParam deleteParam) {
systemRepository.deleteDataSystem(deleteParam.getIds());
return Response.success(deleteParam.getIds());
}
}
package com.ediagnosis.cdr.dataIntegration;
import com.ediagnosis.cdr.context.PageConvertUtils;
import com.ediagnosis.cdr.context.values.PageVo;
import com.ediagnosis.cdr.context.values.Response;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizTableDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizTableQueryDTO;
import com.ediagnosis.cdr.dataIntegration.inner.BizTableRepository;
import com.ediagnosis.cdr.dataIntegration.value.BizTableVo;
import com.ediagnosis.cdr.dataIntegration.value.param.BizTableAddOrUpdateParam;
import com.ediagnosis.cdr.dataIntegration.value.param.BizTableDeleteParam;
import com.ediagnosis.cdr.dataIntegration.value.param.BizTableQueryParam;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author monojun
* @description 源数据表controller
* @createTime 2025年08月06日
*/
@RestController
@RequestMapping("/bizTable")
@RequiredArgsConstructor
public class BizTableController {
private final BizTableRepository tableRepository;
@PostMapping("/addOrUpdate")
public Response<Integer> addOrUpdate(@RequestBody BizTableAddOrUpdateParam addOrUpdateParam) {
BizTableDTO addDTO = new BizTableDTO();
BeanUtils.copyProperties(addOrUpdateParam, addDTO);
Integer id = tableRepository.addOrUpdateDataTable(addDTO);
return Response.success(id);
}
@PostMapping("/page")
public Response<PageVo<BizTableVo>> page(@RequestBody BizTableQueryParam queryParam) {
BizTableQueryDTO queryDTO = new BizTableQueryDTO();
BeanUtils.copyProperties(queryParam, queryDTO);
Page<BizTableDTO> dataSystemPage = tableRepository.queryPage(queryDTO);
PageVo<BizTableVo> systemVoPageInfo = PageConvertUtils.copyPageInfo(dataSystemPage, dataTableDTO -> {
BizTableVo vo = new BizTableVo();
BeanUtils.copyProperties(dataTableDTO, vo);
return vo;
});
return Response.success(systemVoPageInfo);
}
@PostMapping("/delete")
public Response<List<Integer>> delete(@RequestBody BizTableDeleteParam deleteParam) {
tableRepository.deleteDataSystem(deleteParam.getIds());
return Response.success(deleteParam.getIds());
}
}
package com.ediagnosis.cdr.dataIntegration;
import com.ediagnosis.cdr.context.PageConvertUtils;
import com.ediagnosis.cdr.context.values.PageVo;
import com.ediagnosis.cdr.context.values.Response;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizTableDefinitionQueryDTO;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizTableDefinition;
import com.ediagnosis.cdr.dataIntegration.inner.BizTableDefinitionRepository;
import com.ediagnosis.cdr.dataIntegration.value.BizTableFieldVo;
import com.ediagnosis.cdr.dataIntegration.value.param.BizTableDefinitionQueryParam;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author monojun
* @description 数据表字段定义
* @createTime 2025年08月06日
*/
@RestController
@RequestMapping("/tableField")
@RequiredArgsConstructor
public class BizTableFieldController {
private final BizTableDefinitionRepository definitionRepository;
@PostMapping("/page")
public Response<PageVo<BizTableFieldVo>> page(@RequestBody BizTableDefinitionQueryParam queryParam) {
BizTableDefinitionQueryDTO queryDTO = new BizTableDefinitionQueryDTO();
BeanUtils.copyProperties(queryParam, queryDTO);
Page<BizTableDefinition> dataTableFieldPage = definitionRepository.queryPage(queryDTO);
PageVo<BizTableFieldVo> tableFieldVoPageInfo = PageConvertUtils.copyPageInfo(dataTableFieldPage, dataTableField -> {
BizTableFieldVo vo = new BizTableFieldVo();
BeanUtils.copyProperties(dataTableField, vo);
return vo;
});
return Response.success(tableFieldVoPageInfo);
}
}
package com.ediagnosis.cdr.dataIntegration;
import org.springframework.stereotype.Component;
/**
* @author monojun
* @description BusinessDataApi
* @createTime 2025年08月04日
*/
@Component
public class BusinessDataApi {
}
package com.ediagnosis.cdr.controller;
package com.ediagnosis.cdr.dataIntegration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/dashBoard")
public class DashBoardController {
public class DataGovernanceController {
......
package com.ediagnosis.cdr.dataIntegration.dao;
import com.ediagnosis.cdr.dataIntegration.dao.dto.*;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizDataSource;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizSystem;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizTable;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizTableDefinition;
import com.ediagnosis.cdr.dataIntegration.dao.mapper.BizDataSourceMapper;
import com.ediagnosis.cdr.dataIntegration.dao.mapper.BizSystemMapper;
import com.ediagnosis.cdr.dataIntegration.dao.mapper.BizTableDefinitionMapper;
import com.ediagnosis.cdr.dataIntegration.dao.mapper.BizTableMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
* @author monojun
* @description 业务dao
* @createTime 2025年08月06日
*/
@Component
@RequiredArgsConstructor
public class BizDataDao {
private final BizSystemMapper systemMapper;
private final BizDataSourceMapper dataSourceMapper;
private final BizTableMapper tableMapper;
private final BizTableDefinitionMapper tableDefinitionMapper;
/**
* 新增or更新业务系统
*
* @param bizSystemDTO 业务系统dto
* @return 业务系统主键id
*/
public Integer addOrUpdateBizSystem(BizSystemDTO bizSystemDTO) {
BizSystem bizSystem = new BizSystem();
BeanUtils.copyProperties(bizSystemDTO, bizSystem);
bizSystem.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
systemMapper.insertOrUpdate(bizSystem);
return bizSystem.getId();
}
/**
* 删除业务系统
*
* @param dataSystemIds 业务系统id列表
*/
public void deleteBatchBizSystem(List<Integer> dataSystemIds) {
systemMapper.deleteBatchByIds(dataSystemIds);
}
/**
* 分页查询业务系统信息
*
* @param queryDTO 查询dto
* @return PageInfo<BizSystem>
*/
public Page<BizSystem> querySystemPage(BizSystemQueryDTO queryDTO) {
QueryWrapper queryWrapper = QueryWrapper.create();
if (StringUtils.hasText(queryDTO.getName())) {
queryWrapper.like(BizSystem::getName, queryDTO.getName());
}
queryWrapper.orderBy(BizSystem::getUpdateTime, false);
queryWrapper.orderBy(BizSystem::getId, false);
return systemMapper.paginate(queryDTO.getPageNo(), queryDTO.getPageSize(), queryWrapper);
}
/**
* 新增or更新业务数据源
*
* @param dataSourceDTO dataSourceDTO
* @return 数据源主键id
*/
public Integer addOrUpdateDataSource(BizDataSourceDTO dataSourceDTO) {
BizDataSource dataSource = new BizDataSource();
BeanUtils.copyProperties(dataSourceDTO, dataSource);
dataSource.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
dataSourceMapper.insertOrUpdate(dataSource);
return dataSource.getId();
}
/**
* 删除数据源
*
* @param dataSourceIds 数据源id列表
*/
public void deleteBatchDataSource(List<Integer> dataSourceIds) {
dataSourceMapper.deleteBatchByIds(dataSourceIds);
}
/**
* 分页查询业务数据源信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataSource>
*/
public Page<BizDataSourceDTO> querySourcePage(BizDataSourceQueryDTO queryDTO) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select("d.*", "ds.name as bizSystemName")
.from(BizDataSource.class).as("d")
.leftJoin(BizSystem.class).as("ds")
.on(BizDataSource::getBizSystemId, BizSystem::getId)
.orderBy(BizDataSource::getUpdateTime, false)
.orderBy(BizDataSource::getId, false);
if (!CollectionUtils.isEmpty(queryDTO.getBizSystemIds())) {
queryWrapper.in(BizDataSource::getBizSystemId, queryDTO.getBizSystemIds());
}
if (StringUtils.hasText(queryDTO.getName())) {
queryWrapper.like(BizDataSource::getName, queryDTO.getName());
}
if (StringUtils.hasText(queryDTO.getIp())) {
queryWrapper.like(BizDataSource::getIp, queryDTO.getIp());
}
if (StringUtils.hasText(queryDTO.getType())) {
queryWrapper.eq(BizDataSource::getType, queryDTO.getType());
}
return dataSourceMapper.paginateAs(queryDTO.getPageNo(), queryDTO.getPageSize(), queryWrapper, BizDataSourceDTO.class);
}
/**
* 新增or更新业务表信息
*
* @param tableDTO tableDTO
* @return 数据表主键id
*/
public Integer addOrUpdateDataTable(BizTableDTO tableDTO) {
BizTable bizTable = new BizTable();
BeanUtils.copyProperties(tableDTO, bizTable);
bizTable.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
tableMapper.insertOrUpdate(bizTable);
return bizTable.getId();
}
/**
* 删除业务表信息
*
* @param dataTableIds 业务表id列表
*/
public void deleteBatchDataTable(List<Integer> dataTableIds) {
tableMapper.deleteBatchByIds(dataTableIds);
}
/**
* 分页查询业务表信息
*
* @param queryDTO 查询dto
* @return PageInfo<BizDataTableDTO>
*/
public Page<BizTableDTO> queryTablePage(BizTableQueryDTO queryDTO) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select("t.*, d.id as bizDataSourceId, d.name as bizDataSourceName, ds.id as bizSystemId, ds.name as bizSystemName")
.from(BizTable.class).as("t")
.leftJoin(BizDataSource.class).as("d")
.on(BizTable::getBizDataSourceId, BizDataSource::getId)
.leftJoin(BizSystem.class).as("ds")
.on(BizTable::getBizSystemId, BizSystem::getId)
.orderBy(BizTable::getUpdateTime, false)
.orderBy(BizTable::getId, false);
if (!CollectionUtils.isEmpty(queryDTO.getBizSystemIds())) {
queryWrapper.in(BizTable::getBizSystemId, queryDTO.getBizSystemIds());
}
if (!CollectionUtils.isEmpty(queryDTO.getBizDataSourceIds())) {
queryWrapper.in(BizTable::getBizDataSourceId, queryDTO.getBizDataSourceIds());
}
if (StringUtils.hasText(queryDTO.getTableName())) {
queryWrapper.like(BizTable::getTableName, queryDTO.getTableName());
}
if (StringUtils.hasText(queryDTO.getTableCode())) {
queryWrapper.like(BizTable::getTableCode, queryDTO.getTableCode());
}
return tableMapper.paginateAs(queryDTO.getPageNo(), queryDTO.getPageSize(), queryWrapper, BizTableDTO.class);
}
/**
* 分页查询业务表字段信息
*
* @param queryDTO 查询dto
* @return PageInfo<BizTableDefinition>
*/
public Page<BizTableDefinition> queryFieldPage(BizTableDefinitionQueryDTO queryDTO) {
QueryWrapper queryWrapper = QueryWrapper.create();
if (StringUtils.hasText(queryDTO.getFieldName())) {
queryWrapper.like(BizTableDefinition::getFieldName, queryDTO.getFieldName());
}
if (StringUtils.hasText(queryDTO.getFieldType())) {
queryWrapper.eq(BizTableDefinition::getFieldType, queryDTO.getFieldType());
}
if (queryDTO.getTableId() != null) {
queryWrapper.eq(BizTableDefinition::getTableId, queryDTO.getTableId());
}
queryWrapper.orderBy(BizTableDefinition::getId, false);
return tableDefinitionMapper.paginate(queryDTO.getPageNo(), queryDTO.getPageSize(), queryWrapper);
}
}
package com.ediagnosis.cdr.dataIntegration.dao.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author monojun
* @description 数据源dto
* @createTime 2025年07月31日
*/
@Data
public class BizDataSourceDTO implements Serializable {
@Serial
private static final long serialVersionUID = -447329639545048136L;
/**
* 主键id
*/
private Integer id;
/**
* 数据源名称
*/
private String name;
/**
* 数据源类型
*/
private String type;
/**
* IP地址
*/
private String ip;
/**
* 属性信息
*/
private String properties;
/**
* 描述
*/
private String description;
/**
* 更新时间
*/
private String updateTime;
/**
* 业务系统id
*/
private Integer bizSystemId;
/**
* 业务系统名称
*/
private String bizSystemName;
}
package com.ediagnosis.cdr.dataIntegration.dao.dto;
import com.ediagnosis.cdr.dataIntegration.value.param.PageQuery;
import lombok.Data;
import java.io.Serial;
import java.util.List;
/**
* @author monojun
* @description 业务数据源查询dto
* @createTime 2025年07月31日
*/
@Data
public class BizDataSourceQueryDTO extends PageQuery {
@Serial
private static final long serialVersionUID = 4373837873599613512L;
/**
* 业务系统id列表
*/
private List<Integer> bizSystemIds;
/**
* 数据源名称
*/
private String name;
/**
* ip地址
*/
private String ip;
/**
* 数据源类型
*/
private String type;
/**
* 连接状态: 0-未知 1-已连接 2-未连接
*/
private Integer status;
}
package com.ediagnosis.cdr.dataIntegration.dao.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @author monojun
* @description 业务系统dto
* @createTime 2025年07月31日
*/
@Data
public class BizSystemDTO implements Serializable {
@Serial
private static final long serialVersionUID = 8024021126762424795L;
/**
* 主键id
*/
private Integer id;
/**
* 业务系统名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 更新时间
*/
private String updateTime;
}
package com.ediagnosis.cdr.dataIntegration.dao.dto;
import com.ediagnosis.cdr.dataIntegration.value.param.PageQuery;
import lombok.Data;
import java.io.Serial;
/**
* @author monojun
* @description 业务系统查询dto
* @createTime 2025年08月06日
*/
@Data
public class BizSystemQueryDTO extends PageQuery {
@Serial
private static final long serialVersionUID = -5610198422339477569L;
/**
* 业务系统名称
*/
private String name;
}
package com.ediagnosis.cdr.dataIntegration.dao.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author monojun
* @description 业务数据源名称
* @createTime 2025年07月31日
*/
@Data
public class BizTableDTO implements Serializable {
@Serial
private static final long serialVersionUID = -1723613352839697417L;
/**
* 主键id
*/
private Integer id;
/**
* 业务表名称
*/
private String tableName;
/**
* 业务表编码
*/
private String tableCode;
/**
* 业务系统id
*/
private Integer bizSystemId;
/**
* 业务系统名称
*/
private String bizSystemName;
/**
* 业务数据源id
*/
private Integer bizDataSourceId;
/**
* 业务数据源名称
*/
private String bizDataSourceName;
/**
* 描述
*/
private String description;
/**
* 更新时间
*/
private String updateTime;
}
package com.ediagnosis.cdr.dataIntegration.dao.dto;
import com.ediagnosis.cdr.dataIntegration.value.param.PageQuery;
import com.mybatisflex.annotation.Column;
import lombok.Data;
import java.io.Serial;
/**
* @author monojun
* @description 业务数据表dto
* @createTime 2025年07月31日
*/
@Data
public class BizTableDefinitionQueryDTO extends PageQuery {
@Serial
private static final long serialVersionUID = -7409716170936124466L;
/**
* 字段名称
*/
private String fieldName;
/**
* 字段类型
*/
private String fieldType;
/**
* 业务表id
*/
private Integer tableId;
}
package com.ediagnosis.cdr.dataIntegration.dao.dto;
import com.ediagnosis.cdr.dataIntegration.value.param.PageQuery;
import lombok.Data;
import java.io.Serial;
import java.util.List;
/**
* @author monojun
* @description 业务数据表dto
* @createTime 2025年07月31日
*/
@Data
public class BizTableQueryDTO extends PageQuery {
@Serial
private static final long serialVersionUID = 2568845339056229745L;
/**
* 业务系统id
*/
private List<Integer> bizSystemIds;
/**
* 业务数据源id列表
*/
private List<Integer> bizDataSourceIds;
/**
* 业务表名称
*/
private String tableName;
/**
* 业务表编号
*/
private String tableCode;
}
package com.ediagnosis.cdr.dataIntegration.dao.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serializable;
/**
* @author monojun
* @description 业务系统数据源表
* @createTime 2025年08月06日
*/
@Data
@Table(value = "biz_data_source")
public class BizDataSource implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@Id(value = "id", keyType = KeyType.Auto)
private Integer id;
/**
* 数据源名称
*/
@Column(value = "name")
private String name;
/**
* 数据源类型
*/
@Column(value = "type")
private String type;
/**
* IP地址
*/
@Column(value = "ip")
private String ip;
/**
* 属性信息
*/
@Column(value = "properties")
private String properties;
/**
* 业务系统id
*/
@Column(value = "biz_system_id")
private Integer bizSystemId;
/**
* 描述
*/
@Column(value = "description")
private String description;
/**
* 更新时间
*/
@Column(value = "update_time")
private String updateTime;
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.entity;
import java.io.Serializable;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
/**
* @author monojun
* @description 业务系统表
* @createTime 2025年08月06日
*/
@Data
@Table(value = "biz_system")
public class BizSystem implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@Id(value = "id", keyType = KeyType.Auto)
private Integer id;
/**
* 业务系统名称
*/
@Column(value = "name")
private String name;
/**
* 描述
*/
@Column(value = "description")
private String description;
/**
* 更新时间
*/
@Column(value = "update_time")
private String updateTime;
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serializable;
/**
* @author monojun
* @description 业务表信息表
* @createTime 2025年08月06日
*/
@Data
@Table(value = "biz_table")
public class BizTable implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@Id(value = "id", keyType = KeyType.Auto)
private Integer id;
/**
* 业务表名称
*/
@Column(value = "table_name")
private String tableName;
/**
* 业务表编码
*/
@Column(value = "table_code")
private String tableCode;
/**
* 业务系统id
*/
@Column(value = "biz_system_id")
private Integer bizSystemId;
/**
* 业务数据源id
*/
@Column(value = "biz_data_source_id")
private Integer bizDataSourceId;
/**
* 描述
*/
@Column(value = "description")
private String description;
/**
* 更新时间
*/
@Column(value = "update_time")
private String updateTime;
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.io.Serializable;
/**
* @author monojun
* @description 业务字段信息表
* @createTime 2025年08月06日
*/
@Data
@Table(value = "biz_table_definition")
public class BizTableDefinition implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@Id(value = "id", keyType = KeyType.Auto)
private Integer id;
/**
* 字段名称
*/
@Column(value = "field_name")
private String fieldName;
/**
* 字段类型
*/
@Column(value = "field_type")
private String fieldType;
/**
* 业务表id
*/
@Column(value = "table_id")
private Integer tableId;
/**
* 描述
*/
@Column(value = "description")
private String description;
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.mapper;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizDataSource;
import java.util.List;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author monojun
* @description 业务系统数据源mapper
* @createTime 2025年08月06日
*/
@Mapper
public interface BizDataSourceMapper extends BaseMapper<BizDataSource> {
int batchInsert(@Param("list") List<BizDataSource> list);
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.mapper;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizSystem;
import java.util.List;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author monojun
* @description 业务系统mapper
* @createTime 2025年08月06日
*/
@Mapper
public interface BizSystemMapper extends BaseMapper<BizSystem> {
int batchInsert(@Param("list") List<BizSystem> list);
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.mapper;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizTableDefinition;
import java.util.List;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author monojun
* @description 业务字段信息mapper
* @createTime 2025年08月06日
*/
@Mapper
public interface BizTableDefinitionMapper extends BaseMapper<BizTableDefinition> {
int batchInsert(@Param("list") List<BizTableDefinition> list);
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.mapper;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizTable;
import java.util.List;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author monojun
* @description 业务表mapper
* @createTime 2025年08月06日
*/
@Mapper
public interface BizTableMapper extends BaseMapper<BizTable> {
int batchInsert(@Param("list") List<BizTable> list);
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.inner;
import com.ediagnosis.cdr.dataIntegration.dao.BizDataDao;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizDataSourceDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizDataSourceQueryDTO;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author monojun
* @description 数据源Repository
* @createTime 2025年08月05日
*/
@Repository
@RequiredArgsConstructor
public class BizSourceRepository {
private final BizDataDao bizDataDao;
/**
* 新增or更新数据源
*
* @param dataSourceDTO 数据源dto
* @return 数据源主键id
*/
public Integer addDataSource(BizDataSourceDTO dataSourceDTO) {
return bizDataDao.addOrUpdateDataSource(dataSourceDTO);
}
/**
* 分页查询数据源信息
*
* @param queryDTO 查询dto
* @return PageInfo<BizDataSourceDTO>
*/
public Page<BizDataSourceDTO> queryPage(BizDataSourceQueryDTO queryDTO) {
return bizDataDao.querySourcePage(queryDTO);
}
/**
* 删除业务系统
*
* @param dataSourceIds 数据源id列表
*/
public void deleteDataSource(List<Integer> dataSourceIds) {
bizDataDao.deleteBatchDataSource(dataSourceIds);
}
}
package com.ediagnosis.cdr.dataIntegration.inner;
import com.ediagnosis.cdr.dataIntegration.dao.BizDataDao;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizSystemDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizSystemQueryDTO;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizSystem;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author monojun
* @description BizSystemRepository
* @createTime 2025年08月05日
*/
@Repository
@RequiredArgsConstructor
public class BizSystemRepository {
private final BizDataDao bizDataDao;
/**
* 新增or更新业务系统
*
* @param bizSystemDTO 业务系统dto
* @return 业务系统主键id
*/
public Integer addBizSystem(BizSystemDTO bizSystemDTO) {
return bizDataDao.addOrUpdateBizSystem(bizSystemDTO);
}
/**
* 分页查询业务系统信息
*
* @param queryDTO 查询dto
* @return PageInfo<BizSystem>
*/
public Page<BizSystem> queryPage(BizSystemQueryDTO queryDTO) {
return bizDataDao.querySystemPage(queryDTO);
}
/**
* 删除业务系统
*
* @param dataSystemIds 业务系统id列表
*/
public void deleteDataSystem(List<Integer> dataSystemIds) {
bizDataDao.deleteBatchBizSystem(dataSystemIds);
}
}
package com.ediagnosis.cdr.dataIntegration.inner;
import com.ediagnosis.cdr.dataIntegration.dao.BizDataDao;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizTableDefinitionQueryDTO;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizTableDefinition;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
/**
* @author monojun
* @description BizTableDefinitionRepository
* @createTime 2025年08月06日
*/
@Repository
@RequiredArgsConstructor
public class BizTableDefinitionRepository {
private final BizDataDao bizDataDao;
/**
* 分页查询源业务表字段信息
*
* @param queryDTO 查询dto
* @return PageInfo<BizTableDTO>
*/
public Page<BizTableDefinition> queryPage(BizTableDefinitionQueryDTO queryDTO) {
return bizDataDao.queryFieldPage(queryDTO);
}
}
package com.ediagnosis.cdr.dataIntegration.inner;
import com.ediagnosis.cdr.dataIntegration.dao.BizDataDao;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizTableDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BizTableQueryDTO;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author monojun
* @description 数据表Repository
* @createTime 2025年08月05日
*/
@Repository
@RequiredArgsConstructor
public class BizTableRepository {
private final BizDataDao bizDataDao;
/**
* 新增or更新源业务表
*
* @param tableDTO 源业务表dto
* @return 源业务表主键id
*/
public Integer addOrUpdateDataTable(BizTableDTO tableDTO) {
return bizDataDao.addOrUpdateDataTable(tableDTO);
}
/**
* 分页查询源业务表信息
*
* @param queryDTO 查询dto
* @return PageInfo<BizTableDTO>
*/
public Page<BizTableDTO> queryPage(BizTableQueryDTO queryDTO) {
return bizDataDao.queryTablePage(queryDTO);
}
/**
* 删除源业务表
*
* @param dataTableIds 源数据表id
*/
public void deleteDataSystem(List<Integer> dataTableIds) {
bizDataDao.deleteBatchDataTable(dataTableIds);
}
}
package com.ediagnosis.cdr.dataIntegration.inner;
import com.ediagnosis.cdr.cache.CacheFacade;
import com.ediagnosis.cdr.dataIntegration.value.TableDefinitionItem;
import com.ediagnosis.cdr.dataIntegration.value.TableTree;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class CacheableTableDefinitionRepository implements TableDefinitionRepository {
private final DefaultTableDefinitionRepository defaultTableDefinitionRepository;
private final CacheFacade cacheFacade;
public CacheableTableDefinitionRepository(DefaultTableDefinitionRepository defaultTableDefinitionRepository,
CacheFacade cacheFacade) {
this.defaultTableDefinitionRepository = defaultTableDefinitionRepository;
this.cacheFacade = cacheFacade;
}
@Override
public TableTree getTableTree(String keyword) {
cacheFacade.getCache(keyword, TableTree.class);
defaultTableDefinitionRepository.getTableTree(keyword);
return null;
}
@Override
public List<TableDefinitionItem> getTableDefinitionItem(String tableId) {
return List.of();
}
}
package com.ediagnosis.cdr.dataIntegration.inner;
import com.ediagnosis.cdr.dataIntegration.value.TableDefinitionItem;
import com.ediagnosis.cdr.dataIntegration.value.TableTree;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class DefaultTableDefinitionRepository implements TableDefinitionRepository {
@Override
public TableTree getTableTree(String keyword) {
return null;
}
@Override
public List<TableDefinitionItem> getTableDefinitionItem(String tableId) {
return List.of();
}
}
package com.ediagnosis.cdr.dataIntegration.inner;
import com.ediagnosis.cdr.dataIntegration.value.TableDefinitionItem;
import com.ediagnosis.cdr.dataIntegration.value.TableTree;
import java.util.List;
public interface TableDefinitionRepository {
/**
* 关键字搜索表
* @param keyword 关键字
*/
TableTree getTableTree(String keyword);
List<TableDefinitionItem> getTableDefinitionItem(String tableId);
}
package com.ediagnosis.cdr.dataIntegration.request;
public record SourceTableRequest(
) {
}
package com.ediagnosis.cdr.dataIntegration.request;
public record TableFieldRequest(
Integer pageNo,
Integer pageSize,
Integer tableId
) {
}
package com.ediagnosis.cdr.dataIntegration.value;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author monojun
* @description 数据源信息
* @createTime 2025年07月31日
*/
@Data
public class BizDataSourceVo implements Serializable {
@Serial
private static final long serialVersionUID = -4205114103165887164L;
/**
* 主键id
*/
private Integer id;
/**
* 数据源名称
*/
private String name;
/**
* 数据源类型
*/
private String type;
/**
* IP地址
*/
private String ip;
/**
* 属性信息
*/
private String properties;
/**
* 描述
*/
private String description;
/**
* 更新时间
*/
private String updateTime;
/**
* 业务系统id
*/
private Integer bizSystemId;
/**
* 业务系统名称
*/
private String bizSystemName;
/**
* 连接状态
*/
private Integer status;
}
package com.ediagnosis.cdr.dataIntegration.value;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author monojun
* @description 业务系统信息
* @createTime 2025年07月31日
*/
@Data
public class BizSystemVo implements Serializable {
@Serial
private static final long serialVersionUID = 1995094555769215993L;
/**
* 主键id
*/
private Integer id;
/**
* 业务系统名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 更新时间
*/
private String updateTime;
}
package com.ediagnosis.cdr.dataIntegration.value;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author monojun
* @description 表字段信息
* @createTime 2025年07月31日
*/
@Data
public class BizTableFieldVo implements Serializable {
@Serial
private static final long serialVersionUID = 3062177923173755855L;
/**
* 主键id
*/
private Integer id;
/**
* 字段名称
*/
private String fieldName;
/**
* 字段类型
*/
private String fieldType;
/**
* 业务表id
*/
private Integer tableId;
/**
* 描述
*/
private String description;
}
package com.ediagnosis.cdr.dataIntegration.value;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @author monojun
* @description 表信息
* @createTime 2025年07月31日
*/
@Data
public class BizTableVo implements Serializable {
@Serial
private static final long serialVersionUID = 8791629491093128048L;
/**
* 主键id
*/
private Integer id;
/**
* 业务表名称
*/
private String tableName;
/**
* 业务表编码
*/
private String tableCode;
/**
* 业务系统id
*/
private Integer bizSystemId;
/**
* 业务系统名称
*/
private String bizSystemName;
/**
* 业务数据源id
*/
private Integer bizDataSourceId;
/**
* 业务数据源名称
*/
private String bizDataSourceName;
/**
* 描述
*/
private String description;
/**
* 更新时间
*/
private String updateTime;
}
package com.ediagnosis.cdr.dataIntegration.value;
public record TableDefinitionItem(
String column,
String type,
String comment
) {
}
package com.ediagnosis.cdr.dataIntegration.value;
import java.util.LinkedList;
import java.util.List;
public class TableTree {
public static class TreeNode {
private final String id;
private final String code;
private final List<TreeNode> children = new LinkedList<>();
private final boolean tableNodeFlag;
public TreeNode(String id, String code, boolean tableNodeFlag) {
this.id = id;
this.code = code;
this.tableNodeFlag = tableNodeFlag;
}
public TreeNode appendChild(String id, String code,boolean tableNodeFlag) {
TreeNode node = new TreeNode(id,code,tableNodeFlag);
this.children.add(node);
return node;
}
public String getId() {
return id;
}
public String getCode() {
return code;
}
public boolean isTableNodeFlag() {
return tableNodeFlag;
}
public List<TreeNode> getChildren() {
return children;
}
}
private List<TreeNode> rootNodes;
public static TableTree create() {
TableTree tableTree = new TableTree();
tableTree.rootNodes = new LinkedList<>();
return tableTree;
}
public TableTree ofRoot(TreeNode... node) {
rootNodes.addAll(List.of(node));
return this;
}
public TableTree ofChild(TreeNode parent, TreeNode... childNode) {
parent.children.addAll(List.of(childNode));
return this;
}
public TreeNode addRoot(TreeNode node) {
rootNodes.add(node);
return node;
}
public List<TreeNode> getRootNodes() {
return rootNodes;
}
public void setRootNodes(List<TreeNode> rootNodes) {
this.rootNodes = rootNodes;
}
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author monojun
* @description 数据源新增参数
* @createTime 2025年08月05日
*/
@Data
public class BizSourceAddOrUpdateParam implements Serializable {
@Serial
private static final long serialVersionUID = 5282468723403441092L;
/**
* 主键id
*/
private Integer id;
/**
* 数据源名称
*/
@Column(value = "name")
private String name;
/**
* 数据源类型
*/
@Column(value = "type")
private String type;
/**
* IP地址
*/
@Column(value = "ip")
private String ip;
/**
* 属性信息
*/
@Column(value = "properties")
private String properties;
/**
* 业务系统id
*/
@Column(value = "biz_system_id")
private Integer bizSystemId;
/**
* 描述
*/
@Column(value = "description")
private String description;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author monojun
* @description 业务系统删除参数
* @createTime 2025年08月05日
*/
@Data
public class BizSourceDeleteParam implements Serializable {
@Serial
private static final long serialVersionUID = -5941215912179720671L;
private List<Integer> ids;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
import java.util.List;
/**
* @author monojun
* @description 数据源查询参数
* @createTime 2025年08月01日
*/
@Data
public class BizSourceQueryParam extends PageQuery {
@Serial
private static final long serialVersionUID = 4384878864788101913L;
/**
* 业务系统id
*/
private List<Integer> bizSystemIds;
/**
* 数据源名称
*/
private String name;
/**
* ip地址
*/
private String ip;
/**
* 数据源类型
*/
private String type;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author monojun
* @description 业务系统新增参数
* @createTime 2025年08月05日
*/
@Data
public class BizSystemAddOrUpdateParam implements Serializable {
@Serial
private static final long serialVersionUID = 8362821373667292598L;
/**
* 主键id
*/
private Integer id;
/**
* 业务系统名称
*/
private String name;
/**
* 描述
*/
private String description;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author monojun
* @description 业务系统删除参数
* @createTime 2025年08月05日
*/
@Data
public class BizSystemDeleteParam implements Serializable {
@Serial
private static final long serialVersionUID = -5941215912179720671L;
private List<Integer> ids;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
/**
* @author monojun
* @description 业务系统分页查询参数
* @createTime 2025年08月01日
*/
@Data
public class BizSystemQueryParam extends PageQuery {
@Serial
private static final long serialVersionUID = 5408831076545737168L;
/**
* 业务系统名称
*/
private String name;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author monojun
* @description 数据表新增参数
* @createTime 2025年08月05日
*/
@Data
public class BizTableAddOrUpdateParam implements Serializable {
@Serial
private static final long serialVersionUID = 3378139727731995899L;
/**
* 主键id
*/
private Integer id;
/**
* 业务表名称
*/
@Column(value = "table_name")
private String tableName;
/**
* 业务表编码
*/
@Column(value = "table_code")
private String tableCode;
/**
* 业务系统id
*/
@Column(value = "biz_system_id")
private Integer bizSystemId;
/**
* 业务数据源id
*/
@Column(value = "biz_data_source_id")
private Integer bizDataSourceId;
/**
* 描述
*/
@Column(value = "description")
private String description;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
/**
* @author monojun
* @description 表字段查询参数
* @createTime 2025年08月01日
*/
@Data
public class BizTableDefinitionQueryParam extends PageQuery {
@Serial
private static final long serialVersionUID = 5419533067070233483L;
/**
* 字段名称
*/
private String fieldName;
/**
* 字段类型
*/
private String fieldType;
/**
* 业务表id
*/
private Integer tableId;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author monojun
* @description 数据表删除参数
* @createTime 2025年08月05日
*/
@Data
public class BizTableDeleteParam implements Serializable {
@Serial
private static final long serialVersionUID = 6212775010515528227L;
private List<Integer> ids;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
import java.util.List;
/**
* @author monojun
* @description 表信息查询参数
* @createTime 2025年08月01日
*/
@Data
public class BizTableQueryParam extends PageQuery {
@Serial
private static final long serialVersionUID = -6012405803243067316L;
/**
* 业务系统id
*/
private List<Integer> bizSystemIds;
/**
* 业务数据源id列表
*/
private List<Integer> bizDataSourceIds;
/**
* 业务表名称
*/
private String name;
/**
* 业务表编号
*/
private String tableNo;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 可以传入一个实体T类型来接收该类型属性值。
*
* @author wangziqiao
*/
@Data
public class PageQuery implements Serializable {
@Serial
private static final long serialVersionUID = -1808475912533720127L;
private int pageNo = 1;
private int pageSize = 10;
public int getOffset() {
return (pageNo - 1) * pageSize;
}
}
package com.ediagnosis.cdr.dataModel;
import org.springframework.stereotype.Component;
@Component
public class ModelDefinitionRepository {
}
package com.ediagnosis.cdr.dao;
package com.ediagnosis.cdr.dataService;
import com.ediagnosis.cdr.value.Page;
import com.ediagnosis.cdr.context.values.PageVo;
import com.mybatisflex.core.row.Row;
import org.springframework.stereotype.Repository;
......@@ -19,7 +19,7 @@ public class DwsRepository {
this.hiveQueryExecutor = hiveQueryExecutor;
}
public Page<Map<String, String>> queryPage(String sql, int pageNo,int pageSize) {
public PageVo<Map<String, String>> queryPage(String sql, int pageNo, int pageSize) {
com.mybatisflex.core.paginate.Page<Row> rowPage = hiveQueryExecutor.selectByFullSql(sql, pageNo, pageSize);
List<Map<String, String>> result = rowPage.getRecords().stream()
.map(row -> {
......@@ -41,7 +41,7 @@ public class DwsRepository {
.filter(map -> !map.isEmpty()) // 可选:过滤掉空 map
.toList();
return new Page<>(pageNo, pageSize, rowPage.getTotalRow(), result);
return new PageVo<>(pageNo, pageSize, rowPage.getTotalRow(), result);
}
......
package com.ediagnosis.cdr.dao;
package com.ediagnosis.cdr.dataService;
import com.ediagnosis.cdr.dao.sqlutil.SqlParser;
import com.mybatisflex.core.datasource.DataSourceKey;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.row.Db;
......
package com.ediagnosis.cdr.dao.sqlutil;
package com.ediagnosis.cdr.dataService;
import net.sf.jsqlparser.JSQLParserException;
......
package com.ediagnosis.cdr.enums;
import lombok.Getter;
/**
* @author monojun
* @description 数据源类型枚举
* @createTime 2025年07月31日
*/
@Getter
public enum DataSourceTypeEnum {
Mysql("Mysql", "mysql"),
Oracle("Oracle", "oracle"),
PostgreSQL("PostgreSQL", "postgreSQL"),
SQLServer("SQLServer", "sqlserver"),
H2("H2", "h2"),
SQLite("SQLite", "sqlite");
private final String key;
private final String value;
DataSourceTypeEnum(String key, String value) {
this.key = key;
this.value = value;
}
}
package com.ediagnosis.cdr.enums;
import lombok.Getter;
/**
* @author monojun
* @description 字段类型枚举
* @createTime 2025年08月01日
*/
@Getter
public enum FieldTypeEnum {
varchar("varchar", "String"),
text("text", "String"),
decimal("decimal", "BigDecimal"),
integer("integer", "Integer"),
int4("int4", "Integer"),
int8("int8", "Integer"),
number("number", "Long"),
datetime("datetime", "Date"),
timestamp("timestamp", "Date"),
bool("boolean", "Boolean");
private final String key;
private final String value;
FieldTypeEnum(String key, String value) {
this.key = key;
this.value = value;
}
}
//package com.ediagnosis.cdr.indicator;
//
//import com.ediagnosis.cdr.indicator.dao.entity.IndicatorEntity;
//import com.ediagnosis.cdr.indicator.dao.mapper.IndicatorMapper;
//import com.ediagnosis.cdr.context.TimeUtil;
//import com.ediagnosis.cdr.indicator.value.Indicator;
//import org.springframework.stereotype.Repository;
//
//import java.time.LocalDateTime;
//
//import java.util.Optional;
//
//@Repository
//public class IndicatorRepository {
//
// private final IndicatorMapper indicatorMapper;
//
// public IndicatorRepository(IndicatorMapper indicatorMapper) {
// this.indicatorMapper = indicatorMapper;
// }
//
//
//
//
// private Optional<Indicator> convertToIndicator(IndicatorEntity entity) {
// Optional<LocalDateTime> timeOptional = TimeUtil.toLocalDateTime(entity.getUpdateTime());
// return timeOptional.map(localDateTime -> new Indicator(
// entity.getName(),
// entity.getCode(),
// entity.getValue(),
// localDateTime
// ));
//
// }
//
//
//}
package com.ediagnosis.cdr.indicator.dao;
import com.ediagnosis.cdr.context.TimeUtil;
import com.ediagnosis.cdr.indicator.dao.entity.IndicatorEntity;
import com.ediagnosis.cdr.indicator.dao.mapper.IndicatorMapper;
import com.ediagnosis.cdr.indicator.value.Indicator;
import com.mybatisflex.core.query.QueryChain;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Optional;
@Component
public class IndicatorDao {
private final IndicatorMapper indicatorMapper;
public IndicatorDao(IndicatorMapper indicatorMapper) {
this.indicatorMapper = indicatorMapper;
}
public Optional<Indicator> getIndicator(String code) {
IndicatorEntity indicatorEntity = QueryChain.of(indicatorMapper)
.eq(IndicatorEntity::getCode, code)
.one();
if (indicatorEntity != null) {
return Optional.of(toIndicator(indicatorEntity));
}
return Optional.empty();
}
public void upsertIndicator(Indicator indicator) {
boolean existed = QueryChain.of(indicatorMapper)
.eq(IndicatorEntity::getCode, indicator.code())
.exists();
if (existed) {
UpdateChain.of(indicatorMapper)
.set(IndicatorEntity::getValue, indicator.value())
.set(IndicatorEntity::getUpdateTime,
TimeUtil.toString(indicator.updateTime()).orElse(""))
.where(IndicatorEntity::getCode)
.eq(indicator.code())
.update();
}else {
indicatorMapper.insert(toEntity(indicator));
}
}
public void deleteIndicator(String code) {
QueryWrapper queryWrapper = QueryWrapper.create();
queryWrapper
.where(IndicatorEntity::getCode)
.eq(code);
indicatorMapper.deleteByQuery(queryWrapper);
}
private Indicator toIndicator(IndicatorEntity entity) {
String name = entity.getName();
String code = entity.getCode();
String value = entity.getValue();
String description = entity.getDescription();
LocalDateTime updateTime = TimeUtil.toLocalDateTime(entity.getUpdateTime()).orElse(null);
return new Indicator(name, code, value, description, updateTime);
}
private IndicatorEntity toEntity(Indicator indicator) {
IndicatorEntity entity = new IndicatorEntity();
entity.setName(indicator.name());
entity.setCode(indicator.code());
entity.setValue(indicator.value());
entity.setDescription(indicator.description());
entity.setUpdateTime(TimeUtil.toString(indicator.updateTime()).orElse(""));
return entity;
}
}
package com.ediagnosis.cdr.dao.entity;
package com.ediagnosis.cdr.indicator.dao.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
/**
* 记录数据总量概览
* @TableName dim_data_summary
*/
@Table(value ="dim_data_summary")
public class DimDataSummaryEntity {
@Table(value ="indicator",dataSource = "ds-mysql")
public class IndicatorEntity {
/**
*
*/
......@@ -32,6 +29,8 @@ public class DimDataSummaryEntity {
*/
private String value;
private String description;
/**
* 更新时间
*/
......@@ -93,6 +92,15 @@ public class DimDataSummaryEntity {
this.value = value;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
/**
* 更新时间
*/
......
package com.ediagnosis.cdr.dao.mapper;
package com.ediagnosis.cdr.indicator.dao.mapper;
import com.ediagnosis.cdr.dao.entity.DimDataSummaryEntity;
import com.ediagnosis.cdr.indicator.dao.entity.IndicatorEntity;
import com.mybatisflex.core.BaseMapper;
import org.mybatis.spring.annotation.MapperScan;
@MapperScan
public interface DimDataSummaryMapper extends BaseMapper<DimDataSummaryEntity> {
public interface IndicatorMapper extends BaseMapper<IndicatorEntity> {
}
......
package com.ediagnosis.cdr.indicator.statistics;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class StatisticsController {
}
package com.ediagnosis.cdr.indicator.statistics;
public interface StatisticsService {
long getRowCount();
int getDataSourceCount();
int getSourceBizTableCount();
}
package com.ediagnosis.cdr.indicator.statistics.impl;
import com.ediagnosis.cdr.indicator.statistics.StatisticsService;
public abstract class AbstractDataSourceCountService implements StatisticsService {
@Override
public int getDataSourceCount() {
return 0;
}
}
package com.ediagnosis.cdr.indicator.statistics.impl;
import com.ediagnosis.cdr.indicator.statistics.StatisticsService;
public abstract class AbstractRowCountService implements StatisticsService {
@Override
public long getRowCount() {
return 0;
}
}
package com.ediagnosis.cdr.indicator.statistics.impl;
import com.ediagnosis.cdr.indicator.statistics.StatisticsService;
public abstract class AbstractSourceBizTableCountService implements StatisticsService {
public int getSourceBizTableCount(){
return 0;
}
}
package com.ediagnosis.cdr.indicator.statistics.impl;
import com.ediagnosis.cdr.indicator.statistics.StatisticsService;
import org.springframework.stereotype.Service;
@Service
public class CacheableStatisticsService implements StatisticsService {
private final AbstractRowCountService rowCountService;
private final AbstractDataSourceCountService dataSourceCountService;
private final AbstractSourceBizTableCountService sourceBizTableCountService;
public CacheableStatisticsService() {
this.rowCountService = new AbstractRowCountService(){
@Override
public int getDataSourceCount() {
return 0;
}
@Override
public int getSourceBizTableCount() {
return 0;
}
};
this.dataSourceCountService =new AbstractDataSourceCountService(){
@Override
public long getRowCount() {
return 0;
}
@Override
public int getSourceBizTableCount() {
return 0;
}
} ;
this.sourceBizTableCountService = new AbstractSourceBizTableCountService() {
@Override
public long getRowCount() {
return 0;
}
@Override
public int getDataSourceCount() {
return 0;
}
};
}
@Override
public long getRowCount() {
return rowCountService.getRowCount();
}
@Override
public int getDataSourceCount() {
return dataSourceCountService.getDataSourceCount();
}
@Override
public int getSourceBizTableCount() {
return sourceBizTableCountService.getSourceBizTableCount();
}
}
package com.ediagnosis.cdr.domain;
package com.ediagnosis.cdr.indicator.value;
import java.time.LocalDateTime;
public record DimDataSummary(
public record Indicator(
String name,
String code,
String value,
String description,
LocalDateTime updateTime
) {
......
package com.ediagnosis.cdr.maintenance;
public interface JobRepository {
}
package com.ediagnosis.cdr.maintenance.hostMonitor;
import com.ediagnosis.cdr.context.values.Response;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/host")
public class DashBoardController {
private final HostMonitorValueRepository hostMonitorValueRepository;
public DashBoardController(HostMonitorValueRepository hostMonitorValueRepository) {
this.hostMonitorValueRepository = hostMonitorValueRepository;
}
@GetMapping("/list")
public Response<List<HostMonitorValue.HostValue>> list() {
HostMonitorValue.HostValue hostValue = hostMonitorValueRepository.getHostValue();
return Response.success(List.of(hostValue));
}
@PostMapping("/monitor")
public Response<List<HostMonitorValue>> monitor(String hostName) {
HostMonitorValue hostMonitorValue = hostMonitorValueRepository.getHostMonitorValue(hostName);
return Response.success(List.of(hostMonitorValue));
}
}
package com.ediagnosis.cdr.maintenance.hostMonitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HostMonitor {
private static final Logger log = LoggerFactory.getLogger(HostMonitor.class);
public static Optional<Map<String, String>> getHostIpAndName() {
String hostname = "";
String ip = "";
Optional<String> optionalHostname = executeCommand("hostname");
Optional<String> optionalIp = executeCommand("hostname", "-I");
if (optionalHostname.isPresent()) {
hostname = optionalHostname.get();
}
if (optionalIp.isPresent()) {
ip = optionalIp.get();
}
Map<String, String> host = Map.of("hostName", hostname,
"ip", ip);
log.info("主机信息: " + host);
return Optional.of(host);
}
/**
* 执行系统命令并返回第一行输出
*/
private static Optional<String> executeCommand(String... command) {
ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectErrorStream(true); // 合并标准输出和错误输出
Optional<String> optionalString = Optional.empty();
log.info("执行命令: " + String.join(" ", command));
Process process;
try {
process = pb.start();
} catch (IOException e) {
// 可以记录日志
log.error("执行命令失败:" + String.join(" ", command), e);
return optionalString;
}
// 使用 try-with-resources 自动关闭流
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String line = reader.readLine(); // 通常只关心第一行
optionalString = Optional.of(line);
} catch (IOException e) {
// 可以记录日志
log.error("读取命令结果失败:" + String.join(" ", command), e);
return optionalString;
}
return optionalString;
}
public static Optional<Map<String, String>> getCpuUsage() {
Optional<Map<String, String>> optionalMap = Optional.empty();
ProcessBuilder pb = new ProcessBuilder("top", "-bn1");
log.info("执行命令:top -bn1");
Process process = null;
try {
process = pb.start();
} catch (IOException e) {
log.error("执行命令时,启动进程失败: top -bn1", e);
return optionalMap;
}
String cpuLine = "";
String loadLine = "";
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("load average:")) {
loadLine = line;
} else if (line.contains("Cpu(s)")) {
cpuLine = line;
}
if (!cpuLine.isBlank() && !loadLine.isBlank()) {
break;
}
}
} catch (IOException e) {
log.error("读取cpu信息时失败:top -bn1 ", e);
return optionalMap;
}
// 去掉前缀 "%Cpu(s):",并提取数字
String[] parts = cpuLine
.replace("%Cpu(s):", "")
.trim()
.split(",");
// 存储各个字段的值
double id = 0;
for (String part : parts) {
part = part.trim();
if (part.endsWith("id")) {
id = Double.parseDouble(part.replace("id", "").trim());
}
}
String cpuUsage = Math.round(100 - id) + "%";
String cpuCores = String.valueOf(
Runtime.getRuntime().availableProcessors()
);
String loadAverage = "";
// 正则匹配 "load average: 数值, 数值, 数值"
Pattern pattern = Pattern.compile("load average: ([\\d.]+), ([\\d.]+), ([\\d.]+)");
Matcher matcher = pattern.matcher(loadLine);
if (matcher.find()) {
double fiveMin = Double.parseDouble(matcher.group(2));
loadAverage = String.valueOf(fiveMin);
}
// 方法一:100 - idle
Map<String, String> cpu = Map.of(
"cpuUsage", cpuUsage,
"cpuCores", cpuCores,
"loadAverage", loadAverage
);
log.info("cpu信息: " + cpu);
return Optional.of(cpu);
}
public static Optional<Map<String, String>> getMemoryUsage() {
Optional<Map<String, String>> optionalMap = Optional.empty();
ProcessBuilder pb = new ProcessBuilder("free", "-h");
log.info("执行命令:free -h");
Process process = null;
try {
process = pb.start();
} catch (IOException e) {
log.error("执行命令时,启动进程失败: free -h");
return optionalMap;
}
String memLine = "";
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("Mem:")) {
memLine = line;
}
}
} catch (IOException e) {
log.error("读取内存信息时失败:free -h ");
}
// 将多个空格替换为单个空格,便于分割
String[] parts = memLine.trim().replaceAll("\\s+", " ").split(" ");
// 解析各字段(单位:KB、M、G)
String totalStr = parts[1];
String availableStr = parts[6];
// 转换为统一单位(GB)
double total = parseSizeToGB(totalStr);
double available = parseSizeToGB(availableStr);
// 计算内存使用率:(1 - available / total) * 100%
double usagePercent = (1 - (available / total)) * 100;
String memoryUsage = Math.round(usagePercent) + "%";
String used = (total - available) + "G";
String size = total + "G";
String free = available + "G";
Map<String, String> memory = Map.of(
"used", used,
"size", size,
"free", free,
"memoryUsage", memoryUsage
);
log.info("内存信息: " + memory);
return Optional.of(memory);
}
private static double parseSizeToGB(String size) {
double value;
if (size.endsWith("G")) {
value = Double.parseDouble(size.replace("G", ""));
} else if (size.endsWith("M")) {
value = Double.parseDouble(size.replace("M", "")) / 1024;
} else if (size.endsWith("K")) {
value = Double.parseDouble(size.replace("K", "")) / (1024 * 1024);
} else {
value = Double.parseDouble(size) / (1024 * 1024 * 1024);
}
return value;
}
public static Optional<Map<String, String>> getDiskUsage() {
ProcessBuilder pb = new ProcessBuilder("df", "-h", "/");
Optional<Map<String, String>> optionalMap = Optional.empty();
log.info("执行命令:df -h /");
Process process = null;
try {
process = pb.start();
} catch (IOException e) {
log.error("执行命令时,启动进程失败: df -h /", e);
return optionalMap;
}
String body;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
body = reader.readLine();
} catch (IOException e) {
log.error("读取磁盘信息时失败:df -h /", e);
return optionalMap;
}
String[] parts = body.trim().replaceAll("\\s+", " ").split(" ");
// 确保是有效行(至少有6列)
if (parts.length < 6 || parts[4].indexOf('%') == -1) {
throw new IllegalArgumentException("无效的磁盘使用行");
}
// 提取 Use% 字段(如 "69%")
String usePercent = parts[4];
String size = parts[1];
String free = parts[3];
String used = parts[2];
// 转换为整数
Map<String, String> disk = Map.of(
"usePercent", usePercent,
"size", size,
"free", free,
"used", used);
log.info("磁盘信息: " + disk);
return Optional.of(disk);
}
}
package com.ediagnosis.cdr.maintenance.hostMonitor;
public record HostMonitorValue(
HostValue host,
CpuValue cpu,
MemoryValue memory,
DiskValue disk
) {
public record HostValue(
String hostName,
String hostIp
){
}
public record CpuValue(
int coreNum,
double fiveMinLoad,
String usage
){
}
public record MemoryValue(
String usage,
String size,
String used,
String free
){
}
public record DiskValue(
String usage,
String size,
String used,
String free
){
}
}
package com.ediagnosis.cdr.maintenance.hostMonitor;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Optional;
@Component
public class HostMonitorValueRepository {
// todo: 待扩展,获取集群主机的列表
public HostMonitorValue.HostValue getHostValue() {
Optional<Map<String, String>> hostIpAndNameOptional = HostMonitor.getHostIpAndName();
String hostname = "";
String ip = "";
if (hostIpAndNameOptional.isPresent()) {
Map<String, String> hostMap = hostIpAndNameOptional.get();
hostname = hostMap.get("hostname");
ip = hostMap.get("ip");
}
return new HostMonitorValue.HostValue(hostname, ip);
}
// todo: 带扩展,获取指定主机的监控信息
public HostMonitorValue getHostMonitorValue(String hostName) {
Optional<Map<String, String>> hostIpAndNameOptional = HostMonitor.getHostIpAndName();
HostMonitorValue.HostValue hostValue;
if (hostIpAndNameOptional.isPresent()) {
Map<String, String> hostMap = hostIpAndNameOptional.get();
String hostNameInner = hostMap.get("hostname");
String ip = hostMap.get("ip");
hostValue = new HostMonitorValue.HostValue(hostNameInner, ip);
}else {
hostValue = new HostMonitorValue.HostValue("", "");
}
Optional<Map<String, String>> cpuUsageOptional = HostMonitor.getCpuUsage();
HostMonitorValue.CpuValue cpuValue;
if (cpuUsageOptional.isPresent()) {
Map<String, String> cpuMap = cpuUsageOptional.get();
String cpuUsage = cpuMap.get("cpuUsage");
String cpuCores = cpuMap.get("cpuCores");
int cpuCoresNum = Integer.parseInt(cpuCores);
String loadAverage = cpuMap.get("loadAverage");
double loadAverageNum = Double.parseDouble(loadAverage);
cpuValue = new HostMonitorValue.CpuValue(cpuCoresNum, loadAverageNum, cpuUsage);
} else {
cpuValue = new HostMonitorValue.CpuValue(0, 0, "");
}
Optional<Map<String, String>> memoryUsageOptional = HostMonitor.getMemoryUsage();
HostMonitorValue.MemoryValue memoryValue;
if (memoryUsageOptional.isPresent()) {
Map<String, String> memoryMap = memoryUsageOptional.get();
String used = memoryMap.get("used");
String size = memoryMap.get("size");
String free = memoryMap.get("free");
String memoryUsage = memoryMap.get("memoryUsage");
memoryValue = new HostMonitorValue.MemoryValue(memoryUsage, size, used, free);
} else {
memoryValue = new HostMonitorValue.MemoryValue("", "", "", "");
}
Optional<Map<String, String>> diskUsageOptional = HostMonitor.getDiskUsage();
HostMonitorValue.DiskValue diskValue;
if (diskUsageOptional.isPresent()) {
Map<String, String> diskMap = diskUsageOptional.get();
String usePercent = diskMap.get("usePercent");
String used = diskMap.get("used");
String size = diskMap.get("size");
String free = diskMap.get("free");
diskValue = new HostMonitorValue.DiskValue(usePercent, size, used, free);
} else {
diskValue = new HostMonitorValue.DiskValue("", "", "", "");
}
return new HostMonitorValue(hostValue, cpuValue, memoryValue, diskValue);
}
}
/**
* 分包原则:
* 1、每层包结构代表一个特定领域,项目整体按照业务领域进行一级分包,简称业务模块,模块内按功能进行分包。
* 2、每层第一层包目录下的类为公开类,额外追加的公开包需要再package-info.java中声明。
* 3、每层包目录下的子包结构的类为私有类,私有类不提供外部访问,外部不感知。
* 4、开发遵循测试先行的流程,每层领域都要有单元测试、集成测试。
* 代码设计原则:
* 1、注重扩展性的同时,要警惕过渡设计 。
* 2、尽力遮蔽对特定框架、软件的强依赖,形成防腐层,便于重构。
* 3、代码以简洁为目标,例如只有一个实现类的情况,没有必要使用接口。
* 4、代码尽量使用抽象类、组合、继承等手段解构大类,形成一系列灵活的小类。
* 5、如果不写注释,代码要做到语义化,仅通过阅读单词就能准确描述出代码的意图。
* 角色语义:
* 构建类:
* 1、repository:代表提供某类对象的仓库,对对象的生命周期进行管理,外部直接询问repository拿到对象,不关注具体细节。
* 2、builder:代表提供对象构建者,为对象的属性进行组装,用于构建复杂对象。
* 3、factory:代表提供对象工厂,提供对象创建功能,用于构建消耗性对象。
* 行为类:
* 1、service:代表提供某类相关服务,代表一组难以归属实例对象的行为抽象。
* 2、dao:数据访问对象,用于封装对数据库的访问,进行业务对象到数据库实体记录的转换
* 3、convertor:数据转换器,用于将值对象之间转换。
* 4、processor/handler: 代表处理某类功能的实例对象,实例有一组对应的行为
* 5、manager: 代表管理某一系列实例对象的实例对象
* 6、listener: 代表监听某类事件,并执行相应的处理逻辑。
* 7、observer: 代表观察某类状态的实例对象
* 8、strategy: 代表策略对象,提供一组算法,并封装,使得算法可以相互替换。
* 9、validator: 代表数据校验对象,用于校验数据,并返回校验结果。
* 10、executor: 代表执行器对象,执行某类任务。
* 11、scheduler: 代表计划任务对象,执行某类任务。
* 12、chain: 连锁对象,执行某类任务,并传递给下一个连锁。
* 13、proxy: 代理对象,代理某类对象,对某类对象的行为进行代理。
* 数据结构:
* 1、value:表示值对象,没有唯一标识,无需管理生命周期,用于系统内部一对一的数据交换。
* 2、entity:表示实体对象,有唯一标识,需要管理生命周期
* 3、event:表示事件对象,有唯一追踪标识,存在生命周期,用于描述某类事件,并携带事件数据,用在系统内部对边界的访问
* 4、signal:表示信号对象,无唯一追踪标识,不存在生命周期,用于描述某类信号,并携带信号数据,用在系统内部一对N的通知
* 5、request:表示请求对象,专用于外部网络请求对边界的访问
* 6、response:表示响应对象,专用于边界对外部网络请求的返回
* 包名语义:
* 1、endpoint:表示端点,是系统、模块的边界
* 2、api:表示接口,端点的一种,是系统对外提供功能的入口
* 3、values:表示值对象,存放数据结构
* 4、inner:存放难以分类的内部文件
* 5、entities:表示对应数据库记录的实体对象
* 6、context:表示上下文对象,存放贯通系统层级的类
* 系统业务术语:
* cdr:临床数据中心
* dataIntegration:数据集成,描述采集数据的业务。
* dataService:数据服务,描述数据中心对外提供数据的业务。
* indicator:指标,描述数据中心的指标业务。
* dataModel:模型设计,描述数据中心数据服务层的模型设计业务。
* dataDict: 数据字典
* maintenance: 运维中心,描述系统监控、作业调度、任务调度。
*
*
*
*/
package com.ediagnosis.cdr;
\ No newline at end of file
......@@ -2,11 +2,14 @@
mybatis-flex:
datasource:
ds-mysql:
url: jdbc:mysql://10.11.4.21:33063/cdr
url: jdbc:mysql://10.11.4.21:33063/cdr_v1
username: root
password: Admin123456#
ds-hive:
url: jdbc:hive2://10.11.4.21:10000
username: root
ds-presto:
url: jdbc:presto://10.11.4.21:8999
username: root
server:
port: 7001
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ediagnosis.cdr.dataIntegration.dao.mapper.BizDataSourceMapper">
<resultMap id="BaseResultMap" type="com.ediagnosis.cdr.dataIntegration.dao.entity.BizDataSource">
<!--@mbg.generated-->
<!--@Table biz_data_source-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="type" jdbcType="VARCHAR" property="type" />
<result column="ip" jdbcType="VARCHAR" property="ip" />
<result column="properties" jdbcType="LONGVARCHAR" property="properties" />
<result column="biz_system_id" jdbcType="INTEGER" property="bizSystemId" />
<result column="description" jdbcType="LONGVARCHAR" property="description" />
<result column="update_time" jdbcType="VARCHAR" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, `name`, `type`, ip, properties, biz_system_id, description, update_time
</sql>
<insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
<!--@mbg.generated-->
insert into biz_data_source
(`name`, `type`, ip, properties, biz_system_id, description, update_time)
values
<foreach collection="list" item="item" separator=",">
(#{item.name,jdbcType=VARCHAR}, #{item.type,jdbcType=VARCHAR}, #{item.ip,jdbcType=VARCHAR},
#{item.properties,jdbcType=LONGVARCHAR}, #{item.bizSystemId,jdbcType=INTEGER},
#{item.description,jdbcType=LONGVARCHAR}, #{item.updateTime,jdbcType=VARCHAR})
</foreach>
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ediagnosis.cdr.dataIntegration.dao.mapper.BizSystemMapper">
<resultMap id="BaseResultMap" type="com.ediagnosis.cdr.dataIntegration.dao.entity.BizSystem">
<!--@mbg.generated-->
<!--@Table biz_system-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="description" jdbcType="LONGVARCHAR" property="description" />
<result column="update_time" jdbcType="VARCHAR" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, `name`, description, update_time
</sql>
<insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
<!--@mbg.generated-->
insert into biz_system
(`name`, description, update_time)
values
<foreach collection="list" item="item" separator=",">
(#{item.name,jdbcType=VARCHAR}, #{item.description,jdbcType=LONGVARCHAR}, #{item.updateTime,jdbcType=VARCHAR}
)
</foreach>
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ediagnosis.cdr.dataIntegration.dao.mapper.BizTableDefinitionMapper">
<resultMap id="BaseResultMap" type="com.ediagnosis.cdr.dataIntegration.dao.entity.BizTableDefinition">
<!--@mbg.generated-->
<!--@Table biz_table_definition-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="field_name" jdbcType="VARCHAR" property="fieldName" />
<result column="field_type" jdbcType="VARCHAR" property="fieldType" />
<result column="table_id" jdbcType="INTEGER" property="tableId" />
<result column="description" jdbcType="LONGVARCHAR" property="description" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, field_name, field_type, table_id, description
</sql>
<insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
<!--@mbg.generated-->
insert into biz_table_definition
(field_name, field_type, table_id, description)
values
<foreach collection="list" item="item" separator=",">
(#{item.fieldName,jdbcType=VARCHAR}, #{item.fieldType,jdbcType=VARCHAR}, #{item.tableId,jdbcType=INTEGER},
#{item.description,jdbcType=LONGVARCHAR})
</foreach>
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ediagnosis.cdr.dataIntegration.dao.mapper.BizTableMapper">
<resultMap id="BaseResultMap" type="com.ediagnosis.cdr.dataIntegration.dao.entity.BizTable">
<!--@mbg.generated-->
<!--@Table biz_table-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="table_name" jdbcType="VARCHAR" property="tableName" />
<result column="table_code" jdbcType="VARCHAR" property="tableCode" />
<result column="biz_system_id" jdbcType="BIGINT" property="bizSystemId" />
<result column="biz_data_source_id" jdbcType="BIGINT" property="bizDataSourceId" />
<result column="description" jdbcType="LONGVARCHAR" property="description" />
<result column="update_time" jdbcType="VARCHAR" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, `table_name`, table_code, biz_system_id, biz_data_source_id, description, update_time
</sql>
<insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
<!--@mbg.generated-->
insert into biz_table
(`table_name`, table_code, biz_system_id, biz_data_source_id, description, update_time
)
values
<foreach collection="list" item="item" separator=",">
(#{item.tableName,jdbcType=VARCHAR}, #{item.tableCode,jdbcType=VARCHAR}, #{item.bizSystemId,jdbcType=BIGINT},
#{item.bizDataSourceId,jdbcType=BIGINT}, #{item.description,jdbcType=LONGVARCHAR},
#{item.updateTime,jdbcType=VARCHAR})
</foreach>
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ediagnosis.cdr.dataIntegration.dao.mapper.BusinessDataSourceMapper">
<resultMap id="BaseResultMap" type="com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSource">
<!--@mbg.generated-->
<!--@Table business_data_source-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="type" jdbcType="VARCHAR" property="type" />
<result column="ip_address" jdbcType="VARCHAR" property="ipAddress" />
<result column="properties" jdbcType="LONGVARCHAR" property="properties" />
<result column="business_id" jdbcType="BIGINT" property="businessId" />
<result column="description" jdbcType="LONGVARCHAR" property="description" />
<result column="status" jdbcType="INTEGER" property="status" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="create_user_id" jdbcType="BIGINT" property="createUserId" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="update_user_id" jdbcType="BIGINT" property="updateUserId" />
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, `name`, `type`, ip_address, properties, business_id, description, `status`, create_time,
create_user_id, update_time, update_user_id, is_deleted
</sql>
<sql id="Column_List_DTO">
d.id, d.`name`, d.`type`, d.ip_address, d.properties, d.business_id, ds.name as businessName, d.description, d.`status`, d.create_time,
d.create_user_id, d.update_time, d.update_user_id
</sql>
<insert id="batchInsert" parameterType="map">
<!--@mbg.generated-->
insert into business_data_source
(id, `name`, `type`, ip_address, properties, business_id, description, `status`,
create_time, create_user_id, update_time, update_user_id, is_deleted)
values
<foreach collection="list" item="item" separator=",">
(#{item.id,jdbcType=BIGINT}, #{item.name,jdbcType=VARCHAR}, #{item.type,jdbcType=VARCHAR},
#{item.ipAddress,jdbcType=VARCHAR}, #{item.properties,jdbcType=LONGVARCHAR}, #{item.businessId,jdbcType=BIGINT},
#{item.description,jdbcType=LONGVARCHAR}, #{item.status,jdbcType=INTEGER}, #{item.createTime,jdbcType=TIMESTAMP},
#{item.createUserId,jdbcType=BIGINT}, #{item.updateTime,jdbcType=TIMESTAMP}, #{item.updateUserId,jdbcType=BIGINT},
#{item.isDeleted,jdbcType=INTEGER})
</foreach>
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ediagnosis.cdr.dataIntegration.dao.mapper.BusinessDataSystemMapper">
<resultMap id="BaseResultMap" type="com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSystem">
<!--@mbg.generated-->
<!--@Table business_data_system-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="description" jdbcType="LONGVARCHAR" property="description" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="create_user_id" jdbcType="BIGINT" property="createUserId" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="update_user_id" jdbcType="BIGINT" property="updateUserId" />
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, name, description, create_time, create_user_id, update_time, update_user_id,
is_deleted
</sql>
<insert id="batchInsert" keyColumn="id" keyProperty="id" parameterType="map" useGeneratedKeys="true">
<!--@mbg.generated-->
insert into business_data_system
(name, description, create_time, create_user_id, update_time, update_user_id, is_deleted
)
values
<foreach collection="list" item="item" separator=",">
(#{item.name,jdbcType=VARCHAR}, #{item.description,jdbcType=LONGVARCHAR}, #{item.createTime,jdbcType=TIMESTAMP},
#{item.createUserId,jdbcType=BIGINT}, #{item.updateTime,jdbcType=TIMESTAMP}, #{item.updateUserId,jdbcType=BIGINT},
#{item.isDeleted,jdbcType=INTEGER})
</foreach>
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ediagnosis.cdr.dataIntegration.dao.mapper.BusinessDataTableFieldMapper">
<resultMap id="BaseResultMap" type="com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataTableField">
<!--@mbg.generated-->
<!--@Table business_data_table_field-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="field_name" jdbcType="VARCHAR" property="fieldName" />
<result column="field_type" jdbcType="VARCHAR" property="fieldType" />
<result column="table_id" jdbcType="BIGINT" property="tableId" />
<result column="description" jdbcType="LONGVARCHAR" property="description" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="create_user_id" jdbcType="BIGINT" property="createUserId" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="update_user_id" jdbcType="BIGINT" property="updateUserId" />
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, field_name, field_type, table_id, description, create_time, create_user_id, update_time,
update_user_id, is_deleted
</sql>
<insert id="batchInsert" parameterType="map">
<!--@mbg.generated-->
insert into business_data_table_field
(id, field_name, field_type, table_id, description, create_time, create_user_id,
update_time, update_user_id, is_deleted)
values
<foreach collection="list" item="item" separator=",">
(#{item.id,jdbcType=BIGINT}, #{item.fieldName,jdbcType=VARCHAR}, #{item.fieldType,jdbcType=VARCHAR},
#{item.tableId,jdbcType=BIGINT}, #{item.description,jdbcType=LONGVARCHAR}, #{item.createTime,jdbcType=TIMESTAMP},
#{item.createUserId,jdbcType=BIGINT}, #{item.updateTime,jdbcType=TIMESTAMP}, #{item.updateUserId,jdbcType=BIGINT},
#{item.isDeleted,jdbcType=INTEGER})
</foreach>
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ediagnosis.cdr.dataIntegration.dao.mapper.BusinessDataTableMapper">
<resultMap id="BaseResultMap" type="com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataTable">
<!--@mbg.generated-->
<!--@Table business_data_table-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="table_no" jdbcType="VARCHAR" property="tableNo" />
<result column="business_id" jdbcType="BIGINT" property="businessId" />
<result column="source_id" jdbcType="BIGINT" property="sourceId" />
<result column="description" jdbcType="LONGVARCHAR" property="description" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="create_user_id" jdbcType="BIGINT" property="createUserId" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="update_user_id" jdbcType="BIGINT" property="updateUserId" />
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, `name`, table_no, business_id, source_id, description, create_time, create_user_id,
update_time, update_user_id, is_deleted
</sql>
<insert id="batchInsert" parameterType="map">
<!--@mbg.generated-->
insert into business_data_table
(id, `name`, table_no, business_id, source_id, description, create_time, create_user_id,
update_time, update_user_id, is_deleted)
values
<foreach collection="list" item="item" separator=",">
(#{item.id,jdbcType=BIGINT}, #{item.name,jdbcType=VARCHAR}, #{item.tableNo,jdbcType=VARCHAR},
#{item.businessId,jdbcType=BIGINT}, #{item.sourceId,jdbcType=BIGINT}, #{item.description,jdbcType=LONGVARCHAR},
#{item.createTime,jdbcType=TIMESTAMP}, #{item.createUserId,jdbcType=BIGINT}, #{item.updateTime,jdbcType=TIMESTAMP},
#{item.updateUserId,jdbcType=BIGINT}, #{item.isDeleted,jdbcType=INTEGER})
</foreach>
</insert>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ediagnosis.cdr.dao.mapper.DimDataSummaryMapper">
<resultMap id="BaseResultMap" type="com.ediagnosis.cdr.dao.entity.DimDataSummaryEntity">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="code" column="code" />
<result property="value" column="value" />
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="Base_Column_List">
id,name,code,value,update_time
</sql>
</mapper>
<configuration>
<!-- 定义日志文件的位置 -->
<property name="LOG_PATH" value="logs"/>
<property name="LOG_FILE" value="app-log"/>
<!-- 控制台输出设置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出设置 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE}.log</file>
<!-- 滚动策略:基于时间和文件大小 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 滚动文件命名模式:每天一个目录或文件,并带序号 -->
<!-- %d{yyyy-MM-dd} 表示按天分割 -->
<!-- %i 是当文件太大时的分片序号 -->
<fileNamePattern>${LOG_PATH}/archive/${LOG_FILE}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个文件最大大小,超过则拆分 -->
<maxFileSize>100MB</maxFileSize>
<!-- 每天最多保留的归档文件总大小 -->
<!-- 可选:限制总存储空间 -->
<!-- <totalSizeCap>10GB</totalSizeCap> -->
<!-- 最多保留多少天的日志 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 设置全局日志级别为INFO,并指定输出到哪个appender -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<!-- <appender-ref ref="FILE" />-->
</root>
</configuration>
\ No newline at end of file
......@@ -5,6 +5,8 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.Assert;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
......@@ -30,4 +32,23 @@ class JsonProcessorTest {
Assert.isTrue(json.get().equals("{\"name\":\"张三\",\"age\":18}"), "转换结果与预期不一致");
}
@Test
void readJsonFileToObject() {
String path="classpath:cache-strategy.json";
Optional<Map> optionalMap = JsonProcessor.readJsonFileToObject(path, Map.class);
Assert.isTrue(optionalMap.isPresent(), "转换结果不应为空");
System.out.println(optionalMap);
Map map = optionalMap.get();
Object tableTree = map.get("fullTableTree");
if(tableTree instanceof Map tableTreeMap ){
Object expiration = tableTreeMap.get("expiration");
if(expiration instanceof String s){
System.out.println(s);
}
}
}
}
\ No newline at end of file
package com.ediagnosis.cdr.dao;
import com.ediagnosis.cdr.dataService.HiveQueryExecutor;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.row.Row;
import org.junit.jupiter.api.Test;
......
......@@ -10,7 +10,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
@SpringBootTest
public class AsyncTest {
......
package com.ediagnosis.cdr.dataGovernance;
import com.mybatisflex.core.datasource.DataSourceKey;
import com.mybatisflex.core.row.Db;
import com.mybatisflex.core.row.Row;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
public class TableDefinitionTest {
@Test
public void testPresto() {
try{
DataSourceKey.use("ds-presto");
String sql = "select count(*) from hive.ods.xjd_patient_info";
List<Row> rows = Db.selectListBySql(sql);
System.out.println(rows.size());
System.out.println(rows);
}finally{
DataSourceKey.clear();
}
}
@Test
public void testTableDefinition() {
List<Row> rows=null;
try{
DataSourceKey.use("ds-presto");
String sql = "DESCRIBE hive.ods.xjd_patient_info";
rows = Db.selectListBySql(sql);
}finally{
DataSourceKey.clear();
}
List<TestTableDefinitionItem> items = new ArrayList<>(rows.size());
for (Row row : rows) {
TestTableDefinitionItem item = new TestTableDefinitionItem();
item.setColumn(row.getString("Column"));
item.setType(row.getString("Type"));
item.setComment(row.getString("Comment"));
System.out.println(item);
items.add(item);
}
System.out.println(rows.size());
System.out.println(items.size());
}
}
package com.ediagnosis.cdr.dataGovernance;
import com.ediagnosis.cdr.context.JsonProcessor;
import com.ediagnosis.cdr.dataIntegration.value.TableTree;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class TableTreeTest {
@Test
public void testTableTree() {
TableTree tableTree = TableTree.create();
tableTree.addRoot(new TableTree.TreeNode("1","ip-xxxx", false))
.appendChild("2","dataBase-xxxx",false)
.appendChild("3","table-xxx",true);
tableTree.addRoot(new TableTree.TreeNode("4","ip-yyyy", false))
.appendChild("5","catalog-yyyy",false)
.appendChild("6","schema-yyyy", true)
.appendChild("7","table-yyyy", true);
tableTree.addRoot(new TableTree.TreeNode("8","ip-zzzz",false ))
.appendChild("9","table-zzzz",true);
JsonProcessor.print(tableTree);
}
}
package com.ediagnosis.cdr.dataGovernance;
public class TestTableDefinitionItem {
private String column;
private String type;
private String comment;
public String getColumn() {
return column;
}
public void setColumn(String column) {
this.column = column;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
@Override
public String toString() {
return "TestTableDefinitionItem{" +
"column='" + column + '\'' +
", type='" + type + '\'' +
", comment='" + comment + '\'' +
'}';
}
}
package com.ediagnosis.cdr.dataIntegration;
import com.ediagnosis.cdr.CdrApplication;
import com.ediagnosis.cdr.dataIntegration.dao.BizDataDao;
import com.ediagnosis.cdr.dataIntegration.dao.dto.*;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BizSystem;
import com.mybatisflex.core.paginate.Page;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author monojun
* @description TODO
* @createTime 2025年08月06日
*/
@SpringBootTest(classes = CdrApplication.class)
public class DemoTest {
@Autowired
private BizDataDao bizDataDao;
@Test
public void test1() {
BizTableQueryDTO queryDTO = new BizTableQueryDTO();
Page<BizTableDTO> businessDataTableDTOPage = bizDataDao.queryTablePage(queryDTO);
System.out.println(businessDataTableDTOPage);
}
@Test
public void test2() {
BizSystemQueryDTO queryDTO = new BizSystemQueryDTO();
Page<BizSystem> dataSystemPage = bizDataDao.querySystemPage(queryDTO);
System.out.println(dataSystemPage);
}
@Test
public void test3() {
Page<BizDataSourceDTO> dataSourceDTOPage = bizDataDao.querySourcePage(new BizDataSourceQueryDTO());
System.out.println(dataSourceDTOPage);
}
@Test
public void test4() {
BizSystemDTO systemDTO = new BizSystemDTO();
systemDTO.setId(4);
systemDTO.setName("test");
systemDTO.setDescription("test");
bizDataDao.addOrUpdateBizSystem(systemDTO);
BizSystemDTO systemDTO1 = new BizSystemDTO();
systemDTO1.setName("test");
systemDTO1.setDescription("test");
bizDataDao.addOrUpdateBizSystem(systemDTO1);
}
}
{
"fullTableTree": {
"expiration": "3000",
"otherProperties": "xxxx"
}
}
\ No newline at end of file