|  |  |  | 
|---|
|  |  |  | import com.google.common.collect.Lists; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.math.BigDecimal; | 
|---|
|  |  |  | import java.math.RoundingMode; | 
|---|
|  |  |  | import java.time.DayOfWeek; | 
|---|
|  |  |  | import java.time.LocalDate; | 
|---|
|  |  |  | import java.time.LocalDateTime; | 
|---|
|  |  |  | 
|---|
|  |  |  | import io.swagger.annotations.Api; | 
|---|
|  |  |  | import io.swagger.annotations.ApiImplicitParam; | 
|---|
|  |  |  | import io.swagger.annotations.ApiImplicitParams; | 
|---|
|  |  |  | import io.swagger.models.auth.In; | 
|---|
|  |  |  | import jdk.nashorn.internal.runtime.ListAdapter; | 
|---|
|  |  |  | import org.springframework.beans.BeanUtils; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | 
|---|
|  |  |  | import org.springframework.web.bind.annotation.*; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.annotation.Resource; | 
|---|
|  |  |  | import javax.servlet.ServletInputStream; | 
|---|
|  |  |  | import javax.servlet.http.HttpServletRequest; | 
|---|
|  |  |  | import javax.servlet.http.HttpServletResponse; | 
|---|
|  |  |  | import java.io.PrintWriter; | 
|---|
|  |  |  | import java.time.YearMonth; | 
|---|
|  |  |  | import java.time.format.DateTimeFormatter; | 
|---|
|  |  |  | import java.time.temporal.ChronoUnit; | 
|---|
|  |  |  | import java.time.temporal.TemporalAdjusters; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | 
|---|
|  |  |  | private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 远程调用根据枪id 查询最新的订单id 用户后台结束充电 | 
|---|
|  |  |  | * @param id | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/queryOrderByGunId/{id}") | 
|---|
|  |  |  | public R<String> queryOrderByGunId(@PathVariable("id") String id) { | 
|---|
|  |  |  | List<Integer> integers = new ArrayList<>(); | 
|---|
|  |  |  | integers.add(2); | 
|---|
|  |  |  | integers.add(3); | 
|---|
|  |  |  | integers.add(4); | 
|---|
|  |  |  | TChargingOrder one = chargingOrderService.lambdaQuery() | 
|---|
|  |  |  | .eq(TChargingOrder::getChargingGunId, id) | 
|---|
|  |  |  | .in(TChargingOrder::getStatus, integers) | 
|---|
|  |  |  | .one(); | 
|---|
|  |  |  | if (one!=null){ | 
|---|
|  |  |  | return R.ok(one.getId().toString()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return R.ok(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/pay/order/list") | 
|---|
|  |  |  | @ApiOperation(value = "列表", tags = {"管理后台-支付订单-订单信息"}) | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @GetMapping(value = "/getCar") | 
|---|
|  |  |  | public R<Long> getCar() { | 
|---|
|  |  |  | @GetMapping(value = "/getCar/{id}") | 
|---|
|  |  |  | public R<Long> getCar(@PathVariable("id")String id) { | 
|---|
|  |  |  | List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>() | 
|---|
|  |  |  | .eq(TChargingOrder::getAppUserId, tokenService.getLoginUserApplet().getUserId()) | 
|---|
|  |  |  | .eq(TChargingOrder::getAppUserId, id) | 
|---|
|  |  |  | .isNotNull(TChargingOrder::getAppUserCarId)); | 
|---|
|  |  |  | if (!list.isEmpty()){ | 
|---|
|  |  |  | // 最近使用的车辆id | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 充电充值支付回调 | 
|---|
|  |  |  | * @param request | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/chargingOrderWXCallback") | 
|---|
|  |  |  | public void chargingOrderWXCallback(HttpServletRequest request) { | 
|---|
|  |  |  | Map<String, Object> data = wxPaymentClient.payNotify(request).getData(); | 
|---|
|  |  |  | if (null != data) { | 
|---|
|  |  |  | String out_trade_no = data.get("out_trade_no").toString(); | 
|---|
|  |  |  | String transaction_id = data.get("transaction_id").toString(); | 
|---|
|  |  |  | String attach = data.get("attach").toString(); | 
|---|
|  |  |  | AjaxResult ajaxResult = chargingOrderService.chargingOrderCallback(1, out_trade_no, transaction_id, attach); | 
|---|
|  |  |  | if (ajaxResult.isSuccess()) { | 
|---|
|  |  |  | wxPaymentClient.ack(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public void chargingOrderWXCallback(@RequestParam("out_trade_no") String out_trade_no, @RequestParam("transaction_id") String transaction_id, | 
|---|
|  |  |  | @RequestParam("attach") String attach) { | 
|---|
|  |  |  | AjaxResult ajaxResult = chargingOrderService.chargingOrderCallback(1, out_trade_no, transaction_id, attach); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 修改安全检测数据 | 
|---|
|  |  |  | * @param securityDetection | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/securityDetection") | 
|---|
|  |  |  | public void securityDetection(@RequestBody SecurityDetection securityDetection){ | 
|---|
|  |  |  | chargingOrderService.securityDetection(securityDetection); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 远程启动充电应答 | 
|---|
|  |  |  | * @param message | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/startChargeSuccessfully") | 
|---|
|  |  |  | public void startChargeSuccessfully(@RequestBody PlatformStartChargingReplyMessage message){ | 
|---|
|  |  |  | System.err.println("远程启动应答:" + message); | 
|---|
|  |  |  | chargingOrderService.startChargeSuccessfully(message); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 支付宝支付成功后的回调 | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 远程启动失败后退款回调 | 
|---|
|  |  |  | * @param request | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/chargingOrderStartupFailureWxRefund") | 
|---|
|  |  |  | public void chargingOrderStartupFailureWxRefund(HttpServletRequest request){ | 
|---|
|  |  |  | WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData(); | 
|---|
|  |  |  | if(null != data){ | 
|---|
|  |  |  | String out_refund_no = data.getOut_refund_no(); | 
|---|
|  |  |  | String refund_id = data.getRefund_id(); | 
|---|
|  |  |  | String tradeState = data.getTradeState(); | 
|---|
|  |  |  | String success_time = data.getSuccess_time(); | 
|---|
|  |  |  | chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public void chargingOrderStartupFailureWxRefund(@RequestParam("out_trade_no") String out_refund_no, | 
|---|
|  |  |  | @RequestParam("out_trade_no") String refund_id, | 
|---|
|  |  |  | @RequestParam("out_trade_no") String tradeState, | 
|---|
|  |  |  | @RequestParam("out_trade_no") String success_time){ | 
|---|
|  |  |  | chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/work/shop") | 
|---|
|  |  |  | @ApiOperation(value = "购物收入", tags = {"后台-工作台"}) | 
|---|
|  |  |  | public R workShop(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto) { | 
|---|
|  |  |  | //count近6个月的数据 | 
|---|
|  |  |  | LocalDate sixBefore = PreviousSixMonths.get(); | 
|---|
|  |  |  | List<Map<String,Object >> shopData =  shoppingOrderService.getData(statisticsQueryDto); | 
|---|
|  |  |  | return R.ok(shopData); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @GetMapping(value = "/six/vip") | 
|---|
|  |  |  | @ApiOperation(value = "vip收入", tags = {"后台-数据分析-平台收入分析"}) | 
|---|
|  |  |  | public R<List<SixVipDto>> vip() { | 
|---|
|  |  |  | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/watch/chargingOrder") | 
|---|
|  |  |  | @ApiOperation(value = "监控订单", tags = {"管理后台-订单管理"}) | 
|---|
|  |  |  | public AjaxResult<TCharingOrderVO> watchChargingOrder(@RequestBody ChargingOrderQuery dto) { | 
|---|
|  |  |  | public R<List<ChargingOrderAndUploadRealTimeMonitoringDataDto>> watchChargingOrder(@RequestBody ChargingOrderQuery dto) { | 
|---|
|  |  |  | Integer page = dto.getPageCurr(); | 
|---|
|  |  |  | Integer pageSize = dto.getPageSize(); | 
|---|
|  |  |  | List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return AjaxResult.success(res); | 
|---|
|  |  |  | return R.ok(dtos); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | //上方折现 | 
|---|
|  |  |  | if (statisticsQueryDto.getDayType()==1){ | 
|---|
|  |  |  | List<Map<String,Object>> map = chargingOrderService.usersDay(); | 
|---|
|  |  |  | tCharingUserMapVO.setMap(map); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Map<String, Object>> charMap = new ArrayList<>(); | 
|---|
|  |  |  | // 生成从 "00:00" 到 "23:00" 的时间数据 | 
|---|
|  |  |  | for (int hour = 0; hour < 24; hour++) { | 
|---|
|  |  |  | String time = String.format("%02d:00", hour); | 
|---|
|  |  |  | Map<String, Object> mapWithTimeValue = findMapWithTimeValue(map, time); | 
|---|
|  |  |  | if (mapWithTimeValue!=null){ | 
|---|
|  |  |  | charMap.add(mapWithTimeValue); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | Map<String, Object> timeMap = new HashMap<>(); | 
|---|
|  |  |  | timeMap.put("time", time); // 初始化值为 null | 
|---|
|  |  |  | timeMap.put("counts", 0); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | charMap.add(timeMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Map<String,Object>> map1 = chargingOrderService.usersDay1(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Map<String, Object>> charMap1 = new ArrayList<>(); | 
|---|
|  |  |  | // 生成从 "00:00" 到 "23:00" 的时间数据 | 
|---|
|  |  |  | for (int hour = 0; hour < 24; hour++) { | 
|---|
|  |  |  | String time = String.format("%02d:00", hour); | 
|---|
|  |  |  | Map<String, Object> mapWithTimeValue = findMapWithTimeValue(map1, time); | 
|---|
|  |  |  | if (mapWithTimeValue!=null){ | 
|---|
|  |  |  | charMap1.add(mapWithTimeValue); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | Map<String, Object> timeMap = new HashMap<>(); | 
|---|
|  |  |  | timeMap.put("time", time); // 初始化值为 null | 
|---|
|  |  |  | timeMap.put("counts", 0); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | charMap1.add(timeMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | tCharingUserMapVO.setMap(charMap); | 
|---|
|  |  |  | tCharingUserMapVO.setMap1(charMap1); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | List<Map<String,Object>> map =  chargingOrderService.usersByQuery(statisticsQueryDto); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //按日 | 
|---|
|  |  |  | // 解析 startTime 和 endTime 为 LocalDate | 
|---|
|  |  |  | LocalDate startDate = statisticsQueryDto.getStartTime(); | 
|---|
|  |  |  | LocalDate endDate = statisticsQueryDto.getEndTime(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Map<String, Object>> dateRangeStatistics = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 遍历日期范围 | 
|---|
|  |  |  | while (!startDate.isAfter(endDate)) { | 
|---|
|  |  |  | String formattedDate = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); | 
|---|
|  |  |  | Map<String, Object> dailyStats = findMapWithDateValue(map, formattedDate); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (dailyStats != null) { | 
|---|
|  |  |  | dateRangeStatistics.add(dailyStats); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Map<String, Object> dateMap = new HashMap<>(); | 
|---|
|  |  |  | dateMap.put("time", formattedDate); | 
|---|
|  |  |  | dateMap.put("counts", 0); | 
|---|
|  |  |  | dateRangeStatistics.add(dateMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 移动到下一天 | 
|---|
|  |  |  | startDate = startDate.plusDays(1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | tCharingUserMapVO.setMap(map); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/charging/equipment") | 
|---|
|  |  |  | @ApiOperation(value = "电站评价", tags = {"管理后台-数据分析-设备运维分析"}) | 
|---|
|  |  |  | public R<TCharingUserEvaluateVO> equipment(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto){ | 
|---|
|  |  |  | public R<TCharingUserEquimentVO> equipment(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto){ | 
|---|
|  |  |  | List<Integer> siteIds =new ArrayList<>(); | 
|---|
|  |  |  | if (statisticsQueryDto.getSiteId()==null) { | 
|---|
|  |  |  | Long userId = SecurityUtils.getUserId(); | 
|---|
|  |  |  | 
|---|
|  |  |  | List<Map<String,Object>> equipmentMap1 = chargingOrderService.equipmentUserType1(siteIds,statisticsQueryDto); | 
|---|
|  |  |  | //交流可用率 | 
|---|
|  |  |  | List<Map<String,Object>> equipmentMap2= chargingOrderService.equipmentUserType2(siteIds,statisticsQueryDto); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //取出直流可用率和交流可用率的percent的平均值保留两位小数 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | double average1 = calculateAveragePercent(equipmentMap1, equipmentMap2); | 
|---|
|  |  |  | System.out.printf("The average percent is: %.2f\n", average1); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //直流故障率 | 
|---|
|  |  |  | List<Map<String,Object>> equipmentMapbroke1 = chargingOrderService.equipmentMapbroke1(siteIds,statisticsQueryDto); | 
|---|
|  |  |  | //交流故障率 | 
|---|
|  |  |  | List<Map<String,Object>> equipmentMapbroke2 = chargingOrderService.equipmentMapbroke2(siteIds,statisticsQueryDto); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | double average2 = calculateAveragePercent(equipmentMapbroke1, equipmentMapbroke2); | 
|---|
|  |  |  | System.out.printf("The average percent is: %.2f\n", average2); | 
|---|
|  |  |  | //直流离网率 | 
|---|
|  |  |  | List<Map<String,Object>> equipmentMapOut1 = chargingOrderService.equipmentMapOut1(siteIds,statisticsQueryDto); | 
|---|
|  |  |  | //交流离网率 | 
|---|
|  |  |  | List<Map<String,Object>> equipmentMapOut2 = chargingOrderService.equipmentMapOut2(siteIds,statisticsQueryDto); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | double average3 = calculateAveragePercent(equipmentMapOut1, equipmentMapOut2); | 
|---|
|  |  |  | System.out.printf("The average percent is: %.2f\n", average3); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //需求电流满足率 | 
|---|
|  |  |  | List<Map<String,Object>>  needElec1 =  chargingOrderService.needElec(siteIds,statisticsQueryDto); | 
|---|
|  |  |  | List<Map<String,Object>>  needElec2 =  chargingOrderService.needElec1(siteIds,statisticsQueryDto); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | double average4 = calculateAveragePercent(needElec1, needElec2); | 
|---|
|  |  |  | System.out.printf("The average percent is: %.2f\n", average4); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TCharingUserEquimentVO tCharingUserEquimentVO = new TCharingUserEquimentVO(); | 
|---|
|  |  |  | tCharingUserEquimentVO.setEquipmentMap1(equipmentMap1); | 
|---|
|  |  |  | tCharingUserEquimentVO.setEquipmentMap2(equipmentMap2); | 
|---|
|  |  |  | tCharingUserEquimentVO.setEquipmentMapbroke1(equipmentMapbroke1); | 
|---|
|  |  |  | tCharingUserEquimentVO.setEquipmentMapbroke2(equipmentMapbroke2); | 
|---|
|  |  |  | tCharingUserEquimentVO.setEquipmentMapOut1(equipmentMapOut1); | 
|---|
|  |  |  | tCharingUserEquimentVO.setEquipmentMapOut2(equipmentMapOut2); | 
|---|
|  |  |  | tCharingUserEquimentVO.setNeedElec1(needElec1); | 
|---|
|  |  |  | tCharingUserEquimentVO.setNeedElec2(needElec2); | 
|---|
|  |  |  | tCharingUserEquimentVO.setAverage1(average1); | 
|---|
|  |  |  | tCharingUserEquimentVO.setAverage2(average2); | 
|---|
|  |  |  | tCharingUserEquimentVO.setAverage3(average3); | 
|---|
|  |  |  | tCharingUserEquimentVO.setAverage4(average4); | 
|---|
|  |  |  | return R.ok(tCharingUserEquimentVO); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private static double calculateAveragePercent(List<Map<String, Object>> mapList1, List<Map<String, Object>> mapList2) { | 
|---|
|  |  |  | int totalElements = mapList1.size() + mapList2.size(); | 
|---|
|  |  |  | double sum = 0.0; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 累加两个列表中所有元素的 "percent" 值 | 
|---|
|  |  |  | for (Map<String, Object> map : mapList1) { | 
|---|
|  |  |  | if (map.containsKey("percent")) { | 
|---|
|  |  |  | sum += Double.parseDouble((String) map.get("percent")); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (Map<String, Object> map : mapList2) { | 
|---|
|  |  |  | if (map.containsKey("percent")) { | 
|---|
|  |  |  | sum += Double.parseDouble((String) map.get("percent")); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 防止除以零错误 | 
|---|
|  |  |  | if (totalElements == 0) { | 
|---|
|  |  |  | return 0.0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 计算平均值 | 
|---|
|  |  |  | return sum / totalElements; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/work/charge") | 
|---|
|  |  |  | @ApiOperation(value = "上方充电数据统计", tags = {"管理后台-工作台"}) | 
|---|
|  |  |  | public R<TCharingWorkVO> workCharge(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto) { | 
|---|
|  |  |  | List<Integer> siteIds = new ArrayList<>(); | 
|---|
|  |  |  | if (statisticsQueryDto.getSiteId() == null) { | 
|---|
|  |  |  | Long userId = SecurityUtils.getUserId(); | 
|---|
|  |  |  | //获取当前登录的siteIds | 
|---|
|  |  |  | List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); | 
|---|
|  |  |  | for (GetSiteListDTO datum : data) { | 
|---|
|  |  |  | siteIds.add(datum.getId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | siteIds.add(statisticsQueryDto.getSiteId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<TChargingOrder> list = chargingOrderService.lambdaQuery().in(!siteIds.isEmpty(), TChargingOrder::getSiteId, siteIds).eq(statisticsQueryDto.getSiteId() != null, TChargingOrder::getSiteId, statisticsQueryDto.getSiteId()).list(); | 
|---|
|  |  |  | //当日的订单总数 | 
|---|
|  |  |  | int size = list.size(); | 
|---|
|  |  |  | //计算list中paymentAmount的总和 | 
|---|
|  |  |  | BigDecimal totalPaymentAmount = list.stream().map(TChargingOrder::getOrderAmount).reduce(BigDecimal.ZERO, BigDecimal::add); | 
|---|
|  |  |  | //计算list中electrovalence的总和 | 
|---|
|  |  |  | BigDecimal totalElectrovalence = list.stream().map(TChargingOrder::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add); | 
|---|
|  |  |  | //计算list中serviceCharge的总和 | 
|---|
|  |  |  | BigDecimal totalServiceCharge = list.stream().map(TChargingOrder::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add); | 
|---|
|  |  |  | //计算list中charging_capacity的总和 | 
|---|
|  |  |  | BigDecimal totalChargingCapacity = list.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); | 
|---|
|  |  |  | TCharingWorkVO tCharingWorkVO = new TCharingWorkVO(); | 
|---|
|  |  |  | tCharingWorkVO.setCount(size); | 
|---|
|  |  |  | tCharingWorkVO.setTotalPaymentAmount(totalPaymentAmount); | 
|---|
|  |  |  | tCharingWorkVO.setTotalElectrovalence(totalElectrovalence); | 
|---|
|  |  |  | tCharingWorkVO.setTotalServiceCharge(totalServiceCharge); | 
|---|
|  |  |  | tCharingWorkVO.setTotalChargingCapacity(totalChargingCapacity); | 
|---|
|  |  |  | return R.ok(tCharingWorkVO); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/work/chargeDetail") | 
|---|
|  |  |  | @ApiOperation(value = "运营情况", tags = {"管理后台-工作台"}) | 
|---|
|  |  |  | public R workCharge(@RequestBody ChargingDetailQueryDto statisticsQueryDto) { | 
|---|
|  |  |  | List<Integer> siteIds = new ArrayList<>(); | 
|---|
|  |  |  | if (statisticsQueryDto.getSiteId() == null) { | 
|---|
|  |  |  | Long userId = SecurityUtils.getUserId(); | 
|---|
|  |  |  | //获取当前登录的siteIds | 
|---|
|  |  |  | List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); | 
|---|
|  |  |  | for (GetSiteListDTO datum : data) { | 
|---|
|  |  |  | siteIds.add(datum.getId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | siteIds.add(statisticsQueryDto.getSiteId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (statisticsQueryDto.getDayType()==1) { | 
|---|
|  |  |  | List<Map<String,Object>> charMap1 = chargingOrderService.getHourType(siteIds,statisticsQueryDto); | 
|---|
|  |  |  | List<Map<String, Object>> charMap = new ArrayList<>(); | 
|---|
|  |  |  | // 生成从 "00:00" 到 "23:00" 的时间数据 | 
|---|
|  |  |  | for (int hour = 0; hour < 24; hour++) { | 
|---|
|  |  |  | String time = String.format("%02d:00", hour); | 
|---|
|  |  |  | Map<String, Object> mapWithTimeValue = findMapWithTimeValue(charMap1, time); | 
|---|
|  |  |  | if (mapWithTimeValue!=null){ | 
|---|
|  |  |  | charMap.add(mapWithTimeValue); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | Map<String, Object> timeMap = new HashMap<>(); | 
|---|
|  |  |  | timeMap.put("time", time); // 初始化值为 null | 
|---|
|  |  |  | timeMap.put("electrovalence", 0); | 
|---|
|  |  |  | timeMap.put("orderCount", 0); | 
|---|
|  |  |  | timeMap.put("servicecharge", 0); | 
|---|
|  |  |  | timeMap.put("electricity", 0); | 
|---|
|  |  |  | charMap.add(timeMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return R.ok(charMap); | 
|---|
|  |  |  | }else if (statisticsQueryDto.getDayType()==2){ | 
|---|
|  |  |  | // 假设 chargingOrderService.getDateType() 返回的是按天的数据 | 
|---|
|  |  |  | List<Map<String, Object>> charMap1 = chargingOrderService.getDateType(siteIds, statisticsQueryDto); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 解析 startTime 和 endTime 为 LocalDate | 
|---|
|  |  |  | LocalDate startDate = statisticsQueryDto.getStartTime(); | 
|---|
|  |  |  | LocalDate endDate = statisticsQueryDto.getEndTime(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Map<String, Object>> dateRangeStatistics = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 遍历日期范围 | 
|---|
|  |  |  | while (!startDate.isAfter(endDate)) { | 
|---|
|  |  |  | String formattedDate = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); | 
|---|
|  |  |  | Map<String, Object> dailyStats = findMapWithDateValue(charMap1, formattedDate); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (dailyStats != null) { | 
|---|
|  |  |  | dateRangeStatistics.add(dailyStats); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Map<String, Object> dateMap = new HashMap<>(); | 
|---|
|  |  |  | dateMap.put("time", formattedDate); | 
|---|
|  |  |  | dateMap.put("electrovalence", 0); | 
|---|
|  |  |  | dateMap.put("orderCount", 0); | 
|---|
|  |  |  | dateMap.put("servicecharge", 0); | 
|---|
|  |  |  | dateMap.put("electricity", 0); | 
|---|
|  |  |  | dateRangeStatistics.add(dateMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 移动到下一天 | 
|---|
|  |  |  | startDate = startDate.plusDays(1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //            return dateRangeStatistics; | 
|---|
|  |  |  | return R.ok(dateRangeStatistics); | 
|---|
|  |  |  | }else if (statisticsQueryDto.getDayType()==3){ | 
|---|
|  |  |  | List<Map<String,Object>> charMap1 =  chargingOrderService.getMonthType(siteIds,statisticsQueryDto); | 
|---|
|  |  |  | // 解析 startTime 和 endTime 为 LocalDate | 
|---|
|  |  |  | LocalDate startDate = statisticsQueryDto.getStartTime(); | 
|---|
|  |  |  | LocalDate endDate = statisticsQueryDto.getEndTime(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Map<String, Object>> dateRangeStatistics = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 遍历日期范围 | 
|---|
|  |  |  | while (!startDate.isAfter(endDate)) { | 
|---|
|  |  |  | String formattedDate = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM")); | 
|---|
|  |  |  | Map<String, Object> dailyStats = findMapWithDateValue(charMap1, formattedDate); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (dailyStats != null) { | 
|---|
|  |  |  | dateRangeStatistics.add(dailyStats); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Map<String, Object> dateMap = new HashMap<>(); | 
|---|
|  |  |  | dateMap.put("time", formattedDate); | 
|---|
|  |  |  | dateMap.put("electrovalence", 0); | 
|---|
|  |  |  | dateMap.put("orderCount", 0); | 
|---|
|  |  |  | dateMap.put("servicecharge", 0); | 
|---|
|  |  |  | dateMap.put("electricity", 0); | 
|---|
|  |  |  | dateRangeStatistics.add(dateMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 移动到下一天 | 
|---|
|  |  |  | startDate = startDate.plusMonths(1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return R.ok(dateRangeStatistics); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return R.ok(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private static Map<String, Object> findMapWithTimeValue(List<Map<String, Object>> charMap1,String timeValue) { | 
|---|
|  |  |  | for (Map<String, Object> map : charMap1) { | 
|---|
|  |  |  | if (map.containsKey("time") && map.get("time").equals(timeValue)) { | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; // 如果没有找到,返回 null | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Map<String, Object> findMapWithDateValue(List<Map<String, Object>> list, String date) { | 
|---|
|  |  |  | for (Map<String, Object> map : list) { | 
|---|
|  |  |  | if (date.equals(map.get("time"))) { | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @PostMapping(value = "/work/use") | 
|---|
|  |  |  | @ApiOperation(value = "利用率", tags = {"管理后台-工作台"}) | 
|---|
|  |  |  | public R workUse(@RequestBody ChargingDetailQueryDto statisticsQueryDto) { | 
|---|
|  |  |  | List<Integer> siteIds = new ArrayList<>(); | 
|---|
|  |  |  | if (statisticsQueryDto.getSiteId() == null) { | 
|---|
|  |  |  | Long userId = SecurityUtils.getUserId(); | 
|---|
|  |  |  | //获取当前登录的siteIds | 
|---|
|  |  |  | List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); | 
|---|
|  |  |  | for (GetSiteListDTO datum : data) { | 
|---|
|  |  |  | siteIds.add(datum.getId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | siteIds.add(statisticsQueryDto.getSiteId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Map<String,Object>>   capMap  =   chargingOrderService.getchargingCapacity(siteIds,statisticsQueryDto); | 
|---|
|  |  |  | List<TChargingPile> chargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData(); | 
|---|
|  |  |  | //获取chargingPiles的ratedPower的总和再乘以chargingPiles的数量再乘以24 | 
|---|
|  |  |  | BigDecimal totalRatedPower = chargingPiles.stream().map(TChargingPile::getRatedPower).reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(chargingPiles.size())).multiply(new BigDecimal(24)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //将capMap的chargingCapacity除以totalRatedPower保留两位数 | 
|---|
|  |  |  | capMap.forEach(map -> { | 
|---|
|  |  |  | BigDecimal chargingCapacity = (BigDecimal) map.get("chargingCapacity"); | 
|---|
|  |  |  | BigDecimal result = chargingCapacity.divide(totalRatedPower, 2, RoundingMode.HALF_UP); | 
|---|
|  |  |  | map.put("chargingCapacity", result); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // | 
|---|
|  |  |  | // 解析 startTime 和 endTime 为 LocalDate | 
|---|
|  |  |  | LocalDate startDate = statisticsQueryDto.getStartTime(); | 
|---|
|  |  |  | LocalDate endDate = statisticsQueryDto.getEndTime(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Map<String, Object>> dateRangeStatistics = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 遍历日期范围 | 
|---|
|  |  |  | while (!startDate.isAfter(endDate)) { | 
|---|
|  |  |  | String formattedDate = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); | 
|---|
|  |  |  | Map<String, Object> dailyStats = findMapWithDateValue(capMap, formattedDate); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (dailyStats != null) { | 
|---|
|  |  |  | dateRangeStatistics.add(dailyStats); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Map<String, Object> dateMap = new HashMap<>(); | 
|---|
|  |  |  | dateMap.put("time", formattedDate); | 
|---|
|  |  |  | dateMap.put("chargingCapacity", 0); | 
|---|
|  |  |  | dateRangeStatistics.add(dateMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 移动到下一天 | 
|---|
|  |  |  | startDate = startDate.plusDays(1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return R.ok(dateRangeStatistics); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private TOrderInvoiceService invoiceService; | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @GetMapping(value = "/work/shopOrder") | 
|---|
|  |  |  | @ApiOperation(value = "购物订单统计", tags = {"管理后台-工作台"}) | 
|---|
|  |  |  | public R shopOrder() { | 
|---|
|  |  |  | Long count = shoppingOrderService.lambdaQuery().eq(TShoppingOrder::getStatus, 1).count(); | 
|---|
|  |  |  | Long count1 = shoppingOrderService.lambdaQuery().eq(TShoppingOrder::getStatus, 2).count(); | 
|---|
|  |  |  | List<Long> counts = new ArrayList<>(); | 
|---|
|  |  |  | counts.add(count); | 
|---|
|  |  |  | counts.add(count1); | 
|---|
|  |  |  | return R.ok(counts); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @GetMapping(value = "/work/invoice") | 
|---|
|  |  |  | @ApiOperation(value = "开票统计", tags = {"管理后台-工作台"}) | 
|---|
|  |  |  | public R invoice() { | 
|---|
|  |  |  | Long count = invoiceService.lambdaQuery().eq(TOrderInvoice::getStatus, 1).count(); | 
|---|
|  |  |  | Long count1 = invoiceService.lambdaQuery().eq(TOrderInvoice::getStatus, 3).count(); | 
|---|
|  |  |  | List<Long> counts = new ArrayList<>(); | 
|---|
|  |  |  | counts.add(count); | 
|---|
|  |  |  | counts.add(count1); | 
|---|
|  |  |  | return R.ok(counts); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @GetMapping(value = "/work/users/count") | 
|---|
|  |  |  | @ApiOperation(value = "用户数量", tags = {"管理后台-工作台"}) | 
|---|
|  |  |  | public R usersCount() { | 
|---|
|  |  |  | List<Map<String,Object>>  userMap  =    chargingOrderService.countAllUserData(); | 
|---|
|  |  |  | return R.ok(userMap); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public static void main(String[] args) { | 
|---|
|  |  |  | // 示例数据 | 
|---|
|  |  |  | List<TChargingOrder> list = getSampleData(); | 
|---|
|  |  |  | 
|---|
|  |  |  | TChargingOrder chargingOrder = chargingOrderService.getChargingOrderByLicensePlate(query); | 
|---|
|  |  |  | return R.ok(chargingOrder); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 修改充电订单 | 
|---|
|  |  |  | * @param chargingOrder | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @PostMapping("/updateChargingOrder") | 
|---|
|  |  |  | public R<String> updateChargingOrder(@RequestBody TChargingOrder chargingOrder){ | 
|---|
|  |  |  | chargingOrderService.updateById(chargingOrder); | 
|---|
|  |  |  | return R.ok(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|