liusheng
8 天以前 f0a09ee996ab2605869844d6a3d812709e2bf0fa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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;
    }
}