1
0

feat: 股票增加上市日期

This commit is contained in:
2025-09-06 21:01:41 +08:00
parent fccf059416
commit 440d67c5e7
7 changed files with 34 additions and 6 deletions

View File

@@ -4,6 +4,7 @@ import com.lanyuanxiaoyao.leopard.server.entity.Stock;
import com.lanyuanxiaoyao.leopard.server.service.StockService; import com.lanyuanxiaoyao.leopard.server.service.StockService;
import com.lanyuanxiaoyao.service.template.controller.GlobalResponse; import com.lanyuanxiaoyao.service.template.controller.GlobalResponse;
import com.lanyuanxiaoyao.service.template.controller.SimpleControllerSupport; import com.lanyuanxiaoyao.service.template.controller.SimpleControllerSupport;
import java.time.LocalDate;
import java.util.function.Function; import java.util.function.Function;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@@ -36,7 +37,8 @@ public class StockController extends SimpleControllerSupport<Stock, Void, StockC
stock.getName(), stock.getName(),
stock.getFullname(), stock.getFullname(),
stock.getMarket(), stock.getMarket(),
stock.getIndustry() stock.getIndustry(),
stock.getListedDate()
); );
} }
@@ -56,7 +58,8 @@ public class StockController extends SimpleControllerSupport<Stock, Void, StockC
String name, String name,
String fullname, String fullname,
Stock.Market market, Stock.Market market,
String industry String industry,
LocalDate listedDate
) { ) {
} }
} }

View File

@@ -11,6 +11,7 @@ import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated; import jakarta.persistence.Enumerated;
import jakarta.persistence.OneToMany; import jakarta.persistence.OneToMany;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import java.time.LocalDate;
import java.util.Set; import java.util.Set;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -55,6 +56,8 @@ public class Stock extends SimpleEntity {
private Market market; private Market market;
@Comment("行业") @Comment("行业")
private String industry; private String industry;
@Comment("上市日期")
private LocalDate listedDate;
@OneToMany(mappedBy = "stock", cascade = CascadeType.REMOVE) @OneToMany(mappedBy = "stock", cascade = CascadeType.REMOVE)
@ToString.Exclude @ToString.Exclude

View File

@@ -45,8 +45,8 @@ public class TuShareService {
public TuShareResponse stockList() { public TuShareResponse stockList() {
var response = HttpUtil.post(API_URL, buildRequest( var response = HttpUtil.post(API_URL, buildRequest(
"stock_basic", "stock_basic",
Map.of("list_status", "L"), Map.of("list_status", "L", "market", "主板", "exchange", "SSE,SZSE"),
List.of("ts_code", "name", "fullname", "exchange", "industry") List.of("ts_code", "name", "fullname", "exchange", "industry", "list_date")
)); ));
var tuShareResponse = mapper.readValue(response, TuShareResponse.class); var tuShareResponse = mapper.readValue(response, TuShareResponse.class);
if (tuShareResponse.code != 0) { if (tuShareResponse.code != 0) {

View File

@@ -7,6 +7,7 @@ import com.lanyuanxiaoyao.leopard.server.service.TuShareService;
import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.core.NodeComponent;
import jakarta.transaction.Transactional; import jakarta.transaction.Transactional;
import java.time.LocalDate;
import java.util.HashSet; import java.util.HashSet;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -35,12 +36,14 @@ public class UpdateStockNode extends NodeComponent {
var fullname = item.get(2); var fullname = item.get(2);
var market = EnumUtil.fromString(Stock.Market.class, item.get(3)); var market = EnumUtil.fromString(Stock.Market.class, item.get(3));
var industry = item.get(4); var industry = item.get(4);
var listedDate = LocalDate.parse(item.get(5), TuShareService.TRADE_FORMAT);
if (stocksMap.containsKey(code)) { if (stocksMap.containsKey(code)) {
var stock = stocksMap.get(code); var stock = stocksMap.get(code);
stock.setName(name); stock.setName(name);
stock.setFullname(fullname); stock.setFullname(fullname);
stock.setMarket(market); stock.setMarket(market);
stock.setIndustry(industry); stock.setIndustry(industry);
stock.setListedDate(listedDate);
} else { } else {
var stock = new Stock(); var stock = new Stock();
stock.setCode(code); stock.setCode(code);
@@ -48,6 +51,7 @@ public class UpdateStockNode extends NodeComponent {
stock.setFullname(fullname); stock.setFullname(fullname);
stock.setMarket(market); stock.setMarket(market);
stock.setIndustry(industry); stock.setIndustry(industry);
stock.setListedDate(listedDate);
stocks.add(stock); stocks.add(stock);
} }
targetCodes.add(code); targetCodes.add(code);

View File

@@ -9,14 +9,18 @@ Content-Type: application/json
"api_name": "stock_basic", "api_name": "stock_basic",
"token": "{{api_key}}", "token": "{{api_key}}",
"params": { "params": {
"list_status": "D,P,L" "list_status": "L",
"market": "主板",
"exchange": "SSE,SZSE"
}, },
"fields": [ "fields": [
"ts_code", "ts_code",
"name", "name",
"fullname", "fullname",
"exchange", "exchange",
"industry" "industry",
"market",
"list_date"
] ]
} }

View File

@@ -3,6 +3,7 @@ import {
amisRender, amisRender,
commonInfo, commonInfo,
crudCommonOptions, crudCommonOptions,
date,
paginationTemplate, paginationTemplate,
remoteMappings, remoteMappings,
remoteOptions, remoteOptions,
@@ -123,6 +124,12 @@ function StockList() {
label: '行业', label: '行业',
width: 150, width: 150,
}, },
{
label: '上市日期',
width: 100,
align: 'center',
...date('listedDate'),
},
{ {
type: 'operation', type: 'operation',
label: '操作', label: '操作',

View File

@@ -254,6 +254,13 @@ export function time(field: string) {
} }
} }
export function date(field: string) {
return {
type: 'tpl',
tpl: `\${IF(${field}, DATETOSTR(${field}, 'YYYY-MM-DD'), '/')}`,
}
}
export function pictureFromIds(field: string) { export function pictureFromIds(field: string) {
return `\${ARRAYMAP(${field},id => '${commonInfo.baseUrl}/upload/download/' + id)}` return `\${ARRAYMAP(${field},id => '${commonInfo.baseUrl}/upload/download/' + id)}`
} }