Browse Source

modify some codes

master
xiaowuler 3 years ago
parent
commit
a212491412
  1. 9
      04.系统编码/02.api-service/pom.xml
  2. 42
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/dao/IDataRepository.java
  3. 12
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/dao/ISchemaRepository.java
  4. 80
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/dao/impl/DataRepository.java
  5. 8
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/dao/impl/SchemaRepository.java
  6. 1
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/model/constant/TimeConstant.java
  7. 8
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/model/dao/MetaInfo.java
  8. 10
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/service/IDataService.java
  9. 19
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/template/CacheTemplate.java
  10. 50
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/util/CalcUtil.java
  11. 34
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/util/SwaggerConfig.java
  12. 11
      04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/util/TimeUtil.java
  13. 3
      04.系统编码/02.api-service/src/main/resources/application.yml

9
04.系统编码/02.api-service/pom.xml

@ -102,6 +102,15 @@
<target>15</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>15</source>
<target>15</target>
<compilerArgs>--enable-preview</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>

42
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/dao/IDataRepository.java

@ -1,13 +1,55 @@
package com.ping.chuan.apiservice.dao;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.ping.chuan.apiservice.model.domain.CoordinateInfo;
import com.ping.chuan.apiservice.model.vo.PointValue;
/**
* @describe: 数据处理 数据接口
* @author: xiaowuler
* @createTime: 2021-11-10 16:01
*/
public interface IDataRepository {
/**
*
* @param keyspace
* @param tableName
* @param initialTime
* @param forecastTime
* @param timeEffect
* @param columns
*/
void insert(String keyspace, String tableName, Date initialTime, Date forecastTime, int timeEffect, Map<String, byte[]> columns);
/**
*
* @param keyspace
* @param tableName
* @param initialTime
* @param forecastTime
* @param coordinateInfos
* @return
*/
List<PointValue> findPoint(String keyspace, String tableName, LocalDateTime initialTime, LocalDateTime forecastTime, List<CoordinateInfo> coordinateInfos) throws Exception;
/**
*
* @param keyspace
* @param tableName
* @return
*/
List<Date> findInitialTime(String keyspace, String tableName);
/**
*
* @param keyspace
* @param tableName
* @param initialTime
* @return
*/
List<Date> findForecastTime(String keyspace, String tableName, Date initialTime);
}

12
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/dao/ISchemaRepository.java

@ -1,9 +1,13 @@
package com.ping.chuan.apiservice.dao;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import com.datastax.driver.core.DataType;
import com.ping.chuan.apiservice.model.domain.CoordinateInfo;
/**
* @describe: 模式接口类
* @author: xiaowuler
@ -25,4 +29,12 @@ public interface ISchemaRepository {
* @param columns
*/
void prepareTable(String keyspaceName, String tableName, Map<String, DataType> partitionKey, Map<String, DataType> columns);
/**
*
* @param keyspace
* @param tableName
* @return
*/
boolean exist(String keyspace, String tableName);
}

80
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/dao/impl/DataRepository.java

@ -1,12 +1,27 @@
package com.ping.chuan.apiservice.dao.impl;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import lombok.Data;
import org.springframework.stereotype.Repository;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.querybuilder.Clause;
import com.datastax.driver.core.querybuilder.Insert;
import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.datastax.driver.core.querybuilder.Select;
import com.datastax.driver.mapping.Mapper;
import com.datastax.driver.mapping.MappingManager;
import com.datastax.driver.mapping.annotations.Table;
import com.ping.chuan.apiservice.dao.IDataRepository;
import com.ping.chuan.apiservice.model.constant.TimeConstant;
import com.ping.chuan.apiservice.model.domain.CoordinateInfo;
import com.ping.chuan.apiservice.model.vo.PointValue;
import com.ping.chuan.apiservice.template.CassandraTemplate;
/**
@ -17,9 +32,11 @@ import com.ping.chuan.apiservice.template.CassandraTemplate;
@Repository
public class DataRepository implements IDataRepository {
private final MappingManager mappingManager;
private final CassandraTemplate cassandraTemplate;
public DataRepository(CassandraTemplate cassandraTemplate){
public DataRepository(CassandraTemplate cassandraTemplate, MappingManager mappingManager){
this.cassandraTemplate = cassandraTemplate;
this.mappingManager = mappingManager;
}
@Override
@ -29,6 +46,67 @@ public class DataRepository implements IDataRepository {
cassandraTemplate.getSession().execute(builder);
}
@Override
public List<PointValue> findPoint(String keyspace, String tableName, LocalDateTime initialTime, LocalDateTime forecastTime, List<CoordinateInfo> coordinateInfos) throws Exception {
List<String> columns = coordinateInfos.stream().map(c -> c.getColumn()).distinct().collect(Collectors.toList());
String cql = "select %s from %s.%s where initial_time = '%s' and forecast_time = '%s' ALLOW FILTERING".formatted(columns.stream().collect(Collectors.joining(", ")),
keyspace, tableName, initialTime.format(TimeConstant.YYYYMMDDHHMMSS_), forecastTime);
ResultSet resultSet = cassandraTemplate.getSession().execute(cql);
Map<String, List<List<BigDecimal>>> result = new HashMap<>(columns.size());
for(Row row : resultSet){
for(String column : columns){
result.put(column, (List<List<BigDecimal>>) row.getObject(column));
}
}
if (result.isEmpty()){
throw new Exception("未查到相关数据");
}
List<PointValue> pointValues = new ArrayList<>(coordinateInfos.size());
for(CoordinateInfo coordinateInfo : coordinateInfos){
PointValue pointValue = toPointValue(coordinateInfo.getOriginalLon(), coordinateInfo.getOriginalLat(), coordinateInfo.getGridLon(), coordinateInfo.getGridLat());
if (result.containsKey(coordinateInfo.getColumn())){
pointValue.setValue(result.get(coordinateInfo.getColumn()).get(coordinateInfo.getTargetLatIndex()).get(coordinateInfo.getTargetLonIndex()));
}
pointValues.add(pointValue);
}
return pointValues;
}
@Override
public List<Date> findInitialTime(String keyspace, String tableName) {
String cql = "select initial_time from %s.%s".formatted(keyspace, tableName);
ResultSet resultSet = cassandraTemplate.getSession().execute(cql);
List<Date> times = new ArrayList<>();
for(Row row : resultSet){
times.add(row.getTimestamp("initial_time"));
}
return times.stream().distinct().collect(Collectors.toList());
}
@Override
public List<Date> findForecastTime(String keyspace, String tableName, Date initialTime) {
String cql = "select forecast_time from %s.%s where initial_time = %s ALLOW FILTERING".formatted(keyspace, tableName, initialTime.getTime());
ResultSet resultSet = cassandraTemplate.getSession().execute(cql);
List<Date> times = new ArrayList<>();
for(Row row : resultSet){
times.add(row.getTimestamp("forecast_time"));
}
return times;
}
private PointValue toPointValue(BigDecimal originalLon, BigDecimal originalLat, BigDecimal gridLon, BigDecimal gridLat){
PointValue pointValue = new PointValue();
pointValue.setOriginalLat(originalLat);
pointValue.setOriginalLon(originalLon);
pointValue.setGridLat(gridLat);
pointValue.setGridLon(gridLon);
return pointValue;
}
private List<String> prepareColumnNames(Set<String> columnSet){
List<String> columns = new ArrayList<>();
columns.add("initial_time");

8
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/dao/impl/SchemaRepository.java

@ -4,6 +4,7 @@ import java.util.Map;
import org.springframework.stereotype.Repository;
import com.datastax.driver.core.DataType;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.schemabuilder.Create;
import com.datastax.driver.core.schemabuilder.KeyspaceOptions;
import com.datastax.driver.core.schemabuilder.SchemaBuilder;
@ -48,4 +49,11 @@ public class SchemaRepository implements ISchemaRepository {
cassandraTemplate.getSession().execute(builder);
}
@Override
public boolean exist(String keyspace, String tableName) {
String cql = "SELECT table_name FROM system_schema.tables WHERE keyspace_name ='%s' and table_name = '%s';".formatted(keyspace, tableName);
ResultSet resultSet = cassandraTemplate.getSession().execute(cql);
return !resultSet.all().isEmpty();
}
}

1
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/model/constant/TimeConstant.java

@ -14,5 +14,6 @@ public class TimeConstant {
public static final DateTimeFormatter FILE_SAVE_FORMAT = DateTimeFormatter.ofPattern("yyyy\\MM\\dd");
public static final String YYYYMM_STR = "yyyyMM";
public static final DateTimeFormatter YYYYMM = DateTimeFormatter.ofPattern(YYYYMM_STR);
public static final String YYYYMMDDHHMMSS_STR = "yyyyMMddHHmmss";
public static final DateTimeFormatter YYYYMMDDHHMMSS_ = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
}

8
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/model/dao/MetaInfo.java

@ -7,6 +7,7 @@ import lombok.Data;
import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.PartitionKey;
import com.datastax.driver.mapping.annotations.Table;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* @describe: 要素信息表
@ -29,18 +30,25 @@ public class MetaInfo {
@PartitionKey(5)
private BigDecimal height;
@Column
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private int latClipCount;
@Column
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private int lonClipCount;
@Column
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private int startTimeEffect;
@Column
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private int timeConvertValue;
@Column
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String timeUtil;
@Column
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String coordinateId;
@Column
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String fullNameEscaped;
public String toTableName(){

10
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/service/IDataService.java

@ -1,10 +1,15 @@
package com.ping.chuan.apiservice.service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.ping.chuan.apiservice.model.dao.Coordinate;
import com.ping.chuan.apiservice.model.dao.DealInfo;
import com.ping.chuan.apiservice.model.dao.MetaInfo;
import com.ping.chuan.apiservice.model.vo.PointValueVo;
/**
* @describe: 数据服务接口
@ -14,4 +19,9 @@ import com.ping.chuan.apiservice.model.dao.MetaInfo;
public interface IDataService {
void readRoutineElement(Map.Entry<DealInfo, Map.Entry<MetaInfo, Coordinate>> entry, boolean isTmp);
void readWindElement(Map.Entry<DealInfo, Map.Entry<MetaInfo, Coordinate>> entry);
PointValueVo findPoints(Map.Entry<MetaInfo, Coordinate> entry, LocalDateTime initialTime, LocalDateTime forecastTime, List<BigDecimal[]> latLons) throws Exception;
List<String> findInitialTime(Map.Entry<MetaInfo, Coordinate> entry) throws Exception;
List<String> findForecastTime(Map.Entry<MetaInfo, Coordinate> entry, Date initialTimeValue) throws Exception;
}

19
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/template/CacheTemplate.java

@ -1,10 +1,8 @@
package com.ping.chuan.apiservice.template;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.math.BigDecimal;
import java.util.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -58,4 +56,17 @@ public class CacheTemplate {
return Map.entry(metaInfo, metaInfos.get(metaInfo));
}
public static Map.Entry<MetaInfo, Coordinate> findOne(String modeCode, String elementCode, String memberCode, int timeInterval, int timeLength, int height){
MetaInfo metaInfo = metaInfos.keySet().stream().filter(m -> m.getHeight().equals(BigDecimal.valueOf(height)) && m.getElementCode().startsWith(elementCode.toUpperCase(Locale.ROOT)) &&
m.getMemberCode().equals(memberCode) && m.getModeCode().equals(modeCode) &&
m.getTimeInterval() == timeInterval && m.getTimeLength() == timeLength)
.findFirst().orElse(null);
if (Objects.isNull(metaInfo)){
return null;
}
return Map.entry(metaInfo, metaInfos.get(metaInfo));
}
}

50
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/util/CalcUtil.java

@ -1,7 +1,13 @@
package com.ping.chuan.apiservice.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import com.ping.chuan.apiservice.model.dao.Coordinate;
import com.ping.chuan.apiservice.model.dao.MetaInfo;
import com.ping.chuan.apiservice.model.domain.CoordinateInfo;
/**
* @describe: 计算工具类
* @author: xiaowuler
@ -25,4 +31,48 @@ public class CalcUtil {
int endYear = endTime.getYear();
return (endYear - startYear) * 12 + (endMonth - startMonth);
}
public static CoordinateInfo calcLocation(Coordinate sourceCoordinate, MetaInfo metaInfo, BigDecimal[] location) throws Exception {
if (location[0].compareTo(sourceCoordinate.getEndLat()) == 1 || location[0].compareTo(sourceCoordinate.getStartLat()) == -1 || location[1].compareTo(sourceCoordinate.getEndLon()) == 1 || location[1].compareTo(sourceCoordinate.getStartLon()) == -1) {
throw new Exception(String.format("超过边界,边界信息minLon:%s,maxLon:%s,minLat:%s,maxLat:%s", sourceCoordinate.getStartLon(), sourceCoordinate.getEndLon(), sourceCoordinate.getStartLat(), sourceCoordinate.getEndLat()));
}
CoordinateInfo coordinateInfo = new CoordinateInfo();
coordinateInfo.setOriginalLat(location[0]);
coordinateInfo.setOriginalLon(location[1]);
coordinateInfo.setLonIndex(calcLatLonIndex(location[1], sourceCoordinate.getStartLon(), sourceCoordinate.getLonInterval()));
coordinateInfo.setLatIndex(calcLatLonIndex(location[0], sourceCoordinate.getStartLat(), sourceCoordinate.getLatInterval()));
coordinateInfo.setGridLon(calcGridLatLon(sourceCoordinate.getStartLon(), coordinateInfo.getLonIndex(), sourceCoordinate.getLonInterval()));
coordinateInfo.setGridLat(calcGridLatLon(sourceCoordinate.getStartLat(), coordinateInfo.getLatIndex(), sourceCoordinate.getLatInterval()));
coordinateInfo.setSliceLat(coordinateInfo.getLatIndex() / metaInfo.getLatClipCount() * metaInfo.getLatClipCount());
coordinateInfo.setSliceLon(coordinateInfo.getLonIndex() / metaInfo.getLonClipCount() * metaInfo.getLonClipCount());
coordinateInfo.setSliceLatIndex(coordinateInfo.getLatIndex() / metaInfo.getLatClipCount());
coordinateInfo.setSliceLonIndex(coordinateInfo.getLonIndex() / metaInfo.getLonClipCount());
coordinateInfo.setTargetLatIndex(coordinateInfo.getLatIndex() % metaInfo.getLatClipCount());
coordinateInfo.setTargetLonIndex(coordinateInfo.getLonIndex() % metaInfo.getLonClipCount());
coordinateInfo.setColumn(String.format("col_%s_%s", coordinateInfo.getSliceLatIndex(), coordinateInfo.getSliceLonIndex()));
return coordinateInfo;
}
private static int calcLatLonIndex(BigDecimal original, BigDecimal start, BigDecimal delta) {
BigDecimal intervalValue = original.subtract(start);
BigDecimal divide = intervalValue.divide(delta, 4, RoundingMode.HALF_UP);
int index = divide.intValue();
if (new BigDecimal(index).compareTo(divide) == 0) {
return index;
} else {
return index + 1;
}
}
private static BigDecimal calcGridLatLon(BigDecimal start, int index, BigDecimal delta) {
return start.add(delta.multiply(new BigDecimal(index)));
}
}

34
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/util/SwaggerConfig.java

@ -1,34 +0,0 @@
package com.ping.chuan.apiservice.util;
import io.swagger.annotations.Api;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("swagger2测试项目")
.description("初级版本")
.version("1.0")
.build();
}
}

11
04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/util/TimeUtil.java

@ -1,7 +1,10 @@
package com.ping.chuan.apiservice.util;
import java.time.LocalDateTime;
import java.util.Date;
import com.ping.chuan.apiservice.model.constant.TimeConstant;
/**
* @describe: 时间工具类
* @author: xiaowuler
@ -19,4 +22,12 @@ public class TimeUtil {
now.setTime(sourceTime.getTime() + minutes * 60000);
return now;
}
public static Object convertTime(String timeStr){
try{
return LocalDateTime.parse(timeStr, TimeConstant.YYYYMMDDHHMMSS);
}catch (Exception e){
return "时间格式是yyyyMMddHHmmss";
}
}
}

3
04.系统编码/02.api-service/src/main/resources/application.yml

@ -1 +1,2 @@
server:
port: 4557

Loading…
Cancel
Save