From 4d7a208f388e42e7dd83dab0e38eadfa0847de1c Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期三, 11 十二月 2024 19:24:10 +0800 Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java | 576 +++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 439 insertions(+), 137 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java index b833c5b..b71a9d6 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java @@ -3,6 +3,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; +import java.text.DecimalFormat; import java.time.*; @@ -18,18 +19,23 @@ import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; +import com.ruoyi.chargingPile.api.model.TParkingRecord; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.ChargingOrderGroup; import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; import com.ruoyi.common.core.web.domain.BasePojo; import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.common.security.annotation.Logical; +import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.integration.api.model.PageChargingOrderAndUploadRealTimeMonitoringDataDto; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; import com.ruoyi.integration.api.model.ChargingOrderAndUploadRealTimeMonitoringDataDto; +import com.ruoyi.integration.api.model.UploadRealTimeMonitoringPageData; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.common.core.dto.MongoChargingOrderQuery; @@ -133,6 +139,12 @@ @Resource private TOrderInvoiceService invoiceService; + @Resource + private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; + + + + /** * 远程调用 增加管理后台赠送会员记录 @@ -165,6 +177,9 @@ } return R.ok(); } + + + @RequiresPermissions(value = {"/invoiceManagement/select_order", "/paymentOrder/order"}, logical = Logical.OR) @ResponseBody @PostMapping(value = "/pay/order/list") @ApiOperation(value = "列表", tags = {"管理后台-支付订单-订单信息"}) @@ -177,7 +192,9 @@ public R refund(@RequestBody PayOrderRefundDto payOrderQueryDto) { return chargingOrderService.payRefund(payOrderQueryDto); } - + + + @RequiresPermissions(value = {"/paymentOrder/order"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/pay/order/pay/detail") @ApiOperation(value = "支付信息", tags = {"管理后台-支付订单-订单信息"}) @@ -193,6 +210,8 @@ payOrderInfoDto.setPayAmount(byId.getPaymentAmount()); payOrderInfoDto.setPayTime(byId.getCreateTime()); payOrderInfoDto.setRefundAmount(byId.getRefundAmount()); + payOrderInfoDto.setRechargeAmount(byId.getRechargeAmount()); + payOrderInfoDto.setFinalAmount(byId.getRechargeAmount().subtract(byId.getRefundAmount())); return R.ok(payOrderInfoDto); case 2: TShoppingOrder byId1 = shoppingOrderService.getById(orderId); @@ -204,6 +223,8 @@ payOrderInfoDto1.setPayAmount(byId1.getPaymentAmount()); payOrderInfoDto1.setPayTime(byId1.getCreateTime()); payOrderInfoDto1.setRefundAmount(byId1.getRefundAmount()); + payOrderInfoDto1.setRechargeAmount(byId1.getPaymentAmount()); + payOrderInfoDto1.setFinalAmount(byId1.getPaymentAmount().subtract(byId1.getRefundAmount())); return R.ok(payOrderInfoDto1); case 3: TVipOrder byId2 = vipOrderService.getById(orderId); @@ -215,19 +236,19 @@ payOrderInfoDto2.setPayAmount(byId2.getPaymentAmount()); payOrderInfoDto2.setPayTime(byId2.getCreateTime()); payOrderInfoDto2.setRefundAmount(byId2.getRefundAmount()); + payOrderInfoDto2.setRechargeAmount(byId2.getPaymentAmount()); + payOrderInfoDto2.setFinalAmount(byId2.getPaymentAmount().subtract(byId2.getRefundAmount())); return R.ok(payOrderInfoDto2); //todo luo 停车场订单 -// case 4: -// TParkingRecord byId3 = parkingLotClient.getRecordById(orderId).getData(); -// PayOrderInfoDto payOrderInfoDto3 = new PayOrderInfoDto(); -// payOrderInfoDto3.setOrderId(byId3.getId().toString()); -// payOrderInfoDto3.setCode(byId3.getCode()); -// payOrderInfoDto3.setTradeNo(byId3); -// payOrderInfoDto3.setPayType(0); -// payOrderInfoDto3.setPayAmount(new BigDecimal("0")); -// payOrderInfoDto3.setPayTime(LocalDateTime.now()); -// payOrderInfoDto3.setRefundAmount(new BigDecimal("0")); - + case 4: + R<TParkingRecord> recordById = parkingLotClient.getRecordById(orderId); + TParkingRecord byId3 =recordById.getData(); + PayOrderInfoDto payOrderInfoDto3 = new PayOrderInfoDto(); + payOrderInfoDto3.setOrderId(byId3.getId().toString()); + payOrderInfoDto3.setCode(byId3.getCode()); + payOrderInfoDto3.setPayTime(byId3.getCreateTime()); + payOrderInfoDto3.setRechargeAmount(byId3.getPayment()); + return R.ok(payOrderInfoDto3); @@ -302,9 +323,10 @@ return R.ok(list); } - - - + + + + @RequiresPermissions(value = {"/paymentOrder/refund"}, logical = Logical.OR) @ResponseBody @PostMapping(value = "/pay/order/refund/list") @ApiOperation(value = "列表", tags = {"管理后台-支付订单-退款订单"}) @@ -323,12 +345,13 @@ return chargingOrderService.getRefundList(chargingRefundDto); } - - - - - - + + + + + + + @RequiresPermissions(value = {"/chargingPileOrder"}, logical = Logical.OR) @ResponseBody @PostMapping(value = "/chargingOrder") @ApiOperation(value = "充电桩订单列表", tags = {"管理后台-订单管理"}) @@ -338,14 +361,15 @@ TCharingOrderVO res = chargingOrderService.chargingOrder(dto); return AjaxResult.success(res); } - + + + @RequiresPermissions(value = {"/chargingPileOrder/monitoring_record"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/chargingOrderInfo") @ApiOperation(value = "充电桩订单列表查看详情", tags = {"管理后台-订单管理"}) public AjaxResult<ChargingOrderInfoVO> chargingOrderInfo(String strategyId) { TChargingOrder byId = chargingOrderService.getById(strategyId); ChargingOrderInfoVO chargingOrderInfoVO = new ChargingOrderInfoVO(); - chargingOrderInfoVO.setCdElectronic(byId.getCurrent()!=null?byId.getCurrent().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":""); chargingOrderInfoVO.setCdVoltage(byId.getVoltage()!=null?byId.getVoltage().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":""); chargingOrderInfoVO.setSurplus(byId.getTotalElectricity()!=null?byId.getTotalElectricity().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":""); @@ -360,18 +384,18 @@ } } // 时段总服务费 - BigDecimal bigDecimal = new BigDecimal("0"); List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery().eq(TChargingOrderAccountingStrategy::getChargingOrderId, strategyId).orderByDesc(TChargingOrderAccountingStrategy::getStartTime).list(); - + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); for (TChargingOrderAccountingStrategy tChargingOrderAccountingStrategy : list) { - if (byId.getVipDiscountAmount()!=null){ + String format = tChargingOrderAccountingStrategy.getCreateTime().format(formatter); + tChargingOrderAccountingStrategy.setStartTime(format+" "+tChargingOrderAccountingStrategy.getStartTime()); + tChargingOrderAccountingStrategy.setEndTime(format+" "+tChargingOrderAccountingStrategy.getEndTime()); + if (byId.getVipDiscountAmount()!=null && byId.getServiceCharge().compareTo(BigDecimal.ZERO) != 0){ BigDecimal multiply = byId.getVipDiscountAmount().divide(byId.getServiceCharge(), 2) .multiply(tChargingOrderAccountingStrategy.getPeriodOriginalServicePrice()); tChargingOrderAccountingStrategy.setVipDiscount(multiply); } - bigDecimal = bigDecimal.add(tChargingOrderAccountingStrategy.getPeriodOriginalServicePrice()); - - if (byId.getCouponDiscountAmount()!=null){ + if (byId.getCouponDiscountAmount()!=null && byId.getServiceCharge().compareTo(BigDecimal.ZERO) != 0){ BigDecimal multiply = byId.getCouponDiscountAmount().divide(byId.getServiceCharge(), 2) .multiply(tChargingOrderAccountingStrategy.getPeriodOriginalServicePrice()); tChargingOrderAccountingStrategy.setCouponDiscount(multiply); @@ -478,6 +502,11 @@ @GetMapping(value = "/getMyChargingOrderInfo") @ApiOperation(value = "获取充电记订单明细", tags = {"小程序-充电记录"}) public AjaxResult<MyChargingOrderInfo> getMyChargingOrderInfo(String id) { + TChargingOrder tChargingOrder = chargingOrderService.getById(id); + Long userId = tokenService.getLoginUserApplet().getUserId(); + if(!tChargingOrder.getAppUserId().equals(userId)){ + return AjaxResult.error("权限不足"); + } MyChargingOrderInfo myChargingOrderInfo = chargingOrderService.getMyChargingOrderInfo(id); return AjaxResult.success(myChargingOrderInfo); } @@ -508,7 +537,7 @@ @PostMapping(value = "/chargingOrderWXCallback") 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); + chargingOrderService.chargingOrderCallback(1, out_trade_no, transaction_id, attach); } @@ -519,7 +548,7 @@ @ResponseBody @PostMapping(value = "/securityDetection") public void securityDetection(@RequestBody SecurityDetectionVO securityDetection){ - log.error("-------------------安全检测数据-------------------:" + securityDetection); + log.info("-------------------安全检测数据-------------------:" + securityDetection); chargingOrderService.securityDetection(securityDetection); } @@ -530,7 +559,7 @@ @ResponseBody @PostMapping(value = "/startChargeSuccessfully") public void startChargeSuccessfully(@RequestBody PlatformStartChargingReplyMessageVO message){ - log.error("-------------------远程启动充电请求应答-------------------:" + message); + log.info("-------------------远程启动充电请求应答-------------------:" + message); chargingOrderService.startChargeSuccessfully(message); } @@ -541,21 +570,10 @@ */ @ResponseBody @PostMapping(value = "/chargingOrderALICallback") - public void chargingOrderALICallback(@RequestBody AliQueryOrder aliQueryOrder, HttpServletResponse response) { - try { - String out_trade_no = aliQueryOrder.getOutTradeNo(); - String transaction_id = aliQueryOrder.getTradeNo(); - String attach = aliQueryOrder.getPassbackParams(); - AjaxResult ajaxResult = chargingOrderService.chargingOrderCallback(2, out_trade_no, transaction_id, attach); - if (ajaxResult.isSuccess()) { - PrintWriter writer = response.getWriter(); - writer.println("success"); - writer.flush(); - writer.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } + public void chargingOrderALICallback(@RequestParam("out_trade_no") String out_trade_no, + @RequestParam("transaction_id") String transaction_id, + @RequestParam("attach") String attach) { + chargingOrderService.chargingOrderCallback(2, out_trade_no, transaction_id, attach); } @@ -618,7 +636,7 @@ */ @PostMapping("/terminateSuccessfulResponse") public void terminateSuccessfulResponse(@RequestBody PlatformStopChargingReplyVO platformStopChargingReply){ - log.error("-------------------远程停止充电请求应答-------------------:" + platformStopChargingReply); + log.info("-------------------远程停止充电请求应答-------------------:" + platformStopChargingReply); chargingOrderService.terminateSuccessfulResponse(platformStopChargingReply); } @@ -629,18 +647,19 @@ */ @PostMapping("/endChargeBillingCharge") public void endChargeBillingCharge(@RequestBody TransactionRecordMessageVO vo){ - log.error("-------------------停止充电返回账单后计算费用及修改业务状态-------------------:" + vo); + log.info("-------------------停止充电返回账单后计算费用及修改业务状态-------------------:" + vo); chargingOrderService.endChargeBillingCharge(vo); } - + + @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/six/charge") @ApiOperation(value = "电站收入分析", tags = {"后台-数据分析-平台收入分析"}) public R<List<SixChargingDto>> charge(Integer siteId) { - Long userId = SecurityUtils.getUserId(); + Long userId = tokenService.getLoginUser().getUserid(); //如果没传siteId,获取当前登陆人所有的siteIds List<Integer> siteIds = new ArrayList<>(); if (siteId==null){ @@ -650,6 +669,9 @@ } }else { siteIds.add(siteId); + } + if (siteIds.isEmpty()){ + siteIds.add(-1); } LocalDate sixBefore = PreviousSixMonths.get(); //通过siteIds进行sql查询统计 @@ -684,12 +706,13 @@ return months; } - + + @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/six/circle") @ApiOperation(value = "电站收入占比", tags = {"后台-数据分析-平台收入分析"}) public R<List<SixCircleDto>> circle() { - Long userId = SecurityUtils.getUserId(); + Long userId = tokenService.getLoginUser().getUserid(); //获取当前登录的siteIds List<Integer> siteIds = new ArrayList<>(); List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); @@ -707,8 +730,9 @@ return R.ok(sixCircleDtos); } - - + + + @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/six/shop") @ApiOperation(value = "购物收入", tags = {"后台-数据分析-平台收入分析"}) @@ -744,7 +768,9 @@ return months; } - + + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) @ResponseBody @PostMapping(value = "/work/shop") @ApiOperation(value = "购物收入", tags = {"后台-工作台"}) @@ -754,7 +780,8 @@ List<Map<String,Object >> shopData = shoppingOrderService.getData(statisticsQueryDto); return R.ok(shopData); } - + + @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/six/vip") @ApiOperation(value = "vip收入", tags = {"后台-数据分析-平台收入分析"}) @@ -764,7 +791,9 @@ List<SixVipDto> vipDtos = vipOrderService.sixBefore(sixBefore); return R.ok(vipDtos); } - + + + @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/six/total") @ApiOperation(value = "底部数据分类", tags = {"后台-数据分析-平台收入分析"}) @@ -773,6 +802,9 @@ LocalDate sixBefore = PreviousSixMonths.get(); Map<String,Object> map = chargingOrderService.countAll(sixBefore); BigDecimal data = parkingLotClient.getRecordAmount(sixBefore).getData(); + if (map ==null){ + map = new HashMap<String,Object>(); + } map.put("parkingAmount",data); BigDecimal data1 = shoppingOrderService.getSumAmount(sixBefore); map.put("shopAmount",data1); @@ -783,60 +815,79 @@ return R.ok(map); } - - @Resource - private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; + + + @RequiresPermissions(value = {"/chargeOrderMonitoring"}, logical = Logical.OR) @ResponseBody @PostMapping(value = "/watch/chargingOrder") @ApiOperation(value = "监控订单", tags = {"管理后台-订单管理"}) public R watchChargingOrder(@RequestBody MongoChargingOrderQuery mongoChargingOrderQuery) { -// Integer page = dto.getPageCurr(); -// Integer pageSize = dto.getPageSize(); -// List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); -// dto.setUserIds(data); -// dto.setPageCurr(1); -// dto.setPageSize(99999); - -// Map<String,TChargingOrder> map = new HashMap<>(); -// //吧list放入map中 -// for (ChargingOrderVO record : res.getList().getRecords()) { -// map.put(record.getCode(),record); -// } -// Set<String> strings = map.keySet(); - + Long userid = tokenService.getLoginUser().getUserid(); + List<Integer> siteIds = new ArrayList<>(); + if (mongoChargingOrderQuery.getSiteId()==null){ + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userid).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + }else { + siteIds.add(mongoChargingOrderQuery.getSiteId()); + } + mongoChargingOrderQuery.setSiteIds(siteIds); mongoChargingOrderQuery.setPageSize(10); - List<UploadRealTimeMonitoringData> data1 = uploadRealTimeMonitoringDataClient.getAll(mongoChargingOrderQuery).getData(); + R<UploadRealTimeMonitoringPageData> all = uploadRealTimeMonitoringDataClient.getAll(mongoChargingOrderQuery); + UploadRealTimeMonitoringPageData data1 = all.getData(); List<ChargingOrderAndUploadRealTimeMonitoringDataDto> dtos = new ArrayList<>(); Map<String,ChargingOrderVO> map = new HashMap<>(); - for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data1) { + for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data1.getRecords()) { ChargingOrderAndUploadRealTimeMonitoringDataDto dataDto = new ChargingOrderAndUploadRealTimeMonitoringDataDto(); ChargingOrderQuery dto = new ChargingOrderQuery(); dto.setCode(uploadRealTimeMonitoringData.getTransaction_serial_number()); - TCharingOrderVO vo = chargingOrderService.chargingOrder(dto); - if (!vo.getList().getRecords().isEmpty()) { - ChargingOrderVO chargingOrderVO = vo.getList().getRecords().get(0); - if (chargingOrderVO != null) { - BeanUtils.copyProperties(chargingOrderVO, dataDto); + + if (map.get(uploadRealTimeMonitoringData.getTransaction_serial_number())==null) { + TCharingOrderVO vo = chargingOrderService.chargingOrder(dto); + map.put(uploadRealTimeMonitoringData.getTransaction_serial_number(),vo.getList().getRecords().get(0)); + if (!vo.getList().getRecords().isEmpty()) { + ChargingOrderVO chargingOrderVO = vo.getList().getRecords().get(0); + if (chargingOrderVO != null) { + BeanUtils.copyProperties(chargingOrderVO, dataDto); + } + BeanUtils.copyProperties(uploadRealTimeMonitoringData, dataDto); + dataDto.setStartTime(uploadRealTimeMonitoringData.getStartTime()); + dataDto.setEndTime(uploadRealTimeMonitoringData.getEndTime() == null ? null : uploadRealTimeMonitoringData.getEndTime()); + dataDto.setStatus(uploadRealTimeMonitoringData.getStatus()); + dtos.add(dataDto); } - BeanUtils.copyProperties(uploadRealTimeMonitoringData,dataDto); - dataDto.setStartTime(uploadRealTimeMonitoringData.getStartTime()); - dataDto.setEndTime(uploadRealTimeMonitoringData.getEndTime()==null?null:uploadRealTimeMonitoringData.getEndTime()); - dataDto.setStatus(chargingOrderVO.getStatus()); - dtos.add(dataDto); }else { - continue; + ChargingOrderVO vo = map.get(uploadRealTimeMonitoringData.getTransaction_serial_number()); + BeanUtils.copyProperties(vo, dataDto); + BeanUtils.copyProperties(uploadRealTimeMonitoringData, dataDto); + dataDto.setStartTime(uploadRealTimeMonitoringData.getStartTime()); + dataDto.setEndTime(uploadRealTimeMonitoringData.getEndTime() == null ? null : uploadRealTimeMonitoringData.getEndTime()); + dataDto.setStatus(uploadRealTimeMonitoringData.getStatus()); + dtos.add(dataDto); } } for (int i = 0; i < dtos.size(); i++) { dtos.get(i).setIndex(i); } - return R.ok(dtos); + PageChargingOrderAndUploadRealTimeMonitoringDataDto page = new PageChargingOrderAndUploadRealTimeMonitoringDataDto(); + page.setTotal(data1.getCount()); + page.setRecords(dtos); + + return R.ok(page); } - + @RequiresPermissions(value = {"/chargeOrderMonitoring/del"}, logical = Logical.OR) + @ResponseBody + @GetMapping(value = "/watch/deletes") + @ApiOperation(value = "监控订单-删除", tags = {"管理后台-订单管理"}) + public R watchChargingOrder(@RequestParam String id) { + uploadRealTimeMonitoringDataClient.delete(id); + return R.ok(); + } /** * 处理充电订单实时监控数据相关的业务逻辑 @@ -856,18 +907,18 @@ return R.ok(chargingOrderService.getOne(Wrappers.lambdaQuery(TChargingOrder.class) .eq(TChargingOrder::getCode,code))); } - - - - - + + + + + @RequiresPermissions(value = {"/chargingOperationAnalysis"}, logical = Logical.OR) @ResponseBody @PostMapping(value = "/charging/statistics") @ApiOperation(value = "统计,充电订单分析", tags = {"管理后台-数据分析-充电运营分析"}) public R<TCharingOrderMapVO> watchChargingOrder(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto){ List<Integer> siteIds =new ArrayList<>(); if (statisticsQueryDto.getSiteId()==null) { - Long userId = SecurityUtils.getUserId(); + Long userId = tokenService.getLoginUser().getUserid(); //获取当前登录的siteIds List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { @@ -898,16 +949,13 @@ // 获取当前日期 LocalDate today = LocalDate.now(); start = statisticsQueryDto.getStartTime(); - end = statisticsQueryDto.getEndTime(); + end = statisticsQueryDto.getEndTime().plusDays(1); // 获取本月1号的日期 - YearMonth yearMonth = YearMonth.from(today); // start = yearMonth.atDay(1); // // System.out.println("本月1号是: " + start); }else if (statisticsQueryDto.getDayType()==4){ - LocalDate today = LocalDate.now(); - // 获取当前年份 - int currentYear = today.getYear(); + // 获取今年1月1日的日期 start = statisticsQueryDto.getStartTime(); end = statisticsQueryDto.getEndTime(); @@ -916,7 +964,11 @@ // 获取今年1月1日的日期 start = statisticsQueryDto.getStartTime(); end = statisticsQueryDto.getEndTime(); + if (start.equals(end)){ + end = end.plusDays(1); + } } + List<TChargingOrder> list = chargingOrderService.lambdaQuery().ge(TChargingOrder::getCreateTime, start).le(TChargingOrder::getCreateTime, end).in(TChargingOrder::getSiteId, siteIds).list(); List<Long> chargingOrderIds = list.stream().map(TChargingOrder::getId).collect(Collectors.toList()); chargingOrderIds.add(-1L); @@ -925,19 +977,154 @@ if (statisticsQueryDto.getDayType()==1){ List<Map<String,Object>> maps1 = chargingOrderService.getDateData(chargingOrderIds); - tCharingOrderMapVO.setMaps1(maps1); + + 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(maps1, 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("paymentAmount", 0); + timeMap.put("paymoney", 0); + timeMap.put("servicecharge", 0); + + charMap.add(timeMap); + } + } + + tCharingOrderMapVO.setMaps1(charMap); }else if (statisticsQueryDto.getDayType()==2){ + + + List<Map<String,Object>> maps1 = chargingOrderService.getWeekData(chargingOrderIds); - tCharingOrderMapVO.setMaps1(maps1); + + 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(maps1, 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("paymentAmount", 0); + dateMap.put("paymoney", 0); + dateMap.put("servicecharge", 0); + dateRangeStatistics.add(dateMap); + } + + // 移动到下一天 + startDate = startDate.plusDays(1); + } + tCharingOrderMapVO.setMaps1(dateRangeStatistics); }else if (statisticsQueryDto.getDayType()==3){ List<Map<String,Object>> maps1 = chargingOrderService.getMonthData(chargingOrderIds); - tCharingOrderMapVO.setMaps1(maps1); + + 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(maps1, 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("paymentAmount", 0); + dateMap.put("paymoney", 0); + dateMap.put("servicecharge", 0); + dateRangeStatistics.add(dateMap); + } + + // 移动到下一天 + startDate = startDate.plusDays(1); + } + tCharingOrderMapVO.setMaps1(dateRangeStatistics); }else if (statisticsQueryDto.getDayType()==4){ List<Map<String,Object>> maps1 = chargingOrderService.getYearData(chargingOrderIds); - tCharingOrderMapVO.setMaps1(maps1); + + 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(maps1, 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("paymentAmount", 0); + dateMap.put("paymoney", 0); + dateMap.put("servicecharge", 0); + dateRangeStatistics.add(dateMap); + } + + // 移动到下一天 + startDate = startDate.plusDays(1); + } + tCharingOrderMapVO.setMaps1(dateRangeStatistics); }else if (statisticsQueryDto.getDayType()==5){ List<Map<String,Object>> maps1 = chargingOrderService.getByDate(chargingOrderIds); - tCharingOrderMapVO.setMaps1(maps1); + + 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(maps1, 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("paymentAmount", 0); + dateMap.put("paymoney", 0); + dateMap.put("servicecharge", 0); + dateRangeStatistics.add(dateMap); + } + + // 移动到下一天 + startDate = startDate.plusDays(1); + } + tCharingOrderMapVO.setMaps1(dateRangeStatistics); } @@ -963,7 +1150,7 @@ public R<TCharingOrderPowerMapVO> power(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto) { List<Integer> siteIds = new ArrayList<>(); if (statisticsQueryDto.getSiteId() == null) { - Long userId = SecurityUtils.getUserId(); + Long userId = tokenService.getLoginUser().getUserid(); //获取当前登录的siteIds List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { @@ -972,6 +1159,8 @@ } else { siteIds.add(statisticsQueryDto.getSiteId()); } + + List<Map<String,Object>> maps1 = chargingOrderService.queryPower(siteIds); @@ -983,17 +1172,31 @@ return R.ok(tCharingOrderPowerMapVO); } - - + + + @RequiresPermissions(value = {"/chargingUserAnalysis"}, logical = Logical.OR) @ResponseBody @PostMapping(value = "/charging/users") @ApiOperation(value = "除电站流量外", tags = {"管理后台-数据分析-充电用户分析"}) public R<TCharingUserMapVO> users(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto){ + Long userId = tokenService.getLoginUserApplet().getUserId(); + + List<Integer> siteIds = new ArrayList<>(); + if (statisticsQueryDto.getSiteId()==null){ + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + }else { + siteIds.add(statisticsQueryDto.getSiteId()); + } + statisticsQueryDto.setSiteIds(siteIds); + TCharingUserMapVO tCharingUserMapVO = new TCharingUserMapVO(); //上方折现 if (statisticsQueryDto.getDayType()==1){ - List<Map<String,Object>> map = chargingOrderService.usersDay(); + List<Map<String,Object>> map = chargingOrderService.usersDay(statisticsQueryDto); List<Map<String, Object>> charMap = new ArrayList<>(); // 生成从 "00:00" 到 "23:00" 的时间数据 @@ -1033,6 +1236,8 @@ tCharingUserMapVO.setMap(charMap); tCharingUserMapVO.setMap1(charMap1); }else { + + List<Map<String,Object>> map = chargingOrderService.usersByQuery(statisticsQueryDto); @@ -1113,8 +1318,21 @@ //车辆用途 List<Map<String, Object>> carMap = chargingOrderService.carUserMethod(); + //车辆品牌 List<Map<String, Object>> carBrandMap = chargingOrderService.carUserBrand(); + List<String> brands = new ArrayList<>(); + for (Map<String, Object> objectMap : carBrandMap) { + brands.add(objectMap.get("vehicle_brand").toString()); + } + + if (carBrandMap.size()>=5) { + Long count = chargingOrderService.countCar(brands); + Map<String, Object> others = new HashMap<>(); + others.put("vehicle_brand", "其他"); + others.put("counts", count); + carBrandMap.add(others); + } //本地车数量 Map<String,Object> localCarMap = chargingOrderService.countLocalCar(); @@ -1128,13 +1346,16 @@ return R.ok(tCharingUserMapVO); } + + + @RequiresPermissions(value = {"/chargingUserAnalysis"}, logical = Logical.OR) @ResponseBody @PostMapping(value = "/charging/sites") @ApiOperation(value = "电站评价", tags = {"管理后台-数据分析-充电用户分析"}) public R<TCharingUserEvaluateVO> sites(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto){ List<Integer> siteIds =new ArrayList<>(); if (statisticsQueryDto.getSiteId()==null) { - Long userId = SecurityUtils.getUserId(); + Long userId = tokenService.getLoginUser().getUserid(); //获取当前登录的siteIds List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { @@ -1164,21 +1385,23 @@ List<Map<String,Object>> badTop = orderEvaluateService.badTop(siteIds); //流量分析 - List<Map<String,Object>> sourceMap = chargingOrderService.countBySource(siteIds); + List<Map<String,Object>> sourceMap = chargingOrderService.countBySource(siteIds,statisticsQueryDto); tCharingUserEvaluateVO.setGoodTop(goodTop); tCharingUserEvaluateVO.setBadTop(badTop); tCharingUserEvaluateVO.setFlow(sourceMap); //流量 return R.ok(tCharingUserEvaluateVO); } - + + + @RequiresPermissions(value = {"/operationMaintenanceAnalysis"}, logical = Logical.OR) @ResponseBody @PostMapping(value = "/charging/equipment") @ApiOperation(value = "电站评价", tags = {"管理后台-数据分析-设备运维分析"}) public R<TCharingUserEquimentVO> equipment(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto){ List<Integer> siteIds =new ArrayList<>(); - if (statisticsQueryDto.getSiteId()==null) { - Long userId = SecurityUtils.getUserId(); + if (statisticsQueryDto.getSiteId()==null||statisticsQueryDto.getSiteId()==0) { + Long userId = tokenService.getLoginUser().getUserid(); //获取当前登录的siteIds List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { @@ -1189,8 +1412,48 @@ } //直流可用率 List<Map<String,Object>> equipmentMap1 = chargingOrderService.equipmentUserType1(siteIds,statisticsQueryDto); + for (Map<String, Object> result : equipmentMap1) { + Object percentObj = result.get("percent"); + if (percentObj instanceof String) { + try { + BigDecimal percent = new BigDecimal((String) percentObj); + if (percent.compareTo(BigDecimal.ZERO) < 0) { + result.put("percent", percent.negate().toString()); + } + } catch (NumberFormatException e) { + // 处理转换异常 + result.put("percent", BigDecimal.ZERO); // 或者其他默认值 + } + } else if (percentObj instanceof BigDecimal) { + BigDecimal percent = (BigDecimal) percentObj; + if (percent.compareTo(BigDecimal.ZERO) < 0) { + result.put("percent", percent.negate().toString()); + } + } + } + //交流可用率 List<Map<String,Object>> equipmentMap2= chargingOrderService.equipmentUserType2(siteIds,statisticsQueryDto); + + for (Map<String, Object> result : equipmentMap2) { + Object percentObj = result.get("percent"); + if (percentObj instanceof String) { + try { + BigDecimal percent = new BigDecimal((String) percentObj); + if (percent.compareTo(BigDecimal.ZERO) < 0) { + result.put("percent", percent.negate().toString()); + } + } catch (NumberFormatException e) { + // 处理转换异常 + result.put("percent", BigDecimal.ZERO); // 或者其他默认值 + } + } else if (percentObj instanceof BigDecimal) { + BigDecimal percent = (BigDecimal) percentObj; + if (percent.compareTo(BigDecimal.ZERO) < 0) { + result.put("percent", percent.negate().toString()); + } + } + } //取出直流可用率和交流可用率的percent的平均值保留两位小数 @@ -1239,8 +1502,8 @@ return R.ok(tCharingUserEquimentVO); } - - private static double calculateAveragePercent(List<Map<String, Object>> mapList1, List<Map<String, Object>> mapList2) { + private static final DecimalFormat DF = new DecimalFormat("#.00"); + public static double calculateAveragePercent(List<Map<String, Object>> mapList1, List<Map<String, Object>> mapList2) { int totalElements = mapList1.size() + mapList2.size(); double sum = 0.0; @@ -1262,16 +1525,21 @@ } // 计算平均值 - return sum / totalElements; - } + double average = sum / totalElements; + // 格式化为两位小数 + return Double.parseDouble(DF.format(average)); + } + + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) @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(); + Long userId = tokenService.getLoginUser().getUserid(); //获取当前登录的siteIds List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { @@ -1288,11 +1556,11 @@ - List<TChargingOrder> list = chargingOrderService.lambdaQuery().in(!siteIds.isEmpty(), TChargingOrder::getSiteId, siteIds).ge( TChargingOrder::getCreateTime,min).le(BasePojo::getCreateTime,max).eq(statisticsQueryDto.getSiteId() != null, TChargingOrder::getSiteId, statisticsQueryDto.getSiteId()).list(); + List<TChargingOrder> list = chargingOrderService.lambdaQuery().in(!siteIds.isEmpty(), TChargingOrder::getSiteId, siteIds).ge( TChargingOrder::getCreateTime,min).le(BasePojo::getCreateTime,max).eq(TChargingOrder::getStatus,5).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); + BigDecimal totalPaymentAmount = list.stream().map(TChargingOrder::getPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); //计算list中electrovalence的总和 BigDecimal totalElectrovalence = list.stream().map(TChargingOrder::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add); //计算list中serviceCharge的总和 @@ -1307,16 +1575,17 @@ tCharingWorkVO.setTotalChargingCapacity(totalChargingCapacity); return R.ok(tCharingWorkVO); } - - - + + + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) @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(); + Long userId = tokenService.getLoginUser().getUserid(); //获取当前登录的siteIds List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { @@ -1431,17 +1700,18 @@ } return null; } - - - - + + + + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) @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(); + Long userId = tokenService.getLoginUser().getUserid(); //获取当前登录的siteIds List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { @@ -1493,8 +1763,9 @@ } - + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/work/shopOrder") @ApiOperation(value = "购物订单统计", tags = {"管理后台-工作台"}) @@ -1506,7 +1777,9 @@ counts.add(count1); return R.ok(counts); } - + + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/work/invoice") @ApiOperation(value = "开票统计", tags = {"管理后台-工作台"}) @@ -1518,7 +1791,8 @@ counts.add(count1); return R.ok(counts); } - + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) @ResponseBody @GetMapping(value = "/work/users/count") @ApiOperation(value = "用户数量", tags = {"管理后台-工作台"}) @@ -1534,7 +1808,7 @@ Long userId = tokenService.getLoginUserApplet().getUserId(); List<TChargingOrder> list = chargingOrderService.list(Wrappers.lambdaQuery(TChargingOrder.class) .eq(TChargingOrder::getAppUserId, userId) - .eq(TChargingOrder::getStatus, 3)); + .in(TChargingOrder::getStatus, Arrays.asList(1,2,3,4))); List<Integer> gunIds = list.stream().map(TChargingOrder::getChargingGunId).collect(Collectors.toList()); return R.ok(gunIds); } @@ -1591,7 +1865,7 @@ */ @PostMapping("/endCharge") public void endCharge(@RequestParam("code") String code){ - log.error(code + ":-------------------充电桩自动结束充电-------------------"); + log.info(code + ":-------------------充电桩自动结束充电-------------------"); chargingOrderService.endCharge(code, 2); } @@ -1601,7 +1875,7 @@ */ @PostMapping("/excelEndCharge") public void excelEndCharge(@RequestParam("code") String code){ - log.error(code + ":-------------------充电异常,停止充电-------------------"); + log.info(code + ":-------------------充电异常,停止充电-------------------"); chargingOrderService.excelEndCharge(code); } @@ -1638,4 +1912,32 @@ EndOfChargePageInfo endOfChargePageInfo = chargingOrderService.getEndOfChargePageInfo(id); return AjaxResult.success(endOfChargePageInfo); } + + + /** + * 获取订单数据 + * @param order + * @return + */ + @PostMapping("/getChargingOrder") + public R<List<TChargingOrder>> getChargingOrder(@RequestBody TChargingOrderVo order){ + List<TChargingOrder> chargingOrder = chargingOrderService.getChargingOrder(order); + return R.ok(chargingOrder); + } + + + /** + * 根据车辆id获取指定时间范围内的数据 + * @param carId + * @param startTime + * @param endTime + * @return + */ + @PostMapping("/getCarChargingOrder") + public R<List<TChargingOrder>> getCarChargingOrder(@RequestParam("carId") Long carId, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime){ + List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserCarId, carId).eq(TChargingOrder::getDelFlag, 0) + .in(TChargingOrder::getStatus, Arrays.asList(4, 5)).between(TChargingOrder::getStartTime, startTime, endTime)); + return R.ok(list); + } + } -- Gitblit v1.7.1