From 26dc129099a44a2644f3bf749b58dbe7f53533ef Mon Sep 17 00:00:00 2001 From: Lxy Date: Wed, 21 Jan 2026 23:46:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20qoder=E5=A2=9E=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E5=8F=8A=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=B1=BB=EF=BC=9B=E6=96=B0=E5=A2=9E=E4=B8=89=E4=B8=AA?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=9B=E6=96=B0=E5=A2=9E=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=9B=E5=B0=9A=E5=AD=98=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9A=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=85=A5=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=EF=BC=9B=E5=8E=9F=E6=8E=A5=E5=8F=A3=E6=97=A0=E6=B3=95=E4=BD=BF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StockDataController.java | 380 ++++++++++++ .../newstocksystem/domain/TIndustryIndex.java | 223 +++++++ .../newstocksystem/domain/TStockBasic.java | 147 +++++ .../domain/TStockDailyTrade.java | 292 +++++++++ .../domain/TStockHighLowStatus.java | 158 +++++ .../mapper/TIndustryIndexMapper.java | 87 +++ .../mapper/TStockBasicMapper.java | 86 +++ .../mapper/TStockDailyTradeMapper.java | 105 ++++ .../mapper/TStockHighLowStatusMapper.java | 98 +++ .../service/IIndustryIndexService.java | 80 +++ .../service/IStockBasicService.java | 78 +++ .../service/IStockDailyTradeService.java | 97 +++ .../service/IStockHighLowStatusService.java | 90 +++ .../impl/IndustryIndexServiceImpl.java | 99 ++++ .../service/impl/StockBasicServiceImpl.java | 89 +++ .../impl/StockDailyTradeServiceImpl.java | 120 ++++ .../impl/StockHighLowStatusServiceImpl.java | 114 ++++ .../newstocksystem/IndustryIndexMapper.xml | 166 ++++++ .../newstocksystem/StockBasicMapper.xml | 141 +++++ .../newstocksystem/StockDailyTradeMapper.xml | 242 ++++++++ .../StockHighLowStatusMapper.xml | 180 ++++++ .../src/main/resources/application-druid.yml | 2 +- ruoyi-ui/src/api/newstocksystem/stockdata.js | 197 ++++++ .../src/views/newstocksystem/stockdata.vue | 560 ++++++++++++++++++ 24 files changed, 3830 insertions(+), 1 deletion(-) create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataController.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TIndustryIndex.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockBasic.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockDailyTrade.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockHighLowStatus.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TIndustryIndexMapper.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockBasicMapper.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockDailyTradeMapper.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockHighLowStatusMapper.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IIndustryIndexService.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockBasicService.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockDailyTradeService.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockHighLowStatusService.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/IndustryIndexServiceImpl.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockBasicServiceImpl.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockDailyTradeServiceImpl.java create mode 100644 newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockHighLowStatusServiceImpl.java create mode 100644 newstock-system/src/main/resources/mapper/newstocksystem/IndustryIndexMapper.xml create mode 100644 newstock-system/src/main/resources/mapper/newstocksystem/StockBasicMapper.xml create mode 100644 newstock-system/src/main/resources/mapper/newstocksystem/StockDailyTradeMapper.xml create mode 100644 newstock-system/src/main/resources/mapper/newstocksystem/StockHighLowStatusMapper.xml create mode 100644 ruoyi-ui/src/api/newstocksystem/stockdata.js create mode 100644 ruoyi-ui/src/views/newstocksystem/stockdata.vue diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataController.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataController.java new file mode 100644 index 0000000..70a3994 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/controller/StockDataController.java @@ -0,0 +1,380 @@ +package com.ruoyi.newstocksystem.controller; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.newstocksystem.domain.TIndustryIndex; +import com.ruoyi.newstocksystem.domain.TStockBasic; +import com.ruoyi.newstocksystem.domain.TStockDailyTrade; +import com.ruoyi.newstocksystem.domain.TStockHighLowStatus; +import com.ruoyi.newstocksystem.service.IIndustryIndexService; +import com.ruoyi.newstocksystem.service.IStockBasicService; +import com.ruoyi.newstocksystem.service.IStockDailyTradeService; +import com.ruoyi.newstocksystem.service.IStockHighLowStatusService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 股票行情数据导入Controller + * + * @author lxy + * @date 2026-01-21 + */ +@RestController +@RequestMapping("/newstocksystem/stockdata") +public class StockDataController extends BaseController +{ + @Autowired + private IIndustryIndexService industryIndexService; + + @Autowired + private IStockBasicService stockBasicService; + + @Autowired + private IStockDailyTradeService stockDailyTradeService; + + @Autowired + private IStockHighLowStatusService stockHighLowStatusService; + + // ========================= 行业指数相关接口 ========================= + + /** + * 查询行业指数列表 + */ + @GetMapping("/industryIndex/list") + public TableDataInfo listIndustryIndex(TIndustryIndex industryIndex) + { + startPage(); + List list = industryIndexService.selectIndustryIndexList(industryIndex); + return getDataTable(list); + } + + /** + * 查询所有行业指数基础信息(去重) + */ + @GetMapping("/industryIndex/distinctList") + public AjaxResult distinctIndustryIndexList() + { + List list = industryIndexService.selectDistinctIndustryIndexList(); + return AjaxResult.success(list); + } + + /** + * 导出行业指数列表 + */ + @PostMapping("/industryIndex/export") + public void exportIndustryIndex(HttpServletResponse response, TIndustryIndex industryIndex) + { + List list = industryIndexService.selectIndustryIndexList(industryIndex); + ExcelUtil util = new ExcelUtil(TIndustryIndex.class); + util.exportExcel(response, list, "行业指数数据"); + } + + /** + * 导入行业指数数据(xlsx导入接口1) + * + * @param file Excel文件 + * @param updateSupport 是否支持更新已存在数据 + * @param tradeDate 交易日期(格式:yyyy-MM-dd) + */ + @Log(title = "行业指数数据导入", businessType = BusinessType.IMPORT) + @PostMapping("/industryIndex/importData") + public AjaxResult importIndustryIndex(MultipartFile file, boolean updateSupport, String tradeDate) + { + Date tradeDateValue = parseTradeDate(tradeDate); + if (tradeDateValue == null) + { + return AjaxResult.error("交易日期格式错误,请使用yyyy-MM-dd格式"); + } + + ExcelUtil util = new ExcelUtil(TIndustryIndex.class); + try + { + List industryIndexList = util.importExcel(file.getInputStream()); + int successNum = industryIndexService.importIndustryIndex(industryIndexList, tradeDateValue); + return AjaxResult.success("成功导入 " + successNum + " 条行业指数数据"); + } + catch (Exception e) + { + return AjaxResult.error("导入失败:" + e.getMessage()); + } + } + + /** + * 查询行业指数交易日期列表 + */ + @GetMapping("/industryIndex/tradeDates") + public AjaxResult getIndustryIndexTradeDates() + { + List tradeDates = industryIndexService.selectTradeDates(); + return AjaxResult.success(tradeDates); + } + + // ========================= 个股基础信息相关接口 ========================= + + /** + * 查询个股基础信息列表 + */ + @GetMapping("/stockBasic/list") + public TableDataInfo listStockBasic(TStockBasic stockBasic) + { + startPage(); + List list = stockBasicService.selectStockBasicList(stockBasic); + return getDataTable(list); + } + + /** + * 根据证券代码获取个股基础信息 + */ + @GetMapping("/stockBasic/{stockCode}") + public AjaxResult getStockBasicInfo(@PathVariable("stockCode") String stockCode) + { + return AjaxResult.success(stockBasicService.selectStockBasicByCode(stockCode)); + } + + /** + * 导出个股基础信息列表 + */ + @PostMapping("/stockBasic/export") + public void exportStockBasic(HttpServletResponse response, TStockBasic stockBasic) + { + List list = stockBasicService.selectStockBasicList(stockBasic); + ExcelUtil util = new ExcelUtil(TStockBasic.class); + util.exportExcel(response, list, "个股基础信息数据"); + } + + /** + * 导入个股基础信息数据(xlsx导入接口2) + * + * @param file Excel文件 + * @param updateSupport 是否支持更新已存在数据 + */ + @Log(title = "个股基础信息导入", businessType = BusinessType.IMPORT) + @PostMapping("/stockBasic/importData") + public AjaxResult importStockBasic(MultipartFile file, boolean updateSupport) + { + ExcelUtil util = new ExcelUtil(TStockBasic.class); + try + { + List stockBasicList = util.importExcel(file.getInputStream()); + int successNum = stockBasicService.importStockBasic(stockBasicList); + return AjaxResult.success("成功导入 " + successNum + " 条个股基础信息数据"); + } + catch (Exception e) + { + return AjaxResult.error("导入失败:" + e.getMessage()); + } + } + + /** + * 新增个股基础信息 + */ + @Log(title = "个股基础信息", businessType = BusinessType.INSERT) + @PostMapping("/stockBasic") + public AjaxResult addStockBasic(@RequestBody TStockBasic stockBasic) + { + return toAjax(stockBasicService.insertStockBasic(stockBasic)); + } + + /** + * 修改个股基础信息 + */ + @Log(title = "个股基础信息", businessType = BusinessType.UPDATE) + @PutMapping("/stockBasic") + public AjaxResult editStockBasic(@RequestBody TStockBasic stockBasic) + { + return toAjax(stockBasicService.updateStockBasic(stockBasic)); + } + + /** + * 删除个股基础信息 + */ + @Log(title = "个股基础信息", businessType = BusinessType.DELETE) + @DeleteMapping("/stockBasic/{stockCodes}") + public AjaxResult removeStockBasic(@PathVariable String[] stockCodes) + { + return toAjax(stockBasicService.deleteStockBasicByCodes(stockCodes)); + } + + // ========================= 个股每日交易数据相关接口 ========================= + + /** + * 查询个股每日交易数据列表 + */ + @GetMapping("/stockDailyTrade/list") + public TableDataInfo listStockDailyTrade(TStockDailyTrade stockDailyTrade) + { + startPage(); + List list = stockDailyTradeService.selectStockDailyTradeList(stockDailyTrade); + return getDataTable(list); + } + + /** + * 查询个股每日交易数据列表(包含基础信息) + */ + @GetMapping("/stockDailyTrade/listWithBasic") + public TableDataInfo listStockDailyTradeWithBasic(TStockDailyTrade stockDailyTrade) + { + startPage(); + List list = stockDailyTradeService.selectStockDailyTradeListWithBasic(stockDailyTrade); + return getDataTable(list); + } + + /** + * 导出个股每日交易数据列表 + */ + @PostMapping("/stockDailyTrade/export") + public void exportStockDailyTrade(HttpServletResponse response, TStockDailyTrade stockDailyTrade) + { + List list = stockDailyTradeService.selectStockDailyTradeList(stockDailyTrade); + ExcelUtil util = new ExcelUtil(TStockDailyTrade.class); + util.exportExcel(response, list, "个股每日交易数据"); + } + + /** + * 导入个股每日交易数据(xlsx导入接口3) + * + * @param file Excel文件 + * @param updateSupport 是否支持更新已存在数据 + * @param tradeDate 交易日期(格式:yyyy-MM-dd) + */ + @Log(title = "个股每日交易数据导入", businessType = BusinessType.IMPORT) + @PostMapping("/stockDailyTrade/importData") + public AjaxResult importStockDailyTrade(MultipartFile file, boolean updateSupport, String tradeDate) + { + Date tradeDateValue = parseTradeDate(tradeDate); + if (tradeDateValue == null) + { + return AjaxResult.error("交易日期格式错误,请使用yyyy-MM-dd格式"); + } + + ExcelUtil util = new ExcelUtil(TStockDailyTrade.class); + try + { + List stockDailyTradeList = util.importExcel(file.getInputStream()); + int successNum = stockDailyTradeService.importStockDailyTrade(stockDailyTradeList, tradeDateValue); + return AjaxResult.success("成功导入 " + successNum + " 条个股每日交易数据"); + } + catch (Exception e) + { + return AjaxResult.error("导入失败:" + e.getMessage()); + } + } + + /** + * 查询个股交易日期列表 + */ + @GetMapping("/stockDailyTrade/tradeDates") + public AjaxResult getStockDailyTradeDates() + { + List tradeDates = stockDailyTradeService.selectTradeDates(); + return AjaxResult.success(tradeDates); + } + + /** + * 查询涨停股列表 + */ + @GetMapping("/stockDailyTrade/limitUpList") + public TableDataInfo listLimitUpStocks(TStockDailyTrade stockDailyTrade) + { + startPage(); + List list = stockDailyTradeService.selectLimitUpStockList(stockDailyTrade); + return getDataTable(list); + } + + /** + * 查询强势股列表 + */ + @GetMapping("/stockDailyTrade/strongList") + public TableDataInfo listStrongStocks(TStockDailyTrade stockDailyTrade) + { + startPage(); + List list = stockDailyTradeService.selectStrongStockList(stockDailyTrade); + return getDataTable(list); + } + + // ========================= 个股新高新低状态相关接口 ========================= + + /** + * 查询个股新高新低状态列表 + */ + @GetMapping("/stockHighLow/list") + public TableDataInfo listStockHighLowStatus(TStockHighLowStatus stockHighLowStatus) + { + startPage(); + List list = stockHighLowStatusService.selectStockHighLowStatusList(stockHighLowStatus); + return getDataTable(list); + } + + /** + * 查询个股新高新低状态列表(包含基础信息) + */ + @GetMapping("/stockHighLow/listWithBasic") + public TableDataInfo listStockHighLowStatusWithBasic(TStockHighLowStatus stockHighLowStatus) + { + startPage(); + List list = stockHighLowStatusService.selectStockHighLowStatusListWithBasic(stockHighLowStatus); + return getDataTable(list); + } + + /** + * 查询创新高股票列表 + */ + @GetMapping("/stockHighLow/newHighList") + public TableDataInfo listNewHighStocks(TStockHighLowStatus stockHighLowStatus) + { + startPage(); + List list = stockHighLowStatusService.selectNewHighStockList(stockHighLowStatus); + return getDataTable(list); + } + + /** + * 查询创新低股票列表 + */ + @GetMapping("/stockHighLow/newLowList") + public TableDataInfo listNewLowStocks(TStockHighLowStatus stockHighLowStatus) + { + startPage(); + List list = stockHighLowStatusService.selectNewLowStockList(stockHighLowStatus); + return getDataTable(list); + } + + // ========================= 工具方法 ========================= + + /** + * 解析交易日期字符串 + */ + private Date parseTradeDate(String tradeDate) + { + if (tradeDate == null || tradeDate.isEmpty()) + { + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + try + { + return sdf.parse(tradeDate); + } + catch (ParseException e) + { + return null; + } + } +} diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TIndustryIndex.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TIndustryIndex.java new file mode 100644 index 0000000..55d9af7 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TIndustryIndex.java @@ -0,0 +1,223 @@ +package com.ruoyi.newstocksystem.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 行业指数实体类 + * 对应表 t_industry_index + * + * @author lxy + * @date 2026-01-21 + */ +public class TIndustryIndex extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 行业指数代码(如802089.EI) */ + @Excel(name = "行业指数代码") + private String industryIndexCode; + + /** 行业指数名称(如"银行") */ + @Excel(name = "行业指数名称") + private String industryIndexName; + + /** 成份个数(行业包含个股数量) */ + @Excel(name = "成份个数") + private Integer componentCount; + + /** 交易日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "交易日期", dateFormat = "yyyy-MM-dd") + private Date tradeDate; + + /** 开盘价(指数点位) */ + @Excel(name = "开盘价") + private BigDecimal openPrice; + + /** 收盘价(指数点位) */ + @Excel(name = "收盘价") + private BigDecimal closePrice; + + /** 成交量(指数成交总量) */ + @Excel(name = "成交量") + private Long volume; + + /** 成交额(单位:万元) */ + @Excel(name = "成交额") + private BigDecimal turnover; + + /** 总市值(单位:万元) */ + @Excel(name = "总市值") + private BigDecimal totalMarketCap; + + /** 自由流通市值(单位:万元) */ + @Excel(name = "自由流通市值") + private BigDecimal freeCirculationCap; + + /** 涨跌幅(百分比,如1.2937=1.2937%) */ + @Excel(name = "涨跌幅") + private BigDecimal priceChangeRate; + + /** 市盈率PE(TTM) */ + @Excel(name = "市盈率PE(TTM)") + private BigDecimal peTtm; + + /** 市盈率PE(TTM)中位值 */ + @Excel(name = "市盈率PE(TTM)中位值") + private BigDecimal 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 BigDecimal getOpenPrice() + { + return openPrice; + } + + public void setOpenPrice(BigDecimal openPrice) + { + this.openPrice = openPrice; + } + + public BigDecimal getClosePrice() + { + return closePrice; + } + + public void setClosePrice(BigDecimal closePrice) + { + this.closePrice = closePrice; + } + + public Long getVolume() + { + return volume; + } + + public void setVolume(Long volume) + { + this.volume = volume; + } + + public BigDecimal getTurnover() + { + return turnover; + } + + public void setTurnover(BigDecimal turnover) + { + this.turnover = turnover; + } + + public BigDecimal getTotalMarketCap() + { + return totalMarketCap; + } + + public void setTotalMarketCap(BigDecimal totalMarketCap) + { + this.totalMarketCap = totalMarketCap; + } + + public BigDecimal getFreeCirculationCap() + { + return freeCirculationCap; + } + + public void setFreeCirculationCap(BigDecimal freeCirculationCap) + { + this.freeCirculationCap = freeCirculationCap; + } + + public BigDecimal getPriceChangeRate() + { + return priceChangeRate; + } + + public void setPriceChangeRate(BigDecimal priceChangeRate) + { + this.priceChangeRate = priceChangeRate; + } + + public BigDecimal getPeTtm() + { + return peTtm; + } + + public void setPeTtm(BigDecimal peTtm) + { + this.peTtm = peTtm; + } + + public BigDecimal getPeTtmMedian() + { + return peTtmMedian; + } + + public void setPeTtmMedian(BigDecimal peTtmMedian) + { + this.peTtmMedian = peTtmMedian; + } + + @Override + public String toString() + { + return "TIndustryIndex{" + + "industryIndexCode='" + industryIndexCode + '\'' + + ", industryIndexName='" + industryIndexName + '\'' + + ", componentCount=" + componentCount + + ", tradeDate=" + tradeDate + + ", openPrice=" + openPrice + + ", closePrice=" + closePrice + + ", volume=" + volume + + ", turnover=" + turnover + + ", totalMarketCap=" + totalMarketCap + + ", freeCirculationCap=" + freeCirculationCap + + ", priceChangeRate=" + priceChangeRate + + ", peTtm=" + peTtm + + ", peTtmMedian=" + peTtmMedian + + '}'; + } +} diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockBasic.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockBasic.java new file mode 100644 index 0000000..d383434 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockBasic.java @@ -0,0 +1,147 @@ +package com.ruoyi.newstocksystem.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 个股基础信息实体类 + * 对应表 t_stock_basic + * + * @author lxy + * @date 2026-01-21 + */ +public class TStockBasic extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 证券代码(如000061.SZ、600000.SH) */ + @Excel(name = "证券代码") + private String stockCode; + + /** 证券名称(如"农 产 品") */ + @Excel(name = "证券名称") + private String stockName; + + /** 首发上市日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "首发上市日期", dateFormat = "yyyy-MM-dd") + private Date listingDate; + + /** 上市天数(冗余存储,提升查询效率) */ + @Excel(name = "上市天数") + private Integer listingDays; + + /** 是否为ST股票(1=是,0=否) */ + @Excel(name = "是否ST", readConverterExp = "1=是,0=否") + private Integer isSt; + + /** 是否为*ST股票(1=是,0=否) */ + @Excel(name = "是否*ST", readConverterExp = "1=是,0=否") + private Integer isStarSt; + + /** 所属行业指数代码(关联t_industry_index) */ + @Excel(name = "行业指数代码") + private String industryIndexCode; + + /** 所属行业指数名称(冗余存储,减少关联查询) */ + @Excel(name = "行业指数名称") + 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; + } + + @Override + public String toString() + { + return "TStockBasic{" + + "stockCode='" + stockCode + '\'' + + ", stockName='" + stockName + '\'' + + ", listingDate=" + listingDate + + ", listingDays=" + listingDays + + ", isSt=" + isSt + + ", isStarSt=" + isStarSt + + ", industryIndexCode='" + industryIndexCode + '\'' + + ", industryIndexName='" + industryIndexName + '\'' + + '}'; + } +} diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockDailyTrade.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockDailyTrade.java new file mode 100644 index 0000000..0f30c2c --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockDailyTrade.java @@ -0,0 +1,292 @@ +package com.ruoyi.newstocksystem.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 个股每日交易数据实体类 + * 对应表 t_stock_daily_trade + * + * @author lxy + * @date 2026-01-21 + */ +public class TStockDailyTrade extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 证券代码(关联t_stock_basic) */ + @Excel(name = "证券代码") + private String stockCode; + + /** 交易日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "交易日期", dateFormat = "yyyy-MM-dd") + private Date tradeDate; + + /** 开盘价(单位:元) */ + @Excel(name = "开盘价") + private BigDecimal openPrice; + + /** 收盘价(单位:元) */ + @Excel(name = "收盘价") + private BigDecimal closePrice; + + /** 最高价(单位:元) */ + @Excel(name = "最高价") + private BigDecimal highPrice; + + /** 最低价(单位:元) */ + @Excel(name = "最低价") + private BigDecimal lowPrice; + + /** 当日涨跌幅(百分比) */ + @Excel(name = "涨跌幅") + private BigDecimal priceChangeRate; + + /** 成交量(单位:股) */ + @Excel(name = "成交量") + private Long volume; + + /** 成交额(单位:万元) */ + @Excel(name = "成交额") + private BigDecimal turnover; + + /** 自由流通市值(单位:万元) */ + @Excel(name = "自由流通市值") + private BigDecimal freeCirculationCap; + + /** 是否涨停(1=是,0=否) */ + @Excel(name = "是否涨停", readConverterExp = "1=是,0=否") + private Integer isLimitUp; + + /** 是否跌停(1=是,0=否) */ + @Excel(name = "是否跌停", readConverterExp = "1=是,0=否") + private Integer isLimitDown; + + /** 10日动量(涨跌幅) */ + @Excel(name = "10日动量") + private BigDecimal momentum10d; + + /** 20日动量(涨跌幅) */ + @Excel(name = "20日动量") + private BigDecimal momentum20d; + + /** 60日动量(涨跌幅) */ + @Excel(name = "60日动量") + private BigDecimal momentum60d; + + /** 证券名称(查询时关联获取) */ + private String stockName; + + /** 行业指数代码(查询时关联获取) */ + private String industryIndexCode; + + /** 行业指数名称(查询时关联获取) */ + private String industryIndexName; + + 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 BigDecimal getOpenPrice() + { + return openPrice; + } + + public void setOpenPrice(BigDecimal openPrice) + { + this.openPrice = openPrice; + } + + public BigDecimal getClosePrice() + { + return closePrice; + } + + public void setClosePrice(BigDecimal closePrice) + { + this.closePrice = closePrice; + } + + public BigDecimal getHighPrice() + { + return highPrice; + } + + public void setHighPrice(BigDecimal highPrice) + { + this.highPrice = highPrice; + } + + public BigDecimal getLowPrice() + { + return lowPrice; + } + + public void setLowPrice(BigDecimal lowPrice) + { + this.lowPrice = lowPrice; + } + + public BigDecimal getPriceChangeRate() + { + return priceChangeRate; + } + + public void setPriceChangeRate(BigDecimal priceChangeRate) + { + this.priceChangeRate = priceChangeRate; + } + + public Long getVolume() + { + return volume; + } + + public void setVolume(Long volume) + { + this.volume = volume; + } + + public BigDecimal getTurnover() + { + return turnover; + } + + public void setTurnover(BigDecimal turnover) + { + this.turnover = turnover; + } + + public BigDecimal getFreeCirculationCap() + { + return freeCirculationCap; + } + + public void setFreeCirculationCap(BigDecimal 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 BigDecimal getMomentum10d() + { + return momentum10d; + } + + public void setMomentum10d(BigDecimal momentum10d) + { + this.momentum10d = momentum10d; + } + + public BigDecimal getMomentum20d() + { + return momentum20d; + } + + public void setMomentum20d(BigDecimal momentum20d) + { + this.momentum20d = momentum20d; + } + + public BigDecimal getMomentum60d() + { + return momentum60d; + } + + public void setMomentum60d(BigDecimal momentum60d) + { + this.momentum60d = momentum60d; + } + + public String getStockName() + { + return stockName; + } + + public void setStockName(String stockName) + { + this.stockName = stockName; + } + + 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; + } + + @Override + public String toString() + { + return "TStockDailyTrade{" + + "stockCode='" + stockCode + '\'' + + ", tradeDate=" + tradeDate + + ", openPrice=" + openPrice + + ", closePrice=" + closePrice + + ", highPrice=" + highPrice + + ", lowPrice=" + lowPrice + + ", priceChangeRate=" + priceChangeRate + + ", volume=" + volume + + ", turnover=" + turnover + + ", freeCirculationCap=" + freeCirculationCap + + ", isLimitUp=" + isLimitUp + + ", isLimitDown=" + isLimitDown + + ", momentum10d=" + momentum10d + + ", momentum20d=" + momentum20d + + ", momentum60d=" + momentum60d + + '}'; + } +} diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockHighLowStatus.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockHighLowStatus.java new file mode 100644 index 0000000..7fb3f46 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/domain/TStockHighLowStatus.java @@ -0,0 +1,158 @@ +package com.ruoyi.newstocksystem.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 个股新高新低状态实体类 + * 对应表 t_stock_high_low_status + * + * @author lxy + * @date 2026-01-21 + */ +public class TStockHighLowStatus extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 证券代码(关联t_stock_basic) */ + @Excel(name = "证券代码") + private String stockCode; + + /** 交易日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "交易日期", dateFormat = "yyyy-MM-dd") + private Date tradeDate; + + /** 是否创阶段新高(1=是,0=否) */ + @Excel(name = "是否新高", readConverterExp = "1=是,0=否") + private Integer isNewHigh; + + /** 区间最高价日(创新高时填充) */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "新高日期", dateFormat = "yyyy-MM-dd") + private Date newHighDate; + + /** 是否创阶段新低(1=是,0=否) */ + @Excel(name = "是否新低", readConverterExp = "1=是,0=否") + private Integer isNewLow; + + /** 区间最低价日(创新低时填充) */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "新低日期", dateFormat = "yyyy-MM-dd") + private Date newLowDate; + + /** 证券名称(查询时关联获取) */ + private String stockName; + + /** 行业指数代码(查询时关联获取) */ + private String industryIndexCode; + + /** 行业指数名称(查询时关联获取) */ + private String industryIndexName; + + 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; + } + + public String getStockName() + { + return stockName; + } + + public void setStockName(String stockName) + { + this.stockName = stockName; + } + + 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; + } + + @Override + public String toString() + { + return "TStockHighLowStatus{" + + "stockCode='" + stockCode + '\'' + + ", tradeDate=" + tradeDate + + ", isNewHigh=" + isNewHigh + + ", newHighDate=" + newHighDate + + ", isNewLow=" + isNewLow + + ", newLowDate=" + newLowDate + + '}'; + } +} diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TIndustryIndexMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TIndustryIndexMapper.java new file mode 100644 index 0000000..a00381e --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TIndustryIndexMapper.java @@ -0,0 +1,87 @@ +package com.ruoyi.newstocksystem.mapper; + +import com.ruoyi.newstocksystem.domain.TIndustryIndex; + +import java.util.Date; +import java.util.List; + +/** + * 行业指数Mapper接口 + * + * @author lxy + * @date 2026-01-21 + */ +public interface TIndustryIndexMapper +{ + /** + * 根据行业指数代码和交易日期查询行业指数 + * + * @param industryIndexCode 行业指数代码 + * @param tradeDate 交易日期 + * @return 行业指数 + */ + public TIndustryIndex selectIndustryIndexByCodeAndDate(String industryIndexCode, Date tradeDate); + + /** + * 查询行业指数列表 + * + * @param industryIndex 行业指数 + * @return 行业指数集合 + */ + public List selectIndustryIndexList(TIndustryIndex industryIndex); + + /** + * 查询所有行业指数基础信息(去重) + * + * @return 行业指数基础信息集合 + */ + public List selectDistinctIndustryIndexList(); + + /** + * 新增行业指数 + * + * @param industryIndex 行业指数 + * @return 结果 + */ + public int insertIndustryIndex(TIndustryIndex industryIndex); + + /** + * 修改行业指数 + * + * @param industryIndex 行业指数 + * @return 结果 + */ + public int updateIndustryIndex(TIndustryIndex industryIndex); + + /** + * 删除行业指数 + * + * @param industryIndexCode 行业指数代码 + * @param tradeDate 交易日期 + * @return 结果 + */ + public int deleteIndustryIndexByCodeAndDate(String industryIndexCode, Date tradeDate); + + /** + * 批量新增行业指数 + * + * @param industryIndexList 行业指数集合 + * @return 结果 + */ + public int batchInsertIndustryIndex(List industryIndexList); + + /** + * 批量更新或插入行业指数(ON DUPLICATE KEY UPDATE) + * + * @param industryIndexList 行业指数集合 + * @return 结果 + */ + public int batchUpsertIndustryIndex(List industryIndexList); + + /** + * 查询交易日期列表 + * + * @return 交易日期列表 + */ + public List selectTradeDates(); +} diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockBasicMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockBasicMapper.java new file mode 100644 index 0000000..19fa03b --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockBasicMapper.java @@ -0,0 +1,86 @@ +package com.ruoyi.newstocksystem.mapper; + +import com.ruoyi.newstocksystem.domain.TStockBasic; + +import java.util.List; + +/** + * 个股基础信息Mapper接口 + * + * @author lxy + * @date 2026-01-21 + */ +public interface TStockBasicMapper +{ + /** + * 根据证券代码查询个股基础信息 + * + * @param stockCode 证券代码 + * @return 个股基础信息 + */ + public TStockBasic selectStockBasicByCode(String stockCode); + + /** + * 查询个股基础信息列表 + * + * @param stockBasic 个股基础信息 + * @return 个股基础信息集合 + */ + public List selectStockBasicList(TStockBasic stockBasic); + + /** + * 新增个股基础信息 + * + * @param stockBasic 个股基础信息 + * @return 结果 + */ + public int insertStockBasic(TStockBasic stockBasic); + + /** + * 修改个股基础信息 + * + * @param stockBasic 个股基础信息 + * @return 结果 + */ + public int updateStockBasic(TStockBasic stockBasic); + + /** + * 删除个股基础信息 + * + * @param stockCode 证券代码 + * @return 结果 + */ + public int deleteStockBasicByCode(String stockCode); + + /** + * 批量删除个股基础信息 + * + * @param stockCodes 需要删除的数据证券代码集合 + * @return 结果 + */ + public int deleteStockBasicByCodes(String[] stockCodes); + + /** + * 批量新增个股基础信息 + * + * @param stockBasicList 个股基础信息集合 + * @return 结果 + */ + public int batchInsertStockBasic(List stockBasicList); + + /** + * 批量更新或插入个股基础信息(ON DUPLICATE KEY UPDATE) + * + * @param stockBasicList 个股基础信息集合 + * @return 结果 + */ + public int batchUpsertStockBasic(List stockBasicList); + + /** + * 根据行业指数代码查询个股列表 + * + * @param industryIndexCode 行业指数代码 + * @return 个股基础信息集合 + */ + public List selectStockBasicByIndustryCode(String industryIndexCode); +} diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockDailyTradeMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockDailyTradeMapper.java new file mode 100644 index 0000000..755c0fe --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockDailyTradeMapper.java @@ -0,0 +1,105 @@ +package com.ruoyi.newstocksystem.mapper; + +import com.ruoyi.newstocksystem.domain.TStockDailyTrade; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 个股每日交易数据Mapper接口 + * + * @author lxy + * @date 2026-01-21 + */ +public interface TStockDailyTradeMapper +{ + /** + * 根据证券代码和交易日期查询交易数据 + * + * @param stockCode 证券代码 + * @param tradeDate 交易日期 + * @return 交易数据 + */ + public TStockDailyTrade selectStockDailyTradeByCodeAndDate(@Param("stockCode") String stockCode, @Param("tradeDate") Date tradeDate); + + /** + * 查询个股每日交易数据列表 + * + * @param stockDailyTrade 个股每日交易数据 + * @return 个股每日交易数据集合 + */ + public List selectStockDailyTradeList(TStockDailyTrade stockDailyTrade); + + /** + * 查询个股每日交易数据列表(包含基础信息) + * + * @param stockDailyTrade 个股每日交易数据 + * @return 个股每日交易数据集合 + */ + public List selectStockDailyTradeListWithBasic(TStockDailyTrade stockDailyTrade); + + /** + * 新增个股每日交易数据 + * + * @param stockDailyTrade 个股每日交易数据 + * @return 结果 + */ + public int insertStockDailyTrade(TStockDailyTrade stockDailyTrade); + + /** + * 修改个股每日交易数据 + * + * @param stockDailyTrade 个股每日交易数据 + * @return 结果 + */ + public int updateStockDailyTrade(TStockDailyTrade stockDailyTrade); + + /** + * 删除个股每日交易数据 + * + * @param stockCode 证券代码 + * @param tradeDate 交易日期 + * @return 结果 + */ + public int deleteStockDailyTradeByCodeAndDate(@Param("stockCode") String stockCode, @Param("tradeDate") Date tradeDate); + + /** + * 批量新增个股每日交易数据 + * + * @param stockDailyTradeList 个股每日交易数据集合 + * @return 结果 + */ + public int batchInsertStockDailyTrade(List stockDailyTradeList); + + /** + * 批量更新或插入个股每日交易数据(ON DUPLICATE KEY UPDATE) + * + * @param stockDailyTradeList 个股每日交易数据集合 + * @return 结果 + */ + public int batchUpsertStockDailyTrade(List stockDailyTradeList); + + /** + * 查询交易日期列表 + * + * @return 交易日期列表 + */ + public List selectTradeDates(); + + /** + * 查询涨停股列表 + * + * @param stockDailyTrade 查询条件 + * @return 涨停股列表 + */ + public List selectLimitUpStockList(TStockDailyTrade stockDailyTrade); + + /** + * 查询强势股列表(按动量排序) + * + * @param stockDailyTrade 查询条件 + * @return 强势股列表 + */ + public List selectStrongStockList(TStockDailyTrade stockDailyTrade); +} diff --git a/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockHighLowStatusMapper.java b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockHighLowStatusMapper.java new file mode 100644 index 0000000..2a8fda8 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/mapper/TStockHighLowStatusMapper.java @@ -0,0 +1,98 @@ +package com.ruoyi.newstocksystem.mapper; + +import com.ruoyi.newstocksystem.domain.TStockHighLowStatus; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 个股新高新低状态Mapper接口 + * + * @author lxy + * @date 2026-01-21 + */ +public interface TStockHighLowStatusMapper +{ + /** + * 根据证券代码和交易日期查询新高新低状态 + * + * @param stockCode 证券代码 + * @param tradeDate 交易日期 + * @return 新高新低状态 + */ + public TStockHighLowStatus selectStockHighLowStatusByCodeAndDate(@Param("stockCode") String stockCode, @Param("tradeDate") Date tradeDate); + + /** + * 查询个股新高新低状态列表 + * + * @param stockHighLowStatus 个股新高新低状态 + * @return 个股新高新低状态集合 + */ + public List selectStockHighLowStatusList(TStockHighLowStatus stockHighLowStatus); + + /** + * 查询个股新高新低状态列表(包含基础信息) + * + * @param stockHighLowStatus 个股新高新低状态 + * @return 个股新高新低状态集合 + */ + public List selectStockHighLowStatusListWithBasic(TStockHighLowStatus stockHighLowStatus); + + /** + * 新增个股新高新低状态 + * + * @param stockHighLowStatus 个股新高新低状态 + * @return 结果 + */ + public int insertStockHighLowStatus(TStockHighLowStatus stockHighLowStatus); + + /** + * 修改个股新高新低状态 + * + * @param stockHighLowStatus 个股新高新低状态 + * @return 结果 + */ + public int updateStockHighLowStatus(TStockHighLowStatus stockHighLowStatus); + + /** + * 删除个股新高新低状态 + * + * @param stockCode 证券代码 + * @param tradeDate 交易日期 + * @return 结果 + */ + public int deleteStockHighLowStatusByCodeAndDate(@Param("stockCode") String stockCode, @Param("tradeDate") Date tradeDate); + + /** + * 批量新增个股新高新低状态 + * + * @param stockHighLowStatusList 个股新高新低状态集合 + * @return 结果 + */ + public int batchInsertStockHighLowStatus(List stockHighLowStatusList); + + /** + * 批量更新或插入个股新高新低状态(ON DUPLICATE KEY UPDATE) + * + * @param stockHighLowStatusList 个股新高新低状态集合 + * @return 结果 + */ + public int batchUpsertStockHighLowStatus(List stockHighLowStatusList); + + /** + * 查询创新高股票列表 + * + * @param stockHighLowStatus 查询条件 + * @return 创新高股票列表 + */ + public List selectNewHighStockList(TStockHighLowStatus stockHighLowStatus); + + /** + * 查询创新低股票列表 + * + * @param stockHighLowStatus 查询条件 + * @return 创新低股票列表 + */ + public List selectNewLowStockList(TStockHighLowStatus stockHighLowStatus); +} 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..85bee7d --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IIndustryIndexService.java @@ -0,0 +1,80 @@ +package com.ruoyi.newstocksystem.service; + +import com.ruoyi.newstocksystem.domain.TIndustryIndex; + +import java.util.Date; +import java.util.List; + +/** + * 行业指数Service接口 + * + * @author lxy + * @date 2026-01-21 + */ +public interface IIndustryIndexService +{ + /** + * 根据行业指数代码和交易日期查询行业指数 + * + * @param industryIndexCode 行业指数代码 + * @param tradeDate 交易日期 + * @return 行业指数 + */ + public TIndustryIndex selectIndustryIndexByCodeAndDate(String industryIndexCode, Date tradeDate); + + /** + * 查询行业指数列表 + * + * @param industryIndex 行业指数 + * @return 行业指数集合 + */ + public List selectIndustryIndexList(TIndustryIndex industryIndex); + + /** + * 查询所有行业指数基础信息(去重) + * + * @return 行业指数基础信息集合 + */ + public List selectDistinctIndustryIndexList(); + + /** + * 新增行业指数 + * + * @param industryIndex 行业指数 + * @return 结果 + */ + public int insertIndustryIndex(TIndustryIndex industryIndex); + + /** + * 修改行业指数 + * + * @param industryIndex 行业指数 + * @return 结果 + */ + public int updateIndustryIndex(TIndustryIndex industryIndex); + + /** + * 删除行业指数 + * + * @param industryIndexCode 行业指数代码 + * @param tradeDate 交易日期 + * @return 结果 + */ + public int deleteIndustryIndexByCodeAndDate(String industryIndexCode, Date tradeDate); + + /** + * 导入行业指数数据 + * + * @param industryIndexList 行业指数数据 + * @param tradeDate 交易日期 + * @return 导入条数 + */ + public int importIndustryIndex(List industryIndexList, Date tradeDate); + + /** + * 查询交易日期列表 + * + * @return 交易日期列表 + */ + public List selectTradeDates(); +} 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..3c55646 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockBasicService.java @@ -0,0 +1,78 @@ +package com.ruoyi.newstocksystem.service; + +import com.ruoyi.newstocksystem.domain.TStockBasic; + +import java.util.List; + +/** + * 个股基础信息Service接口 + * + * @author lxy + * @date 2026-01-21 + */ +public interface IStockBasicService +{ + /** + * 根据证券代码查询个股基础信息 + * + * @param stockCode 证券代码 + * @return 个股基础信息 + */ + public TStockBasic selectStockBasicByCode(String stockCode); + + /** + * 查询个股基础信息列表 + * + * @param stockBasic 个股基础信息 + * @return 个股基础信息集合 + */ + public List selectStockBasicList(TStockBasic stockBasic); + + /** + * 新增个股基础信息 + * + * @param stockBasic 个股基础信息 + * @return 结果 + */ + public int insertStockBasic(TStockBasic stockBasic); + + /** + * 修改个股基础信息 + * + * @param stockBasic 个股基础信息 + * @return 结果 + */ + public int updateStockBasic(TStockBasic stockBasic); + + /** + * 删除个股基础信息 + * + * @param stockCode 证券代码 + * @return 结果 + */ + public int deleteStockBasicByCode(String stockCode); + + /** + * 批量删除个股基础信息 + * + * @param stockCodes 需要删除的数据证券代码集合 + * @return 结果 + */ + public int deleteStockBasicByCodes(String[] stockCodes); + + /** + * 导入个股基础信息数据 + * + * @param stockBasicList 个股基础信息数据 + * @return 导入条数 + */ + public int importStockBasic(List stockBasicList); + + /** + * 根据行业指数代码查询个股列表 + * + * @param industryIndexCode 行业指数代码 + * @return 个股基础信息集合 + */ + public List selectStockBasicByIndustryCode(String industryIndexCode); +} 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..afbc2e9 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockDailyTradeService.java @@ -0,0 +1,97 @@ +package com.ruoyi.newstocksystem.service; + +import com.ruoyi.newstocksystem.domain.TStockDailyTrade; + +import java.util.Date; +import java.util.List; + +/** + * 个股每日交易数据Service接口 + * + * @author lxy + * @date 2026-01-21 + */ +public interface IStockDailyTradeService +{ + /** + * 根据证券代码和交易日期查询交易数据 + * + * @param stockCode 证券代码 + * @param tradeDate 交易日期 + * @return 交易数据 + */ + public TStockDailyTrade selectStockDailyTradeByCodeAndDate(String stockCode, Date tradeDate); + + /** + * 查询个股每日交易数据列表 + * + * @param stockDailyTrade 个股每日交易数据 + * @return 个股每日交易数据集合 + */ + public List selectStockDailyTradeList(TStockDailyTrade stockDailyTrade); + + /** + * 查询个股每日交易数据列表(包含基础信息) + * + * @param stockDailyTrade 个股每日交易数据 + * @return 个股每日交易数据集合 + */ + public List selectStockDailyTradeListWithBasic(TStockDailyTrade stockDailyTrade); + + /** + * 新增个股每日交易数据 + * + * @param stockDailyTrade 个股每日交易数据 + * @return 结果 + */ + public int insertStockDailyTrade(TStockDailyTrade stockDailyTrade); + + /** + * 修改个股每日交易数据 + * + * @param stockDailyTrade 个股每日交易数据 + * @return 结果 + */ + public int updateStockDailyTrade(TStockDailyTrade stockDailyTrade); + + /** + * 删除个股每日交易数据 + * + * @param stockCode 证券代码 + * @param tradeDate 交易日期 + * @return 结果 + */ + public int deleteStockDailyTradeByCodeAndDate(String stockCode, Date tradeDate); + + /** + * 导入个股每日交易数据 + * + * @param stockDailyTradeList 个股每日交易数据 + * @param tradeDate 交易日期 + * @return 导入条数 + */ + public int importStockDailyTrade(List stockDailyTradeList, Date tradeDate); + + /** + * 查询交易日期列表 + * + * @return 交易日期列表 + */ + public List selectTradeDates(); + + /** + * 查询涨停股列表 + * + * @param stockDailyTrade 查询条件 + * @return 涨停股列表 + */ + public List selectLimitUpStockList(TStockDailyTrade stockDailyTrade); + + /** + * 查询强势股列表(按动量排序) + * + * @param stockDailyTrade 查询条件 + * @return 强势股列表 + */ + public List selectStrongStockList(TStockDailyTrade stockDailyTrade); +} 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..4713179 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/IStockHighLowStatusService.java @@ -0,0 +1,90 @@ +package com.ruoyi.newstocksystem.service; + +import com.ruoyi.newstocksystem.domain.TStockHighLowStatus; + +import java.util.Date; +import java.util.List; + +/** + * 个股新高新低状态Service接口 + * + * @author lxy + * @date 2026-01-21 + */ +public interface IStockHighLowStatusService +{ + /** + * 根据证券代码和交易日期查询新高新低状态 + * + * @param stockCode 证券代码 + * @param tradeDate 交易日期 + * @return 新高新低状态 + */ + public TStockHighLowStatus selectStockHighLowStatusByCodeAndDate(String stockCode, Date tradeDate); + + /** + * 查询个股新高新低状态列表 + * + * @param stockHighLowStatus 个股新高新低状态 + * @return 个股新高新低状态集合 + */ + public List selectStockHighLowStatusList(TStockHighLowStatus stockHighLowStatus); + + /** + * 查询个股新高新低状态列表(包含基础信息) + * + * @param stockHighLowStatus 个股新高新低状态 + * @return 个股新高新低状态集合 + */ + public List selectStockHighLowStatusListWithBasic(TStockHighLowStatus stockHighLowStatus); + + /** + * 新增个股新高新低状态 + * + * @param stockHighLowStatus 个股新高新低状态 + * @return 结果 + */ + public int insertStockHighLowStatus(TStockHighLowStatus stockHighLowStatus); + + /** + * 修改个股新高新低状态 + * + * @param stockHighLowStatus 个股新高新低状态 + * @return 结果 + */ + public int updateStockHighLowStatus(TStockHighLowStatus stockHighLowStatus); + + /** + * 删除个股新高新低状态 + * + * @param stockCode 证券代码 + * @param tradeDate 交易日期 + * @return 结果 + */ + public int deleteStockHighLowStatusByCodeAndDate(String stockCode, Date tradeDate); + + /** + * 批量导入个股新高新低状态数据 + * + * @param stockHighLowStatusList 个股新高新低状态数据 + * @param tradeDate 交易日期 + * @return 导入条数 + */ + public int importStockHighLowStatus(List stockHighLowStatusList, Date tradeDate); + + /** + * 查询创新高股票列表 + * + * @param stockHighLowStatus 查询条件 + * @return 创新高股票列表 + */ + public List selectNewHighStockList(TStockHighLowStatus stockHighLowStatus); + + /** + * 查询创新低股票列表 + * + * @param stockHighLowStatus 查询条件 + * @return 创新低股票列表 + */ + public List selectNewLowStockList(TStockHighLowStatus stockHighLowStatus); +} 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..d6d69db --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/IndustryIndexServiceImpl.java @@ -0,0 +1,99 @@ +package com.ruoyi.newstocksystem.service.impl; + +import java.util.Date; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ruoyi.newstocksystem.domain.TIndustryIndex; +import com.ruoyi.newstocksystem.mapper.TIndustryIndexMapper; +import com.ruoyi.newstocksystem.service.IIndustryIndexService; + +/** + * 行业指数Service实现类 + * + * @author lxy + * @date 2026-01-21 + */ +@Service +public class IndustryIndexServiceImpl implements IIndustryIndexService +{ + @Autowired + private TIndustryIndexMapper industryIndexMapper; + + @Override + public TIndustryIndex selectIndustryIndexByCodeAndDate(String industryIndexCode, Date tradeDate) + { + return industryIndexMapper.selectIndustryIndexByCodeAndDate(industryIndexCode, tradeDate); + } + + @Override + public List selectIndustryIndexList(TIndustryIndex industryIndex) + { + return industryIndexMapper.selectIndustryIndexList(industryIndex); + } + + @Override + public List selectDistinctIndustryIndexList() + { + return industryIndexMapper.selectDistinctIndustryIndexList(); + } + + @Override + public int insertIndustryIndex(TIndustryIndex industryIndex) + { + return industryIndexMapper.insertIndustryIndex(industryIndex); + } + + @Override + public int updateIndustryIndex(TIndustryIndex industryIndex) + { + return industryIndexMapper.updateIndustryIndex(industryIndex); + } + + @Override + public int deleteIndustryIndexByCodeAndDate(String industryIndexCode, Date tradeDate) + { + return industryIndexMapper.deleteIndustryIndexByCodeAndDate(industryIndexCode, tradeDate); + } + + @Override + @Transactional + public int importIndustryIndex(List industryIndexList, Date tradeDate) + { + if (industryIndexList == null || industryIndexList.isEmpty()) + { + return 0; + } + + // 设置交易日期 + for (TIndustryIndex industryIndex : industryIndexList) + { + if (industryIndex.getTradeDate() == null) + { + industryIndex.setTradeDate(tradeDate); + } + } + + int count = 0; + int batchSize = 500; + + // 分批导入数据 + for (int i = 0; i < industryIndexList.size(); i += batchSize) + { + int end = Math.min(i + batchSize, industryIndexList.size()); + List batchList = industryIndexList.subList(i, end); + count += industryIndexMapper.batchUpsertIndustryIndex(batchList); + } + + return count; + } + + @Override + public List selectTradeDates() + { + return industryIndexMapper.selectTradeDates(); + } +} 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..8db5e8d --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockBasicServiceImpl.java @@ -0,0 +1,89 @@ +package com.ruoyi.newstocksystem.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ruoyi.newstocksystem.domain.TStockBasic; +import com.ruoyi.newstocksystem.mapper.TStockBasicMapper; +import com.ruoyi.newstocksystem.service.IStockBasicService; + +/** + * 个股基础信息Service实现类 + * + * @author lxy + * @date 2026-01-21 + */ +@Service +public class StockBasicServiceImpl implements IStockBasicService +{ + @Autowired + private TStockBasicMapper stockBasicMapper; + + @Override + public TStockBasic selectStockBasicByCode(String stockCode) + { + return stockBasicMapper.selectStockBasicByCode(stockCode); + } + + @Override + public List selectStockBasicList(TStockBasic stockBasic) + { + return stockBasicMapper.selectStockBasicList(stockBasic); + } + + @Override + public int insertStockBasic(TStockBasic stockBasic) + { + return stockBasicMapper.insertStockBasic(stockBasic); + } + + @Override + public int updateStockBasic(TStockBasic stockBasic) + { + return stockBasicMapper.updateStockBasic(stockBasic); + } + + @Override + public int deleteStockBasicByCode(String stockCode) + { + return stockBasicMapper.deleteStockBasicByCode(stockCode); + } + + @Override + public int deleteStockBasicByCodes(String[] stockCodes) + { + return stockBasicMapper.deleteStockBasicByCodes(stockCodes); + } + + @Override + @Transactional + public int importStockBasic(List stockBasicList) + { + if (stockBasicList == null || stockBasicList.isEmpty()) + { + return 0; + } + + int count = 0; + int batchSize = 500; + + // 分批导入数据(使用 upsert 方式,自动处理新增和更新) + for (int i = 0; i < stockBasicList.size(); i += batchSize) + { + int end = Math.min(i + batchSize, stockBasicList.size()); + List batchList = stockBasicList.subList(i, end); + count += stockBasicMapper.batchUpsertStockBasic(batchList); + } + + return count; + } + + @Override + public List selectStockBasicByIndustryCode(String industryIndexCode) + { + return stockBasicMapper.selectStockBasicByIndustryCode(industryIndexCode); + } +} 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..46b8f21 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockDailyTradeServiceImpl.java @@ -0,0 +1,120 @@ +package com.ruoyi.newstocksystem.service.impl; + +import java.util.Date; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ruoyi.newstocksystem.domain.TStockDailyTrade; +import com.ruoyi.newstocksystem.mapper.TStockDailyTradeMapper; +import com.ruoyi.newstocksystem.service.IStockDailyTradeService; + +/** + * 个股每日交易数据Service实现类 + * + * @author lxy + * @date 2026-01-21 + */ +@Service +public class StockDailyTradeServiceImpl implements IStockDailyTradeService +{ + @Autowired + private TStockDailyTradeMapper stockDailyTradeMapper; + + @Override + public TStockDailyTrade selectStockDailyTradeByCodeAndDate(String stockCode, Date tradeDate) + { + return stockDailyTradeMapper.selectStockDailyTradeByCodeAndDate(stockCode, tradeDate); + } + + @Override + public List selectStockDailyTradeList(TStockDailyTrade stockDailyTrade) + { + return stockDailyTradeMapper.selectStockDailyTradeList(stockDailyTrade); + } + + @Override + public List selectStockDailyTradeListWithBasic(TStockDailyTrade stockDailyTrade) + { + return stockDailyTradeMapper.selectStockDailyTradeListWithBasic(stockDailyTrade); + } + + @Override + public int insertStockDailyTrade(TStockDailyTrade stockDailyTrade) + { + return stockDailyTradeMapper.insertStockDailyTrade(stockDailyTrade); + } + + @Override + public int updateStockDailyTrade(TStockDailyTrade stockDailyTrade) + { + return stockDailyTradeMapper.updateStockDailyTrade(stockDailyTrade); + } + + @Override + public int deleteStockDailyTradeByCodeAndDate(String stockCode, Date tradeDate) + { + return stockDailyTradeMapper.deleteStockDailyTradeByCodeAndDate(stockCode, tradeDate); + } + + @Override + @Transactional + public int importStockDailyTrade(List stockDailyTradeList, Date tradeDate) + { + if (stockDailyTradeList == null || stockDailyTradeList.isEmpty()) + { + return 0; + } + + // 设置交易日期 + for (TStockDailyTrade stockDailyTrade : stockDailyTradeList) + { + if (stockDailyTrade.getTradeDate() == null) + { + stockDailyTrade.setTradeDate(tradeDate); + } + // 设置默认值 + if (stockDailyTrade.getIsLimitUp() == null) + { + stockDailyTrade.setIsLimitUp(0); + } + if (stockDailyTrade.getIsLimitDown() == null) + { + stockDailyTrade.setIsLimitDown(0); + } + } + + int count = 0; + int batchSize = 500; + + // 分批导入数据 + for (int i = 0; i < stockDailyTradeList.size(); i += batchSize) + { + int end = Math.min(i + batchSize, stockDailyTradeList.size()); + List batchList = stockDailyTradeList.subList(i, end); + count += stockDailyTradeMapper.batchUpsertStockDailyTrade(batchList); + } + + return count; + } + + @Override + public List selectTradeDates() + { + return stockDailyTradeMapper.selectTradeDates(); + } + + @Override + public List selectLimitUpStockList(TStockDailyTrade stockDailyTrade) + { + return stockDailyTradeMapper.selectLimitUpStockList(stockDailyTrade); + } + + @Override + public List selectStrongStockList(TStockDailyTrade stockDailyTrade) + { + return stockDailyTradeMapper.selectStrongStockList(stockDailyTrade); + } +} 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..f1e9952 --- /dev/null +++ b/newstock-system/src/main/java/com/ruoyi/newstocksystem/service/impl/StockHighLowStatusServiceImpl.java @@ -0,0 +1,114 @@ +package com.ruoyi.newstocksystem.service.impl; + +import java.util.Date; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ruoyi.newstocksystem.domain.TStockHighLowStatus; +import com.ruoyi.newstocksystem.mapper.TStockHighLowStatusMapper; +import com.ruoyi.newstocksystem.service.IStockHighLowStatusService; + +/** + * 个股新高新低状态Service实现类 + * + * @author lxy + * @date 2026-01-21 + */ +@Service +public class StockHighLowStatusServiceImpl implements IStockHighLowStatusService +{ + @Autowired + private TStockHighLowStatusMapper stockHighLowStatusMapper; + + @Override + public TStockHighLowStatus selectStockHighLowStatusByCodeAndDate(String stockCode, Date tradeDate) + { + return stockHighLowStatusMapper.selectStockHighLowStatusByCodeAndDate(stockCode, tradeDate); + } + + @Override + public List selectStockHighLowStatusList(TStockHighLowStatus stockHighLowStatus) + { + return stockHighLowStatusMapper.selectStockHighLowStatusList(stockHighLowStatus); + } + + @Override + public List selectStockHighLowStatusListWithBasic(TStockHighLowStatus stockHighLowStatus) + { + return stockHighLowStatusMapper.selectStockHighLowStatusListWithBasic(stockHighLowStatus); + } + + @Override + public int insertStockHighLowStatus(TStockHighLowStatus stockHighLowStatus) + { + return stockHighLowStatusMapper.insertStockHighLowStatus(stockHighLowStatus); + } + + @Override + public int updateStockHighLowStatus(TStockHighLowStatus stockHighLowStatus) + { + return stockHighLowStatusMapper.updateStockHighLowStatus(stockHighLowStatus); + } + + @Override + public int deleteStockHighLowStatusByCodeAndDate(String stockCode, Date tradeDate) + { + return stockHighLowStatusMapper.deleteStockHighLowStatusByCodeAndDate(stockCode, tradeDate); + } + + @Override + @Transactional + public int importStockHighLowStatus(List stockHighLowStatusList, Date tradeDate) + { + if (stockHighLowStatusList == null || stockHighLowStatusList.isEmpty()) + { + return 0; + } + + // 设置交易日期 + for (TStockHighLowStatus stockHighLowStatus : stockHighLowStatusList) + { + if (stockHighLowStatus.getTradeDate() == null) + { + stockHighLowStatus.setTradeDate(tradeDate); + } + // 设置默认值 + if (stockHighLowStatus.getIsNewHigh() == null) + { + stockHighLowStatus.setIsNewHigh(0); + } + if (stockHighLowStatus.getIsNewLow() == null) + { + stockHighLowStatus.setIsNewLow(0); + } + } + + int count = 0; + int batchSize = 500; + + // 分批导入数据 + for (int i = 0; i < stockHighLowStatusList.size(); i += batchSize) + { + int end = Math.min(i + batchSize, stockHighLowStatusList.size()); + List batchList = stockHighLowStatusList.subList(i, end); + count += stockHighLowStatusMapper.batchUpsertStockHighLowStatus(batchList); + } + + return count; + } + + @Override + public List selectNewHighStockList(TStockHighLowStatus stockHighLowStatus) + { + return stockHighLowStatusMapper.selectNewHighStockList(stockHighLowStatus); + } + + @Override + public List selectNewLowStockList(TStockHighLowStatus stockHighLowStatus) + { + return stockHighLowStatusMapper.selectNewLowStockList(stockHighLowStatus); + } +} 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..dd3dd5f --- /dev/null +++ b/newstock-system/src/main/resources/mapper/newstocksystem/IndustryIndexMapper.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + 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, + + + #{industryIndexCode}, + #{industryIndexName}, + #{componentCount}, + #{tradeDate}, + #{openPrice}, + #{closePrice}, + #{volume}, + #{turnover}, + #{totalMarketCap}, + #{freeCirculationCap}, + #{priceChangeRate}, + #{peTtm}, + #{peTtmMedian}, + NOW(), + + + + + 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 = NOW(), + + where industry_index_code = #{industryIndexCode} and trade_date = #{tradeDate} + + + + delete from t_industry_index where industry_index_code = #{param1} and trade_date = #{param2} + + + + 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) + values + + (#{item.industryIndexCode}, #{item.industryIndexName}, #{item.componentCount}, #{item.tradeDate}, + #{item.openPrice}, #{item.closePrice}, #{item.volume}, #{item.turnover}, #{item.totalMarketCap}, + #{item.freeCirculationCap}, #{item.priceChangeRate}, #{item.peTtm}, #{item.peTtmMedian}, NOW()) + + + + + 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) + values + + (#{item.industryIndexCode}, #{item.industryIndexName}, #{item.componentCount}, #{item.tradeDate}, + #{item.openPrice}, #{item.closePrice}, #{item.volume}, #{item.turnover}, #{item.totalMarketCap}, + #{item.freeCirculationCap}, #{item.priceChangeRate}, #{item.peTtm}, #{item.peTtmMedian}, NOW()) + + ON DUPLICATE KEY UPDATE + industry_index_name = VALUES(industry_index_name), + component_count = VALUES(component_count), + open_price = VALUES(open_price), + close_price = VALUES(close_price), + volume = VALUES(volume), + turnover = VALUES(turnover), + total_market_cap = VALUES(total_market_cap), + free_circulation_cap = VALUES(free_circulation_cap), + price_change_rate = VALUES(price_change_rate), + pe_ttm = VALUES(pe_ttm), + pe_ttm_median = VALUES(pe_ttm_median), + update_time = NOW() + + 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..07b2ce3 --- /dev/null +++ b/newstock-system/src/main/resources/mapper/newstocksystem/StockBasicMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + 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, + + + #{stockCode}, + #{stockName}, + #{listingDate}, + #{listingDays}, + #{isSt}, + #{isStarSt}, + #{industryIndexCode}, + #{industryIndexName}, + NOW(), + + + + + 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 = NOW(), + + where stock_code = #{stockCode} + + + + delete from t_stock_basic where stock_code = #{stockCode} + + + + delete from t_stock_basic where stock_code in + + #{stockCode} + + + + + 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) + values + + (#{item.stockCode}, #{item.stockName}, #{item.listingDate}, #{item.listingDays}, + #{item.isSt}, #{item.isStarSt}, #{item.industryIndexCode}, #{item.industryIndexName}, NOW()) + + + + + 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) + values + + (#{item.stockCode}, #{item.stockName}, #{item.listingDate}, #{item.listingDays}, + #{item.isSt}, #{item.isStarSt}, #{item.industryIndexCode}, #{item.industryIndexName}, NOW()) + + ON DUPLICATE KEY UPDATE + stock_name = VALUES(stock_name), + listing_date = VALUES(listing_date), + listing_days = VALUES(listing_days), + is_st = VALUES(is_st), + is_star_st = VALUES(is_star_st), + industry_index_code = VALUES(industry_index_code), + industry_index_name = VALUES(industry_index_name), + update_time = NOW() + + 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..64a5c99 --- /dev/null +++ b/newstock-system/src/main/resources/mapper/newstocksystem/StockDailyTradeMapper.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + select t.stock_code, t.trade_date, t.open_price, t.close_price, t.high_price, t.low_price, + t.price_change_rate, t.volume, t.turnover, t.free_circulation_cap, + t.is_limit_up, t.is_limit_down, t.momentum_10d, t.momentum_20d, t.momentum_60d, t.create_time, + b.stock_name, b.industry_index_code, b.industry_index_name + from t_stock_daily_trade t + left join t_stock_basic b on t.stock_code = b.stock_code + + + + + + + + + + + + + + + + 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}, + NOW(), + + + + + 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} + + + + 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) + values + + (#{item.stockCode}, #{item.tradeDate}, #{item.openPrice}, #{item.closePrice}, #{item.highPrice}, #{item.lowPrice}, + #{item.priceChangeRate}, #{item.volume}, #{item.turnover}, #{item.freeCirculationCap}, + #{item.isLimitUp}, #{item.isLimitDown}, #{item.momentum10d}, #{item.momentum20d}, #{item.momentum60d}, NOW()) + + + + + 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) + values + + (#{item.stockCode}, #{item.tradeDate}, #{item.openPrice}, #{item.closePrice}, #{item.highPrice}, #{item.lowPrice}, + #{item.priceChangeRate}, #{item.volume}, #{item.turnover}, #{item.freeCirculationCap}, + #{item.isLimitUp}, #{item.isLimitDown}, #{item.momentum10d}, #{item.momentum20d}, #{item.momentum60d}, NOW()) + + ON DUPLICATE KEY UPDATE + open_price = VALUES(open_price), + close_price = VALUES(close_price), + high_price = VALUES(high_price), + low_price = VALUES(low_price), + price_change_rate = VALUES(price_change_rate), + volume = VALUES(volume), + turnover = VALUES(turnover), + free_circulation_cap = VALUES(free_circulation_cap), + is_limit_up = VALUES(is_limit_up), + is_limit_down = VALUES(is_limit_down), + momentum_10d = VALUES(momentum_10d), + momentum_20d = VALUES(momentum_20d), + momentum_60d = VALUES(momentum_60d) + + 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..daba656 --- /dev/null +++ b/newstock-system/src/main/resources/mapper/newstocksystem/StockHighLowStatusMapper.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + 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 + + + + select h.stock_code, h.trade_date, h.is_new_high, h.new_high_date, h.is_new_low, h.new_low_date, h.create_time, + b.stock_name, b.industry_index_code, b.industry_index_name + from t_stock_high_low_status h + left join t_stock_basic b on h.stock_code = b.stock_code + + + + + + + + + + + + + + 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}, + NOW(), + + + + + 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} + + + + 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) + values + + (#{item.stockCode}, #{item.tradeDate}, #{item.isNewHigh}, #{item.newHighDate}, #{item.isNewLow}, #{item.newLowDate}, NOW()) + + + + + 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) + values + + (#{item.stockCode}, #{item.tradeDate}, #{item.isNewHigh}, #{item.newHighDate}, #{item.isNewLow}, #{item.newLowDate}, NOW()) + + ON DUPLICATE KEY UPDATE + is_new_high = VALUES(is_new_high), + new_high_date = VALUES(new_high_date), + is_new_low = VALUES(is_new_low), + new_low_date = VALUES(new_low_date) + + diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index 0c623a5..890a5b0 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -7,7 +7,7 @@ spring: # 主库数据源 master: # url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - url: jdbc:mysql://192.168.0.222:3306/ry_refactor0118?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://192.168.0.222:3306/ry_refactor0120?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 1qazse42W3 # 从库数据源 diff --git a/ruoyi-ui/src/api/newstocksystem/stockdata.js b/ruoyi-ui/src/api/newstocksystem/stockdata.js new file mode 100644 index 0000000..86a486b --- /dev/null +++ b/ruoyi-ui/src/api/newstocksystem/stockdata.js @@ -0,0 +1,197 @@ +import request from '@/utils/request' + +// 股票行情数据 API +export default { + // ========================= 行业指数相关 ========================= + + // 查询行业指数列表 + listIndustryIndex(query) { + return request({ + url: '/newstocksystem/stockdata/industryIndex/list', + method: 'get', + params: query + }) + }, + + // 查询所有行业指数基础信息(去重) + getDistinctIndustryIndexList() { + return request({ + url: '/newstocksystem/stockdata/industryIndex/distinctList', + method: 'get' + }) + }, + + // 导出行业指数数据 + exportIndustryIndex(query) { + return request({ + url: '/newstocksystem/stockdata/industryIndex/export', + method: 'post', + params: query, + responseType: 'blob' + }) + }, + + // 查询行业指数交易日期列表 + getIndustryIndexTradeDates() { + return request({ + url: '/newstocksystem/stockdata/industryIndex/tradeDates', + method: 'get' + }) + }, + + // ========================= 个股基础信息相关 ========================= + + // 查询个股基础信息列表 + listStockBasic(query) { + return request({ + url: '/newstocksystem/stockdata/stockBasic/list', + method: 'get', + params: query + }) + }, + + // 根据证券代码获取个股基础信息 + getStockBasicInfo(stockCode) { + return request({ + url: `/newstocksystem/stockdata/stockBasic/${stockCode}`, + method: 'get' + }) + }, + + // 导出个股基础信息 + exportStockBasic(query) { + return request({ + url: '/newstocksystem/stockdata/stockBasic/export', + method: 'post', + params: query, + responseType: 'blob' + }) + }, + + // 新增个股基础信息 + addStockBasic(data) { + return request({ + url: '/newstocksystem/stockdata/stockBasic', + method: 'post', + data: data + }) + }, + + // 修改个股基础信息 + updateStockBasic(data) { + return request({ + url: '/newstocksystem/stockdata/stockBasic', + method: 'put', + data: data + }) + }, + + // 删除个股基础信息 + deleteStockBasic(stockCodes) { + return request({ + url: `/newstocksystem/stockdata/stockBasic/${stockCodes}`, + method: 'delete' + }) + }, + + // ========================= 个股每日交易数据相关 ========================= + + // 查询个股每日交易数据列表 + listStockDailyTrade(query) { + return request({ + url: '/newstocksystem/stockdata/stockDailyTrade/list', + method: 'get', + params: query + }) + }, + + // 查询个股每日交易数据列表(包含基础信息) + listStockDailyTradeWithBasic(query) { + return request({ + url: '/newstocksystem/stockdata/stockDailyTrade/listWithBasic', + method: 'get', + params: query + }) + }, + + // 导出个股每日交易数据 + exportStockDailyTrade(query) { + return request({ + url: '/newstocksystem/stockdata/stockDailyTrade/export', + method: 'post', + params: query, + responseType: 'blob' + }) + }, + + // 查询个股交易日期列表 + getStockDailyTradeDates() { + return request({ + url: '/newstocksystem/stockdata/stockDailyTrade/tradeDates', + method: 'get' + }) + }, + + // 查询涨停股列表 + listLimitUpStocks(query) { + return request({ + url: '/newstocksystem/stockdata/stockDailyTrade/limitUpList', + method: 'get', + params: query + }) + }, + + // 查询强势股列表 + listStrongStocks(query) { + return request({ + url: '/newstocksystem/stockdata/stockDailyTrade/strongList', + method: 'get', + params: query + }) + }, + + // ========================= 个股新高新低状态相关 ========================= + + // 查询个股新高新低状态列表 + listStockHighLowStatus(query) { + return request({ + url: '/newstocksystem/stockdata/stockHighLow/list', + method: 'get', + params: query + }) + }, + + // 查询个股新高新低状态列表(包含基础信息) + listStockHighLowStatusWithBasic(query) { + return request({ + url: '/newstocksystem/stockdata/stockHighLow/listWithBasic', + method: 'get', + params: query + }) + }, + + // 查询创新高股票列表 + listNewHighStocks(query) { + return request({ + url: '/newstocksystem/stockdata/stockHighLow/newHighList', + method: 'get', + params: query + }) + }, + + // 查询创新低股票列表 + listNewLowStocks(query) { + return request({ + url: '/newstocksystem/stockdata/stockHighLow/newLowList', + method: 'get', + params: query + }) + } +} + +// 导入接口 URL 常量 +export const IMPORT_URLS = { + industryIndex: '/newstocksystem/stockdata/industryIndex/importData', + stockBasic: '/newstocksystem/stockdata/stockBasic/importData', + stockDailyTrade: '/newstocksystem/stockdata/stockDailyTrade/importData' +} diff --git a/ruoyi-ui/src/views/newstocksystem/stockdata.vue b/ruoyi-ui/src/views/newstocksystem/stockdata.vue new file mode 100644 index 0000000..5953976 --- /dev/null +++ b/ruoyi-ui/src/views/newstocksystem/stockdata.vue @@ -0,0 +1,560 @@ + + + + +