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()));
}
}