diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataImportController.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataImportController.java new file mode 100644 index 0000000..51cc039 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataImportController.java @@ -0,0 +1,91 @@ +package com.ruoyi.newstocksystem.controller; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.newstocksystem.domain.StockHighLowStatus; +import com.ruoyi.newstocksystem.domain.IndustryIndex; +import com.ruoyi.newstocksystem.domain.StockDailyTrade; +import com.ruoyi.newstocksystem.domain.StockBasic; +import com.ruoyi.newstocksystem.service.IStockHighLowStatusService; +import com.ruoyi.newstocksystem.service.IIndustryIndexService; +import com.ruoyi.newstocksystem.service.IStockDailyTradeService; +import com.ruoyi.newstocksystem.service.IStockBasicService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.List; + +@Controller +@RequestMapping("/newstock/data/import") +public class StockDataImportController extends BaseController { + + @Resource + private IStockHighLowStatusService stockHighLowStatusService; + + @Resource + private IIndustryIndexService industryIndexService; + + @Resource + private IStockDailyTradeService stockDailyTradeService; + + @Resource + private IStockBasicService stockBasicService; + + @PostMapping("/highlow") + @ResponseBody + public AjaxResult importHighLowData(@RequestParam("file") MultipartFile file) { + try { + ExcelUtil util = new ExcelUtil<>(StockHighLowStatus.class); + List list = util.importExcel(file.getInputStream()); + int count = stockHighLowStatusService.batchInsertStockHighLowStatus(list); + return AjaxResult.success("Import successful, " + count + " records imported"); + } catch (Exception e) { + return AjaxResult.error("Import failed: " + e.getMessage()); + } + } + + @PostMapping("/industry") + @ResponseBody + public AjaxResult importIndustryData(@RequestParam("file") MultipartFile file) { + try { + ExcelUtil util = new ExcelUtil<>(IndustryIndex.class); + List list = util.importExcel(file.getInputStream()); + int count = industryIndexService.batchInsertIndustryIndex(list); + return AjaxResult.success("Import successful, " + count + " records imported"); + } catch (Exception e) { + return AjaxResult.error("Import failed: " + e.getMessage()); + } + } + + @PostMapping("/momentum") + @ResponseBody + public AjaxResult importMomentumData(@RequestParam("file") MultipartFile file) { + try { + ExcelUtil util = new ExcelUtil<>(StockDailyTrade.class); + List list = util.importExcel(file.getInputStream()); + int count = stockDailyTradeService.batchInsertStockDailyTrade(list); + return AjaxResult.success("Import successful, " + count + " records imported"); + } catch (Exception e) { + return AjaxResult.error("Import failed: " + e.getMessage()); + } + } + + @PostMapping("/basic") + @ResponseBody + public AjaxResult importBasicData(@RequestParam("file") MultipartFile file) { + try { + ExcelUtil util = new ExcelUtil<>(StockBasic.class); + List list = util.importExcel(file.getInputStream()); + int count = stockBasicService.batchInsertStockBasic(list); + return AjaxResult.success("Import successful, " + count + " records imported"); + } catch (Exception e) { + return AjaxResult.error("Import failed: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/IndustryIndex.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/IndustryIndex.java new file mode 100644 index 0000000..104ab41 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/IndustryIndex.java @@ -0,0 +1,141 @@ +package com.ruoyi.newstocksystem.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +public class IndustryIndex extends BaseEntity { + private static final long serialVersionUID = 1L; + + private String industryIndexCode; + + private String industryIndexName; + + private Integer componentCount; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date tradeDate; + + private Double openPrice; + + private Double closePrice; + + private Long volume; + + private Double turnover; + + private Double totalMarketCap; + + private Double freeCirculationCap; + + private Double priceChangeRate; + + private Double peTtm; + + private Double peTtmMedian; + + public String getIndustryIndexCode() { + return industryIndexCode; + } + + public void setIndustryIndexCode(String industryIndexCode) { + this.industryIndexCode = industryIndexCode; + } + + public String getIndustryIndexName() { + return industryIndexName; + } + + public void setIndustryIndexName(String industryIndexName) { + this.industryIndexName = industryIndexName; + } + + public Integer getComponentCount() { + return componentCount; + } + + public void setComponentCount(Integer componentCount) { + this.componentCount = componentCount; + } + + public Date getTradeDate() { + return tradeDate; + } + + public void setTradeDate(Date tradeDate) { + this.tradeDate = tradeDate; + } + + public Double getOpenPrice() { + return openPrice; + } + + public void setOpenPrice(Double openPrice) { + this.openPrice = openPrice; + } + + public Double getClosePrice() { + return closePrice; + } + + public void setClosePrice(Double closePrice) { + this.closePrice = closePrice; + } + + public Long getVolume() { + return volume; + } + + public void setVolume(Long volume) { + this.volume = volume; + } + + public Double getTurnover() { + return turnover; + } + + public void setTurnover(Double turnover) { + this.turnover = turnover; + } + + public Double getTotalMarketCap() { + return totalMarketCap; + } + + public void setTotalMarketCap(Double totalMarketCap) { + this.totalMarketCap = totalMarketCap; + } + + public Double getFreeCirculationCap() { + return freeCirculationCap; + } + + public void setFreeCirculationCap(Double freeCirculationCap) { + this.freeCirculationCap = freeCirculationCap; + } + + public Double getPriceChangeRate() { + return priceChangeRate; + } + + public void setPriceChangeRate(Double priceChangeRate) { + this.priceChangeRate = priceChangeRate; + } + + public Double getPeTtm() { + return peTtm; + } + + public void setPeTtm(Double peTtm) { + this.peTtm = peTtm; + } + + public Double getPeTtmMedian() { + return peTtmMedian; + } + + public void setPeTtmMedian(Double peTtmMedian) { + this.peTtmMedian = peTtmMedian; + } +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/StockBasic.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/StockBasic.java new file mode 100644 index 0000000..414b5f7 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/StockBasic.java @@ -0,0 +1,91 @@ +package com.ruoyi.newstocksystem.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +public class StockBasic extends BaseEntity { + private static final long serialVersionUID = 1L; + + private String stockCode; + + private String stockName; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date listingDate; + + private Integer listingDays; + + private Integer isSt; + + private Integer isStarSt; + + private String industryIndexCode; + + private String industryIndexName; + + public String getStockCode() { + return stockCode; + } + + public void setStockCode(String stockCode) { + this.stockCode = stockCode; + } + + public String getStockName() { + return stockName; + } + + public void setStockName(String stockName) { + this.stockName = stockName; + } + + public Date getListingDate() { + return listingDate; + } + + public void setListingDate(Date listingDate) { + this.listingDate = listingDate; + } + + public Integer getListingDays() { + return listingDays; + } + + public void setListingDays(Integer listingDays) { + this.listingDays = listingDays; + } + + public Integer getIsSt() { + return isSt; + } + + public void setIsSt(Integer isSt) { + this.isSt = isSt; + } + + public Integer getIsStarSt() { + return isStarSt; + } + + public void setIsStarSt(Integer isStarSt) { + this.isStarSt = isStarSt; + } + + public String getIndustryIndexCode() { + return industryIndexCode; + } + + public void setIndustryIndexCode(String industryIndexCode) { + this.industryIndexCode = industryIndexCode; + } + + public String getIndustryIndexName() { + return industryIndexName; + } + + public void setIndustryIndexName(String industryIndexName) { + this.industryIndexName = industryIndexName; + } +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/StockDailyTrade.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/StockDailyTrade.java new file mode 100644 index 0000000..c109cdc --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/StockDailyTrade.java @@ -0,0 +1,161 @@ +package com.ruoyi.newstocksystem.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +public class StockDailyTrade extends BaseEntity { + private static final long serialVersionUID = 1L; + + private String stockCode; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date tradeDate; + + private Double openPrice; + + private Double closePrice; + + private Double highPrice; + + private Double lowPrice; + + private Double priceChangeRate; + + private Long volume; + + private Double turnover; + + private Double freeCirculationCap; + + private Integer isLimitUp; + + private Integer isLimitDown; + + private Double momentum10d; + + private Double momentum20d; + + private Double momentum60d; + + public String getStockCode() { + return stockCode; + } + + public void setStockCode(String stockCode) { + this.stockCode = stockCode; + } + + public Date getTradeDate() { + return tradeDate; + } + + public void setTradeDate(Date tradeDate) { + this.tradeDate = tradeDate; + } + + public Double getOpenPrice() { + return openPrice; + } + + public void setOpenPrice(Double openPrice) { + this.openPrice = openPrice; + } + + public Double getClosePrice() { + return closePrice; + } + + public void setClosePrice(Double closePrice) { + this.closePrice = closePrice; + } + + public Double getHighPrice() { + return highPrice; + } + + public void setHighPrice(Double highPrice) { + this.highPrice = highPrice; + } + + public Double getLowPrice() { + return lowPrice; + } + + public void setLowPrice(Double lowPrice) { + this.lowPrice = lowPrice; + } + + public Double getPriceChangeRate() { + return priceChangeRate; + } + + public void setPriceChangeRate(Double priceChangeRate) { + this.priceChangeRate = priceChangeRate; + } + + public Long getVolume() { + return volume; + } + + public void setVolume(Long volume) { + this.volume = volume; + } + + public Double getTurnover() { + return turnover; + } + + public void setTurnover(Double turnover) { + this.turnover = turnover; + } + + public Double getFreeCirculationCap() { + return freeCirculationCap; + } + + public void setFreeCirculationCap(Double freeCirculationCap) { + this.freeCirculationCap = freeCirculationCap; + } + + public Integer getIsLimitUp() { + return isLimitUp; + } + + public void setIsLimitUp(Integer isLimitUp) { + this.isLimitUp = isLimitUp; + } + + public Integer getIsLimitDown() { + return isLimitDown; + } + + public void setIsLimitDown(Integer isLimitDown) { + this.isLimitDown = isLimitDown; + } + + public Double getMomentum10d() { + return momentum10d; + } + + public void setMomentum10d(Double momentum10d) { + this.momentum10d = momentum10d; + } + + public Double getMomentum20d() { + return momentum20d; + } + + public void setMomentum20d(Double momentum20d) { + this.momentum20d = momentum20d; + } + + public Double getMomentum60d() { + return momentum60d; + } + + public void setMomentum60d(Double momentum60d) { + this.momentum60d = momentum60d; + } +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/StockHighLowStatus.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/StockHighLowStatus.java new file mode 100644 index 0000000..a39cf46 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/StockHighLowStatus.java @@ -0,0 +1,73 @@ +package com.ruoyi.newstocksystem.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +public class StockHighLowStatus extends BaseEntity { + private static final long serialVersionUID = 1L; + + private String stockCode; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date tradeDate; + + private Integer isNewHigh; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date newHighDate; + + private Integer isNewLow; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date newLowDate; + + public String getStockCode() { + return stockCode; + } + + public void setStockCode(String stockCode) { + this.stockCode = stockCode; + } + + public Date getTradeDate() { + return tradeDate; + } + + public void setTradeDate(Date tradeDate) { + this.tradeDate = tradeDate; + } + + public Integer getIsNewHigh() { + return isNewHigh; + } + + public void setIsNewHigh(Integer isNewHigh) { + this.isNewHigh = isNewHigh; + } + + public Date getNewHighDate() { + return newHighDate; + } + + public void setNewHighDate(Date newHighDate) { + this.newHighDate = newHighDate; + } + + public Integer getIsNewLow() { + return isNewLow; + } + + public void setIsNewLow(Integer isNewLow) { + this.isNewLow = isNewLow; + } + + public Date getNewLowDate() { + return newLowDate; + } + + public void setNewLowDate(Date newLowDate) { + this.newLowDate = newLowDate; + } +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/IndustryIndexMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/IndustryIndexMapper.java new file mode 100644 index 0000000..1771169 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/IndustryIndexMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.newstocksystem.mapper; + +import com.ruoyi.newstocksystem.domain.IndustryIndex; + +import java.util.Date; +import java.util.List; + +public interface IndustryIndexMapper { + int insertIndustryIndex(IndustryIndex industryIndex); + + int updateIndustryIndex(IndustryIndex industryIndex); + + int deleteIndustryIndex(String industryIndexCode, Date tradeDate); + + IndustryIndex selectIndustryIndexByCodeAndDate(String industryIndexCode, Date tradeDate); + + List selectIndustryIndexList(IndustryIndex industryIndex); + + List selectIndustryIndexByDate(Date tradeDate); +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/StockBasicMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/StockBasicMapper.java new file mode 100644 index 0000000..327f4f0 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/StockBasicMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.newstocksystem.mapper; + +import com.ruoyi.newstocksystem.domain.StockBasic; + +import java.util.List; + +public interface StockBasicMapper { + int insertStockBasic(StockBasic stockBasic); + + int updateStockBasic(StockBasic stockBasic); + + int deleteStockBasic(String stockCode); + + StockBasic selectStockBasicByCode(String stockCode); + + List selectStockBasicList(StockBasic stockBasic); + + List selectStockBasicByIndustry(String industryIndexCode); +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/StockDailyTradeMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/StockDailyTradeMapper.java new file mode 100644 index 0000000..b8918ab --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/StockDailyTradeMapper.java @@ -0,0 +1,22 @@ +package com.ruoyi.newstocksystem.mapper; + +import com.ruoyi.newstocksystem.domain.StockDailyTrade; + +import java.util.Date; +import java.util.List; + +public interface StockDailyTradeMapper { + int insertStockDailyTrade(StockDailyTrade stockDailyTrade); + + int updateStockDailyTrade(StockDailyTrade stockDailyTrade); + + int deleteStockDailyTrade(String stockCode, Date tradeDate); + + StockDailyTrade selectStockDailyTradeByCodeAndDate(String stockCode, Date tradeDate); + + List selectStockDailyTradeList(StockDailyTrade stockDailyTrade); + + List selectStockDailyTradeByDate(Date tradeDate); + + List selectStockDailyTradeByCode(String stockCode); +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/StockHighLowStatusMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/StockHighLowStatusMapper.java new file mode 100644 index 0000000..edb784a --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/StockHighLowStatusMapper.java @@ -0,0 +1,22 @@ +package com.ruoyi.newstocksystem.mapper; + +import com.ruoyi.newstocksystem.domain.StockHighLowStatus; + +import java.util.Date; +import java.util.List; + +public interface StockHighLowStatusMapper { + int insertStockHighLowStatus(StockHighLowStatus stockHighLowStatus); + + int updateStockHighLowStatus(StockHighLowStatus stockHighLowStatus); + + int deleteStockHighLowStatus(String stockCode, Date tradeDate); + + StockHighLowStatus selectStockHighLowStatusByCodeAndDate(String stockCode, Date tradeDate); + + List selectStockHighLowStatusList(StockHighLowStatus stockHighLowStatus); + + List selectNewHighStocks(Date tradeDate); + + List selectNewLowStocks(Date tradeDate); +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IIndustryIndexService.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IIndustryIndexService.java new file mode 100644 index 0000000..bca9cf9 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IIndustryIndexService.java @@ -0,0 +1,22 @@ +package com.ruoyi.newstocksystem.service; + +import com.ruoyi.newstocksystem.domain.IndustryIndex; + +import java.util.Date; +import java.util.List; + +public interface IIndustryIndexService { + int insertIndustryIndex(IndustryIndex industryIndex); + + int updateIndustryIndex(IndustryIndex industryIndex); + + int deleteIndustryIndex(String industryIndexCode, Date tradeDate); + + IndustryIndex selectIndustryIndexByCodeAndDate(String industryIndexCode, Date tradeDate); + + List selectIndustryIndexList(IndustryIndex industryIndex); + + List selectIndustryIndexByDate(Date tradeDate); + + int batchInsertIndustryIndex(List industryIndexList); +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockBasicService.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockBasicService.java new file mode 100644 index 0000000..036737e --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockBasicService.java @@ -0,0 +1,21 @@ +package com.ruoyi.newstocksystem.service; + +import com.ruoyi.newstocksystem.domain.StockBasic; + +import java.util.List; + +public interface IStockBasicService { + int insertStockBasic(StockBasic stockBasic); + + int updateStockBasic(StockBasic stockBasic); + + int deleteStockBasic(String stockCode); + + StockBasic selectStockBasicByCode(String stockCode); + + List selectStockBasicList(StockBasic stockBasic); + + List selectStockBasicByIndustry(String industryIndexCode); + + int batchInsertStockBasic(List stockBasicList); +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockDailyTradeService.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockDailyTradeService.java new file mode 100644 index 0000000..2699769 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockDailyTradeService.java @@ -0,0 +1,24 @@ +package com.ruoyi.newstocksystem.service; + +import com.ruoyi.newstocksystem.domain.StockDailyTrade; + +import java.util.Date; +import java.util.List; + +public interface IStockDailyTradeService { + int insertStockDailyTrade(StockDailyTrade stockDailyTrade); + + int updateStockDailyTrade(StockDailyTrade stockDailyTrade); + + int deleteStockDailyTrade(String stockCode, Date tradeDate); + + StockDailyTrade selectStockDailyTradeByCodeAndDate(String stockCode, Date tradeDate); + + List selectStockDailyTradeList(StockDailyTrade stockDailyTrade); + + List selectStockDailyTradeByDate(Date tradeDate); + + List selectStockDailyTradeByCode(String stockCode); + + int batchInsertStockDailyTrade(List stockDailyTradeList); +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockHighLowStatusService.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockHighLowStatusService.java new file mode 100644 index 0000000..5439eef --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockHighLowStatusService.java @@ -0,0 +1,24 @@ +package com.ruoyi.newstocksystem.service; + +import com.ruoyi.newstocksystem.domain.StockHighLowStatus; + +import java.util.Date; +import java.util.List; + +public interface IStockHighLowStatusService { + int insertStockHighLowStatus(StockHighLowStatus stockHighLowStatus); + + int updateStockHighLowStatus(StockHighLowStatus stockHighLowStatus); + + int deleteStockHighLowStatus(String stockCode, Date tradeDate); + + StockHighLowStatus selectStockHighLowStatusByCodeAndDate(String stockCode, Date tradeDate); + + List selectStockHighLowStatusList(StockHighLowStatus stockHighLowStatus); + + List selectNewHighStocks(Date tradeDate); + + List selectNewLowStocks(Date tradeDate); + + int batchInsertStockHighLowStatus(List stockHighLowStatusList); +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/IndustryIndexServiceImpl.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/IndustryIndexServiceImpl.java new file mode 100644 index 0000000..e2ce6fd --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/IndustryIndexServiceImpl.java @@ -0,0 +1,56 @@ +package com.ruoyi.newstocksystem.service.impl; + +import com.ruoyi.newstocksystem.domain.IndustryIndex; +import com.ruoyi.newstocksystem.mapper.IndustryIndexMapper; +import com.ruoyi.newstocksystem.service.IIndustryIndexService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +@Service +public class IndustryIndexServiceImpl implements IIndustryIndexService { + + @Resource + private IndustryIndexMapper industryIndexMapper; + + @Override + public int insertIndustryIndex(IndustryIndex industryIndex) { + return industryIndexMapper.insertIndustryIndex(industryIndex); + } + + @Override + public int updateIndustryIndex(IndustryIndex industryIndex) { + return industryIndexMapper.updateIndustryIndex(industryIndex); + } + + @Override + public int deleteIndustryIndex(String industryIndexCode, Date tradeDate) { + return industryIndexMapper.deleteIndustryIndex(industryIndexCode, tradeDate); + } + + @Override + public IndustryIndex selectIndustryIndexByCodeAndDate(String industryIndexCode, Date tradeDate) { + return industryIndexMapper.selectIndustryIndexByCodeAndDate(industryIndexCode, tradeDate); + } + + @Override + public List selectIndustryIndexList(IndustryIndex industryIndex) { + return industryIndexMapper.selectIndustryIndexList(industryIndex); + } + + @Override + public List selectIndustryIndexByDate(Date tradeDate) { + return industryIndexMapper.selectIndustryIndexByDate(tradeDate); + } + + @Override + public int batchInsertIndustryIndex(List industryIndexList) { + int count = 0; + for (IndustryIndex industryIndex : industryIndexList) { + count += industryIndexMapper.insertIndustryIndex(industryIndex); + } + return count; + } +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockBasicServiceImpl.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockBasicServiceImpl.java new file mode 100644 index 0000000..a13aac2 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockBasicServiceImpl.java @@ -0,0 +1,55 @@ +package com.ruoyi.newstocksystem.service.impl; + +import com.ruoyi.newstocksystem.domain.StockBasic; +import com.ruoyi.newstocksystem.mapper.StockBasicMapper; +import com.ruoyi.newstocksystem.service.IStockBasicService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class StockBasicServiceImpl implements IStockBasicService { + + @Resource + private StockBasicMapper stockBasicMapper; + + @Override + public int insertStockBasic(StockBasic stockBasic) { + return stockBasicMapper.insertStockBasic(stockBasic); + } + + @Override + public int updateStockBasic(StockBasic stockBasic) { + return stockBasicMapper.updateStockBasic(stockBasic); + } + + @Override + public int deleteStockBasic(String stockCode) { + return stockBasicMapper.deleteStockBasic(stockCode); + } + + @Override + public StockBasic selectStockBasicByCode(String stockCode) { + return stockBasicMapper.selectStockBasicByCode(stockCode); + } + + @Override + public List selectStockBasicList(StockBasic stockBasic) { + return stockBasicMapper.selectStockBasicList(stockBasic); + } + + @Override + public List selectStockBasicByIndustry(String industryIndexCode) { + return stockBasicMapper.selectStockBasicByIndustry(industryIndexCode); + } + + @Override + public int batchInsertStockBasic(List stockBasicList) { + int count = 0; + for (StockBasic stockBasic : stockBasicList) { + count += stockBasicMapper.insertStockBasic(stockBasic); + } + return count; + } +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockDailyTradeServiceImpl.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockDailyTradeServiceImpl.java new file mode 100644 index 0000000..15651b9 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockDailyTradeServiceImpl.java @@ -0,0 +1,61 @@ +package com.ruoyi.newstocksystem.service.impl; + +import com.ruoyi.newstocksystem.domain.StockDailyTrade; +import com.ruoyi.newstocksystem.mapper.StockDailyTradeMapper; +import com.ruoyi.newstocksystem.service.IStockDailyTradeService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +@Service +public class StockDailyTradeServiceImpl implements IStockDailyTradeService { + + @Resource + private StockDailyTradeMapper stockDailyTradeMapper; + + @Override + public int insertStockDailyTrade(StockDailyTrade stockDailyTrade) { + return stockDailyTradeMapper.insertStockDailyTrade(stockDailyTrade); + } + + @Override + public int updateStockDailyTrade(StockDailyTrade stockDailyTrade) { + return stockDailyTradeMapper.updateStockDailyTrade(stockDailyTrade); + } + + @Override + public int deleteStockDailyTrade(String stockCode, Date tradeDate) { + return stockDailyTradeMapper.deleteStockDailyTrade(stockCode, tradeDate); + } + + @Override + public StockDailyTrade selectStockDailyTradeByCodeAndDate(String stockCode, Date tradeDate) { + return stockDailyTradeMapper.selectStockDailyTradeByCodeAndDate(stockCode, tradeDate); + } + + @Override + public List selectStockDailyTradeList(StockDailyTrade stockDailyTrade) { + return stockDailyTradeMapper.selectStockDailyTradeList(stockDailyTrade); + } + + @Override + public List selectStockDailyTradeByDate(Date tradeDate) { + return stockDailyTradeMapper.selectStockDailyTradeByDate(tradeDate); + } + + @Override + public List selectStockDailyTradeByCode(String stockCode) { + return stockDailyTradeMapper.selectStockDailyTradeByCode(stockCode); + } + + @Override + public int batchInsertStockDailyTrade(List stockDailyTradeList) { + int count = 0; + for (StockDailyTrade stockDailyTrade : stockDailyTradeList) { + count += stockDailyTradeMapper.insertStockDailyTrade(stockDailyTrade); + } + return count; + } +} \ No newline at end of file diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockHighLowStatusServiceImpl.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockHighLowStatusServiceImpl.java new file mode 100644 index 0000000..4293b68 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockHighLowStatusServiceImpl.java @@ -0,0 +1,61 @@ +package com.ruoyi.newstocksystem.service.impl; + +import com.ruoyi.newstocksystem.domain.StockHighLowStatus; +import com.ruoyi.newstocksystem.mapper.StockHighLowStatusMapper; +import com.ruoyi.newstocksystem.service.IStockHighLowStatusService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +@Service +public class StockHighLowStatusServiceImpl implements IStockHighLowStatusService { + + @Resource + private StockHighLowStatusMapper stockHighLowStatusMapper; + + @Override + public int insertStockHighLowStatus(StockHighLowStatus stockHighLowStatus) { + return stockHighLowStatusMapper.insertStockHighLowStatus(stockHighLowStatus); + } + + @Override + public int updateStockHighLowStatus(StockHighLowStatus stockHighLowStatus) { + return stockHighLowStatusMapper.updateStockHighLowStatus(stockHighLowStatus); + } + + @Override + public int deleteStockHighLowStatus(String stockCode, Date tradeDate) { + return stockHighLowStatusMapper.deleteStockHighLowStatus(stockCode, tradeDate); + } + + @Override + public StockHighLowStatus selectStockHighLowStatusByCodeAndDate(String stockCode, Date tradeDate) { + return stockHighLowStatusMapper.selectStockHighLowStatusByCodeAndDate(stockCode, tradeDate); + } + + @Override + public List selectStockHighLowStatusList(StockHighLowStatus stockHighLowStatus) { + return stockHighLowStatusMapper.selectStockHighLowStatusList(stockHighLowStatus); + } + + @Override + public List selectNewHighStocks(Date tradeDate) { + return stockHighLowStatusMapper.selectNewHighStocks(tradeDate); + } + + @Override + public List selectNewLowStocks(Date tradeDate) { + return stockHighLowStatusMapper.selectNewLowStocks(tradeDate); + } + + @Override + public int batchInsertStockHighLowStatus(List stockHighLowStatusList) { + int count = 0; + for (StockHighLowStatus stockHighLowStatus : stockHighLowStatusList) { + count += stockHighLowStatusMapper.insertStockHighLowStatus(stockHighLowStatus); + } + return count; + } +} \ No newline at end of file diff --git a/newstock-system/src/main/resources/mapper/newstocksystem/IndustryIndexMapper.xml b/newstock-system/src/main/resources/mapper/newstocksystem/IndustryIndexMapper.xml new file mode 100644 index 0000000..4be9d62 --- /dev/null +++ b/newstock-system/src/main/resources/mapper/newstocksystem/IndustryIndexMapper.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + select industry_index_code, industry_index_name, component_count, trade_date, open_price, close_price, volume, turnover, total_market_cap, free_circulation_cap, price_change_rate, pe_ttm, pe_ttm_median, create_time, update_time + from t_industry_index + + + + + + + + + + insert into t_industry_index + + industry_index_code, + industry_index_name, + component_count, + trade_date, + open_price, + close_price, + volume, + turnover, + total_market_cap, + free_circulation_cap, + price_change_rate, + pe_ttm, + pe_ttm_median, + create_time, + update_time, + + + #{industryIndexCode}, + #{industryIndexName}, + #{componentCount}, + #{tradeDate}, + #{openPrice}, + #{closePrice}, + #{volume}, + #{turnover}, + #{totalMarketCap}, + #{freeCirculationCap}, + #{priceChangeRate}, + #{peTtm}, + #{peTtmMedian}, + #{createTime}, + #{updateTime}, + + + + + update t_industry_index + + industry_index_name = #{industryIndexName}, + component_count = #{componentCount}, + open_price = #{openPrice}, + close_price = #{closePrice}, + volume = #{volume}, + turnover = #{turnover}, + total_market_cap = #{totalMarketCap}, + free_circulation_cap = #{freeCirculationCap}, + price_change_rate = #{priceChangeRate}, + pe_ttm = #{peTtm}, + pe_ttm_median = #{peTtmMedian}, + update_time = #{updateTime}, + + where industry_index_code = #{industryIndexCode} and trade_date = #{tradeDate} + + + + delete from t_industry_index + where industry_index_code = #{industryIndexCode} and trade_date = #{tradeDate} + + \ No newline at end of file diff --git a/newstock-system/src/main/resources/mapper/newstocksystem/StockBasicMapper.xml b/newstock-system/src/main/resources/mapper/newstocksystem/StockBasicMapper.xml new file mode 100644 index 0000000..a2f1b64 --- /dev/null +++ b/newstock-system/src/main/resources/mapper/newstocksystem/StockBasicMapper.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + select stock_code, stock_name, listing_date, listing_days, is_st, is_star_st, industry_index_code, industry_index_name, create_time, update_time + from t_stock_basic + + + + + + + + + + insert into t_stock_basic + + stock_code, + stock_name, + listing_date, + listing_days, + is_st, + is_star_st, + industry_index_code, + industry_index_name, + create_time, + update_time, + + + #{stockCode}, + #{stockName}, + #{listingDate}, + #{listingDays}, + #{isSt}, + #{isStarSt}, + #{industryIndexCode}, + #{industryIndexName}, + #{createTime}, + #{updateTime}, + + + + + update t_stock_basic + + stock_name = #{stockName}, + listing_date = #{listingDate}, + listing_days = #{listingDays}, + is_st = #{isSt}, + is_star_st = #{isStarSt}, + industry_index_code = #{industryIndexCode}, + industry_index_name = #{industryIndexName}, + update_time = #{updateTime}, + + where stock_code = #{stockCode} + + + + delete from t_stock_basic + where stock_code = #{stockCode} + + \ No newline at end of file diff --git a/newstock-system/src/main/resources/mapper/newstocksystem/StockDailyTradeMapper.xml b/newstock-system/src/main/resources/mapper/newstocksystem/StockDailyTradeMapper.xml new file mode 100644 index 0000000..c8de3d8 --- /dev/null +++ b/newstock-system/src/main/resources/mapper/newstocksystem/StockDailyTradeMapper.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + select stock_code, trade_date, open_price, close_price, high_price, low_price, price_change_rate, volume, turnover, free_circulation_cap, is_limit_up, is_limit_down, momentum_10d, momentum_20d, momentum_60d, create_time + from t_stock_daily_trade + + + + + + + + + + + + insert into t_stock_daily_trade + + stock_code, + trade_date, + open_price, + close_price, + high_price, + low_price, + price_change_rate, + volume, + turnover, + free_circulation_cap, + is_limit_up, + is_limit_down, + momentum_10d, + momentum_20d, + momentum_60d, + create_time, + + + #{stockCode}, + #{tradeDate}, + #{openPrice}, + #{closePrice}, + #{highPrice}, + #{lowPrice}, + #{priceChangeRate}, + #{volume}, + #{turnover}, + #{freeCirculationCap}, + #{isLimitUp}, + #{isLimitDown}, + #{momentum10d}, + #{momentum20d}, + #{momentum60d}, + #{createTime}, + + + + + update t_stock_daily_trade + + open_price = #{openPrice}, + close_price = #{closePrice}, + high_price = #{highPrice}, + low_price = #{lowPrice}, + price_change_rate = #{priceChangeRate}, + volume = #{volume}, + turnover = #{turnover}, + free_circulation_cap = #{freeCirculationCap}, + is_limit_up = #{isLimitUp}, + is_limit_down = #{isLimitDown}, + momentum_10d = #{momentum10d}, + momentum_20d = #{momentum20d}, + momentum_60d = #{momentum60d}, + + where stock_code = #{stockCode} and trade_date = #{tradeDate} + + + + delete from t_stock_daily_trade + where stock_code = #{stockCode} and trade_date = #{tradeDate} + + \ No newline at end of file diff --git a/newstock-system/src/main/resources/mapper/newstocksystem/StockHighLowStatusMapper.xml b/newstock-system/src/main/resources/mapper/newstocksystem/StockHighLowStatusMapper.xml new file mode 100644 index 0000000..d1be44f --- /dev/null +++ b/newstock-system/src/main/resources/mapper/newstocksystem/StockHighLowStatusMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + select stock_code, trade_date, is_new_high, new_high_date, is_new_low, new_low_date, create_time + from t_stock_high_low_status + + + + + + + + + + + + insert into t_stock_high_low_status + + stock_code, + trade_date, + is_new_high, + new_high_date, + is_new_low, + new_low_date, + create_time, + + + #{stockCode}, + #{tradeDate}, + #{isNewHigh}, + #{newHighDate}, + #{isNewLow}, + #{newLowDate}, + #{createTime}, + + + + + update t_stock_high_low_status + + is_new_high = #{isNewHigh}, + new_high_date = #{newHighDate}, + is_new_low = #{isNewLow}, + new_low_date = #{newLowDate}, + + where stock_code = #{stockCode} and trade_date = #{tradeDate} + + + + delete from t_stock_high_low_status + where stock_code = #{stockCode} and trade_date = #{tradeDate} + + \ No newline at end of file diff --git a/sql_refacor0120/t_stock_daily_trade.sql b/sql_refacor0120/t_stock_daily_trade.sql index bc44410..340219c 100644 --- a/sql_refacor0120/t_stock_daily_trade.sql +++ b/sql_refacor0120/t_stock_daily_trade.sql @@ -1,34 +1,38 @@ --- 个股每日交易数据表:大表,按“交易日期”按月分区(MySQL原生分区) +-- 个股每日交易数据表:分区表(去掉外键,解决MySQL限制) +--去掉外键后,需通过以下方式确保 t_stock_daily_trade 的 stock_code 一定存在于 t_stock_basic(避免脏数据): +--批量导入前校验(推荐,无性能损耗) +-- 在执行 LOAD DATA INFILE 导入数据前,先通过 SQL 过滤掉 “不存在的 stock_code”,适用于每日批量导入场景(与你之前的导入脚本结合)。 CREATE TABLE `t_stock_daily_trade` ( - `stock_code` VARCHAR(20) NOT NULL COMMENT '证券代码(关联t_stock_basic)', - `trade_date` DATE NOT NULL COMMENT '交易日期', - `open_price` DECIMAL(10,2) NULL COMMENT '开盘价(单位:元)', - `close_price` DECIMAL(10,2) NOT NULL COMMENT '收盘价(单位:元)', - `high_price` DECIMAL(10,2) NULL COMMENT '最高价(单位:元)', - `low_price` DECIMAL(10,2) NULL COMMENT '最低价(单位:元)', - `price_change_rate` DECIMAL(6,4) NULL COMMENT '当日涨跌幅(百分比)', - `volume` BIGINT NULL COMMENT '成交量(单位:股)', - `turnover` DECIMAL(20,2) NULL COMMENT '成交额(单位:万元)', - `free_circulation_cap` DECIMAL(20,2) NULL COMMENT '自由流通市值(单位:万元)', - `is_limit_up` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否涨停(1=是,0=否)', - `is_limit_down` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否跌停(1=是,0=否)', - `momentum_10d` DECIMAL(6,4) NULL COMMENT '10日动量(涨跌幅)', - `momentum_20d` DECIMAL(6,4) NULL COMMENT '20日动量(涨跌幅)', - `momentum_60d` DECIMAL(6,4) NULL COMMENT '60日动量(涨跌幅)', - `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '数据创建时间', - -- 复合主键:确保“个股代码+日期”唯一 - PRIMARY KEY (`stock_code`, `trade_date`), - -- 外键:关联个股基础表,确保个股代码有效性 - FOREIGN KEY (`stock_code`) - REFERENCES `t_stock_basic` (`stock_code`) - ON UPDATE RESTRICT ON DELETE RESTRICT, - -- 索引:优化按日期查询所有个股交易数据的场景 - INDEX `idx_t_stock_daily_trade_date` (`trade_date`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 --- 按“交易日期”按月分区(示例:2024年12月-2025年3月,后续可扩展) + `stock_code` VARCHAR(20) NOT NULL COMMENT '证券代码(关联t_stock_basic,通过应用层校验一致性)', + `trade_date` DATE NOT NULL COMMENT '交易日期', + `open_price` DECIMAL(10,2) NULL COMMENT '开盘价(单位:元)', + `close_price` DECIMAL(10,2) NOT NULL COMMENT '收盘价(单位:元)', + `high_price` DECIMAL(10,2) NULL COMMENT '最高价(单位:元)', + `low_price` DECIMAL(10,2) NULL COMMENT '最低价(单位:元)', + `price_change_rate` DECIMAL(6,4) NULL COMMENT '当日涨跌幅(百分比)', + `volume` BIGINT NULL COMMENT '成交量(单位:股)', + `turnover` DECIMAL(20,2) NULL COMMENT '成交额(单位:万元)', + `free_circulation_cap` DECIMAL(20,2) NULL COMMENT '自由流通市值(单位:万元)', + `is_limit_up` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否涨停(1=是,0=否)', + `is_limit_down` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否跌停(1=是,0=否)', + `momentum_10d` DECIMAL(6,4) NULL COMMENT '10日动量(涨跌幅)', + `momentum_20d` DECIMAL(6,4) NULL COMMENT '20日动量(涨跌幅)', + `momentum_60d` DECIMAL(6,4) NULL COMMENT '60日动量(涨跌幅)', + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '数据创建时间', + + -- 复合主键:确保“个股代码+日期”唯一(保留原设计) + PRIMARY KEY (`stock_code`, `trade_date`), + + -- 索引:优化按日期、个股代码的查询(保留原设计) + INDEX `idx_t_stock_daily_trade_date` (`trade_date`), + INDEX `idx_t_stock_daily_trade_code` (`stock_code`) -- 新增:优化按个股查询的效率 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 +-- 表注释:移到分区前(之前已修复的语法问题) +COMMENT='A股个股每日交易数据-按月分区' +-- 按月分区(保留原设计,确保性能优势) PARTITION BY RANGE (TO_DAYS(`trade_date`)) ( PARTITION `p202412` VALUES LESS THAN (TO_DAYS('2025-01-01')) COMMENT '2024年12月数据', PARTITION `p202501` VALUES LESS THAN (TO_DAYS('2025-02-01')) COMMENT '2025年1月数据', PARTITION `p202502` VALUES LESS THAN (TO_DAYS('2025-03-01')) COMMENT '2025年2月数据', PARTITION `p202503` VALUES LESS THAN (TO_DAYS('2025-04-01')) COMMENT '2025年3月数据' -) COMMENT='A股个股每日交易数据(按月分区)'; \ No newline at end of file +); \ No newline at end of file diff --git a/sql_refacor0120/t_stock_high_low_status.sql b/sql_refacor0120/t_stock_high_low_status.sql index dda7f5c..17e155e 100644 --- a/sql_refacor0120/t_stock_high_low_status.sql +++ b/sql_refacor0120/t_stock_high_low_status.sql @@ -1,23 +1,20 @@ --- 个股新高新低状态表:存储300天新高新低信息 +-- 个股新高新低状态表:去掉外键(兼容MySQL分区表限制) +-- 同样需要增加导入前检验 CREATE TABLE `t_stock_high_low_status` ( - `stock_code` VARCHAR(20) NOT NULL COMMENT '证券代码(关联t_stock_basic)', - `trade_date` DATE NOT NULL COMMENT '交易日期', - `is_new_high` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否创阶段新高(1=是,0=否)', - `new_high_date` DATE NULL COMMENT '区间最高价日(创新高时填充)', - `is_new_low` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否创阶段新低(1=是,0=否)', - `new_low_date` DATE NULL COMMENT '区间最低价日(创新低时填充)', - `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '数据创建时间', - -- 复合主键:确保“个股代码+日期”唯一 - PRIMARY KEY (`stock_code`, `trade_date`), - -- 外键1:关联个股基础表 - FOREIGN KEY (`stock_code`) - REFERENCES `t_stock_basic` (`stock_code`) - ON UPDATE RESTRICT ON DELETE RESTRICT, - -- 外键2:关联个股交易表,确保“个股+日期”的交易数据存在 - FOREIGN KEY (`stock_code`, `trade_date`) - REFERENCES `t_stock_daily_trade` (`stock_code`, `trade_date`) - ON UPDATE RESTRICT ON DELETE RESTRICT, - -- 索引:优化“查询某日所有新高/新低个股”的场景 - INDEX `idx_t_stock_high_low_high` (`is_new_high`, `trade_date`), - INDEX `idx_t_stock_high_low_low` (`is_new_low`, `trade_date`) + `stock_code` VARCHAR(20) NOT NULL COMMENT '证券代码(关联t_stock_basic,导入前校验)', + `trade_date` DATE NOT NULL COMMENT '交易日期', + `is_new_high` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否创阶段新高(1=是,0=否)', + `new_high_date` DATE NULL COMMENT '区间最高价日(创新高时填充)', + `is_new_low` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否创阶段新低(1=是,0=否)', + `new_low_date` DATE NULL COMMENT '区间最低价日(创新低时填充)', + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '数据创建时间', + + -- 复合主键:确保“个股代码+日期”唯一(保留原设计) + PRIMARY KEY (`stock_code`, `trade_date`), + + -- 索引:优化新高/新低查询(保留原设计) + INDEX `idx_t_stock_high_low_high` (`is_new_high`, `trade_date`), + INDEX `idx_t_stock_high_low_low` (`is_new_low`, `trade_date`), + -- 新增索引:优化关联t_stock_daily_trade的查询效率 + INDEX `idx_t_stock_high_low_code_date` (`stock_code`, `trade_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='A股个股300天新高新低状态'; \ No newline at end of file