package com.ruoyi.satisfaction.service.strategy; import com.ruoyi.common.exception.ServiceException; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; /** * 满意度站点口径策略解析器。 *

* 由 Spring 注入全部 {@link SatisfactionScoreStrategy} 实现,按站点标识选择; * 站点为空或未知时回落到通用口径并打 WARN(保证调用方永远不会因为 * "传了个没见过的站点"而失败)。 *

* 用法: *

 * BigDecimal score = resolver.resolve(SatisfactionSites.SLTD).comprehensiveScore(rows);
 * 
* 以后新增站点:只加一个 {@code SatisfactionScoreStrategy} 实现类即可,本类无需改动。 */ @Slf4j @Component public class SatisfactionScoreStrategyResolver { private final Map strategies; private final SatisfactionScoreStrategy fallback; public SatisfactionScoreStrategyResolver(List strategyList) { Map map = new LinkedHashMap<>(); if (strategyList != null) { for (SatisfactionScoreStrategy strategy : strategyList) { map.put(SatisfactionSites.normalize(strategy.site()), strategy); } } this.strategies = Collections.unmodifiableMap(map); this.fallback = map.get(SatisfactionSites.COMMON); if (this.fallback == null) { // 只可能在配置错误时发生(通用口径实现被误删),尽早暴露 throw new ServiceException("满意度模块缺少通用口径策略实现(site=" + SatisfactionSites.COMMON + ")"); } } /** * 按站点取策略;未知站点回落到通用口径并打 WARN * * @param site 站点标识({@link SatisfactionSites} 中的常量,或其别名) */ public SatisfactionScoreStrategy resolve(String site) { String key = SatisfactionSites.normalize(site); SatisfactionScoreStrategy strategy = strategies.get(key); if (strategy == null) { log.warn("【满意度】未找到站点口径策略 site={},回落到通用口径({})", site, SatisfactionSites.COMMON); return fallback; } return strategy; } /** * 已注册的站点标识(供校验/文档使用) */ public Set supportedSites() { return Collections.unmodifiableSet(new TreeSet<>(strategies.keySet())); } }