| | |
| | | result.put("electricityFee", electricity); |
| | | result.put("serviceFee", service); |
| | | result.put("incomeColumn", franchiseeIncomeTrendFromSix(sixChargingDtos)); |
| | | List<Map<String, Object>> incomePie = new ArrayList<>(); |
| | | Map<String, Object> electricityItem = new LinkedHashMap<>(); |
| | | electricityItem.put("name", "充电费"); |
| | | electricityItem.put("value", electricity); |
| | | incomePie.add(electricityItem); |
| | | Map<String, Object> serviceItem = new LinkedHashMap<>(); |
| | | serviceItem.put("name", "服务费"); |
| | | serviceItem.put("value", service); |
| | | incomePie.add(serviceItem); |
| | | result.put("incomePie", incomePie); |
| | | // 电站收入占比:口径与后台 /six/circle 一致(近6月结算账单按站点分组,电费+服务费-三方佣金) |
| | | result.put("incomePie", franchiseeIncomePieBySite(siteIds)); |
| | | return R.ok(result); |
| | | } |
| | | |
| | | /** 加盟商看板"电站收入占比":复用 /six/circle 统计口径,按金额降序返回站点占比列表 */ |
| | | private List<Map<String, Object>> franchiseeIncomePieBySite(List<Integer> siteIds) { |
| | | List<Map<String, Object>> incomePie = new ArrayList<>(); |
| | | if (siteIds == null || siteIds.isEmpty()) { |
| | | return incomePie; |
| | | } |
| | | List<SixCircleDto> circleDtos = chargingOrderService.circle(siteIds, PreviousSixMonths.get(), false); |
| | | if (circleDtos == null || circleDtos.isEmpty()) { |
| | | return incomePie; |
| | | } |
| | | // 站点名批量映射,避免逐个远程调用 |
| | | Map<Integer, String> siteNameMap = new HashMap<>(); |
| | | R<List<Site>> siteResult = siteClient.getSiteAll(); |
| | | List<Site> sites = siteResult == null ? null : siteResult.getData(); |
| | | if (sites != null) { |
| | | for (Site site : sites) { |
| | | if (site != null && site.getId() != null) { |
| | | siteNameMap.put(site.getId(), site.getName()); |
| | | } |
| | | } |
| | | } |
| | | circleDtos.sort((a, b) -> { |
| | | BigDecimal amountA = a == null || a.getPaymentAmount() == null ? BigDecimal.ZERO : a.getPaymentAmount(); |
| | | BigDecimal amountB = b == null || b.getPaymentAmount() == null ? BigDecimal.ZERO : b.getPaymentAmount(); |
| | | return amountB.compareTo(amountA); |
| | | }); |
| | | for (SixCircleDto dto : circleDtos) { |
| | | if (dto == null || dto.getSiteId() == null || dto.getPaymentAmount() == null) { |
| | | continue; |
| | | } |
| | | Map<String, Object> item = new LinkedHashMap<>(); |
| | | item.put("name", siteNameMap.getOrDefault(dto.getSiteId(), "电站" + dto.getSiteId())); |
| | | item.put("value", dto.getPaymentAmount()); |
| | | incomePie.add(item); |
| | | } |
| | | return incomePie; |
| | | } |
| | | |
| | | @PostMapping("/app/franchisee/user") |
| | | public R<Map<String, Object>> franchiseeUser(@RequestBody(required = false) Map<String, Object> params) { |
| | | Partner partner = franchiseePartner(); |