diff --git a/pom.xml b/pom.xml index 6fe2d02..2bba2aa 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,17 @@ 22 22 + + + + org.springframework.cloud + spring-cloud-dependencies + 2023.0.5 + pom + import + + + org.springframework.boot @@ -66,6 +77,13 @@ org.springframework.boot spring-boot-starter-test test + + + + org.skyscreamer + jsonassert + + org.springframework.boot @@ -90,6 +108,11 @@ org.springframework.data spring-data-redis + + + org.springframework.cloud + spring-cloud-starter-openfeign + org.redisson @@ -103,11 +126,6 @@ redisson-spring-boot-starter 3.26.0 - - - redis.clients - jedis - com.baomidou @@ -302,6 +320,19 @@ jsoup 1.20.1 + + + + org.skyscreamer + jsonassert + test + + + com.vaadin.external.google + android-json + + + diff --git a/src/main/java/quant/rich/emoney/EmoneyAutoApplication.java b/src/main/java/quant/rich/emoney/EmoneyAutoApplication.java index 5789f3c..5f839cb 100644 --- a/src/main/java/quant/rich/emoney/EmoneyAutoApplication.java +++ b/src/main/java/quant/rich/emoney/EmoneyAutoApplication.java @@ -3,11 +3,13 @@ package quant.rich.emoney; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @EnableAsync @EnableScheduling +@EnableFeignClients @SpringBootApplication @EnableCaching(proxyTargetClass=true) public class EmoneyAutoApplication { diff --git a/src/main/java/quant/rich/emoney/component/EmoneyAutoPlatformExceptionHandler.java b/src/main/java/quant/rich/emoney/component/EmoneyAutoPlatformExceptionHandler.java index cba5cc7..21bb232 100644 --- a/src/main/java/quant/rich/emoney/component/EmoneyAutoPlatformExceptionHandler.java +++ b/src/main/java/quant/rich/emoney/component/EmoneyAutoPlatformExceptionHandler.java @@ -23,6 +23,7 @@ import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @@ -50,7 +51,8 @@ public class EmoneyAutoPlatformExceptionHandler { @ExceptionHandler({ BindException.class, ConstraintViolationException.class, - MethodArgumentNotValidException.class }) + MethodArgumentNotValidException.class, + MissingServletRequestParameterException.class}) @ResponseBody @ResponseStatus(HttpStatus.BAD_REQUEST) public R handleBindException(Ex ex) { diff --git a/src/main/java/quant/rich/emoney/config/EmoneyAutoConfig.java b/src/main/java/quant/rich/emoney/config/EmoneyAutoConfig.java index 7439b7f..ff0903d 100644 --- a/src/main/java/quant/rich/emoney/config/EmoneyAutoConfig.java +++ b/src/main/java/quant/rich/emoney/config/EmoneyAutoConfig.java @@ -8,7 +8,6 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import quant.rich.emoney.interceptor.BaseInterceptor; import quant.rich.emoney.interceptor.EnumOptionsInterceptor; import quant.rich.emoney.service.ConfigService; @@ -22,9 +21,6 @@ import quant.rich.emoney.service.ConfigService; @Configuration @Import(ConfigAutoRegistrar.class) public class EmoneyAutoConfig implements WebMvcConfigurer { - - @Autowired - BaseInterceptor baseInterceptor; @Autowired EnumOptionsInterceptor enumOptionsInterceptor; @@ -39,7 +35,6 @@ public class EmoneyAutoConfig implements WebMvcConfigurer { */ @Override public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(baseInterceptor).addPathPatterns("/**"); registry.addInterceptor(enumOptionsInterceptor).addPathPatterns("/**"); } } diff --git a/src/main/java/quant/rich/emoney/interceptor/BaseInterceptor.java b/src/main/java/quant/rich/emoney/interceptor/BaseInterceptor.java deleted file mode 100644 index 1fd0aab..0000000 --- a/src/main/java/quant/rich/emoney/interceptor/BaseInterceptor.java +++ /dev/null @@ -1,22 +0,0 @@ -package quant.rich.emoney.interceptor; - -import lombok.extern.slf4j.Slf4j; - -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.HandlerInterceptor; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -/** - * 后台系统身份验证拦截器 Modify by Doghole 2025/3/11 - */ -@Component -@Slf4j -public class BaseInterceptor implements HandlerInterceptor { - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - return true; - } - -} diff --git a/src/main/java/quant/rich/emoney/interceptor/EnumOptionsInterceptor.java b/src/main/java/quant/rich/emoney/interceptor/EnumOptionsInterceptor.java index 5369b6f..168c3e4 100644 --- a/src/main/java/quant/rich/emoney/interceptor/EnumOptionsInterceptor.java +++ b/src/main/java/quant/rich/emoney/interceptor/EnumOptionsInterceptor.java @@ -3,8 +3,6 @@ package quant.rich.emoney.interceptor; import org.reflections.Reflections; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.AliasFor; -import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/quant/rich/emoney/tushare/ITsStockInfo.java b/src/main/java/quant/rich/emoney/tushare/ITsStockInfo.java new file mode 100644 index 0000000..805a685 --- /dev/null +++ b/src/main/java/quant/rich/emoney/tushare/ITsStockInfo.java @@ -0,0 +1,28 @@ +package quant.rich.emoney.tushare; + +import java.time.LocalDateTime; + +public interface ITsStockInfo { + /** + * 获取 Tushare 代码 + * @return + */ + String getTsCode(); + /** + * 获取名称 + * @return + */ + String getName(); + /** + * 获取上市(成立)日期 + * @return + */ + LocalDateTime getListDate(); + /** + * 获取退市(终止)日期 + * @return + */ + default LocalDateTime getDelistDate() { + return null; + } +} \ No newline at end of file diff --git a/src/main/java/quant/rich/emoney/tushare/StockInfo.java b/src/main/java/quant/rich/emoney/tushare/StockInfo.java new file mode 100644 index 0000000..55f7353 --- /dev/null +++ b/src/main/java/quant/rich/emoney/tushare/StockInfo.java @@ -0,0 +1,26 @@ +package quant.rich.emoney.tushare; + +import java.time.LocalDateTime; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain=true) +public class StockInfo implements ITsStockInfo { + + private String tsCode; + private String name; + private LocalDateTime listDate; + private LocalDateTime delistDate; + + public Integer getGoodsId() { + if (tsCode.endsWith("SH")) { + return Integer.valueOf(tsCode.substring(0, 6)); + } + if (tsCode.endsWith("SZ") || tsCode.endsWith("BJ")) { + return Integer.valueOf("1" + tsCode.substring(0, 6)); + } + throw new RuntimeException("无法将指定的 tsCode " + tsCode + " 转换成 goodsId"); + } +} diff --git a/src/main/java/quant/rich/emoney/tushare/TushareDataServiceClient.java b/src/main/java/quant/rich/emoney/tushare/TushareDataServiceClient.java new file mode 100644 index 0000000..cccdd12 --- /dev/null +++ b/src/main/java/quant/rich/emoney/tushare/TushareDataServiceClient.java @@ -0,0 +1,22 @@ +package quant.rich.emoney.tushare; + +import java.util.List; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 对接 TushareDataService 的 Feign 客户端 + */ +@FeignClient(name="tushare-data-service-client", url="http://localhost:9999") +public interface TushareDataServiceClient { + + @GetMapping("/api/v1/common/stockInfo/list") + public List list( + @RequestParam(name="listStatus", required=false) String listStatus, + @RequestParam(name="stockMarket", required=false) String[] stockMarket, + @RequestParam(name="ths", required=false, defaultValue="false") Boolean ths + ); + +} diff --git a/src/test/java/quant/rich/emoney/TushareDataServiceClientTest.java b/src/test/java/quant/rich/emoney/TushareDataServiceClientTest.java new file mode 100644 index 0000000..0a3b2b5 --- /dev/null +++ b/src/test/java/quant/rich/emoney/TushareDataServiceClientTest.java @@ -0,0 +1,33 @@ +package quant.rich.emoney; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import lombok.extern.slf4j.Slf4j; +import quant.rich.emoney.tushare.StockInfo; +import quant.rich.emoney.tushare.TushareDataServiceClient; + +@SpringBootTest +@ContextConfiguration(classes = EmoneyAutoApplication.class) +@RunWith(SpringJUnit4ClassRunner.class) +@Slf4j +public class TushareDataServiceClientTest { + + @Autowired + TushareDataServiceClient tushareDataServiceClient; + + @Test + void test() { + List stockInfos = tushareDataServiceClient.list("LIST", new String[] {"SZ", "SH"}, null); + for(StockInfo stockInfo : stockInfos) { + log.info("{} {}", stockInfo.getGoodsId(), stockInfo); + } + } + +}