fix: 修改获取动量数据为计算获取,而不是sql语句

dev_refactor_0120_qoder
Lxy 4 months ago
parent 789584e62a
commit e2b609bf52

@ -87,4 +87,28 @@ public interface TTrendsMapper
* @return 10 * @return 10
*/ */
public int checkTrendsExistsByDate(Date tradeDate); public int checkTrendsExistsByDate(Date tradeDate);
/**
* 10
*
* @param momentumType
* @return 10
*/
public List<Date> getRecentTradeDates(String momentumType);
/**
*
*
* @param momentumType
* @return
*/
public List<String> getAllIndustryNames(String momentumType);
/**
*
*
* @param params mapmomentumTypeindustryNametradeDate
* @return
*/
public Integer getIndustryRankByDate(java.util.Map<String, Object> params);
} }

@ -1,6 +1,10 @@
package com.ruoyi.newstocksystem.service.impl; package com.ruoyi.newstocksystem.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.newstocksystem.mapper.TTrendsMapper; import com.ruoyi.newstocksystem.mapper.TTrendsMapper;
@ -129,6 +133,42 @@ public class TTrendsServiceImpl implements TTrendsService
@Override @Override
public List<?> listTrendsSection(TTrends tTrends) public List<?> listTrendsSection(TTrends tTrends)
{ {
return tTrendsMapper.listTrendsSection(tTrends); // 1. 获取最近10个交易日
List<Date> recentDays = tTrendsMapper.getRecentTradeDates(tTrends.getMomentumType());
if (recentDays == null || recentDays.isEmpty()) {
return new ArrayList<>();
}
// 2. 获取所有行业名称
List<String> industryNames = tTrendsMapper.getAllIndustryNames(tTrends.getMomentumType());
if (industryNames == null || industryNames.isEmpty()) {
return new ArrayList<>();
}
// 3. 准备返回结果列表
List<Map<String, Object>> resultList = new ArrayList<>();
// 4. 遍历每个行业,获取其在每个交易日的排名
for (String industryName : industryNames) {
Map<String, Object> industryData = new HashMap<>();
industryData.put("industryName", industryName);
// 遍历每个交易日,获取排名
for (int i = 0; i < recentDays.size(); i++) {
Date tradeDate = recentDays.get(i);
Map<String, Object> params = new HashMap<>();
params.put("momentumType", tTrends.getMomentumType());
params.put("industryName", industryName);
params.put("tradeDate", tradeDate);
Integer rank = tTrendsMapper.getIndustryRankByDate(params);
// 如果没有排名数据设置为0
industryData.put("day_" + (i + 1), rank != null ? rank : 0);
}
resultList.add(industryData);
}
return resultList;
} }
} }

@ -136,51 +136,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select count(1) from t_trends where trade_date = #{tradeDate} select count(1) from t_trends where trade_date = #{tradeDate}
</select> </select>
<!-- 查询趋势分段列表 --> <!-- 获取最近10个交易日 -->
<select id="listTrendsSection" parameterType="TTrends" resultType="map"> <select id="getRecentTradeDates" parameterType="String" resultType="Date">
<!-- 第一步获取最近10个交易日 --> SELECT DISTINCT trade_date
WITH recent_days AS (
SELECT trade_date
FROM t_trends FROM t_trends
WHERE momentum_type = #{momentumType} WHERE momentum_type = #{momentumType}
GROUP BY trade_date
ORDER BY trade_date DESC ORDER BY trade_date DESC
LIMIT 10 LIMIT 10
), </select>
<!-- 第二步:获取所有行业名称 -->
industry_names AS ( <!-- 获取所有行业名称 -->
<select id="getAllIndustryNames" parameterType="String" resultType="String">
SELECT DISTINCT industry_name SELECT DISTINCT industry_name
FROM t_trends FROM t_trends
WHERE momentum_type = #{momentumType} WHERE momentum_type = #{momentumType}
AND trade_date IN (SELECT trade_date FROM recent_days) </select>
),
<!-- 第三步:获取每个行业在每个交易日的排名 --> <!-- 获取指定行业在指定日期的排名 -->
industry_ranks AS ( <select id="getIndustryRankByDate" parameterType="map" resultType="Integer">
SELECT SELECT `rank`
i.industry_name, FROM t_trends
rd.trade_date, WHERE momentum_type = #{momentumType}
t.`rank` AND industry_name = #{industryName}
FROM industry_names i AND trade_date = #{tradeDate}
CROSS JOIN recent_days rd
LEFT JOIN t_trends t ON i.industry_name = t.industry_name
AND rd.trade_date = t.trade_date
AND t.momentum_type = #{momentumType}
)
<!-- 第四步:将数据转换为列形式 -->
SELECT
industry_name,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1) THEN `rank` ELSE 0 END) AS current_day,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1 OFFSET 1) THEN `rank` ELSE 0 END) AS day_2,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1 OFFSET 2) THEN `rank` ELSE 0 END) AS day_3,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1 OFFSET 3) THEN `rank` ELSE 0 END) AS day_4,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1 OFFSET 4) THEN `rank` ELSE 0 END) AS day_5,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1 OFFSET 5) THEN `rank` ELSE 0 END) AS day_6,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1 OFFSET 6) THEN `rank` ELSE 0 END) AS day_7,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1 OFFSET 7) THEN `rank` ELSE 0 END) AS day_8,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1 OFFSET 8) THEN `rank` ELSE 0 END) AS day_9,
MAX(CASE WHEN trade_date = (SELECT trade_date FROM recent_days ORDER BY trade_date DESC LIMIT 1 OFFSET 9) THEN `rank` ELSE 0 END) AS day_10
FROM industry_ranks
GROUP BY industry_name
ORDER BY current_day
</select> </select>
</mapper> </mapper>
Loading…
Cancel
Save