gongchunyi
3 天以前 e9b4ceeea014f9d81263672f3d9c46a567c39591
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
package com.ruoyi.energymeter.constant;
 
import java.time.ZoneId;
 
/**
 * 能耗表(水表/电表/气表)接入模块常量。
 *
 * <p>所有业务日期均按 Asia/Shanghai 计算,与服务器默认时区无关。</p>
 */
public final class EnergyMeterConstants {
 
    private EnergyMeterConstants() {
    }
 
    public static final ZoneId ZONE = ZoneId.of("Asia/Shanghai");
 
    /* ---------------- 能源类型 ---------------- */
    public static final String TYPE_WATER = "WATER";
    public static final String TYPE_ELECTRIC = "ELECTRIC";
    public static final String TYPE_GAS = "GAS";
 
    /* ---------------- 数据来源 ---------------- */
    /** 第三方接口接入,由定时任务/手动查表落库。 */
    public static final String SOURCE_TYPE_PROVIDER = "PROVIDER";
    /** 手工抄表,由用户在表具台账中录入表码,用量按期差计算。 */
    public static final String SOURCE_TYPE_MANUAL = "MANUAL";
    /** 手工抄表数据在采集表中的来源标识。 */
    public static final String SOURCE_MANUAL = "MANUAL";
 
    /* ---------------- 指标编码 ---------------- */
    public static final String METRIC_WATER_USAGE = "WATER_USAGE";
    public static final String METRIC_WATER_READING = "WATER_READING";
    public static final String METRIC_ELECTRIC_USAGE = "ELECTRIC_USAGE";
    public static final String METRIC_ELECTRIC_READING = "ELECTRIC_READING";
    public static final String METRIC_ELECTRIC_COST = "ELECTRIC_COST";
    public static final String METRIC_GAS_USAGE = "GAS_USAGE";
    public static final String METRIC_GAS_READING = "GAS_READING";
 
    /* ---------------- 粒度 ---------------- */
    public static final String GRANULARITY_DAY = "D";
    public static final String GRANULARITY_MONTH = "M";
    public static final String GRANULARITY_YEAR = "Y";
    public static final String GRANULARITY_POINT = "POINT";
 
    /* ---------------- 单位 ---------------- */
    public static final String UNIT_WATER = "m3";
    public static final String UNIT_ELECTRIC = "kWh";
    public static final String UNIT_GAS = "m3";
    public static final String UNIT_COST = "CNY";
 
    /* ---------------- 第三方接口标识 ---------------- */
    public static final String SOURCE_GET_USE_WATER = "GetUseWater";
    public static final String SOURCE_GET_WATER_RAW = "GetWaterRawData";
    public static final String SOURCE_FROZEN_ELECTRICITY = "FrozenElectricity";
    public static final String SOURCE_ELECTRIC_QUANTITY = "ElectricQuantity";
    public static final String SOURCE_GAS_USE = "GetGasUseData";
    public static final String SOURCE_GAS_RAW = "GetGasRawData";
 
    /* ---------------- 绑定与启用 ---------------- */
    public static final String BIND_VERIFIED = "VERIFIED";
    public static final String BIND_INVALID = "INVALID";
 
    /* ---------------- 批次类型 ---------------- */
    public static final String RUN_SCHEDULED = "SCHEDULED";
    public static final String RUN_MANUAL = "MANUAL";
    public static final String RUN_BACKFILL = "BACKFILL";
 
    /* ---------------- 批次状态 ---------------- */
    public static final String RUN_PENDING = "PENDING";
    public static final String RUN_RUNNING = "RUNNING";
    public static final String RUN_SUCCESS = "SUCCESS";
    public static final String RUN_PARTIAL = "PARTIAL";
    public static final String RUN_FAILED = "FAILED";
 
    /* ---------------- 任务状态 ---------------- */
    public static final String TASK_PENDING = "PENDING";
    public static final String TASK_RUNNING = "RUNNING";
    public static final String TASK_SUCCESS = "SUCCESS";
    public static final String TASK_EMPTY = "EMPTY";
    public static final String TASK_RETRY = "RETRY";
    public static final String TASK_FAILED = "FAILED";
 
    /* ---------------- 错误类别 ---------------- */
    public static final String ERROR_UPSTREAM = "UPSTREAM_ERROR";
    public static final String ERROR_TIMEOUT = "UPSTREAM_TIMEOUT";
    public static final String ERROR_PARSE = "PARSE_ERROR";
    public static final String ERROR_PAGE_INCOMPLETE = "PAGE_INCOMPLETE";
    public static final String ERROR_ADDRESS_MISMATCH = "ADDRESS_MISMATCH";
 
    /** 自动批次 run_key 前缀。 */
    public static final String AUTO_RUN_KEY_PREFIX = "AUTO:";
 
    /** 重试间隔(分钟),下标对应第几次失败。 */
    public static final int[] RETRY_DELAY_MINUTES = {1, 5, 15};
 
    /** 一个设备最多支持的补采跨度(自然日),超出时按分片拆分。 */
    public static final int MAX_RANGE_DAYS = 366 * 3;
 
    public static boolean isWater(String meterType) {
        return TYPE_WATER.equalsIgnoreCase(meterType);
    }
 
    public static boolean isElectric(String meterType) {
        return TYPE_ELECTRIC.equalsIgnoreCase(meterType);
    }
 
    public static boolean isGas(String meterType) {
        return TYPE_GAS.equalsIgnoreCase(meterType);
    }
 
    public static boolean isManual(String sourceType) {
        return SOURCE_TYPE_MANUAL.equalsIgnoreCase(sourceType);
    }
 
    /**
     * 是否属于自动采集:第三方接入,或由系统每日自动生成数据的模拟表(如蒸汽表演示设备)。
     *
     * <p>模拟表的 source_type 仍是 MANUAL(不参与第三方查表),但业务上按自动采集展示与统计。</p>
     */
    public static boolean isAutoCollect(String sourceType, Integer simulated) {
        return SOURCE_TYPE_PROVIDER.equalsIgnoreCase(sourceType) || Integer.valueOf(1).equals(simulated);
    }
 
    public static boolean isSimulated(Integer simulated) {
        return Integer.valueOf(1).equals(simulated);
    }
 
    /** 规范化能源类型,未知类型返回 null,由调用方抛出业务异常。 */
    public static String canonicalType(String meterType) {
        String type = meterType == null ? null : meterType.trim();
        if (TYPE_WATER.equalsIgnoreCase(type)) {
            return TYPE_WATER;
        }
        if (TYPE_ELECTRIC.equalsIgnoreCase(type)) {
            return TYPE_ELECTRIC;
        }
        if (TYPE_GAS.equalsIgnoreCase(type)) {
            return TYPE_GAS;
        }
        return null;
    }
 
    public static String typeName(String meterType) {
        if (isWater(meterType)) {
            return "水表";
        }
        if (isGas(meterType)) {
            return "气表";
        }
        if (isElectric(meterType)) {
            return "电表";
        }
        return meterType;
    }
 
    public static String usageMetric(String meterType) {
        if (isWater(meterType)) {
            return METRIC_WATER_USAGE;
        }
        if (isGas(meterType)) {
            return METRIC_GAS_USAGE;
        }
        return METRIC_ELECTRIC_USAGE;
    }
 
    public static String readingMetric(String meterType) {
        if (isWater(meterType)) {
            return METRIC_WATER_READING;
        }
        if (isGas(meterType)) {
            return METRIC_GAS_READING;
        }
        return METRIC_ELECTRIC_READING;
    }
 
    public static String unit(String meterType) {
        if (isWater(meterType)) {
            return UNIT_WATER;
        }
        if (isGas(meterType)) {
            return UNIT_GAS;
        }
        return UNIT_ELECTRIC;
    }
 
    /** 期间用量的来源标识。 */
    public static String usageSource(String meterType) {
        if (isWater(meterType)) {
            return SOURCE_GET_USE_WATER;
        }
        if (isGas(meterType)) {
            return SOURCE_GAS_USE;
        }
        // 电表用量取 ElectricQuantity 的正向有功电量;FrozenElectricity 的 TotalKwh 可能恒为 null
        return SOURCE_ELECTRIC_QUANTITY;
    }
 
    /** 时点示值的来源标识。 */
    public static String readingSource(String meterType) {
        if (isWater(meterType)) {
            return SOURCE_GET_WATER_RAW;
        }
        if (isGas(meterType)) {
            return SOURCE_GAS_RAW;
        }
        return SOURCE_FROZEN_ELECTRICITY;
    }
}