支持Retifive的操作

This commit is contained in:
Achilles
2024-04-10 21:06:23 +08:00
parent 9d3bac8a9d
commit 1d317149b3
15 changed files with 584 additions and 60 deletions

View File

@@ -0,0 +1,51 @@
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;
/**
* QRetifiveStockPO is a Querydsl query type for RetifiveStockPO
*/
@Generated("com.querydsl.codegen.EntitySerializer")
public class QRetifiveStockPO extends EntityPathBase<RetifiveStockPO> {
private static final long serialVersionUID = -280817720L;
public static final QRetifiveStockPO retifiveStockPO = new QRetifiveStockPO("retifiveStockPO");
public final NumberPath<Integer> id = createNumber("id", Integer.class);
public final NumberPath<Integer> isLock = createNumber("isLock", Integer.class);
public final NumberPath<Integer> isShow = createNumber("isShow", Integer.class);
public final DateTimePath<java.util.Date> saveTime = createDateTime("saveTime", java.util.Date.class);
public final StringPath stockCode = createString("stockCode");
public final StringPath stockName = createString("stockName");
public final StringPath stockType = createString("stockType");
public final StringPath symbol = createString("symbol");
public QRetifiveStockPO(String variable) {
super(RetifiveStockPO.class, forVariable(variable));
}
public QRetifiveStockPO(Path<? extends RetifiveStockPO> path) {
super(path.getType(), path.getMetadata());
}
public QRetifiveStockPO(PathMetadata metadata) {
super(RetifiveStockPO.class, metadata);
}
}

View File

@@ -0,0 +1,35 @@
package cn.stock.market.application.assembler;
import cn.qutaojing.common.utils.Beans;
import cn.qutaojing.common.utils.SpringUtils;
import cn.stock.market.domain.basic.entity.RetifiveStock;
import cn.stock.market.dto.RetifiveStockDTO;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
/**
* RetifiveStockAssembler
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@Component
@Lazy
public class RetifiveStockAssembler {
public RetifiveStockDTO toDTO(RetifiveStock e) {
RetifiveStockDTO dto = Beans.mapper(e, RetifiveStockDTO.class);
if(dto == null) return dto;
fill(e, dto);
return dto;
}
protected void fill(RetifiveStock e, RetifiveStockDTO dto) {
if(dto == null) return;
return;
}
public static RetifiveStockAssembler of() {
return SpringUtils.getBean(RetifiveStockAssembler.class);
}
}

View File

@@ -0,0 +1,23 @@
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.RetifiveStock;
import cn.stock.market.infrastructure.db.po.RetifiveStockPO;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
/**
* RetifiveStockConvert
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@Component
@Lazy
public class RetifiveStockConvert extends SimpleEntityPOConvert<RetifiveStock, RetifiveStockPO> {
public static RetifiveStockConvert of() {
return SpringUtils.getBean(RetifiveStockConvert.class);
}
}

View File

@@ -0,0 +1,28 @@
package cn.stock.market.domain.basic.entity;
import cn.qutaojing.common.utils.Beans;
import cn.stock.market.dto.command.RetifiveStockCreateCommand;
import cn.stock.market.infrastructure.db.po.RetifiveStockPO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* RetifiveStock
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@Data
@NoArgsConstructor
@SuperBuilder
@EqualsAndHashCode(
callSuper = false
)
public class RetifiveStock extends RetifiveStockPO {
public void update(RetifiveStockCreateCommand cmd) {
Beans.copyProperties(cmd, this);
}
}

View File

@@ -0,0 +1,28 @@
package cn.stock.market.domain.basic.factory;
import cn.qutaojing.common.utils.SpringUtils;
import cn.stock.market.domain.basic.entity.RetifiveStock;
import cn.stock.market.dto.command.RetifiveStockCreateCommand;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
/**
* RetifiveStockFactory
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@Component
@Lazy
public class RetifiveStockFactory {
public static RetifiveStockFactory of() {
return SpringUtils.getBean(RetifiveStockFactory.class);
}
public RetifiveStock from(RetifiveStockCreateCommand cmd) {
RetifiveStock e = RetifiveStock.builder().build();
e.update(cmd);
return e;
}
}

View File

@@ -0,0 +1,46 @@
package cn.stock.market.domain.basic.repository;
import cn.qutaojing.common.domain.convert.IEntityPOConvert;
import cn.qutaojing.common.domain.respostory.SimplePoConvertEntityRepository;
import cn.qutaojing.common.utils.SpringUtils;
import cn.stock.market.domain.basic.convert.RetifiveStockConvert;
import cn.stock.market.domain.basic.entity.RetifiveStock;
import cn.stock.market.infrastructure.db.po.RetifiveStockPO;
import cn.stock.market.infrastructure.db.repo.RetifiveStockRepo;
import com.rp.spring.jpa.GenericJpaRepository;
import java.lang.Integer;
import java.lang.Override;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
/**
* RetifiveStockRepository
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@Repository
@RequiredArgsConstructor(
onConstructor = @__(@Autowired)
)
public class RetifiveStockRepository extends SimplePoConvertEntityRepository<RetifiveStock, RetifiveStockPO, Integer> {
final RetifiveStockRepo repo;
final RetifiveStockConvert convert;
@Override
public GenericJpaRepository<RetifiveStockPO, Integer> repo() {
return repo;
}
@Override
public IEntityPOConvert<RetifiveStock, RetifiveStockPO> convert() {
return convert;
}
public static RetifiveStockRepository of() {
return SpringUtils.getBean(RetifiveStockRepository.class);
}
}

View File

@@ -0,0 +1,33 @@
package cn.stock.market.domain.basic.service;
import cn.qutaojing.common.utils.SpringUtils;
import cn.stock.market.domain.basic.factory.RetifiveStockFactory;
import cn.stock.market.domain.basic.repository.RetifiveStockRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* RetifiveStockService
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@Service
@RequiredArgsConstructor(
onConstructor = @__(@Autowired)
)
public class RetifiveStockService {
final RetifiveStockRepository repository;
final RetifiveStockFactory factory;
public RetifiveStockRepository repository() {
return repository;
}
public static RetifiveStockService of() {
return SpringUtils.getBean(RetifiveStockService.class);
}
}

View File

@@ -0,0 +1,23 @@
package cn.stock.market.dto;
import cn.stock.market.infrastructure.db.po.RetifiveStockPO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* RetifiveStockDTO
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@Data
@NoArgsConstructor
@SuperBuilder
@EqualsAndHashCode(
callSuper = false
)
public class RetifiveStockDTO extends RetifiveStockPO {
}

View File

@@ -20,6 +20,7 @@ public class RetifiveStockInfo {
private String stockType; // 股票类型
private String currentPrice; // 当前价格
private String changePercent; // 变动百分比
private String changeValue; //变动值
private String openPrice; // 开盘价格
private String previousPrice; // 昨日收盘价格
private String volume; // 成交量

View File

@@ -0,0 +1,52 @@
package cn.stock.market.dto.command;
import java.lang.Integer;
import java.lang.String;
import java.util.Date;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* RetifiveStockCreateCommand
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@Data
@SuperBuilder
@NoArgsConstructor
public class RetifiveStockCreateCommand {
/**
* 主键 */
Integer id;
/**
* 股票名称 */
String stockName;
/**
* BSE or NSE */
String stockType;
/**
* symbol,查询Rics的id用 */
String symbol;
/**
* 股票code */
String stockCode;
/**
* 保存时间 */
Date saveTime;
/**
* 是否锁定 0否 1是 */
Integer isLock;
/**
* 是否展示 0是 1否 */
Integer isShow;
}

View File

@@ -0,0 +1,24 @@
package cn.stock.market.dto.command;
import java.lang.Integer;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* RetifiveStockModifyCommand
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@Data
@SuperBuilder
@NoArgsConstructor
@EqualsAndHashCode(
callSuper = false
)
public class RetifiveStockModifyCommand extends RetifiveStockCreateCommand {
Integer id;
}

View File

@@ -0,0 +1,70 @@
package cn.stock.market.infrastructure.db.po;
import java.lang.Integer;
import java.lang.String;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
/**
* RetifiveStockPO
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
@SuperBuilder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@DynamicInsert
@DynamicUpdate
@Table(
name = "retifive_stock"
)
public class RetifiveStockPO {
/**
* 主键 */
@Id
@GeneratedValue(
strategy = javax.persistence.GenerationType.IDENTITY
)
Integer id;
/**
* 股票名称 */
String stockName;
/**
* BSE or NSE */
String stockType;
/**
* symbol,查询Rics的id用 */
String symbol;
/**
* 股票code */
String stockCode;
/**
* 保存时间 */
Date saveTime;
/**
* 是否锁定 0否 1是 */
Integer isLock;
/**
* 是否展示 0是 1否 */
Integer isShow;
}

View File

@@ -0,0 +1,15 @@
package cn.stock.market.infrastructure.db.repo;
import cn.stock.market.infrastructure.db.po.RetifiveStockPO;
import com.rp.spring.jpa.GenericJpaRepository;
import java.lang.Integer;
/**
* RetifiveStockRepo
*
* @author rplees
* @email rplees.i.ly@gmail.com
* @created 2024/04/10
*/
public interface RetifiveStockRepo extends GenericJpaRepository<RetifiveStockPO, Integer> {
}

View File

@@ -1,6 +1,9 @@
package cn.stock.market.web;
import cn.stock.market.domain.basic.entity.RetifiveStock;
import cn.stock.market.domain.basic.service.RetifiveStockService;
import cn.stock.market.dto.RetifiveStockInfo;
import cn.stock.market.infrastructure.db.po.RetifiveStockPO;
import cn.stock.market.listener.AppClient;
import cn.stock.market.listener.ConcurrentAppClient;
import cn.stock.market.listener.StockInfoRefinitiv;
@@ -24,6 +27,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -47,6 +51,9 @@ public class MessageRetifiveController {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private RetifiveStockService retifiveStockService;
@GetMapping("/message")
public ServerResponse<?> getMessage(@RequestParam String itemName) {
RefreshMsg refreshMsg = null;
@@ -141,10 +148,9 @@ public class MessageRetifiveController {
}*/
@GetMapping("/getStockInfoList2")
@GetMapping("/testStockInfoList2")
public ServerResponse<?> getStockInfoList2() {
List<String> collect = mongoTemplate.query(SymbolRefinitiv.class).stream().map(SymbolRefinitiv::getSymbol).collect(Collectors.toList());
// 计算每个线程应处理的元素数量
for (String itemName : collect) {
try {
@@ -267,6 +273,10 @@ public class MessageRetifiveController {
String symbol = fieldEntry.load().toString();
if(!symbol.contains("blank data")){
mongoTemplate.insert(new SymbolRefinitiv(symbol,"bse",name));
/* RetifiveStock retifiveStockPO = new RetifiveStock();
retifiveStockPO.setSymbol(name);
retifiveStockPO.setStockType("bse");
retifiveStockService.repository().save(retifiveStockPO);*/
}
}
}
@@ -313,59 +323,7 @@ public class MessageRetifiveController {
return nextLink;
}
synchronized void decode2(FieldList fieldList,String name)
{
List<FieldEntry> safeList = new CopyOnWriteArrayList<>();
for(FieldEntry fieldEntry : fieldList) {
safeList.add(fieldEntry); // 假设这里是安全的但实际上你可能需要根据FieldEntry的实现来确定
}
String stockName = "";
String stockCode = "";
String status = "";
for(FieldEntry fieldEntry : safeList)
{
System.out.println("Fid: " + fieldEntry.fieldId() + " Name: " + fieldEntry.name() + " value: " + fieldEntry.load());
if(fieldEntry.name().startsWith("LINK_")){
if(fieldEntry.loadType() == DataType.DataTypes.ASCII){
String symbol = fieldEntry.load().toString();
if(!symbol.contains("blank data")){
mongoTemplate.insert(new SymbolRefinitiv(symbol,"bse",name));
}
}
}
if(fieldEntry.name().equals("DSPLY_NAME")){
if(fieldEntry.loadType() == DataType.DataTypes.RMTES) {
stockName = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("PROV_SYMB")){
if(fieldEntry.loadType() == DataType.DataTypes.RMTES) {
stockCode = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("TRD_STATUS")){
if(fieldEntry.loadType() == DataType.DataTypes.RMTES) {
status = fieldEntry.load().toString();
}
}
}
StockInfoRefinitiv stockInfoRefinitiv = new StockInfoRefinitiv();
stockInfoRefinitiv.setStockName(stockName);
stockInfoRefinitiv.setStockCode(stockCode);
stockInfoRefinitiv.setStatus(status);
stockInfoRefinitiv.setStockType("bse");
stockInfoRefinitiv.setCommandStr(name);
mongoTemplate.insert(stockInfoRefinitiv);
}
RetifiveStockInfo decode3(FieldList fieldList, String name)
void decode2(FieldList fieldList,String name)
{
Iterator<FieldEntry> iter = fieldList.iterator();
FieldEntry fieldEntry;
@@ -382,6 +340,7 @@ public class MessageRetifiveController {
String low = "";
String volume = "";//实时交易数量
String stockType = "";
String changeValue = "";
while (iter.hasNext())
{
fieldEntry = iter.next();
@@ -426,12 +385,148 @@ public class MessageRetifiveController {
week52Low = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("NETCHNG_1")){
if(fieldEntry.name().equals("PCTCHNG")){ // NETCHNG_1
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
percentChange = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("NETCHNG_1")){ // NETCHNG_1
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
changeValue = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("HIGH_1")){
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
high = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("LOW_1")){
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
low = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("IRGVOL")){
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
volume = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("TRDPRC_1")){
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
price = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("RDN_EXCHID")){
if(fieldEntry.loadType() == DataType.DataTypes.ENUM) {
stockType = fieldEntry.load().toString();
if(StringUtils.equals(stockType,"145")){
stockType = "bse";//孟买国家交易所
}else if(StringUtils.equals(stockType,"147")){
stockType = "nse";//印度国家交易所
}
}
}
}
/*StockInfoRefinitiv stockInfoRefinitiv = new StockInfoRefinitiv();
stockInfoRefinitiv.setStockName(stockName);
stockInfoRefinitiv.setStockCode(stockCode);
stockInfoRefinitiv.setStatus(status);
stockInfoRefinitiv.setStockType("bse");
stockInfoRefinitiv.setCommandStr(name);
mongoTemplate.insert(stockInfoRefinitiv);*/
RetifiveStockInfo retifiveStockInfo = RetifiveStockInfo.builder().stockCode(stockCode).stockName(stockName).symbol(name).status(status)
.openPrice(openPrice).currentPrice(price).highPrice(high).lowPrice(low).previousPrice(previousPrice).changePercent(percentChange)
.volume(volume).week52HighPrice(week52High).week52LowPrice(week52Low).stockType(stockType).changeValue(changeValue)
.build();
RetifiveStock retifiveStock = RetifiveStock.builder().stockType(stockType).saveTime(new Date()).isLock(0).isShow(0)
.stockCode(stockCode).symbol(name).stockName(stockName).build();
retifiveStockService.repository().save(retifiveStock);
}
RetifiveStockInfo decode3(FieldList fieldList, String name)
{
Iterator<FieldEntry> iter = fieldList.iterator();
FieldEntry fieldEntry;
String stockName = "";
String stockCode = "";
String status = "";
String price = "";
String openPrice = "";
String previousPrice = "";
String percentChange = "";
String week52High ="";
String week52Low = "";
String high = "";
String low = "";
String volume = "";//实时交易数量
String stockType = "";
String changeValue = "";
while (iter.hasNext())
{
fieldEntry = iter.next();
System.out.println("Fid: " + fieldEntry.fieldId() + " Name: " + fieldEntry.name() +" Unit: "+DataType.asString(fieldEntry.loadType()) + " value: " + fieldEntry.load());
if(fieldEntry.name().equals("DSPLY_NAME")){
if(fieldEntry.loadType() == DataType.DataTypes.RMTES) {
stockName = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("PROV_SYMB")){
if(fieldEntry.loadType() == DataType.DataTypes.RMTES) {
stockCode = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("INST_PHASE")){
if(fieldEntry.loadType() == DataType.DataTypes.ENUM) {
status = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("OPEN_PRC")){
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
openPrice = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("HST_CLOSE")){
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
previousPrice = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("52WK_HIGH")){
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
week52High = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("52WK_LOW")){
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
week52Low = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("PCTCHNG")){ // NETCHNG_1
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
percentChange = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("NETCHNG_1")){ // NETCHNG_1
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
changeValue = fieldEntry.load().toString();
}
}
if(fieldEntry.name().equals("HIGH_1")){
if(fieldEntry.loadType() == DataType.DataTypes.REAL) {
high = fieldEntry.load().toString();
@@ -467,7 +562,7 @@ public class MessageRetifiveController {
}
RetifiveStockInfo retifiveStockInfo = RetifiveStockInfo.builder().stockCode(stockCode).stockName(stockName).symbol(name).status(status)
.openPrice(openPrice).currentPrice(price).highPrice(high).lowPrice(low).previousPrice(previousPrice).changePercent(percentChange)
.volume(volume).week52HighPrice(week52High).week52LowPrice(week52Low).stockType(stockType)
.volume(volume).week52HighPrice(week52High).week52LowPrice(week52Low).stockType(stockType).changeValue(changeValue)
.build();
return retifiveStockInfo;

View File

@@ -31,9 +31,9 @@ public class JpaDDDGen {
*/
public static DataSource getMySQLDataSource() {
MysqlDataSource mysqlDS = new MysqlDataSource();
mysqlDS.setURL("jdbc:mysql://43.132.212.180:33306/india_stock?useUnicode=true&characterEncoding=utf-8");
mysqlDS.setURL("jdbc:mysql://149.88.86.7:33306/india_stock?useUnicode=true&characterEncoding=utf-8");
mysqlDS.setUser("root");
mysqlDS.setPassword("33BsUUcnXRYgwt");
mysqlDS.setPassword("33BsUUcnXRYgwtIND");
return mysqlDS;
}
@@ -50,7 +50,7 @@ public class JpaDDDGen {
/**
* cs_statistic - 要生成的数据库表
*/
Cons.tableNameToEntiyMapping.put("money_stock", null);
Cons.tableNameToEntiyMapping.put("retifive_stock", null);
ToolDDD.g(getMySQLDataSource().getConnection());
}