|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+package com.sundot.airport.web.controller.quality;
|
|
|
2
|
+
|
|
|
3
|
+import com.sundot.airport.attendance.calculator.AttendancePersonCountCalculator;
|
|
|
4
|
+import com.sundot.airport.attendance.calculator.BrigadeAttendancePersonCountCalculator;
|
|
|
5
|
+import com.sundot.airport.attendance.dto.AttendanceTrendDataDTO;
|
|
|
6
|
+import com.sundot.airport.common.core.domain.entity.SysDept;
|
|
|
7
|
+import com.sundot.airport.attendance.dto.AttendancePersonStatsDTO;
|
|
|
8
|
+import com.sundot.airport.common.enums.DeptTypeEnum;
|
|
|
9
|
+import com.sundot.airport.common.statistics.*;
|
|
|
10
|
+import com.sundot.airport.common.utils.DeptUtils;
|
|
|
11
|
+import com.sundot.airport.common.utils.StringUtils;
|
|
|
12
|
+import com.sundot.airport.system.service.ISysDeptService;
|
|
|
13
|
+import io.swagger.annotations.Api;
|
|
|
14
|
+import io.swagger.annotations.ApiOperation;
|
|
|
15
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
16
|
+import org.springframework.web.bind.annotation.*;
|
|
|
17
|
+
|
|
|
18
|
+import java.math.BigDecimal;
|
|
|
19
|
+import java.util.*;
|
|
|
20
|
+import java.util.stream.Collectors;
|
|
|
21
|
+
|
|
|
22
|
+import static com.sundot.airport.common.utils.SecurityUtils.getDeptId;
|
|
|
23
|
+
|
|
|
24
|
+/**
|
|
|
25
|
+ * 出勤人次控制器
|
|
|
26
|
+ * 根据时间维度返回总体+大队的人次数据
|
|
|
27
|
+ */
|
|
|
28
|
+@Api(tags = "出勤人次")
|
|
|
29
|
+@RestController
|
|
|
30
|
+@RequestMapping("/quality/attendance")
|
|
|
31
|
+public class SimpleAttendancePersonController {
|
|
|
32
|
+
|
|
|
33
|
+ @Autowired
|
|
|
34
|
+ private AttendancePersonCountCalculator overallCalculator; // 全站计算器
|
|
|
35
|
+
|
|
|
36
|
+ @Autowired
|
|
|
37
|
+ private BrigadeAttendancePersonCountCalculator deptCalculator; // 大队计算器
|
|
|
38
|
+
|
|
|
39
|
+ @Autowired
|
|
|
40
|
+ private MultiModelIndicatorCalculator multiModelIndicatorCalculator;
|
|
|
41
|
+
|
|
|
42
|
+ @Autowired
|
|
|
43
|
+ private ISysDeptService deptService;
|
|
|
44
|
+
|
|
|
45
|
+
|
|
|
46
|
+ /**
|
|
|
47
|
+ * 出勤人次分析
|
|
|
48
|
+ */
|
|
|
49
|
+ @ApiOperation("出勤人次分析")
|
|
|
50
|
+ @PostMapping("/calculate")
|
|
|
51
|
+ public List<AttendancePersonStatsDTO> calculateStatistics(@RequestBody IndicatorCalculationParams params) {
|
|
|
52
|
+ List<AttendancePersonStatsDTO> results = new ArrayList<>();
|
|
|
53
|
+
|
|
|
54
|
+ // 获取当前用户所在站点ID
|
|
|
55
|
+ Long topSiteId = DeptUtils.getTopSiteId(deptService.selectDeptById(getDeptId()));
|
|
|
56
|
+ List<SysDept> brigadesUnderSite = getBrigadesUnderSite(topSiteId);
|
|
|
57
|
+ brigadesUnderSite.add(deptService.selectDeptById(topSiteId));
|
|
|
58
|
+ brigadesUnderSite.forEach(dept -> {
|
|
|
59
|
+ results.add(createAttendancePersonStats(dept, params));
|
|
|
60
|
+ });
|
|
|
61
|
+
|
|
|
62
|
+ return results;
|
|
|
63
|
+ }
|
|
|
64
|
+
|
|
|
65
|
+ /**
|
|
|
66
|
+ * 出勤人次趋势数据
|
|
|
67
|
+ * 根据时间维度参数动态生成柱状图数据
|
|
|
68
|
+ * 支持月度(同比+环比)、季度(同比)、年度(同比)等多种展示方式
|
|
|
69
|
+ *
|
|
|
70
|
+ * @param params 时间维度参数(年、季度、月等)
|
|
|
71
|
+ * @return 趋势数据列表
|
|
|
72
|
+ */
|
|
|
73
|
+ @ApiOperation("出勤人次趋势数据")
|
|
|
74
|
+ @PostMapping("/trend-data")
|
|
|
75
|
+ public List<AttendanceTrendDataDTO> getTrendData(@RequestBody IndicatorCalculationParams params) {
|
|
|
76
|
+ List<AttendanceTrendDataDTO> results = new ArrayList<>();
|
|
|
77
|
+
|
|
|
78
|
+ // 根据时间维度类型决定展示策略
|
|
|
79
|
+ if (params.getMonth() != null) {
|
|
|
80
|
+ // 月度:展示当前月、上月、去年同期(同比+环比)
|
|
|
81
|
+ results.addAll(generateMonthlyTrendData(params));
|
|
|
82
|
+ } else if (params.getQuarter() != null) {
|
|
|
83
|
+ // 季度:展示当前季度和去年同期
|
|
|
84
|
+ results.addAll(generateQuarterlyTrendData(params));
|
|
|
85
|
+ } else if (params.getYear() != null) {
|
|
|
86
|
+ // 年度:仅展示当前年和去年(仅同比)
|
|
|
87
|
+ results.addAll(generateYearlyTrendData(params));
|
|
|
88
|
+ } else {
|
|
|
89
|
+ // 默认按月度处理
|
|
|
90
|
+ results.addAll(generateMonthlyTrendData(params));
|
|
|
91
|
+ }
|
|
|
92
|
+
|
|
|
93
|
+ return results;
|
|
|
94
|
+ }
|
|
|
95
|
+
|
|
|
96
|
+ /**
|
|
|
97
|
+ * 生成月度趋势数据(同比+环比)
|
|
|
98
|
+ * 展示:当前月、上月、去年同期
|
|
|
99
|
+ */
|
|
|
100
|
+ private List<AttendanceTrendDataDTO> generateMonthlyTrendData(IndicatorCalculationParams params) {
|
|
|
101
|
+ List<AttendanceTrendDataDTO> results = new ArrayList<>();
|
|
|
102
|
+
|
|
|
103
|
+ // 获取当前用户所在站点ID
|
|
|
104
|
+ Long topSiteId = DeptUtils.getTopSiteId(deptService.selectDeptById(getDeptId()));
|
|
|
105
|
+ List<SysDept> stationAndThreeDepts = getBrigadesUnderSite(topSiteId);
|
|
|
106
|
+ stationAndThreeDepts.add(deptService.selectDeptById(topSiteId));
|
|
|
107
|
+
|
|
|
108
|
+
|
|
|
109
|
+ // 计算当前月数据
|
|
|
110
|
+ List<AttendancePersonStatsDTO> currentList = calculateDeptStats(stationAndThreeDepts, params);
|
|
|
111
|
+
|
|
|
112
|
+ // 计算上月数据
|
|
|
113
|
+ IndicatorCalculationParams lastMonthParams = createLastMonthParams(params);
|
|
|
114
|
+ List<AttendancePersonStatsDTO> lastMonthList = calculateDeptStats(stationAndThreeDepts, lastMonthParams);
|
|
|
115
|
+
|
|
|
116
|
+ // 计算去年同期数据
|
|
|
117
|
+ IndicatorCalculationParams lastYearParams = createLastYearParams(params);
|
|
|
118
|
+ List<AttendancePersonStatsDTO> lastYearList = calculateDeptStats(stationAndThreeDepts, lastYearParams);
|
|
|
119
|
+
|
|
|
120
|
+
|
|
|
121
|
+ // 构造柱状图数据
|
|
|
122
|
+ AttendanceTrendDataDTO currentData = createTrendDataPoint(getMonthLabel(params), currentList);
|
|
|
123
|
+ AttendanceTrendDataDTO lastMonthData = createTrendDataPoint(getLastMonthLabel(params), lastMonthList);
|
|
|
124
|
+ AttendanceTrendDataDTO lastYearData = createTrendDataPoint(getLastYearMonthLabel(params), lastYearList);
|
|
|
125
|
+
|
|
|
126
|
+ results.add(lastYearData);
|
|
|
127
|
+ results.add(lastMonthData);
|
|
|
128
|
+ results.add(currentData);
|
|
|
129
|
+
|
|
|
130
|
+ return results;
|
|
|
131
|
+ }
|
|
|
132
|
+
|
|
|
133
|
+ /**
|
|
|
134
|
+ * 生成季度趋势数据(同比+环比)
|
|
|
135
|
+ * 展示:当前季度、上季度、去年同期季度
|
|
|
136
|
+ */
|
|
|
137
|
+ private List<AttendanceTrendDataDTO> generateQuarterlyTrendData(IndicatorCalculationParams params) {
|
|
|
138
|
+ List<AttendanceTrendDataDTO> results = new ArrayList<>();
|
|
|
139
|
+ // 获取当前用户所在站点ID
|
|
|
140
|
+ Long topSiteId = DeptUtils.getTopSiteId(deptService.selectDeptById(getDeptId()));
|
|
|
141
|
+ List<SysDept> stationAndThreeDepts = getBrigadesUnderSite(topSiteId);
|
|
|
142
|
+ stationAndThreeDepts.add(deptService.selectDeptById(topSiteId));
|
|
|
143
|
+ // 计算当前季度数据
|
|
|
144
|
+ List<AttendancePersonStatsDTO> currentList = calculateDeptStats(stationAndThreeDepts, params);
|
|
|
145
|
+
|
|
|
146
|
+ // 计算上季度数据
|
|
|
147
|
+ IndicatorCalculationParams lastQuarterParams = createLastQuarterParams(params);
|
|
|
148
|
+ List<AttendancePersonStatsDTO> lastQuarterList = calculateDeptStats(stationAndThreeDepts, lastQuarterParams);
|
|
|
149
|
+
|
|
|
150
|
+ // 计算去年同期季度数据
|
|
|
151
|
+ IndicatorCalculationParams lastYearParams = createLastYearParams(params);
|
|
|
152
|
+ List<AttendancePersonStatsDTO> lastYearList = calculateDeptStats(stationAndThreeDepts, lastYearParams);
|
|
|
153
|
+
|
|
|
154
|
+ // 构造柱状图数据
|
|
|
155
|
+ AttendanceTrendDataDTO currentData = createTrendDataPoint(getQuarterLabel(params), currentList);
|
|
|
156
|
+ AttendanceTrendDataDTO lastQuarterData = createTrendDataPoint(getLastQuarterLabel(params), lastQuarterList);
|
|
|
157
|
+ AttendanceTrendDataDTO lastYearData = createTrendDataPoint(getLastYearQuarterLabel(params), lastYearList);
|
|
|
158
|
+
|
|
|
159
|
+ results.add(lastYearData);
|
|
|
160
|
+ results.add(lastQuarterData);
|
|
|
161
|
+ results.add(currentData);
|
|
|
162
|
+ return results;
|
|
|
163
|
+ }
|
|
|
164
|
+
|
|
|
165
|
+ /**
|
|
|
166
|
+ * 生成年度趋势数据(仅同比)
|
|
|
167
|
+ * 展示:当前年、去年
|
|
|
168
|
+ */
|
|
|
169
|
+ private List<AttendanceTrendDataDTO> generateYearlyTrendData(IndicatorCalculationParams params) {
|
|
|
170
|
+ List<AttendanceTrendDataDTO> results = new ArrayList<>();
|
|
|
171
|
+ // 获取当前用户所在站点ID
|
|
|
172
|
+ Long topSiteId = DeptUtils.getTopSiteId(deptService.selectDeptById(getDeptId()));
|
|
|
173
|
+ List<SysDept> stationAndThreeDepts = getBrigadesUnderSite(topSiteId);
|
|
|
174
|
+ stationAndThreeDepts.add(deptService.selectDeptById(topSiteId));
|
|
|
175
|
+ // 计算当前年数据
|
|
|
176
|
+ List<AttendancePersonStatsDTO> currentList = calculateDeptStats(stationAndThreeDepts, params);
|
|
|
177
|
+
|
|
|
178
|
+ // 计算去年数据
|
|
|
179
|
+ IndicatorCalculationParams lastYearParams = createLastYearParams(params);
|
|
|
180
|
+ List<AttendancePersonStatsDTO> lastYearList = calculateDeptStats(stationAndThreeDepts, lastYearParams);
|
|
|
181
|
+
|
|
|
182
|
+ // 构造柱状图数据
|
|
|
183
|
+ AttendanceTrendDataDTO currentData = createTrendDataPoint(params.getYear() + "年", currentList);
|
|
|
184
|
+ AttendanceTrendDataDTO lastYearData = createTrendDataPoint((params.getYear() - 1) + "年", lastYearList);
|
|
|
185
|
+ results.add(lastYearData);
|
|
|
186
|
+ results.add(currentData);
|
|
|
187
|
+
|
|
|
188
|
+
|
|
|
189
|
+ return results;
|
|
|
190
|
+ }
|
|
|
191
|
+
|
|
|
192
|
+ /**
|
|
|
193
|
+ * 计算部门统计数据
|
|
|
194
|
+ */
|
|
|
195
|
+ private List<AttendancePersonStatsDTO> calculateDeptStats(List<SysDept> depts, IndicatorCalculationParams params) {
|
|
|
196
|
+ List<AttendancePersonStatsDTO> results = new ArrayList<>();
|
|
|
197
|
+ depts.forEach(dept -> {
|
|
|
198
|
+ results.add(createAttendancePersonStats(dept, params));
|
|
|
199
|
+ });
|
|
|
200
|
+ return results;
|
|
|
201
|
+ }
|
|
|
202
|
+
|
|
|
203
|
+ /**
|
|
|
204
|
+ * 创建趋势数据点
|
|
|
205
|
+ */
|
|
|
206
|
+ private AttendanceTrendDataDTO createTrendDataPoint(String timeLabel, List<AttendancePersonStatsDTO> dataList) {
|
|
|
207
|
+ AttendanceTrendDataDTO data = new AttendanceTrendDataDTO();
|
|
|
208
|
+ data.setTimeLabel(timeLabel);
|
|
|
209
|
+ data.setOverall(getStationValue(dataList));
|
|
|
210
|
+ data.setData1(getDeptValue(dataList, "安检一大队"));
|
|
|
211
|
+ data.setData2(getDeptValue(dataList, "安检二大队"));
|
|
|
212
|
+ data.setData3(getDeptValue(dataList, "安检三大队"));
|
|
|
213
|
+ data.setData4(getDeptValue(dataList, "安检综合大队"));
|
|
|
214
|
+ return data;
|
|
|
215
|
+ }
|
|
|
216
|
+
|
|
|
217
|
+ /**
|
|
|
218
|
+ * 获取季度标签
|
|
|
219
|
+ */
|
|
|
220
|
+ private String getQuarterLabel(IndicatorCalculationParams params) {
|
|
|
221
|
+ if (params.getYear() != null && params.getQuarter() != null) {
|
|
|
222
|
+ return params.getYear() + "年第" + params.getQuarter() + "季度";
|
|
|
223
|
+ }
|
|
|
224
|
+ return "当前季度";
|
|
|
225
|
+ }
|
|
|
226
|
+
|
|
|
227
|
+ /**
|
|
|
228
|
+ * 获取上季度标签
|
|
|
229
|
+ */
|
|
|
230
|
+ private String getLastQuarterLabel(IndicatorCalculationParams params) {
|
|
|
231
|
+ if (params.getYear() != null && params.getQuarter() != null) {
|
|
|
232
|
+ int lastQuarter = params.getQuarter() - 1;
|
|
|
233
|
+ int year = params.getYear();
|
|
|
234
|
+ if (lastQuarter <= 0) {
|
|
|
235
|
+ lastQuarter = 4;
|
|
|
236
|
+ year = year - 1;
|
|
|
237
|
+ }
|
|
|
238
|
+ return year + "年第" + lastQuarter + "季度";
|
|
|
239
|
+ }
|
|
|
240
|
+ return "上季度";
|
|
|
241
|
+ }
|
|
|
242
|
+
|
|
|
243
|
+ /**
|
|
|
244
|
+ * 获取去年季度标签
|
|
|
245
|
+ */
|
|
|
246
|
+ private String getLastYearQuarterLabel(IndicatorCalculationParams params) {
|
|
|
247
|
+ if (params.getYear() != null && params.getQuarter() != null) {
|
|
|
248
|
+ return (params.getYear() - 1) + "年第" + params.getQuarter() + "季度";
|
|
|
249
|
+ }
|
|
|
250
|
+ return "去年同期季度";
|
|
|
251
|
+ }
|
|
|
252
|
+
|
|
|
253
|
+ /**
|
|
|
254
|
+ * 月度标签
|
|
|
255
|
+ */
|
|
|
256
|
+ private String getMonthLabel(IndicatorCalculationParams params) {
|
|
|
257
|
+ if (params.getYear() != null && params.getMonth() != null) {
|
|
|
258
|
+ return params.getYear() + "年" + params.getMonth() + "月";
|
|
|
259
|
+ }
|
|
|
260
|
+ return "当前月度";
|
|
|
261
|
+ }
|
|
|
262
|
+
|
|
|
263
|
+ /**
|
|
|
264
|
+ * 获取上月标签
|
|
|
265
|
+ */
|
|
|
266
|
+ private String getLastMonthLabel(IndicatorCalculationParams params) {
|
|
|
267
|
+ if (params.getYear() != null && params.getMonth() != null) {
|
|
|
268
|
+ int lastMonth = params.getMonth() - 1;
|
|
|
269
|
+ int year = params.getYear();
|
|
|
270
|
+ if (lastMonth <= 0) {
|
|
|
271
|
+ lastMonth = 12;
|
|
|
272
|
+ year = year - 1;
|
|
|
273
|
+ }
|
|
|
274
|
+ return year + "年" + lastMonth + "月";
|
|
|
275
|
+ }
|
|
|
276
|
+ return "上月";
|
|
|
277
|
+ }
|
|
|
278
|
+
|
|
|
279
|
+ /**
|
|
|
280
|
+ * 获取去年本月度标签
|
|
|
281
|
+ */
|
|
|
282
|
+ private String getLastYearMonthLabel(IndicatorCalculationParams params) {
|
|
|
283
|
+ if (params.getYear() != null && params.getMonth() != null) {
|
|
|
284
|
+ return (params.getYear() - 1) + "年" + params.getMonth() + "月";
|
|
|
285
|
+ }
|
|
|
286
|
+ return "去年同期月度";
|
|
|
287
|
+ }
|
|
|
288
|
+
|
|
|
289
|
+
|
|
|
290
|
+ /**
|
|
|
291
|
+ * 创建出勤人次统计对象
|
|
|
292
|
+ */
|
|
|
293
|
+ private AttendancePersonStatsDTO createAttendancePersonStats(SysDept sysDept, IndicatorCalculationParams params) {
|
|
|
294
|
+ AttendancePersonStatsDTO result = new AttendancePersonStatsDTO();
|
|
|
295
|
+ result.setDeptId(sysDept.getDeptId());
|
|
|
296
|
+ result.setDeptName(sysDept.getDeptName());
|
|
|
297
|
+ result.setDeptType(sysDept.getDeptType());
|
|
|
298
|
+ try {
|
|
|
299
|
+ IndicatorCalculationParams calcParams = new IndicatorCalculationParams();
|
|
|
300
|
+ calcParams.setDeptId(sysDept.getDeptId());
|
|
|
301
|
+ calcParams.setYear(params.getYear());
|
|
|
302
|
+ calcParams.setQuarter(params.getQuarter());
|
|
|
303
|
+ calcParams.setMonth(params.getMonth());
|
|
|
304
|
+ calcParams.setStartTime(params.getStartTime());
|
|
|
305
|
+ calcParams.setEndTime(params.getEndTime());
|
|
|
306
|
+ calcParams.setChainRatio(params.getChainRatio());
|
|
|
307
|
+ calcParams.setYearOnYear(params.getYearOnYear());
|
|
|
308
|
+
|
|
|
309
|
+ IndicatorCalculationResult currentResult;
|
|
|
310
|
+ if (sysDept.getDeptType().equals(DeptTypeEnum.STATION.getCode())) {
|
|
|
311
|
+ currentResult = multiModelIndicatorCalculator.calculateWithRatio(overallCalculator, calcParams);
|
|
|
312
|
+ } else {
|
|
|
313
|
+ currentResult = multiModelIndicatorCalculator.calculateWithRatio(deptCalculator, calcParams);
|
|
|
314
|
+ }
|
|
|
315
|
+
|
|
|
316
|
+ if ("SUCCESS".equals(currentResult.getStatus())) {
|
|
|
317
|
+ result.setCurrentValue(currentResult.getValue());
|
|
|
318
|
+ result.setBaselineValue(currentResult.getBaselineValue());
|
|
|
319
|
+
|
|
|
320
|
+ boolean showChainRatio = params.getChainRatio() != null && params.getChainRatio();
|
|
|
321
|
+ boolean showYearOnYear = params.getYearOnYear() != null && params.getYearOnYear();
|
|
|
322
|
+
|
|
|
323
|
+ if (params.getYear() != null && params.getQuarter() == null && params.getMonth() == null) {
|
|
|
324
|
+ showChainRatio = false;
|
|
|
325
|
+ }
|
|
|
326
|
+
|
|
|
327
|
+ if (showYearOnYear && currentResult.getYearOnYearValue() != null) {
|
|
|
328
|
+ result.setYearOnYearValue(currentResult.getYearOnYearValue());
|
|
|
329
|
+ result.setYearOnYearDirection(getDirectionText(currentResult.getYearOnYearValue()));
|
|
|
330
|
+ result.setYearOnYearTimeDimension((TimeDimensionParams) currentResult.getExtraInfo().get("yearOnYear"));
|
|
|
331
|
+ }
|
|
|
332
|
+
|
|
|
333
|
+ if (showChainRatio && currentResult.getChainRatioValue() != null) {
|
|
|
334
|
+ result.setChainRatioValue(currentResult.getChainRatioValue());
|
|
|
335
|
+ result.setChainRatioDirection(getDirectionText(currentResult.getChainRatioValue()));
|
|
|
336
|
+ result.setChainTimeDimension((TimeDimensionParams) currentResult.getExtraInfo().get("chain"));
|
|
|
337
|
+ }
|
|
|
338
|
+ }
|
|
|
339
|
+ } catch (Exception e) {
|
|
|
340
|
+ throw new RuntimeException(e);
|
|
|
341
|
+ }
|
|
|
342
|
+
|
|
|
343
|
+ return result;
|
|
|
344
|
+ }
|
|
|
345
|
+
|
|
|
346
|
+ /**
|
|
|
347
|
+ * 创建上月参数
|
|
|
348
|
+ */
|
|
|
349
|
+ private IndicatorCalculationParams createLastMonthParams(IndicatorCalculationParams originalParams) {
|
|
|
350
|
+ IndicatorCalculationParams params = new IndicatorCalculationParams();
|
|
|
351
|
+ params.setYear(originalParams.getYear());
|
|
|
352
|
+ params.setQuarter(originalParams.getQuarter());
|
|
|
353
|
+ params.setMonth(originalParams.getMonth());
|
|
|
354
|
+ params.setStartTime(originalParams.getStartTime());
|
|
|
355
|
+ params.setEndTime(originalParams.getEndTime());
|
|
|
356
|
+ params.setChainRatio(false);
|
|
|
357
|
+ params.setYearOnYear(false);
|
|
|
358
|
+
|
|
|
359
|
+ // 计算上月
|
|
|
360
|
+ if (params.getMonth() != null) {
|
|
|
361
|
+ int lastMonth = params.getMonth() - 1;
|
|
|
362
|
+ int year = params.getYear();
|
|
|
363
|
+ if (lastMonth <= 0) {
|
|
|
364
|
+ lastMonth = 12;
|
|
|
365
|
+ year = year - 1;
|
|
|
366
|
+ }
|
|
|
367
|
+ params.setMonth(lastMonth);
|
|
|
368
|
+ params.setYear(year);
|
|
|
369
|
+ }
|
|
|
370
|
+
|
|
|
371
|
+ return params;
|
|
|
372
|
+ }
|
|
|
373
|
+
|
|
|
374
|
+ /**
|
|
|
375
|
+ * 创建上季度参数
|
|
|
376
|
+ */
|
|
|
377
|
+ private IndicatorCalculationParams createLastQuarterParams(IndicatorCalculationParams originalParams) {
|
|
|
378
|
+ IndicatorCalculationParams params = new IndicatorCalculationParams();
|
|
|
379
|
+ params.setYear(originalParams.getYear());
|
|
|
380
|
+ params.setQuarter(originalParams.getQuarter());
|
|
|
381
|
+ params.setMonth(originalParams.getMonth());
|
|
|
382
|
+ params.setStartTime(originalParams.getStartTime());
|
|
|
383
|
+ params.setEndTime(originalParams.getEndTime());
|
|
|
384
|
+ params.setChainRatio(false);
|
|
|
385
|
+ params.setYearOnYear(false);
|
|
|
386
|
+
|
|
|
387
|
+ // 计算上季度
|
|
|
388
|
+ if (params.getQuarter() != null) {
|
|
|
389
|
+ int lastQuarter = params.getQuarter() - 1;
|
|
|
390
|
+ int year = params.getYear();
|
|
|
391
|
+ if (lastQuarter <= 0) {
|
|
|
392
|
+ lastQuarter = 4;
|
|
|
393
|
+ year = year - 1;
|
|
|
394
|
+ }
|
|
|
395
|
+ params.setQuarter(lastQuarter);
|
|
|
396
|
+ params.setYear(year);
|
|
|
397
|
+ }
|
|
|
398
|
+
|
|
|
399
|
+ return params;
|
|
|
400
|
+ }
|
|
|
401
|
+
|
|
|
402
|
+
|
|
|
403
|
+ /**
|
|
|
404
|
+ * 创建去年同期参数
|
|
|
405
|
+ */
|
|
|
406
|
+ private IndicatorCalculationParams createLastYearParams(IndicatorCalculationParams originalParams) {
|
|
|
407
|
+ IndicatorCalculationParams params = new IndicatorCalculationParams();
|
|
|
408
|
+ params.setYear(originalParams.getYear());
|
|
|
409
|
+ params.setQuarter(originalParams.getQuarter());
|
|
|
410
|
+ params.setMonth(originalParams.getMonth());
|
|
|
411
|
+ params.setStartTime(originalParams.getStartTime());
|
|
|
412
|
+ params.setEndTime(originalParams.getEndTime());
|
|
|
413
|
+ params.setChainRatio(false);
|
|
|
414
|
+ params.setYearOnYear(false);
|
|
|
415
|
+
|
|
|
416
|
+ // 计算去年同期
|
|
|
417
|
+ if (params.getYear() != null) {
|
|
|
418
|
+ params.setYear(params.getYear() - 1);
|
|
|
419
|
+ }
|
|
|
420
|
+
|
|
|
421
|
+ return params;
|
|
|
422
|
+ }
|
|
|
423
|
+
|
|
|
424
|
+ /**
|
|
|
425
|
+ * 获取站点值
|
|
|
426
|
+ */
|
|
|
427
|
+ private BigDecimal getStationValue(List<AttendancePersonStatsDTO> list) {
|
|
|
428
|
+ return list.stream()
|
|
|
429
|
+ .filter(dto -> DeptTypeEnum.STATION.getCode().equals(dto.getDeptType()))
|
|
|
430
|
+ .findFirst()
|
|
|
431
|
+ .map(AttendancePersonStatsDTO::getCurrentValue)
|
|
|
432
|
+ .orElse(BigDecimal.ZERO);
|
|
|
433
|
+ }
|
|
|
434
|
+
|
|
|
435
|
+ /**
|
|
|
436
|
+ * 获取指定大队的值
|
|
|
437
|
+ */
|
|
|
438
|
+ private BigDecimal getDeptValue(List<AttendancePersonStatsDTO> list, String deptName) {
|
|
|
439
|
+ return list.stream()
|
|
|
440
|
+ .filter(dto -> DeptTypeEnum.BRIGADE.getCode().equals(dto.getDeptType())
|
|
|
441
|
+ && deptName.equals(dto.getDeptName()))
|
|
|
442
|
+ .findFirst()
|
|
|
443
|
+ .map(AttendancePersonStatsDTO::getCurrentValue)
|
|
|
444
|
+ .orElse(BigDecimal.ZERO);
|
|
|
445
|
+ }
|
|
|
446
|
+
|
|
|
447
|
+ /**
|
|
|
448
|
+ * 获取方向文本:上升 或 下降
|
|
|
449
|
+ */
|
|
|
450
|
+ private String getDirectionText(String growthRate) {
|
|
|
451
|
+ if (StringUtils.isEmpty(growthRate)) return "";
|
|
|
452
|
+ if (growthRate.equals("--")) return "上升";
|
|
|
453
|
+ return new BigDecimal(growthRate).compareTo(BigDecimal.ZERO) >= 0 ? "上升" : "下降";
|
|
|
454
|
+ }
|
|
|
455
|
+
|
|
|
456
|
+
|
|
|
457
|
+ /**
|
|
|
458
|
+ * 获取站点下的所有大队
|
|
|
459
|
+ */
|
|
|
460
|
+ private List<SysDept> getBrigadesUnderSite(Long siteId) {
|
|
|
461
|
+ List<SysDept> children = deptService.selectChildrenDeptById(siteId);
|
|
|
462
|
+ return children.stream()
|
|
|
463
|
+ .filter(dept -> DeptTypeEnum.BRIGADE.getCode().equals(dept.getDeptType()))
|
|
|
464
|
+ .collect(Collectors.toList());
|
|
|
465
|
+ }
|
|
|
466
|
+
|
|
|
467
|
+}
|