StockHistoryServiceImpl.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package com.yingpai.gupiao.service.impl;
  2. import com.yingpai.gupiao.domain.vo.StockHistoryVO;
  3. import com.yingpai.gupiao.mapper.StockPoolHistoryMapper;
  4. import com.yingpai.gupiao.mapper.StockPoolMapper;
  5. import com.yingpai.gupiao.service.StockHistoryService;
  6. import lombok.RequiredArgsConstructor;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.springframework.stereotype.Service;
  9. import java.time.LocalDate;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13. /**
  14. * 股票历史数据服务实现类(小程序端)
  15. * 查询stock_pool表中status为1(历史有效)的记录
  16. */
  17. @Slf4j
  18. @Service
  19. @RequiredArgsConstructor
  20. public class StockHistoryServiceImpl implements StockHistoryService {
  21. private final StockPoolMapper stockPoolMapper;
  22. private final StockPoolHistoryMapper stockPoolHistoryMapper;
  23. @Override
  24. public Map<String, Object> queryHistoryPage(LocalDate startDate, LocalDate endDate, Integer poolType, int pageNum, int pageSize) {
  25. // 计算偏移量
  26. int offset = (pageNum - 1) * pageSize;
  27. // 查询stock_pool表中status为1和2的数据
  28. List<StockHistoryVO> list = stockPoolMapper.selectPoolHistory(
  29. startDate, endDate, poolType, offset, pageSize
  30. );
  31. // 计算每条记录的成功/失败状态
  32. for (StockHistoryVO vo : list) {
  33. if (vo.getNextDayHighTrend() != null) {
  34. if (vo.getNextDayHighTrend().compareTo(new java.math.BigDecimal("2")) >= 0) {
  35. vo.setStatus("success"); // 涨幅 >= 2%,成功
  36. } else if (vo.getNextDayHighTrend().compareTo(new java.math.BigDecimal("-3")) <= 0) {
  37. vo.setStatus("fail"); // 涨幅 <= -3%,失败
  38. }
  39. // 否则 status 保持为 null(无状态)
  40. }
  41. }
  42. // 查询全量统计(分母统一为有隔日数据的记录)
  43. Map<String, Object> stats = stockPoolMapper.selectPoolHistoryStats(startDate, endDate, poolType);
  44. long successCount = stats != null && stats.get("successCount") != null ? ((Number) stats.get("successCount")).longValue() : 0;
  45. long failCount = stats != null && stats.get("failCount") != null ? ((Number) stats.get("failCount")).longValue() : 0;
  46. // 总记录数(含无隔日数据的,用于分页)
  47. int total = stockPoolMapper.countPoolHistory(startDate, endDate, poolType);
  48. // 计算总页数
  49. int pages = (total + pageSize - 1) / pageSize;
  50. // 构建返回结果
  51. Map<String, Object> result = new HashMap<>();
  52. result.put("list", list);
  53. result.put("total", total);
  54. result.put("successCount", successCount);
  55. result.put("failCount", failCount);
  56. result.put("pageNum", pageNum);
  57. result.put("pageSize", pageSize);
  58. result.put("pages", pages);
  59. result.put("hasMore", pageNum < pages);
  60. return result;
  61. }
  62. @Override
  63. public Map<String, Object> queryHistoryStats(LocalDate startDate, LocalDate endDate, Integer poolType) {
  64. Map<String, Object> stats = stockPoolMapper.selectPoolHistoryStats(startDate, endDate, poolType);
  65. long totalCount = stats != null && stats.get("totalCount") != null ? ((Number) stats.get("totalCount")).longValue() : 0;
  66. long successCount = stats != null && stats.get("successCount") != null ? ((Number) stats.get("successCount")).longValue() : 0;
  67. long failCount = stats != null && stats.get("failCount") != null ? ((Number) stats.get("failCount")).longValue() : 0;
  68. String successRate = totalCount > 0 ? String.format("%.1f%%", (successCount * 100.0 / totalCount)) : "0%";
  69. String avgTrend = "+0%";
  70. if (stats != null && stats.get("avgTrend") != null) {
  71. java.math.BigDecimal avg = new java.math.BigDecimal(stats.get("avgTrend").toString())
  72. .setScale(2, java.math.RoundingMode.HALF_UP);
  73. avgTrend = String.format("%+.2f%%", avg);
  74. }
  75. Map<String, Object> result = new HashMap<>();
  76. result.put("totalCount", totalCount);
  77. result.put("successCount", successCount);
  78. result.put("failCount", failCount);
  79. result.put("successRate", successRate);
  80. result.put("avgTrend", avgTrend);
  81. return result;
  82. }
  83. @Override
  84. public Map<String, Object> queryLatestHistoryByKeyword(String keyword) {
  85. Map<String, Object> result = new HashMap<>();
  86. StockHistoryVO vo = stockPoolHistoryMapper.selectLatestByKeyword(keyword);
  87. if (vo != null) {
  88. result.put("found", true);
  89. result.put("recordDate", vo.getRecordDate());
  90. result.put("stockCode", vo.getStockCode());
  91. result.put("stockName", vo.getStockName());
  92. result.put("strengthScore", vo.getStrengthScore());
  93. result.put("closePrice", vo.getClosePrice());
  94. result.put("changePercent", vo.getChangePercent());
  95. result.put("totalAmount", vo.getTotalAmount());
  96. result.put("circulationMarketValue", vo.getCirculationMarketValue());
  97. result.put("mainRisePeriod", vo.getMainRisePeriod());
  98. result.put("recentLimitUp", vo.getRecentLimitUp());
  99. result.put("dayHighestPrice", vo.getDayHighestPrice());
  100. result.put("dayLowestPrice", vo.getDayLowestPrice());
  101. result.put("dayClosePrice", vo.getDayClosePrice());
  102. result.put("highTrend", vo.getHighTrend());
  103. } else {
  104. result.put("found", false);
  105. }
  106. return result;
  107. }
  108. @Override
  109. public Map<String, Object> queryHistoryByKeywordAndDate(String keyword, LocalDate recordDate) {
  110. Map<String, Object> result = new HashMap<>();
  111. StockHistoryVO vo = stockPoolHistoryMapper.selectByKeywordAndDate(keyword, recordDate);
  112. if (vo != null) {
  113. result.put("found", true);
  114. result.put("recordDate", vo.getRecordDate());
  115. result.put("stockCode", vo.getStockCode());
  116. result.put("stockName", vo.getStockName());
  117. result.put("strengthScore", vo.getStrengthScore());
  118. result.put("closePrice", vo.getClosePrice());
  119. result.put("changePercent", vo.getChangePercent());
  120. result.put("totalAmount", vo.getTotalAmount());
  121. result.put("circulationMarketValue", vo.getCirculationMarketValue());
  122. result.put("mainRisePeriod", vo.getMainRisePeriod());
  123. result.put("recentLimitUp", vo.getRecentLimitUp());
  124. result.put("dayHighestPrice", vo.getDayHighestPrice());
  125. result.put("dayLowestPrice", vo.getDayLowestPrice());
  126. result.put("dayClosePrice", vo.getDayClosePrice());
  127. result.put("highTrend", vo.getHighTrend());
  128. } else {
  129. result.put("found", false);
  130. }
  131. return result;
  132. }
  133. }