...
 
Commits (9)
...@@ -4,6 +4,7 @@ target/ ...@@ -4,6 +4,7 @@ target/
!**/src/test/**/target/ !**/src/test/**/target/
### IntelliJ IDEA ### ### IntelliJ IDEA ###
.idea
.idea/modules.xml .idea/modules.xml
.idea/jarRepositories.xml .idea/jarRepositories.xml
.idea/compiler.xml .idea/compiler.xml
...@@ -35,4 +36,6 @@ build/ ...@@ -35,4 +36,6 @@ build/
.vscode/ .vscode/
### Mac OS ### ### Mac OS ###
.DS_Store .DS_Store
\ No newline at end of file /.idea/
/.mvn/
...@@ -39,6 +39,10 @@ ...@@ -39,6 +39,10 @@
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- Hive JDBC 驱动 --> <!-- Hive JDBC 驱动 -->
...@@ -119,22 +123,112 @@ ...@@ -119,22 +123,112 @@
</exclusions> </exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.hadoop</groupId> <groupId>com.facebook.presto</groupId>
<artifactId>hadoop-hdfs</artifactId> <artifactId>presto-jdbc</artifactId>
<version>3.3.4</version> <version>0.293</version>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.hadoop</groupId> <groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>hadoop-client</artifactId> <artifactId>caffeine</artifactId>
<version>3.3.4</version> <version>3.2.2</version>
</dependency> </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> <dependency>
<groupId>com.zaxxer</groupId> <groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId> <artifactId>HikariCP</artifactId>
......
...@@ -5,7 +5,10 @@ import org.springframework.boot.SpringApplication; ...@@ -5,7 +5,10 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication @SpringBootApplication
@MapperScan("com.ediagnosis.cdr.dao.mapper") @MapperScan(basePackages = {
"com.ediagnosis.cdr.*.dao.mapper",
"com.ediagnosis.cdr.dao.mapper"
})
public class CdrApplication { public class CdrApplication {
public static void main(String[] args) { 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; ...@@ -4,7 +4,10 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import java.io.File;
import java.io.IOException;
import java.util.Optional; import java.util.Optional;
...@@ -15,24 +18,66 @@ public class JsonProcessor { ...@@ -15,24 +18,66 @@ public class JsonProcessor {
public static <T> Optional<T> toObject(String json, Class<T> clazz) { public static <T> Optional<T> toObject(String json, Class<T> clazz) {
T value = null; T value;
try { try {
value = objectMapper.readValue(json, clazz); value = objectMapper.readValue(json, clazz);
} catch (Exception e) { } catch (Exception e) {
log.error("json to object error", e); log.error("json to object error", e);
return Optional.empty();
} }
return Optional.ofNullable(value); return Optional.ofNullable(value);
} }
public static Optional<String> toJson(Object object) { public static Optional<String> toJson(Object object) {
String value = ""; String value;
try { try {
value = objectMapper.writeValueAsString(object); value = objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
log.error("object to json error", 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); 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; import java.util.List;
public class Page<T> { public class PageVo<T> {
private long pageNo; private long pageNo;
private long pageSize; private long pageSize;
private long totalCount; private long totalCount;
private List<T> content; private List<T> content;
private long totalPage; private long totalPage;
public Page() { public PageVo() {
} }
public Page(long pageNo, long pageSize, public PageVo(long pageNo, long pageSize,
long totalCount, List<T> content) { long totalCount, List<T> content) {
this.pageNo = pageNo; this.pageNo = pageNo;
this.pageSize = pageSize; this.pageSize = pageSize;
this.totalCount = totalCount; this.totalCount = totalCount;
......
package com.ediagnosis.cdr.value; package com.ediagnosis.cdr.context.values;
import java.io.Serializable; import java.io.Serializable;
......
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.dataIntegration;
import com.ediagnosis.cdr.context.values.Response;
import com.ediagnosis.cdr.dataIntegration.dao.dto.*;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataTableField;
import com.ediagnosis.cdr.dataIntegration.value.param.DataSourceQueryParam;
import com.ediagnosis.cdr.dataIntegration.value.param.DataTableFieldQueryParam;
import com.ediagnosis.cdr.dataIntegration.value.param.DataTableQueryParam;
import com.ediagnosis.cdr.dataIntegration.value.BusinessDataSourceVo;
import com.ediagnosis.cdr.dataIntegration.value.BusinessDataTableFieldVo;
import com.ediagnosis.cdr.dataIntegration.value.BusinessDataTableVo;
import com.ediagnosis.cdr.dataIntegration.inner.BusinessDataRepository;
import com.ediagnosis.cdr.context.PageConvertUtils;
import com.ediagnosis.cdr.context.values.PageVo;
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.RestController;
/**
* @author monojun
* @description 业务系统controller
* @createTime 2025年08月04日
*/
@RestController
@RequiredArgsConstructor
public class BusinessDataController {
private final BusinessDataRepository dataRepository;
@PostMapping("/dataSource/page")
public Response<PageVo<BusinessDataSourceVo>> page(@RequestBody DataSourceQueryParam queryParam) {
BusinessDataSourceQueryDTO queryDTO = new BusinessDataSourceQueryDTO();
BeanUtils.copyProperties(queryParam, queryDTO);
Page<BusinessDataSourceDTO> dataSourcePage = dataRepository.querySourcePage(queryDTO);
PageVo<BusinessDataSourceVo> systemVoPageInfo = PageConvertUtils.copyPageInfo(dataSourcePage, dataSourceDTO -> {
BusinessDataSourceVo vo = new BusinessDataSourceVo();
BeanUtils.copyProperties(dataSourceDTO, vo);
vo.setBizSystemId(dataSourceDTO.getBusinessId());
vo.setBizSystemName(dataSourceDTO.getBusinessName());
return vo;
});
return Response.success(systemVoPageInfo);
}
@PostMapping("/dataTable/page")
public Response<PageVo<BusinessDataTableVo>> page(@RequestBody DataTableQueryParam queryParam) {
BusinessDataTableQueryDTO queryDTO = new BusinessDataTableQueryDTO();
BeanUtils.copyProperties(queryParam, queryDTO);
Page<BusinessDataTableDTO> dataTablePage = dataRepository.queryTablePage(queryDTO);
PageVo<BusinessDataTableVo> dataTableVoPageInfo = PageConvertUtils.copyPageInfo(dataTablePage, dataTable -> {
BusinessDataTableVo vo = new BusinessDataTableVo();
BeanUtils.copyProperties(dataTable, vo);
return vo;
});
return Response.success(dataTableVoPageInfo);
}
@PostMapping("/dataTableField/page")
public Response<PageVo<BusinessDataTableFieldVo>> page(@RequestBody DataTableFieldQueryParam queryParam) {
BusinessDataTableFieldQueryDTO queryDTO = new BusinessDataTableFieldQueryDTO();
BeanUtils.copyProperties(queryParam, queryDTO);
Page<BusinessDataTableField> dataTableFieldPage = dataRepository.queryFieldPage(queryDTO);
PageVo<BusinessDataTableFieldVo> tableFieldVoPageInfo = PageConvertUtils.copyPageInfo(dataTableFieldPage, dataTableField -> {
BusinessDataTableFieldVo vo = new BusinessDataTableFieldVo();
BeanUtils.copyProperties(dataTableField, vo);
return vo;
});
return Response.success(tableFieldVoPageInfo);
}
}
package com.ediagnosis.cdr.dataIntegration;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BusinessDataSystemDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BusinessDataSystemQueryDTO;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSystem;
import com.ediagnosis.cdr.dataIntegration.value.param.DataSystemAddParam;
import com.ediagnosis.cdr.dataIntegration.value.param.DataSystemDeleteParam;
import com.ediagnosis.cdr.dataIntegration.value.param.DataSystemQueryParam;
import com.ediagnosis.cdr.dataIntegration.value.param.DataSystemUpdateParam;
import com.ediagnosis.cdr.dataIntegration.value.BusinessDataSystemVo;
import com.ediagnosis.cdr.dataIntegration.inner.BusinessSystemRepository;
import com.ediagnosis.cdr.context.PageConvertUtils;
import com.ediagnosis.cdr.context.values.PageVo;
import com.ediagnosis.cdr.value.Response;
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 TODO
* @createTime 2025年08月05日
*/
@RestController
@RequestMapping("/dataSource")
@RequiredArgsConstructor
public class BusinessSourceController {
private final BusinessSystemRepository systemRepository;
@PostMapping("/add")
public Response<Long> page(@RequestBody DataSystemAddParam addParam) {
BusinessDataSystemDTO addDTO = new BusinessDataSystemDTO();
BeanUtils.copyProperties(addParam, addDTO);
Long id = systemRepository.addDataSystem(addDTO);
return Response.success(id);
}
@PostMapping("/update")
public Response<Long> update(@RequestBody DataSystemUpdateParam updateParam) {
BusinessDataSystemDTO addDTO = new BusinessDataSystemDTO();
BeanUtils.copyProperties(updateParam, addDTO);
Long id = systemRepository.updateDataSystem(addDTO);
return Response.success(id);
}
@PostMapping("/page")
public Response<PageVo<BusinessDataSystemVo>> page(@RequestBody DataSystemQueryParam queryParam) {
BusinessDataSystemQueryDTO queryDTO = new BusinessDataSystemQueryDTO();
BeanUtils.copyProperties(queryParam, queryDTO);
Page<BusinessDataSystem> dataSystemPage = systemRepository.queryPage(queryDTO);
PageVo<BusinessDataSystemVo> systemVoPageInfo = PageConvertUtils.copyPageInfo(dataSystemPage, dataSystem -> {
BusinessDataSystemVo vo = new BusinessDataSystemVo();
BeanUtils.copyProperties(dataSystem, vo);
return vo;
});
return Response.success(systemVoPageInfo);
}
@PostMapping("/delete")
public Response<Long> delete(@RequestBody DataSystemDeleteParam deleteParam) {
systemRepository.deleteDataSystem(deleteParam.getId());
return Response.success(deleteParam.getId());
}
}
package com.ediagnosis.cdr.dataIntegration;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BusinessDataSystemDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BusinessDataSystemQueryDTO;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSystem;
import com.ediagnosis.cdr.dataIntegration.value.param.DataSystemAddParam;
import com.ediagnosis.cdr.dataIntegration.value.param.DataSystemDeleteParam;
import com.ediagnosis.cdr.dataIntegration.value.param.DataSystemQueryParam;
import com.ediagnosis.cdr.dataIntegration.value.param.DataSystemUpdateParam;
import com.ediagnosis.cdr.dataIntegration.value.BusinessDataSystemVo;
import com.ediagnosis.cdr.dataIntegration.inner.BusinessSystemRepository;
import com.ediagnosis.cdr.context.PageConvertUtils;
import com.ediagnosis.cdr.context.values.PageVo;
import com.ediagnosis.cdr.value.Response;
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 业务系统controller
* @createTime 2025年08月04日
*/
@RestController
@RequestMapping("/bizSystem")
@RequiredArgsConstructor
public class BusinessSystemController {
private final BusinessSystemRepository systemRepository;
@PostMapping("/add")
public Response<Long> page(@RequestBody DataSystemAddParam addParam) {
BusinessDataSystemDTO addDTO = new BusinessDataSystemDTO();
BeanUtils.copyProperties(addParam, addDTO);
Long id = systemRepository.addDataSystem(addDTO);
return Response.success(id);
}
@PostMapping("/update")
public Response<Long> update(@RequestBody DataSystemUpdateParam updateParam) {
BusinessDataSystemDTO addDTO = new BusinessDataSystemDTO();
BeanUtils.copyProperties(updateParam, addDTO);
Long id = systemRepository.updateDataSystem(addDTO);
return Response.success(id);
}
@PostMapping("/page")
public Response<PageVo<BusinessDataSystemVo>> page(@RequestBody DataSystemQueryParam queryParam) {
BusinessDataSystemQueryDTO queryDTO = new BusinessDataSystemQueryDTO();
BeanUtils.copyProperties(queryParam, queryDTO);
Page<BusinessDataSystem> dataSystemPage = systemRepository.queryPage(queryDTO);
PageVo<BusinessDataSystemVo> systemVoPageInfo = PageConvertUtils.copyPageInfo(dataSystemPage, dataSystem -> {
BusinessDataSystemVo vo = new BusinessDataSystemVo();
BeanUtils.copyProperties(dataSystem, vo);
return vo;
});
return Response.success(systemVoPageInfo);
}
@PostMapping("/delete")
public Response<Long> delete(@RequestBody DataSystemDeleteParam deleteParam) {
systemRepository.deleteDataSystem(deleteParam.getId());
return Response.success(deleteParam.getId());
}
}
package com.ediagnosis.cdr.dataIntegration;
/**
* @author monojun
* @description TODO
* @createTime 2025年08月05日
*/
public class BusinessTableController {
}
package com.ediagnosis.cdr.controller; package com.ediagnosis.cdr.dataIntegration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("/dashBoard") public class DataGovernanceController {
public class DashBoardController {
......
package com.ediagnosis.cdr.dataIntegration.dao;
import com.ediagnosis.cdr.dataCollect.dao.dto.*;
import com.ediagnosis.cdr.dataIntegration.dao.dto.*;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSource;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSystem;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataTable;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataTableField;
import com.ediagnosis.cdr.dataIntegration.dao.mapper.BusinessDataSourceMapper;
import com.ediagnosis.cdr.dataIntegration.dao.mapper.BusinessDataSystemMapper;
import com.ediagnosis.cdr.dataIntegration.dao.mapper.BusinessDataTableFieldMapper;
import com.ediagnosis.cdr.dataIntegration.dao.mapper.BusinessDataTableMapper;
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.util.Date;
/**
* @author monojun
* @description 业务dao
* @createTime 2025年08月04日
*/
@Component
@RequiredArgsConstructor
public class BusinessDataDao {
private final BusinessDataSystemMapper dataSystemMapper;
private final BusinessDataSourceMapper dataSourceMapper;
private final BusinessDataTableMapper dataTableMapper;
private final BusinessDataTableFieldMapper dataTableFieldMapper;
/**
* 新增业务系统
*
* @param dataSystemDTO dataSystemDTO
* @return 业务系统主键id
*/
public Long addDataSystem(BusinessDataSystemDTO dataSystemDTO) {
BusinessDataSystem dataSystem = new BusinessDataSystem();
BeanUtils.copyProperties(dataSystemDTO, dataSystem);
dataSystem.setCreateTime(new Date());
dataSystem.setUpdateTime(new Date());
dataSystemMapper.insert(dataSystem);
return dataSystem.getId();
}
/**
* 更新业务系统
*
* @param dataSystemDTO dataSystemDTO
* @return 业务系统主键id
*/
public Long updateDataSystem(BusinessDataSystemDTO dataSystemDTO) {
BusinessDataSystem dataSystem = new BusinessDataSystem();
BeanUtils.copyProperties(dataSystemDTO, dataSystem);
dataSystem.setUpdateTime(new Date());
dataSystemMapper.update(dataSystem);
return dataSystem.getId();
}
/**
* 删除业务系统
*
* @param dataSystemId 业务系统id
*/
public void deleteDataSystem(Long dataSystemId) {
dataSystemMapper.deleteById(dataSystemId);
}
/**
* 分页查询业务系统信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataSystem>
*/
public Page<BusinessDataSystem> querySystemPage(BusinessDataSystemQueryDTO queryDTO) {
QueryWrapper queryWrapper = QueryWrapper.create();
if (StringUtils.hasText(queryDTO.getName())) {
queryWrapper.like(BusinessDataSystem::getName, queryDTO.getName());
}
queryWrapper.orderBy(BusinessDataSystem::getUpdateTime, false);
queryWrapper.orderBy(BusinessDataSystem::getId, false);
return dataSystemMapper.paginate(queryDTO.getPageNo(), queryDTO.getPageSize(), queryWrapper);
}
/**
* 分页查询业务数据源信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataSource>
*/
public Page<BusinessDataSourceDTO> querySourcePage(BusinessDataSourceQueryDTO queryDTO) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select("d.*", "ds.name as businessName")
.from(BusinessDataSource.class).as("d")
.leftJoin(BusinessDataSystem.class).as("ds")
.on(BusinessDataSource::getBusinessId, BusinessDataSystem::getId)
.orderBy(BusinessDataSource::getUpdateTime, false)
.orderBy(BusinessDataSource::getId, false);
if (!CollectionUtils.isEmpty(queryDTO.getBusinessIds())) {
queryWrapper.in(BusinessDataSource::getBusinessId, queryDTO.getBusinessIds());
}
if (StringUtils.hasText(queryDTO.getName())) {
queryWrapper.like(BusinessDataSource::getName, queryDTO.getName());
}
if (StringUtils.hasText(queryDTO.getIpAddress())) {
queryWrapper.like(BusinessDataSource::getIpAddress, queryDTO.getIpAddress());
}
if (StringUtils.hasText(queryDTO.getType())) {
queryWrapper.eq(BusinessDataSource::getType, queryDTO.getType());
}
if (queryDTO.getStatus() != null) {
queryWrapper.eq(BusinessDataSource::getStatus, queryDTO.getStatus());
}
return dataSourceMapper.paginateAs(queryDTO.getPageNo(), queryDTO.getPageSize(), queryWrapper, BusinessDataSourceDTO.class);
}
/**
* 分页查询业务表信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataTable>
*/
public Page<BusinessDataTableDTO> queryTablePage(BusinessDataTableQueryDTO queryDTO) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select("t.*, d.id as sourceId, d.name as sourceName, ds.id as businessId, ds.name as businessName")
.from(BusinessDataTable.class).as("t")
.leftJoin(BusinessDataSource.class).as("d")
.on(BusinessDataTable::getSourceId, BusinessDataSource::getId)
.leftJoin(BusinessDataSystem.class).as("ds")
.on(BusinessDataSource::getBusinessId, BusinessDataSystem::getId)
.orderBy(BusinessDataTable::getUpdateTime, false)
.orderBy(BusinessDataTable::getId, false);
if (StringUtils.hasText(queryDTO.getName())) {
queryWrapper.like(BusinessDataTable::getName, queryDTO.getName());
}
if (!CollectionUtils.isEmpty(queryDTO.getBusinessIds())) {
queryWrapper.in(BusinessDataTable::getBusinessId, queryDTO.getBusinessIds());
}
if (!CollectionUtils.isEmpty(queryDTO.getSourceIds())) {
queryWrapper.in(BusinessDataTable::getSourceId, queryDTO.getSourceIds());
}
if (StringUtils.hasText(queryDTO.getTableNo())) {
queryWrapper.like(BusinessDataTable::getTableNo, queryDTO.getTableNo());
}
return dataTableMapper.paginateAs(queryDTO.getPageNo(), queryDTO.getPageSize(), queryWrapper, BusinessDataTableDTO.class);
}
/**
* 分页查询业务表字段信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataTableField>
*/
public Page<BusinessDataTableField> queryFieldPage(BusinessDataTableFieldQueryDTO queryDTO) {
QueryWrapper queryWrapper = QueryWrapper.create();
if (StringUtils.hasText(queryDTO.getFieldName())) {
queryWrapper.like(BusinessDataTableField::getFieldName, queryDTO.getFieldName());
}
if (StringUtils.hasText(queryDTO.getFieldType())) {
queryWrapper.like(BusinessDataTableField::getFieldType, queryDTO.getFieldType());
}
if (queryDTO.getTableId() != null) {
queryWrapper.eq(BusinessDataTableField::getTableId, queryDTO.getTableId());
}
queryWrapper.orderBy(BusinessDataTableField::getUpdateTime, false);
queryWrapper.orderBy(BusinessDataTableField::getId, false);
return dataTableFieldMapper.paginate(queryDTO.getPageNo(), queryDTO.getPageSize(), queryWrapper);
}
}
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 BusinessDataSourceDTO implements Serializable {
@Serial
private static final long serialVersionUID = -447329639545048136L;
/**
* 主键id
*/
private Long id;
/**
* 数据源名称
*/
private String name;
/**
* 数据源类型
*/
private String type;
/**
* IP地址
*/
private String ipAddress;
/**
* 属性信息
*/
private String properties;
/**
* 业务系统id
*/
private Long businessId;
/**
* 业务系统名称
*/
private String businessName;
/**
* 描述
*/
private String description;
/**
* 连接状态: 0-未知 1-已连接 2-未连接
*/
private Integer status;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建人
*/
private Long createUserId;
/**
* 更新时间
*/
private Date updateTime;
/**
* 更新人
*/
private Long updateUserId;
}
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 BusinessDataSourceQueryDTO extends PageQuery {
@Serial
private static final long serialVersionUID = 4373837873599613512L;
/**
* 业务系统id列表
*/
private List<Long> businessIds;
/**
* 数据源名称
*/
private String name;
/**
* ip地址
*/
private String ipAddress;
/**
* 数据源类型
*/
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 BusinessDataSystemDTO implements Serializable {
@Serial
private static final long serialVersionUID = 8024021126762424795L;
/**
* 主键id
*/
private Long id;
/**
* 业务系统名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建人
*/
private Long createUserId;
/**
* 更新时间
*/
private Date updateTime;
/**
* 更新人
*/
private Long updateUserId;
}
package com.ediagnosis.cdr.dataIntegration.dao.dto;
import com.ediagnosis.cdr.dataIntegration.value.param.PageQuery;
import lombok.Data;
/**
* @author monojun
* @description 业务系统查询参数
* @createTime 2025年07月31日
*/
@Data
public class BusinessDataSystemQueryDTO extends PageQuery {
private static final long serialVersionUID = -725393158125223566L;
/**
* 业务系统名称
*/
private String name;
}
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 业务数据源名称
* @createTime 2025年07月31日
*/
@Data
public class BusinessDataTableDTO implements Serializable {
@Serial
private static final long serialVersionUID = -1723613352839697417L;
/**
* 主键id
*/
private Long id;
/**
* 业务表名称
*/
private String name;
/**
* 业务表编号
*/
private String tableNo;
/**
* 业务系统id
*/
private Long businessId;
/**
* 业务系统名称
*/
private String businessName;
/**
* 业务数据源id
*/
private Long sourceId;
/**
* 业务数据源名称
*/
private String sourceName;
/**
* 描述
*/
private String description;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建人
*/
private Long createUserId;
/**
* 更新时间
*/
private Date updateTime;
/**
* 更新人
*/
private Long updateUserId;
}
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年07月31日
*/
@Data
public class BusinessDataTableFieldQueryDTO extends PageQuery {
@Serial
private static final long serialVersionUID = -7409716170936124466L;
/**
* 字段名称
*/
private String fieldName;
/**
* 字段类型
*/
private String fieldType;
/**
* 业务表id
*/
private Long 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 BusinessDataTableQueryDTO extends PageQuery {
@Serial
private static final long serialVersionUID = 2568845339056229745L;
/**
* 业务系统id
*/
private List<Long> businessIds;
/**
* 业务数据源id列表
*/
private List<Long> sourceIds;
/**
* 业务表名称
*/
private String name;
/**
* 业务表编号
*/
private String tableNo;
}
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.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @author monojun
* @description 业务系统数据源表
* @createTime 2025年08月01日
*/
@Data
@Table(value = "business_data_source")
public class BusinessDataSource implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@Id(value = "id", keyType = KeyType.Auto)
private Long id;
/**
* 数据源名称
*/
@Column(value = "name")
private String name;
/**
* 数据源类型
*/
@Column(value = "type")
private String type;
/**
* IP地址
*/
@Column(value = "ip_address")
private String ipAddress;
/**
* 属性信息
*/
@Column(value = "properties")
private String properties;
/**
* 业务系统id
*/
@Column(value = "business_id")
private Long businessId;
/**
* 描述
*/
@Column(value = "description")
private String description;
/**
* 连接状态: 0-未知 1-已连接 2-未连接
*/
@Column(value = "status")
private Integer status;
/**
* 创建时间
*/
@Column(value = "create_time")
private Date createTime;
/**
* 创建人
*/
@Column(value = "create_user_id")
private Long createUserId;
/**
* 更新时间
*/
@Column(value = "update_time")
private Date updateTime;
/**
* 更新人
*/
@Column(value = "update_user_id")
private Long updateUserId;
/**
* 是否删除: 0-未删除 1-已删除
*/
@Column(value = "is_deleted", isLogicDelete = true)
private Integer isDeleted;
}
\ 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.util.Date;
/**
* @author monojun
* @description 业务系统表
* @createTime 2025年08月01日
*/
@Data
@Table("business_data_system")
public class BusinessDataSystem {
/**
* 主键id
*/
@Id(value = "id", keyType = KeyType.Auto)
private Long id;
/**
* 业务系统名称
*/
@Column(value = "name")
private String name;
/**
* 描述
*/
@Column(value = "description")
private String description;
/**
* 创建时间
*/
@Column(value = "create_time")
private Date createTime;
/**
* 创建人
*/
@Column(value = "create_user_id")
private Long createUserId;
/**
* 更新时间
*/
@Column(value = "update_time")
private Date updateTime;
/**
* 更新人
*/
@Column(value = "update_user_id")
private Long updateUserId;
/**
* 是否删除 0-未删除 1-已删除
*/
@Column(value = "is_deleted", isLogicDelete = true)
private Integer isDeleted;
}
\ 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.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @author monojun
* @description 业务表信息表
* @createTime 2025年08月01日
*/
@Data
@Table(value = "business_data_table")
public class BusinessDataTable implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@Id(value = "id", keyType = KeyType.Auto)
private Long id;
/**
* 业务表名称
*/
@Column(value = "name")
private String name;
/**
* 业务表编号
*/
@Column(value = "table_no")
private String tableNo;
/**
* 业务系统id
*/
@Column(value = "business_id")
private Long businessId;
/**
* 业务数据源id
*/
@Column(value = "source_id")
private Long sourceId;
/**
* 描述
*/
@Column(value = "description")
private String description;
/**
* 创建时间
*/
@Column(value = "create_time")
private Date createTime;
/**
* 创建人
*/
@Column(value = "create_user_id")
private Long createUserId;
/**
* 更新时间
*/
@Column(value = "update_time")
private Date updateTime;
/**
* 更新人
*/
@Column(value = "update_user_id")
private Long updateUserId;
/**
* 是否删除: 0-未删除 1-已删除
*/
@Column(value = "is_deleted", isLogicDelete = true)
private Byte isDeleted;
}
\ 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.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @author monojun
* @description 业务字段信息表
* @createTime 2025年08月01日
*/
@Data
@Table(value = "business_data_table_field")
public class BusinessDataTableField implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@Id(value = "id", keyType = KeyType.Auto)
private Long id;
/**
* 字段名称
*/
@Column(value = "field_name")
private String fieldName;
/**
* 字段类型
*/
@Column(value = "field_type")
private String fieldType;
/**
* 业务表id
*/
@Column(value = "table_id")
private Long tableId;
/**
* 描述
*/
@Column(value = "description")
private String description;
/**
* 创建时间
*/
@Column(value = "create_time")
private Date createTime;
/**
* 创建人
*/
@Column(value = "create_user_id")
private Long createUserId;
/**
* 更新时间
*/
@Column(value = "update_time")
private Date updateTime;
/**
* 更新人
*/
@Column(value = "update_user_id")
private Long updateUserId;
/**
* 是否删除: 0-未删除 1-已删除
*/
@Column(value = "is_deleted", isLogicDelete = true)
private Byte isDeleted;
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.mapper;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSource;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author monojun
* @description 数据源mapper
* @createTime 2025年08月01日
*/
@Mapper
public interface BusinessDataSourceMapper extends BaseMapper<BusinessDataSource> {
int batchInsert(@Param("list") List<BusinessDataSource> list);
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.mapper;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSystem;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author monojun
* @description 业务系统mapper
* @createTime 2025年08月01日
*/
@Mapper
public interface BusinessDataSystemMapper extends BaseMapper<BusinessDataSystem> {
int batchInsert(@Param("list") List<BusinessDataSystem> list);
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.mapper;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataTableField;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author monojun
* @description 业务表字段mapper
* @createTime 2025年08月01日
*/
@Mapper
public interface BusinessDataTableFieldMapper extends BaseMapper<BusinessDataTableField> {
int batchInsert(@Param("list") List<BusinessDataTableField> list);
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.dao.mapper;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataTable;
import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author monojun
* @description 业务表mapper
* @createTime 2025年08月01日
*/
@Mapper
public interface BusinessDataTableMapper extends BaseMapper<BusinessDataTable> {
int batchInsert(@Param("list") List<BusinessDataTable> list);
}
\ No newline at end of file
package com.ediagnosis.cdr.dataIntegration.inner;
import com.ediagnosis.cdr.dataIntegration.dao.BusinessDataDao;
import com.ediagnosis.cdr.dataIntegration.dao.dto.*;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSystem;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataTableField;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
/**
* @author monojun
* @description BusinessDataRepository
* @createTime 2025年08月04日
*/
@Repository
@RequiredArgsConstructor
public class BusinessDataRepository {
private final BusinessDataDao businessDataDao;
/**
* 分页查询业务系统信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataSystem>
*/
public Page<BusinessDataSystem> queryPage(BusinessDataSystemQueryDTO queryDTO) {
return businessDataDao.querySystemPage(queryDTO);
}
/**
* 分页查询业务数据源信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataSource>
*/
public Page<BusinessDataSourceDTO> querySourcePage(BusinessDataSourceQueryDTO queryDTO) {
return businessDataDao.querySourcePage(queryDTO);
}
/**
* 分页查询业务表信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataTable>
*/
public Page<BusinessDataTableDTO> queryTablePage(BusinessDataTableQueryDTO queryDTO) {
return businessDataDao.queryTablePage(queryDTO);
}
/**
* 分页查询业务表字段信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataTableField>
*/
public Page<BusinessDataTableField> queryFieldPage(BusinessDataTableFieldQueryDTO queryDTO) {
return businessDataDao.queryFieldPage(queryDTO);
}
}
package com.ediagnosis.cdr.dataIntegration.inner;
import com.ediagnosis.cdr.dataIntegration.dao.BusinessDataDao;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BusinessDataSystemDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BusinessDataSystemQueryDTO;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSystem;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
/**
* @author monojun
* @description BusinessSystemRepository
* @createTime 2025年08月05日
*/
@Repository
@RequiredArgsConstructor
public class BusinessSystemRepository {
private final BusinessDataDao businessDataDao;
/**
* 新增业务系统
*
* @param dataSystemDTO 业务系统dto
* @return 业务系统主键id
*/
public Long addDataSystem(BusinessDataSystemDTO dataSystemDTO) {
businessDataDao.addDataSystem(dataSystemDTO);
return businessDataDao.addDataSystem(dataSystemDTO);
}
/**
* 更新业务系统
*
* @param dataSystemDTO 业务系统dto
* @return 业务系统主键id
*/
public Long updateDataSystem(BusinessDataSystemDTO dataSystemDTO) {
return businessDataDao.updateDataSystem(dataSystemDTO);
}
/**
* 分页查询业务系统信息
*
* @param queryDTO 查询dto
* @return PageInfo<BusinessDataSystem>
*/
public Page<BusinessDataSystem> queryPage(BusinessDataSystemQueryDTO queryDTO) {
return businessDataDao.querySystemPage(queryDTO);
}
/**
* 删除业务系统
*
* @param dataSystemId 业务系统id
*/
public void deleteDataSystem(Long dataSystemId) {
businessDataDao.deleteDataSystem(dataSystemId);
}
}
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;
import java.util.Date;
/**
* @author monojun
* @description 数据源信息
* @createTime 2025年07月31日
*/
@Data
public class BusinessDataSourceVo implements Serializable {
@Serial
private static final long serialVersionUID = -4205114103165887164L;
/**
* 主键id
*/
private Long id;
/**
* 数据源名称
*/
private String name;
/**
* 数据源类型(mysql、oracle、postgreSQL、sqlserver、h2、sqlite)
*/
private String type;
/**
* IP地址
*/
private String ipAddress;
/**
* 业务系统id
*/
private Long bizSystemId;
/**
* 业务系统名称
*/
private String bizSystemName;
/**
* 描述
*/
private String description;
/**
* 属性
*/
private String properties;
/**
* 连接状态
*/
private Integer status;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建人
*/
private Long createUserId;
/**
* 更新时间
*/
private Date updateTime;
/**
* 更新人
*/
private Long updateUserId;
}
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 BusinessDataSystemVo implements Serializable {
@Serial
private static final long serialVersionUID = 1995094555769215993L;
/**
* 主键id
*/
private Long id;
/**
* 业务系统名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建人
*/
private Long createUserId;
/**
* 更新时间
*/
private Date updateTime;
/**
* 更新人
*/
private Long updateUserId;
}
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 BusinessDataTableFieldVo implements Serializable {
@Serial
private static final long serialVersionUID = 3062177923173755855L;
/**
* 主键id
*/
private Long id;
/**
* 字段名称
*/
private String fieldName;
/**
* 字段类型
*/
private String fieldType;
/**
* 业务表id
*/
private Long tableId;
/**
* 描述
*/
private String description;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建人
*/
private Long createUserId;
/**
* 更新时间
*/
private Date updateTime;
/**
* 更新人
*/
private Long updateUserId;
}
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 BusinessDataTableVo implements Serializable {
@Serial
private static final long serialVersionUID = 8791629491093128048L;
/**
* 主键id
*/
private Long id;
/**
* 业务表名称
*/
private String name;
/**
* 业务表编号
*/
private String tableNo;
/**
* 业务系统id
*/
private Long businessId;
/**
* 业务系统名称
*/
private String businessName;
/**
* 业务数据源id
*/
private Long sourceId;
/**
* 业务数据源名称
*/
private String sourceName;
/**
* 描述
*/
private String description;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建人
*/
private Long createUserId;
/**
* 更新时间
*/
private Date updateTime;
/**
* 更新人
*/
private Long updateUserId;
}
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 lombok.Data;
import java.io.Serial;
import java.util.List;
/**
* @author monojun
* @description 数据源查询参数
* @createTime 2025年08月01日
*/
@Data
public class DataSourceQueryParam extends PageQuery {
@Serial
private static final long serialVersionUID = 4384878864788101913L;
/**
* 业务系统id列表
*/
private List<Long> businessIds;
/**
* 数据源名称
*/
private String name;
/**
* ip地址
*/
private String ipAddress;
/**
* 数据源类型
*/
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 DataSystemAddParam implements Serializable {
@Serial
private static final long serialVersionUID = 8362821373667292598L;
/**
* 业务系统名称
*/
private String name;
/**
* 描述
*/
private String description;
}
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 DataSystemDeleteParam implements Serializable {
@Serial
private static final long serialVersionUID = -5941215912179720671L;
private Long id;
}
package com.ediagnosis.cdr.dataIntegration.value.param;
import lombok.Data;
import java.io.Serial;
/**
* @author monojun
* @description 业务系统分页查询参数
* @createTime 2025年08月01日
*/
@Data
public class DataSystemQueryParam extends PageQuery {
@Serial
private static final long serialVersionUID = 5408831076545737168L;
/**
* 业务系统名称
*/
private String name;
}
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 DataSystemUpdateParam implements Serializable {
@Serial
private static final long serialVersionUID = -7333708471431047394L;
private Long id;
/**
* 业务系统名称
*/
private String name;
/**
* 描述
*/
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 DataTableFieldQueryParam extends PageQuery {
@Serial
private static final long serialVersionUID = 5419533067070233483L;
/**
* 字段名称
*/
private String fieldName;
/**
* 字段类型
*/
private String fieldType;
/**
* 业务表id
*/
private Long tableId;
}
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 DataTableQueryParam extends PageQuery {
@Serial
private static final long serialVersionUID = -6012405803243067316L;
/**
* 业务系统id列表
*/
private List<Long> businessIds;
/**
* 业务数据源id列表
*/
private List<Long> sourceIds;
/**
* 业务表名称
*/
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.mybatisflex.core.row.Row; import com.mybatisflex.core.row.Row;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -19,7 +18,7 @@ public class DwsRepository { ...@@ -19,7 +18,7 @@ public class DwsRepository {
this.hiveQueryExecutor = hiveQueryExecutor; 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); com.mybatisflex.core.paginate.Page<Row> rowPage = hiveQueryExecutor.selectByFullSql(sql, pageNo, pageSize);
List<Map<String, String>> result = rowPage.getRecords().stream() List<Map<String, String>> result = rowPage.getRecords().stream()
.map(row -> { .map(row -> {
...@@ -41,7 +40,7 @@ public class DwsRepository { ...@@ -41,7 +40,7 @@ public class DwsRepository {
.filter(map -> !map.isEmpty()) // 可选:过滤掉空 map .filter(map -> !map.isEmpty()) // 可选:过滤掉空 map
.toList(); .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.datasource.DataSourceKey;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.row.Db; import com.mybatisflex.core.row.Db;
......
package com.ediagnosis.cdr.dao.sqlutil; package com.ediagnosis.cdr.dataService;
import net.sf.jsqlparser.JSQLParserException; 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.dao; package com.ediagnosis.cdr.indicator;
import com.ediagnosis.cdr.dao.entity.DimDataSummaryEntity; import com.ediagnosis.cdr.indicator.dao.entity.IndicatorEntity;
import com.ediagnosis.cdr.dao.mapper.DimDataSummaryMapper; import com.ediagnosis.cdr.indicator.dao.mapper.IndicatorMapper;
import com.ediagnosis.cdr.domain.DimDataSummary;
import com.ediagnosis.cdr.context.TimeUtil; import com.ediagnosis.cdr.context.TimeUtil;
import com.ediagnosis.cdr.indicator.value.Indicator;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional; import java.util.Optional;
@Repository @Repository
public class DimDataSummaryRepository { public class IndicatorRepository {
private final DimDataSummaryMapper dimDataSummaryMapper; private final IndicatorMapper indicatorMapper;
public DimDataSummaryRepository(DimDataSummaryMapper dimDataSummaryMapper) { public IndicatorRepository(IndicatorMapper indicatorMapper) {
this.dimDataSummaryMapper = dimDataSummaryMapper; this.indicatorMapper = indicatorMapper;
} }
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( private Optional<Indicator> convertToIndicator(IndicatorEntity entity) {
Optional<LocalDateTime> timeOptional = TimeUtil.toLocalDateTime(entity.getUpdateTime());
return timeOptional.map(localDateTime -> new Indicator(
entity.getName(), entity.getName(),
entity.getCode(), entity.getCode(),
entity.getValue(), entity.getValue(),
timeOptional.orElse(null) 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.Id;
import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table; import com.mybatisflex.annotation.Table;
/**
* 记录数据总量概览 @Table(value ="indicator",dataSource = "ds-mysql")
* @TableName dim_data_summary public class IndicatorEntity {
*/
@Table(value ="dim_data_summary")
public class DimDataSummaryEntity {
/** /**
* *
*/ */
...@@ -32,6 +29,8 @@ public class DimDataSummaryEntity { ...@@ -32,6 +29,8 @@ public class DimDataSummaryEntity {
*/ */
private String value; private String value;
private String description;
/** /**
* 更新时间 * 更新时间
*/ */
...@@ -93,6 +92,15 @@ public class DimDataSummaryEntity { ...@@ -93,6 +92,15 @@ public class DimDataSummaryEntity {
this.value = value; 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 com.mybatisflex.core.BaseMapper;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
@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; import java.time.LocalDateTime;
public record DimDataSummary( public record Indicator(
String name, String name,
String code, String code,
String value, String value,
String description,
LocalDateTime updateTime 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 @@ ...@@ -2,11 +2,14 @@
mybatis-flex: mybatis-flex:
datasource: datasource:
ds-mysql: ds-mysql:
url: jdbc:mysql://10.11.4.21:33063/cdr url: jdbc:mysql://10.11.4.21:33063/cdr_v1
username: root username: root
password: Admin123456# password: Admin123456#
ds-hive: ds-hive:
url: jdbc:hive2://10.11.4.21:10000 url: jdbc:hive2://10.11.4.21:10000
username: root username: root
ds-presto:
url: jdbc:presto://10.11.4.21:8999
username: root
server: server:
port: 7001 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.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; ...@@ -5,6 +5,8 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
...@@ -30,4 +32,23 @@ class JsonProcessorTest { ...@@ -30,4 +32,23 @@ class JsonProcessorTest {
Assert.isTrue(json.get().equals("{\"name\":\"张三\",\"age\":18}"), "转换结果与预期不一致"); 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; package com.ediagnosis.cdr.dao;
import com.ediagnosis.cdr.dataService.HiveQueryExecutor;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.row.Row; import com.mybatisflex.core.row.Row;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
......
package com.ediagnosis.cdr.dao;
import com.ediagnosis.cdr.CdrApplication;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BusinessDataSourceDTO;
import com.ediagnosis.cdr.dataIntegration.dao.dto.BusinessDataSourceQueryDTO;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSource;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSystem;
import com.ediagnosis.cdr.dataIntegration.dao.mapper.BusinessDataSourceMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author monojun
* @description MapperTest
* @createTime 2025年07月31日
*/
@SpringBootTest(classes = CdrApplication.class)
public class MapperTest {
@Autowired
private BusinessDataSourceMapper dataSourceMapper;
@Test
public void test1() {
BusinessDataSourceQueryDTO queryDTO = new BusinessDataSourceQueryDTO();
QueryWrapper queryWrapper = QueryWrapper.create()
.select("d.*, ds.name as businessName")
.from("business_data_source").as("d")
.leftJoin("business_data_system").as("ds")
.on("d.business_id = ds.id");
Page<BusinessDataSourceDTO> dataSourceDTOPage = dataSourceMapper.paginateAs(1, 10, queryWrapper, BusinessDataSourceDTO.class);
System.out.println(dataSourceDTOPage);
}
@Test
public void test2() {
QueryWrapper queryWrapper = QueryWrapper.create()
.select("d.*", "ds.id as businessId, ds.name as businessName")
.from(BusinessDataSource.class).as("d")
.leftJoin(BusinessDataSystem.class).as("ds")
.on(BusinessDataSource::getBusinessId, BusinessDataSystem::getId);
queryWrapper.in(BusinessDataSource::getBusinessId, 1);
Page<BusinessDataSourceDTO> dataSourceDTOPage = dataSourceMapper.paginateAs(1, 10, queryWrapper, BusinessDataSourceDTO.class);
System.out.println(dataSourceDTOPage);
}
}
...@@ -10,7 +10,7 @@ import java.util.concurrent.ExecutionException; ...@@ -10,7 +10,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
@SpringBootTest @SpringBootTest
public class AsyncTest { 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.demo;
import com.ediagnosis.cdr.CdrApplication;
import com.ediagnosis.cdr.dataIntegration.dao.BusinessDataDao;
import com.ediagnosis.cdr.dataIntegration.dao.dto.*;
import com.ediagnosis.cdr.dataIntegration.dao.entity.BusinessDataSystem;
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 ServiceTest
* @createTime 2025年07月31日
*/
@SpringBootTest(classes = CdrApplication.class)
public class DemoTest {
@Autowired
private BusinessDataDao businessDataDao;
@Test
public void test1() {
BusinessDataTableQueryDTO queryDTO = new BusinessDataTableQueryDTO();
Page<BusinessDataTableDTO> businessDataTableDTOPage = businessDataDao.queryTablePage(queryDTO);
System.out.println(businessDataTableDTOPage);
}
@Test
public void test2() {
BusinessDataSystemQueryDTO queryDTO = new BusinessDataSystemQueryDTO();
Page<BusinessDataSystem> dataSystemPage = businessDataDao.querySystemPage(queryDTO);
System.out.println(dataSystemPage);
}
@Test
public void test3() {
Page<BusinessDataSourceDTO> dataSourceDTOPage = businessDataDao.querySourcePage(new BusinessDataSourceQueryDTO());
System.out.println(dataSourceDTOPage);
}
}
{
"fullTableTree": {
"expiration": "3000",
"otherProperties": "xxxx"
}
}
\ No newline at end of file