zhizhijie
6 小时以前 799ec6799ad9e994f7d369f059ca7682962f648f
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package com.trafficaudit.common.util;
 
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
 
/**
 * 湖北省行政区划工具类
 */
public class RegionUtil {
 
    /** 规范市州名(顺序即展示顺序) */
    public static final List<String> CITY_LIST = Arrays.asList(
        "武汉市", "黄石市", "十堰市", "宜昌市", "襄阳市", "鄂州市", "荆门市",
        "孝感市", "荆州市", "黄冈市", "咸宁市", "随州市", "恩施州",
        "仙桃市", "潜江市", "天门市", "神农架林区");
 
    /** 区划代码前缀 -> 市州名 */
    private static final Map<String, String> CODE_PREFIX_MAP = new HashMap<>();
 
    /** 别名 -> 规范名 */
    private static final Map<String, String> ALIAS_MAP = new HashMap<>();
 
    static {
        CODE_PREFIX_MAP.put("4201", "武汉市");
        CODE_PREFIX_MAP.put("4202", "黄石市");
        CODE_PREFIX_MAP.put("4203", "十堰市");
        CODE_PREFIX_MAP.put("4205", "宜昌市");
        CODE_PREFIX_MAP.put("4206", "襄阳市");
        CODE_PREFIX_MAP.put("4207", "鄂州市");
        CODE_PREFIX_MAP.put("4208", "荆门市");
        CODE_PREFIX_MAP.put("4209", "孝感市");
        CODE_PREFIX_MAP.put("4210", "荆州市");
        CODE_PREFIX_MAP.put("4211", "黄冈市");
        CODE_PREFIX_MAP.put("4212", "咸宁市");
        CODE_PREFIX_MAP.put("4213", "随州市");
        CODE_PREFIX_MAP.put("4228", "恩施州");
        CODE_PREFIX_MAP.put("429004", "仙桃市");
        CODE_PREFIX_MAP.put("429005", "潜江市");
        CODE_PREFIX_MAP.put("429006", "天门市");
        CODE_PREFIX_MAP.put("429021", "神农架林区");
 
        ALIAS_MAP.put("恩施", "恩施州");
        ALIAS_MAP.put("恩施市", "恩施州");
        ALIAS_MAP.put("恩施土家族苗族自治州", "恩施州");
        ALIAS_MAP.put("天门", "天门市");
        ALIAS_MAP.put("林区", "神农架林区");
        ALIAS_MAP.put("神农架", "神农架林区");
        ALIAS_MAP.put("湖北省", "湖北省");
        ALIAS_MAP.put("全省", "湖北省");
        ALIAS_MAP.put("仙桃", "仙桃市");
        ALIAS_MAP.put("潜江", "潜江市");
    }
 
    /** 行政区划代码 -> 市州名,无法识别返回 null */
    public static String cityByCode(String regionCode) {
        if (regionCode == null || regionCode.isEmpty()) return null;
        String code = regionCode.trim();
        // 先匹配完整的4290xx直管市代码
        if (code.startsWith("4290")) {
            String city = CODE_PREFIX_MAP.get(code);
            if (city != null) return city;
        }
        for (int len = 4; len >= 2; len--) {
            if (code.length() < len) continue;
            String city = CODE_PREFIX_MAP.get(code.substring(0, len));
            if (city != null) return city;
        }
        return null;
    }
 
    /** 名称规范化(全省/恩施市/天门/林区 -> 规范名),无法识别原样返回 */
    public static String normalizeCityName(String name) {
        if (name == null) return null;
        String trimmed = name.trim();
        if (trimmed.isEmpty()) return trimmed;
        if (CITY_LIST.contains(trimmed)) return trimmed;
        String alias = ALIAS_MAP.get(trimmed);
        if (alias != null) return alias;
        // 去掉可能的空白
        String noSpace = trimmed.replaceAll("\\s+", "");
        alias = ALIAS_MAP.get(noSpace);
        if (alias != null) return alias;
        return trimmed;
    }
 
    /** 短名(用于排名报表):武汉市->武汉, 恩施州->恩施, 神农架林区->林区 */
    public static String shortName(String cityName) {
        if (cityName == null) return null;
        String name = normalizeCityName(cityName);
        if (name == null) return null;
        if ("神农架林区".equals(name)) return "林区";
        if ("恩施州".equals(name)) return "恩施";
        if (name.endsWith("市")) return name.substring(0, name.length() - 1);
        if (name.endsWith("州")) return name.substring(0, name.length() - 1);
        return name;
    }
 
    /** 规范市州列表(按展示顺序) */
    public static List<String> cityList() {
        return CITY_LIST;
    }
 
    /** 生成空市州统计Map */
    public static Map<String, BigDecimalStat> emptyStatMap() {
        Map<String, BigDecimalStat> map = new LinkedHashMap<>();
        for (String city : CITY_LIST) {
            map.put(city, new BigDecimalStat());
        }
        return map;
    }
 
    public static class BigDecimalStat {
        private java.math.BigDecimal value = java.math.BigDecimal.ZERO;
 
        public void add(java.math.BigDecimal v) {
            if (v != null) value = value.add(v);
        }
 
        public java.math.BigDecimal getValue() {
            return value;
        }
 
        public void setValue(java.math.BigDecimal value) {
            this.value = value == null ? java.math.BigDecimal.ZERO : value;
        }
    }
}