提交 ef00bcd9 authored 作者: songchuancai's avatar songchuancai

修改数据api服务创建逻辑

上级 7ac5d815
package com.hisense.dataservice.bo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
......@@ -11,21 +15,47 @@ import java.util.List;
* @author : scc
* @date : 2023/02/20
* 列数据范围过滤
* TODO tableName tableId 和columnId columnName不为空的设计
* TODO tableName tableId 和columnId columnName不为空的设计
**/
@ApiModel("列数据范围过滤")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ColumnDataRangeFilter {
// 表名
@JsonIgnore
@ApiModelProperty(name = "表名", required = false)
private String tableName;
// 表名ID
@ApiModelProperty(name = "表名ID", required = true)
private Long tableId;
// 字段
private List<DataColumn> fields;
private String generateSql(){
private StringBuilder generateSql(StringBuilder resultBuilder) {
if (this.getFields().isEmpty()) {
resultBuilder.append(this.getTableName())
.append(".*")
.append(", ");
return resultBuilder;
}
for (DataColumn field : this.getFields()) {
resultBuilder.append(this.getTableName())
.append(".")
.append(field.getColumnName())
.append(" as ")
.append(this.getTableName())
.append("_")
.append(field.getColumnName())
.append(",");
}
return resultBuilder;
}
private String generateSql() {
StringBuilder resultBuilder = new StringBuilder();
if(this.getFields().isEmpty()){
resultBuilder.append(this.getTableName())
......@@ -46,7 +76,8 @@ public class ColumnDataRangeFilter {
return resultBuilder.toString();
}
private List<List<String>> generateExcelHead(){
private List<List<String>> generateExcelHead() {
List<List<String>> heads = new ArrayList<>();
StringBuilder headBuilder;
List<String> head;
......@@ -67,24 +98,26 @@ public class ColumnDataRangeFilter {
/**
* 生成sql-select
* 例如: select * 或者 select t1.a, t2.b, t2.c
*
* @param columnDataRangeFilters
* @return
*/
public static String generateFilterSelectSql(List<ColumnDataRangeFilter> columnDataRangeFilters){
public static String generateFilterSelectSql(List<ColumnDataRangeFilter> columnDataRangeFilters) {
StringBuilder result = new StringBuilder();
if (columnDataRangeFilters.isEmpty()) {
result.append(" select * ");
if (CollectionUtils.isEmpty(columnDataRangeFilters)) {
result.append(" * ");
return result.toString();
}
for (ColumnDataRangeFilter columnDataRangeFilter : columnDataRangeFilters) {
result.append(columnDataRangeFilter.generateSql());
// result.append(columnDataRangeFilter.generateSql());
result = columnDataRangeFilter.generateSql(result);
}
return result.substring(0, result.lastIndexOf(","));
}
public static List<List<String>> generateExcelHead(List<ColumnDataRangeFilter> columnDataRangeFilters){
public static List<List<String>> generateExcelHead(List<ColumnDataRangeFilter> columnDataRangeFilters) {
List<List<String>> result = new ArrayList<>();
for (ColumnDataRangeFilter columnDataRangeFilter : columnDataRangeFilters) {
result.addAll(columnDataRangeFilter.generateExcelHead());
......
package com.hisense.dataservice.bo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.hisense.dataservice.enums.FieldTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@ApiModel("数据字段描述")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DataColumn {
// 字段名
@JsonIgnore
@ApiModelProperty(name = "字段名", required = false)
private String columnName;
// 字段ID
@ApiModelProperty(name = "字段ID", required = true)
private Long id;
// 字段类型
@ApiModelProperty(name = "字段类型", required = false)
private FieldTypeEnum fieldType;
// 字段描述
@ApiModelProperty(name = "字段描述", required = false)
private String desc;
}
\ No newline at end of file
package com.hisense.dataservice.bo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.hisense.dataservice.enums.OperateEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -13,21 +16,33 @@ import java.util.List;
* @author : scc
* @date : 2023/02/27
**/
@ApiModel("行过滤条件")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FilterCondition {
// 表名
@JsonIgnore
@ApiModelProperty(name = "表名", required = false)
private String tableName;
// 表ID
@JsonIgnore
@ApiModelProperty(name = "表ID", required = false)
private Long tableId;
// 字段
@ApiModelProperty(name = "字段", required = true)
@NonNull
private DataColumn field;
// 过滤条件
@ApiModelProperty(name = "过滤条件", required = true)
@NonNull
private OperateEnum operateEnumType;
// 过滤值
@ApiModelProperty(name = "过滤值", required = true)
@NonNull
private List<Object> filterValues;
......
package com.hisense.dataservice.bo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -11,16 +14,25 @@ import java.util.List;
* @date : 2023/02/20
* 行数据范围过滤
**/
@ApiModel("行数据范围过滤")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LineDataRangeFilter {
// 条件全部满足还是满足一个: true:全部匹配, false: 只需要满足一个即可
@ApiModelProperty(name = "条件是否全部满足", required = false)
private Boolean fullMatched = Boolean.TRUE;
// 过滤条件
@ApiModelProperty(name = "过滤条件", required = false)
private List<FilterCondition> filterConditions;
@ApiModelProperty(name = "表ID", required = true)
private Long tableId;
@JsonIgnore
@ApiModelProperty(name = "表名", required = false)
private String tableName;
/**
......@@ -35,6 +47,7 @@ public class LineDataRangeFilter {
StringBuilder result = new StringBuilder();
// 拼接初始条件
if (LineDataRangeFilters.isEmpty()) {
result.append(" 1=1 ");
return result.toString();
}
......
package com.hisense.dataservice.bo;
import com.alibaba.fastjson.JSONObject;
import com.hisense.dataservice.entity.DataApiDataSource;
import com.hisense.dataservice.library.model.Result;
import com.hisense.dataservice.util.JdbcUtil;
import lombok.Data;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
/**
* @author : scc
* @date : 2023/03/14
**/
@Data
public class QueryDataTask<T> implements Callable<T> {
private DataApiDataSource dataApiDataSource;
private String querySql;
private String countSql;
private List<Object> jdbcParamValues;
private Long pageNumber;
private Integer queryDataTotalPerThread = 2000; // 默认2000
private List<List<String>> columnHeads;
@Override
public T call() throws Exception {
if (StringUtils.isEmpty(querySql)) {
Result<Long> dataResult = JdbcUtil.executeCountSql(dataApiDataSource, countSql, jdbcParamValues);
return (T) dataResult.getData();
// return (T) JdbcUtil.testCountSql().getData(); // TODO FOR TEST
} else {
List<List<Object>> result = new ArrayList<>();
Result<List<JSONObject>> dataResult = JdbcUtil.executeSql(dataApiDataSource, querySql, jdbcParamValues, queryDataTotalPerThread);
List<JSONObject> dataJsonList = dataResult.getData();
for (JSONObject dataJson : dataJsonList) {
List<Object> lineData = new ArrayList<>();
for (List<String> head : columnHeads) {
String columnName = head.get(0);
Object columnValue = dataJson.get(columnName);
lineData.add(columnValue); // 获取列名对应的值
}
result.add(lineData);
}
return (T) result;
// return (T) JdbcUtil.testExecuteSql(pageNumber).getData(); // TODO FOR TEST
}
}
}
package com.hisense.dataservice.bo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -10,12 +12,17 @@ import lombok.NoArgsConstructor;
* @date : 2023/02/27
* 多表之间join关系配置
**/
@ApiModel("数据表连接关系")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableJoinRelationConfig {
@ApiModelProperty(name = "表名", required = true)
private String tableName;
@ApiModelProperty(name = "列名", required = true)
private String columnName;
@ApiModelProperty(name = "表ID", required = true)
private Long tableId;
@ApiModelProperty(name = "列ID", required = true)
private Long columnId;
}
......@@ -6,7 +6,12 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @author : scc
......@@ -27,7 +32,7 @@ public class DataApiCommonServiceController {
@ApiImplicitParam(name = "pattern", value = "请求路径", required = true)
})
@GetMapping("/{environment}/{pattern}")
public Object dataQuery(@PathVariable String environment, @PathVariable String pattern) {
return dataApiCommonService.queryData(environment, pattern);
public Object dataQuery(@PathVariable String environment, @PathVariable String pattern, HttpServletRequest request) {
return dataApiCommonService.queryData(environment, pattern, request);
}
}
......@@ -6,6 +6,7 @@ import com.hisense.dataservice.service.DataApiCommonService;
import com.hisense.dataservice.service.DataApiDataSourceManagementService;
import com.hisense.dataservice.service.DataApiServiceManagementService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -26,9 +27,22 @@ public class DataServiceManagementController {
@Autowired
private DataApiServiceManagementService dataApiServiceManagementService;
@PostMapping("/")
public Result<Boolean> createOrUpdateDataApiService(DataApiModelDto dataApiModelDto){
return dataApiServiceManagementService.createOrUpdateDataApi(dataApiModelDto);
// @PostMapping("/")
// public Result<Boolean> createOrUpdateDataApiService(DataApiModelDto dataApiModelDto){
// return dataApiServiceManagementService.createOrUpdateDataApi(dataApiModelDto);
// }
@ApiOperation(value = "数据服务管理-创建数据服务(草稿状态)",notes = "返回数据模型ID")
@PostMapping("/{environment}")
public Result<Long> createDataApiService(@RequestBody DataApiModelDto dataApiModelDto, @PathVariable String environment){
return dataApiServiceManagementService.createDataApi(environment,dataApiModelDto);
}
@ApiOperation(value = "数据服务管理-发布数据服务")
@PostMapping("/{environment}/{modelId}")
public Result<Boolean> publishDataApi(@PathVariable String environment,
@PathVariable Long modelId) {
return dataApiServiceManagementService.publishDataApi(environment, modelId);
}
@GetMapping("/{environment}")
......@@ -36,11 +50,7 @@ public class DataServiceManagementController {
return null;
}
@PostMapping("/{environment}")
public Object publishDataApi(@PathVariable String environment,
@RequestBody DataApiModelDto dataApiModelDto) {
return null;
}
@PatchMapping("/{environment}")
public Object updateDataApi(@PathVariable String environment) {
......
......@@ -33,9 +33,6 @@ public class DataApiModelDto {
@ApiModelProperty(name = "行数据范围", required = true)
private List<LineDataRangeFilter> lineDataRangeConfig;
@ApiModelProperty(name = "apiID", required = true)
private Integer apiID;
@ApiModelProperty(name = "发布系统ID", required = false)
private Long publishSystemId;
......@@ -48,4 +45,7 @@ public class DataApiModelDto {
@ApiModelProperty(name = "系统环境", required = true)
private String systemEnv;
@ApiModelProperty(name = "数据服务描述", required = true)
private String desc;
}
package com.hisense.dataservice.entity;
import com.hisense.dataservice.bo.TableJoinRelationConfig;
import com.hisense.dataservice.enums.DebugStatusEnum;
import com.hisense.dataservice.enums.NetworkEnv;
import com.hisense.dataservice.enums.SystemEnv;
import com.vladmihalcea.hibernate.type.json.JsonBlobType;
......@@ -42,7 +43,7 @@ public class DataApiModel extends BaseEntity{
// apiId
@Column(nullable = false)
private Integer apiID;
private String apiID;
// 发布系统ID
@Column(nullable = false)
......@@ -58,8 +59,14 @@ public class DataApiModel extends BaseEntity{
@Column(name = "system_env", columnDefinition = "varchar2(10)", nullable = true)
private SystemEnv systemEnv;
// 发布:1、草稿:0
// 草稿:0、发布:1
@Column(name = "status", columnDefinition = "CHAR(1) default 0", nullable = false)
private Integer status;
// 未调试:NO_DEBUG、调试成功:SUCCESS、调试失败:FAIL
@Enumerated(EnumType.ORDINAL)
@Column(name = "debug_status", columnDefinition = "varchar2(10)", nullable = false)
private DebugStatusEnum debugStatus;
}
......@@ -110,7 +110,7 @@ public class DataApiModelConfig extends BaseEntity{
}
// 生成数据量大小查询sql
public String generateDataCountSql(DataSourceTypeEnum dataSourceTypeEnum) {
public String generateDataCountSql() {
// 已经通过校验行列筛选条件
StringBuilder fullSqlBuilder = new StringBuilder();
......
package com.hisense.dataservice.enums;
/**
* @author : scc
* @date : 2023/03/14
**/
public enum DebugStatusEnum {
NO_DEBUG,
FAIL,
SUCCESS,
}
......@@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
/**
* @author : scc
......@@ -20,6 +21,8 @@ public interface DataApiColumnRepository extends JpaRepository<DataApiColumn,Lon
// 根据数据表ID查询所有的列信息
List<DataApiColumn> findAllByDataTableIdAndDeletedIsFalse(Long dataTableId);
Optional<DataApiColumn> findByDataTableIdAndIdDeletedIsFalse(Long dataTableId, Long id);
Page<DataApiColumn> findAll(Specification specification, Pageable pageable);
......
......@@ -13,5 +13,5 @@ import java.util.Optional;
@Repository
public interface DataApiModelRepository extends JpaRepository<DataApiModel,Long> {
Optional<DataApiModel> findByApiID(Integer apiId);
Optional<DataApiModel> findByApiID(String apiId);
}
......@@ -13,6 +13,7 @@ import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
/**
* @author : scc
......@@ -24,6 +25,8 @@ public interface DataApiTableRepository extends JpaRepository<DataApiTable,Long>
// 根据数据源ID查询所有的数据表
List<DataApiTable> findAllByDataSourceIdAndDeletedIsFalse(Long dataSourceId);
Optional<DataApiTable> findAllByDataSourceIdAndIdDeletedIsFalse(Long dataSourceId, Long id);
Page<DataApiTable> findAll(Specification specification, Pageable pageable);
// 根据数据源ID查询所有的数据表
......
/*
* Licensed Materials - Property of tenxcloud.com
* (C) Copyright 2019 TenxCloud. All Rights Reserved.
*
* @auther douyanwei
* @date 2020/2/19
*/
package com.hisense.dataservice.repository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface PublishApplicationRepository{
@Query(value ="SELECT " +
"app.system" +
"FROM publish_application app " +
"WHERE app.USER_KEY = :userKey", nativeQuery=true)
List<Integer> findAllByUserKey(@Param("userKey") String userKey);
@Query(value ="SELECT " +
"app.system" +
"FROM publish_application app " +
"WHERE app.app_id = :appId and app.app_key = :appkey", nativeQuery=true)
List<Integer> findAllByAppIdAndAppKey(@Param("appId") String appId, @Param("appKey") String appKey);
}
......@@ -2,11 +2,13 @@ package com.hisense.dataservice.service;
import org.springframework.web.bind.annotation.PathVariable;
import javax.servlet.http.HttpServletRequest;
/**
* @author : scc
* @date : 2023/02/24
**/
public interface DataApiCommonService {
Object queryData(@PathVariable String environment, @PathVariable String pattern);
Object queryData(String environment, String pattern, HttpServletRequest request);
}
......@@ -9,5 +9,9 @@ import com.hisense.dataservice.library.model.Result;
**/
public interface DataApiServiceManagementService extends BaseService {
Result<Boolean> createOrUpdateDataApi(DataApiModelDto dataApiModelDto);
// 发布数据api服务
Result<Boolean> publishDataApi(String environment, Long modelId);
// 创建或修改未发布的数据api服务(草稿状态)
Result<Long> createDataApi(String environment, DataApiModelDto dataApiModelDto);
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论