package com.ruoyi.satisfaction.service.strategy;
|
|
import java.util.Collections;
|
import java.util.LinkedHashMap;
|
import java.util.Map;
|
|
/**
|
* 满意度「站点口径」标识。
|
* <p>
|
* 本模块用<b>策略</b>区分两套满意度口径(见 {@link SatisfactionScoreStrategy}):
|
* <table border="1">
|
* <tr><th>站点</th><th>标识</th><th>口径</th></tr>
|
* <tr>
|
* <td>通用(南华使用;同德也复用其中的 4 个通用端点)</td>
|
* <td>{@link #COMMON}({@code "common"},别名 {@code "nanhua"})</td>
|
* <td>{@link CommonSatisfactionScoreStrategy}:按明细的 {@code score} 字段求平均(分母含分值为空的行)</td>
|
* </tr>
|
* <tr>
|
* <td>省立同德</td>
|
* <td>{@link #SLTD}({@code "sltd"})</td>
|
* <td>{@link SltdSatisfactionScoreStrategy}:按选项< b>文案</b>判定五档并加权(1/0.8/0.6/0.4/0.2),百分制</td>
|
* </tr>
|
* </table>
|
* <p>
|
* <b>为什么两套口径必须分开</b>:同德的历史数据里 {@code score} 有 {@code 0}、{@code 0000000001}
|
* 这类脏值,按 {@code score} 求平均会把得分固定成 0 或 100,所以同德只能按选项文案判档;
|
* 而通用口径的南华数据没有这个问题,改用文案判档反而会让结果与迁移前不一致。
|
* 因此这里不做"统一算法",而是用策略显式区分。
|
*/
|
public final class SatisfactionSites {
|
|
/**
|
* 通用口径(南华使用,同德的 4 个通用端点也走它)
|
*/
|
public static final String COMMON = "common";
|
|
/**
|
* 省立同德口径
|
*/
|
public static final String SLTD = "sltd";
|
|
/**
|
* 站点别名 → 规范站点标识(南华没有独占口径,归到通用口径)
|
*/
|
private static final Map<String, String> ALIASES;
|
|
static {
|
Map<String, String> aliases = new LinkedHashMap<>();
|
aliases.put("nanhua", COMMON);
|
aliases.put("通用", COMMON);
|
aliases.put("同德", SLTD);
|
aliases.put("sld", SLTD);
|
ALIASES = Collections.unmodifiableMap(aliases);
|
}
|
|
private SatisfactionSites() {
|
}
|
|
/**
|
* 归一化站点标识:去空白、转小写、按别名映射;空值返回 {@link #COMMON}
|
*/
|
public static String normalize(String site) {
|
if (site == null) {
|
return COMMON;
|
}
|
String key = site.trim().toLowerCase(java.util.Locale.ROOT);
|
if (key.isEmpty()) {
|
return COMMON;
|
}
|
String mapped = ALIASES.get(key);
|
return mapped == null ? key : mapped;
|
}
|
}
|