diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QOptionalStockPO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QOptionalStockPO.java new file mode 100644 index 0000000..7c210e9 --- /dev/null +++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QOptionalStockPO.java @@ -0,0 +1,41 @@ +package cn.stock.market.infrastructure.db.po; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.Generated; +import com.querydsl.core.types.Path; + + +/** + * QOptionalStockPO is a Querydsl query type for OptionalStockPO + */ +@Generated("com.querydsl.codegen.EntitySerializer") +public class QOptionalStockPO extends EntityPathBase { + + private static final long serialVersionUID = 1161631810L; + + public static final QOptionalStockPO optionalStockPO = new QOptionalStockPO("optionalStockPO"); + + public final StringPath company = createString("company"); + + public final NumberPath id = createNumber("id", Integer.class); + + public final StringPath symbol = createString("symbol"); + + public QOptionalStockPO(String variable) { + super(OptionalStockPO.class, forVariable(variable)); + } + + public QOptionalStockPO(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QOptionalStockPO(PathMetadata metadata) { + super(OptionalStockPO.class, metadata); + } + +} + diff --git a/src/main/java/cn/stock/market/domain/basic/convert/OptionalStockConvert.java b/src/main/java/cn/stock/market/domain/basic/convert/OptionalStockConvert.java new file mode 100644 index 0000000..22445c8 --- /dev/null +++ b/src/main/java/cn/stock/market/domain/basic/convert/OptionalStockConvert.java @@ -0,0 +1,16 @@ +package cn.stock.market.domain.basic.convert; + +import cn.qutaojing.common.domain.convert.SimpleEntityPOConvert; +import cn.qutaojing.common.utils.SpringUtils; +import cn.stock.market.domain.basic.entity.OptionalStock; +import cn.stock.market.infrastructure.db.po.OptionalStockPO; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +@Component +@Lazy +public class OptionalStockConvert extends SimpleEntityPOConvert { + public static OptionalStockConvert of() { + return SpringUtils.getBean(OptionalStockConvert.class); + } +} diff --git a/src/main/java/cn/stock/market/domain/basic/entity/OptionalStock.java b/src/main/java/cn/stock/market/domain/basic/entity/OptionalStock.java new file mode 100644 index 0000000..6bb2483 --- /dev/null +++ b/src/main/java/cn/stock/market/domain/basic/entity/OptionalStock.java @@ -0,0 +1,16 @@ +package cn.stock.market.domain.basic.entity; + +import cn.stock.market.infrastructure.db.po.OptionalStockPO; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode( + callSuper = false +) +public class OptionalStock extends OptionalStockPO { +} diff --git a/src/main/java/cn/stock/market/domain/basic/repository/OptionalStockRepository.java b/src/main/java/cn/stock/market/domain/basic/repository/OptionalStockRepository.java new file mode 100644 index 0000000..5e315b4 --- /dev/null +++ b/src/main/java/cn/stock/market/domain/basic/repository/OptionalStockRepository.java @@ -0,0 +1,32 @@ +package cn.stock.market.domain.basic.repository; + +import cn.qutaojing.common.domain.convert.IEntityPOConvert; +import cn.qutaojing.common.domain.respostory.SimplePoConvertEntityRepository; +import cn.stock.market.domain.basic.convert.OptionalStockConvert; +import cn.stock.market.domain.basic.entity.OptionalStock; +import cn.stock.market.infrastructure.db.po.OptionalStockPO; +import cn.stock.market.infrastructure.db.repo.OptionalStockRepo; +import com.rp.spring.jpa.GenericJpaRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor( + onConstructor = @__(@Autowired) +) +public class OptionalStockRepository extends SimplePoConvertEntityRepository { + final OptionalStockRepo repo; + + final OptionalStockConvert convert; + + @Override + public GenericJpaRepository repo() { + return repo; + } + + @Override + public IEntityPOConvert convert() { + return convert; + } +} diff --git a/src/main/java/cn/stock/market/dto/OptionalStockResponse.java b/src/main/java/cn/stock/market/dto/OptionalStockResponse.java new file mode 100644 index 0000000..0a5cd89 --- /dev/null +++ b/src/main/java/cn/stock/market/dto/OptionalStockResponse.java @@ -0,0 +1,18 @@ +package cn.stock.market.dto; + +import lombok.Data; + +@Data +public class OptionalStockResponse { + private String message; + private Integer code; + private DataResponse data = new DataResponse(); + + @Data + public static class DataResponse { + private String symbol; + private String company; + private Double pricecurrent; + private Float pricepercentchange; + } +} diff --git a/src/main/java/cn/stock/market/infrastructure/db/po/OptionalStockPO.java b/src/main/java/cn/stock/market/infrastructure/db/po/OptionalStockPO.java new file mode 100644 index 0000000..6197e75 --- /dev/null +++ b/src/main/java/cn/stock/market/infrastructure/db/po/OptionalStockPO.java @@ -0,0 +1,35 @@ +package cn.stock.market.infrastructure.db.po; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +@SuperBuilder +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@DynamicInsert +@DynamicUpdate +@Table( + name = "optional_stock" +) +public class OptionalStockPO { + @Id + @GeneratedValue( + strategy = javax.persistence.GenerationType.IDENTITY + ) + Integer id; + + String symbol; + + String company; +} diff --git a/src/main/java/cn/stock/market/infrastructure/db/repo/OptionalStockRepo.java b/src/main/java/cn/stock/market/infrastructure/db/repo/OptionalStockRepo.java new file mode 100644 index 0000000..d61d258 --- /dev/null +++ b/src/main/java/cn/stock/market/infrastructure/db/repo/OptionalStockRepo.java @@ -0,0 +1,7 @@ +package cn.stock.market.infrastructure.db.repo; + +import cn.stock.market.infrastructure.db.po.OptionalStockPO; +import com.rp.spring.jpa.GenericJpaRepository; + +public interface OptionalStockRepo extends GenericJpaRepository { +} diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index 27547a7..c4dcee6 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -3,14 +3,19 @@ package cn.stock.market.web; import cn.hutool.core.date.DateUtil; import cn.stock.market.MoneyStockSuggestDTO; import cn.stock.market.domain.basic.entity.MoneyStock; +import cn.stock.market.domain.basic.entity.OptionalStock; import cn.stock.market.domain.basic.repository.MoneyStockRepository; +import cn.stock.market.domain.basic.repository.OptionalStockRepository; +import cn.stock.market.dto.OptionalStockResponse; import cn.stock.market.dto.StockHistoryRequest; import cn.stock.market.dto.StockHistoryResponse; import cn.stock.market.infrastructure.db.po.QMoneyStockPO; +import cn.stock.market.utils.HttpRequest; import cn.stock.market.utils.NseIndiaRequest; import cn.stock.market.utils.ServerResponse; import cn.stock.market.web.annotations.EncryptFilter; import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; @@ -36,8 +41,12 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.UriUtils; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -58,7 +67,14 @@ public class MoneyApiController { @Autowired private MoneyStockRepository moneyStockRepository; + @Autowired + private OptionalStockRepository optionalStockRepository; + + @Autowired + private ObjectMapper objectMapper; + private static final String EXTERNAL_API_URL = "https://priceapi.moneycontrol.com/techCharts/indianMarket/stock/history"; + private static final String OPTIONAL_STOCK_MONEYCONTROL_URL = "https://priceapi.moneycontrol.com/pricefeed/notapplicable/inidicesindia/"; @ApiOperation(value = "股票详情信息", httpMethod = "GET") @ApiImplicitParams({ @@ -768,6 +784,33 @@ public class MoneyApiController { // 返回响应 } + @GetMapping({"/market/api/market/stock/optional", "/api/market/stock/optional"}) + @ResponseBody + @EncryptFilter(decryptRequest = false) + public ResponseEntity> getOptionalStock() { + List optionalStocks = optionalStockRepository.findAll(); + List data = optionalStocks.stream().map(stock -> { + try { + String responseStr = HttpRequest.doGrabGet(OPTIONAL_STOCK_MONEYCONTROL_URL + URLEncoder.encode(stock.getSymbol(), "UTF-8")); + OptionalStockResponse response = objectMapper.readValue(responseStr, OptionalStockResponse.class); + if (response != null && response.getCode().equals(200)) { + return response.getData(); + } + } + catch (Exception e) { + log.error("Failed to get optional stock from moneycontrol for " + stock.getSymbol(), e); + } + + OptionalStockResponse response = new OptionalStockResponse(); + response.getData().setSymbol(stock.getSymbol()); + response.getData().setSymbol(stock.getCompany()); + + return response.getData(); + }).collect(Collectors.toList()); + + return ResponseEntity.ok(data); + } + private void setResponse(StockHistoryResponse response, String resolution) { if (!"ok".equals(response.getS())) { return;