Commit e60f3171b0da0632f1411a377a3fc6ef768ac170

Authored by wangqian
1 parent eb75ae76

首页查询占比优化保留2位小数

urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/app/homepage/vo/AppWorkOrderSummaryRspVo.java
... ... @@ -17,7 +17,7 @@ public class AppWorkOrderSummaryRspVo {
17 17 /*总条数*/
18 18 private String totalNum;
19 19 /*占比*/
20   - private List<Integer> percents;
  20 + private List<Double> percents;
21 21 /*单位工单统计*/
22 22 private List<AppWorkOrderSummaryVo> table;
23 23  
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java
... ... @@ -320,32 +320,29 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{
320 320 .mapToInt(AppWorkOrderSummaryVo::getTotal)
321 321 .sum();
322 322  
323   - List<Integer> percents;
  323 + List<Double> percents;
324 324 if (totalNum <= 0) {
325   - percents = Collections.singletonList(0);
  325 + percents = Collections.singletonList(0.00);
326 326 } else {
327   - List<Integer> tempPercents = workOrderList.stream()
  327 + // 2. 计算原始百分比
  328 + List<Double> tempList = workOrderList.stream()
328 329 .map(vo -> {
329   - double percent = (vo.getTotal() * 100.0) / totalNum;
330   - int round = (int) Math.round(percent);
331   - // 核心:只要 >0 的,至少给 1%,不允许出现 0%
332   - return (round == 0 && vo.getTotal() > 0) ? 1 : round;
  330 + double val = (vo.getTotal() * 100.0) / totalNum;
  331 + // 保留两位小数
  332 + return Math.round(val * 100.0) / 100.0;
333 333 })
334 334 .collect(Collectors.toList());
335 335  
336   - // 校准总和 = 100%
337   - int sum = tempPercents.stream().mapToInt(Integer::intValue).sum();
338   - int diff = sum - 100; // 多出来的部分,从最大值减掉
  336 + // 3. 计算总和,校准到 100.00
  337 + double sum = tempList.stream().mapToDouble(Double::doubleValue).sum();
  338 + double diff = Math.round((100.00 - sum) * 100.0) / 100.0;
339 339  
340   - if (diff != 0 && !tempPercents.isEmpty()) {
341   - // 找出最大值的索引,把差值减掉(最合理,不会出现0)
342   - OptionalInt maxIndex = IntStream.range(0, tempPercents.size())
343   - .reduce((i, j) -> tempPercents.get(i) > tempPercents.get(j) ? i : j);
344   - if (maxIndex.isPresent()) {
345   - tempPercents.set(maxIndex.getAsInt(), tempPercents.get(maxIndex.getAsInt()) - diff);
346   - }
  340 + if (Math.abs(diff) > 0.001 && !tempList.isEmpty()) {
  341 + // 把差值补到最后一个元素上,保证总和 = 100.00
  342 + int lastIdx = tempList.size() - 1;
  343 + tempList.set(lastIdx, Math.round((tempList.get(lastIdx) + diff) * 100.0) / 100.0);
347 344 }
348   - percents = tempPercents;
  345 + percents = tempList;
349 346 }
350 347 // 6. 封装返回数据
351 348 respVo.setLegend(companyNameList);
... ...