解决获取景区名时出现一个景区名对应多个id的问题

This commit is contained in:
温文静WWW 2025-08-19 12:46:24 +08:00
parent 2f51e6bd46
commit 504fbba046
5 changed files with 62 additions and 19 deletions

View File

@ -4,6 +4,7 @@ import lombok.Data;
@Data @Data
public class RouteStat { public class RouteStat {
private Long scenicId;
private String scenicName;//景区名称通过路线id获得景区id private String scenicName;//景区名称通过路线id获得景区id
private String routeName;//路线名称 private String routeName;//路线名称
private Long routeId ;//路线id private Long routeId ;//路线id

View File

@ -447,16 +447,35 @@ public class OrderAnalysisServiceImpl implements OrderAnalysisService {
.collect(Collectors.toMap(CpRoute::getId, route -> route)); .collect(Collectors.toMap(CpRoute::getId, route -> route));
// 提取所有景区ID // 提取所有景区ID
Set<Long> scenicIds = routes.stream() List<Long> scenicIds = routes.stream()
.map(CpRoute::getScenicId) .map(CpRoute::getScenicId)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toSet()); .collect(Collectors.toList());
// 批量查询所有景区名称确保不为空 // 获取景区id和景区名对应的map
// Map<Long, String> scenicNameMap = emScenicMapper.getScenicNameMap(new ArrayList<>(scenicIds)); List<Map<String, Object>> scenicList = emScenicMapper.getScenicNameMap(scenicIds);
Map<Long, String> scenicNameMap = Collections.emptyMap(); // 处理空集合MyBatis无结果时返回空List
if (!scenicIds.isEmpty()) { if (scenicList == null) {
scenicNameMap = emScenicMapper.getScenicNameMap(new ArrayList<>(scenicIds)); scenicList = new ArrayList<>();
}
// 转换为 Map<String, String>ID为键名称为值
Map<Long, String> scenicNameMap = new HashMap<>();
for (Map<String, Object> item : scenicList) { // 泛型修正为 Map<String, Object>
// 1. 获取scenicId先转Number兼容Integer/Long再转Long
Number idNum = (Number) item.get("scenicId"); // 键是字符串"scenicId"与XML别名一致
Long scenicId = null;
if (idNum != null) {
scenicId = idNum.longValue(); // 安全转为Long避免类型错误
}
// 2. 获取scenicName直接转为String与XML别名"scenicName"一致
String scenicName = (String) item.get("scenicName");
// 3. 非空校验后存入避免存null键/导致后续getOrDefault失效
if (scenicId != null && scenicName != null) {
scenicNameMap.put(scenicId, scenicName);
}
} }
// 组装结果 // 组装结果
@ -474,6 +493,8 @@ public class OrderAnalysisServiceImpl implements OrderAnalysisService {
Long scenicId = route.getScenicId(); Long scenicId = route.getScenicId();
if (scenicId != null) { if (scenicId != null) {
//wenti
stat.setScenicId(scenicId);
stat.setScenicName(scenicNameMap.getOrDefault(scenicId, "未知景区")); stat.setScenicName(scenicNameMap.getOrDefault(scenicId, "未知景区"));
} else { } else {
stat.setScenicName("未知景区"); stat.setScenicName("未知景区");
@ -486,7 +507,6 @@ public class OrderAnalysisServiceImpl implements OrderAnalysisService {
routeDistribution.add(stat); routeDistribution.add(stat);
} }
} }
return routeDistribution; return routeDistribution;
} }
/** /**

View File

@ -518,10 +518,10 @@ public class OrderDetailAnalysisServiceImpl implements OrderDetailAnalysisServic
.collect(Collectors.toMap(CpRoute::getId, route -> route)); .collect(Collectors.toMap(CpRoute::getId, route -> route));
// 提取所有景区ID用于批量查询景区名称 // 提取所有景区ID用于批量查询景区名称
Set<Long> scenicIds = routes.stream() List<Long> scenicIds = routes.stream()
.map(CpRoute::getScenicId) .map(CpRoute::getScenicId)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toSet()); .collect(Collectors.toList());
// 批量查询景区名称 // 批量查询景区名称
Map<Long, String> scenicNameMap = new HashMap<>(); Map<Long, String> scenicNameMap = new HashMap<>();
@ -545,6 +545,7 @@ public class OrderDetailAnalysisServiceImpl implements OrderDetailAnalysisServic
stat.setRouteName(route.getName()); stat.setRouteName(route.getName());
Long scenicId = route.getScenicId(); Long scenicId = route.getScenicId();
if (scenicId != null) { if (scenicId != null) {
stat.setScenicId(scenicId);
stat.setScenicName(scenicNameMap.getOrDefault(scenicId, "未知景区")); stat.setScenicName(scenicNameMap.getOrDefault(scenicId, "未知景区"));
} else { } else {
stat.setScenicName("未知景区"); stat.setScenicName("未知景区");

View File

@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -35,9 +36,9 @@ public interface EmScenicMapper extends BaseMapper<EmScenic> {
* @return * @return
*/ */
List<AreaNumStatisVo> countByAreaId(); List<AreaNumStatisVo> countByAreaId();
List<Map<String, Object>> getScenicNameMap(@Param("scenicIds") List<Long> scenicIds);
// Map<Long, String> getScenicNameMap(ArrayList<Long> scenicIds);
Map<Long, String> getScenicNameMap(ArrayList<Long> scenicIds); // @Select("SELECT * FROM em_scenic WHERE id IN (#{ids})")
@Select("SELECT * FROM em_scenic WHERE id IN (#{ids})")
List<EmScenic> listByIds(ArrayList<Long> ids); List<EmScenic> listByIds(ArrayList<Long> ids);
} }

View File

@ -27,14 +27,34 @@
group by area_id group by area_id
</select> </select>
<select id="getScenicNameMap" resultType="java.util.HashMap"> <select id="getScenicNameMap" resultType="java.util.HashMap">
SELECT id AS "key", name AS "value" SELECT
id AS "scenicId", -- 更明确的别名
name AS "scenicName"
FROM em_scenic FROM em_scenic
WHERE del_flag = 0 WHERE del_flag = 0
<if test="scenicIds != null and scenicIds.size() > 0"> <!-- 确保参数正确传递并且当scenicIds为空时的处理逻辑 -->
AND id IN <if test="scenicIds != null">
<foreach collection="scenicIds" item="id" open="(" separator="," close=")"> <if test="scenicIds.size() > 0">
#{id} AND id IN
</foreach> <foreach collection="scenicIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test="scenicIds.size() == 0">
<!-- 当传入空列表时,确保不返回任何结果 -->
AND 1 = 0
</if>
</if>
<if test="scenicIds == null">
AND 1 = 0
</if> </if>
</select> </select>
<select id="listByIds" resultType="com.aircraft.modules.system.domain.EmScenic">
SELECT * FROM em_scenic
WHERE id IN
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
</mapper> </mapper>