| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- package com.yingpai.gupiao.service.impl;
- import com.yingpai.gupiao.domain.vo.StockHistoryVO;
- import com.yingpai.gupiao.mapper.StockPoolHistoryMapper;
- import com.yingpai.gupiao.mapper.StockPoolMapper;
- import com.yingpai.gupiao.service.StockHistoryService;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.stereotype.Service;
- import java.time.LocalDate;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- /**
- * 股票历史数据服务实现类(小程序端)
- * 查询stock_pool表中status为1(历史有效)的记录
- */
- @Slf4j
- @Service
- @RequiredArgsConstructor
- public class StockHistoryServiceImpl implements StockHistoryService {
- private final StockPoolMapper stockPoolMapper;
- private final StockPoolHistoryMapper stockPoolHistoryMapper;
-
- @Override
- public Map<String, Object> queryHistoryPage(LocalDate startDate, LocalDate endDate, Integer poolType, int pageNum, int pageSize) {
- // 计算偏移量
- int offset = (pageNum - 1) * pageSize;
- // 查询stock_pool表中status为1和2的数据
- List<StockHistoryVO> list = stockPoolMapper.selectPoolHistory(
- startDate, endDate, poolType, offset, pageSize
- );
- // 计算每条记录的成功/失败状态
- for (StockHistoryVO vo : list) {
- if (vo.getNextDayHighTrend() != null) {
- if (vo.getNextDayHighTrend().compareTo(new java.math.BigDecimal("2")) >= 0) {
- vo.setStatus("success"); // 涨幅 >= 2%,成功
- } else if (vo.getNextDayHighTrend().compareTo(new java.math.BigDecimal("-3")) <= 0) {
- vo.setStatus("fail"); // 涨幅 <= -3%,失败
- }
- // 否则 status 保持为 null(无状态)
- }
- }
- // 查询全量统计(分母统一为有隔日数据的记录)
- Map<String, Object> stats = stockPoolMapper.selectPoolHistoryStats(startDate, endDate, poolType);
- long successCount = stats != null && stats.get("successCount") != null ? ((Number) stats.get("successCount")).longValue() : 0;
- long failCount = stats != null && stats.get("failCount") != null ? ((Number) stats.get("failCount")).longValue() : 0;
- // 总记录数(含无隔日数据的,用于分页)
- int total = stockPoolMapper.countPoolHistory(startDate, endDate, poolType);
- // 计算总页数
- int pages = (total + pageSize - 1) / pageSize;
- // 构建返回结果
- Map<String, Object> result = new HashMap<>();
- result.put("list", list);
- result.put("total", total);
- result.put("successCount", successCount);
- result.put("failCount", failCount);
- result.put("pageNum", pageNum);
- result.put("pageSize", pageSize);
- result.put("pages", pages);
- result.put("hasMore", pageNum < pages);
- return result;
- }
-
- @Override
- public Map<String, Object> queryHistoryStats(LocalDate startDate, LocalDate endDate, Integer poolType) {
- Map<String, Object> stats = stockPoolMapper.selectPoolHistoryStats(startDate, endDate, poolType);
- long totalCount = stats != null && stats.get("totalCount") != null ? ((Number) stats.get("totalCount")).longValue() : 0;
- long successCount = stats != null && stats.get("successCount") != null ? ((Number) stats.get("successCount")).longValue() : 0;
- long failCount = stats != null && stats.get("failCount") != null ? ((Number) stats.get("failCount")).longValue() : 0;
- String successRate = totalCount > 0 ? String.format("%.1f%%", (successCount * 100.0 / totalCount)) : "0%";
- String avgTrend = "+0%";
- if (stats != null && stats.get("avgTrend") != null) {
- java.math.BigDecimal avg = new java.math.BigDecimal(stats.get("avgTrend").toString())
- .setScale(2, java.math.RoundingMode.HALF_UP);
- avgTrend = String.format("%+.2f%%", avg);
- }
- Map<String, Object> result = new HashMap<>();
- result.put("totalCount", totalCount);
- result.put("successCount", successCount);
- result.put("failCount", failCount);
- result.put("successRate", successRate);
- result.put("avgTrend", avgTrend);
- return result;
- }
-
- @Override
- public Map<String, Object> queryLatestHistoryByKeyword(String keyword) {
- Map<String, Object> result = new HashMap<>();
- StockHistoryVO vo = stockPoolHistoryMapper.selectLatestByKeyword(keyword);
- if (vo != null) {
- result.put("found", true);
- result.put("recordDate", vo.getRecordDate());
- result.put("stockCode", vo.getStockCode());
- result.put("stockName", vo.getStockName());
- result.put("strengthScore", vo.getStrengthScore());
- result.put("closePrice", vo.getClosePrice());
- result.put("changePercent", vo.getChangePercent());
- result.put("totalAmount", vo.getTotalAmount());
- result.put("circulationMarketValue", vo.getCirculationMarketValue());
- result.put("mainRisePeriod", vo.getMainRisePeriod());
- result.put("recentLimitUp", vo.getRecentLimitUp());
- result.put("dayHighestPrice", vo.getDayHighestPrice());
- result.put("dayLowestPrice", vo.getDayLowestPrice());
- result.put("dayClosePrice", vo.getDayClosePrice());
- result.put("highTrend", vo.getHighTrend());
- } else {
- result.put("found", false);
- }
- return result;
- }
- @Override
- public Map<String, Object> queryHistoryByKeywordAndDate(String keyword, LocalDate recordDate) {
- Map<String, Object> result = new HashMap<>();
- StockHistoryVO vo = stockPoolHistoryMapper.selectByKeywordAndDate(keyword, recordDate);
- if (vo != null) {
- result.put("found", true);
- result.put("recordDate", vo.getRecordDate());
- result.put("stockCode", vo.getStockCode());
- result.put("stockName", vo.getStockName());
- result.put("strengthScore", vo.getStrengthScore());
- result.put("closePrice", vo.getClosePrice());
- result.put("changePercent", vo.getChangePercent());
- result.put("totalAmount", vo.getTotalAmount());
- result.put("circulationMarketValue", vo.getCirculationMarketValue());
- result.put("mainRisePeriod", vo.getMainRisePeriod());
- result.put("recentLimitUp", vo.getRecentLimitUp());
- result.put("dayHighestPrice", vo.getDayHighestPrice());
- result.put("dayLowestPrice", vo.getDayLowestPrice());
- result.put("dayClosePrice", vo.getDayClosePrice());
- result.put("highTrend", vo.getHighTrend());
- } else {
- result.put("found", false);
- }
- return result;
- }
- }
|