From c5462d60b99823adb10d9e9eda671920118538f7 Mon Sep 17 00:00:00 2001 From: luodangjia <luodangjia> Date: 星期四, 12 九月 2024 09:06:35 +0800 Subject: [PATCH] 9.12 --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java | 762 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 732 insertions(+), 30 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 9c19079..f011021 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 @@ -1,7 +1,11 @@ package com.ruoyi.order.controller; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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; @@ -9,6 +13,7 @@ import com.ruoyi.account.api.feignClient.AppUserCarClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUserCar; +import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient; @@ -19,16 +24,27 @@ import com.ruoyi.chargingPile.api.model.TParkingRecord; import com.ruoyi.chargingPile.api.vo.SiteVO; 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.utils.DateUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.BasePage; import com.ruoyi.common.core.web.page.PageInfo; +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.UploadRealTimeMonitoringData; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.TChargingCountQuery; +import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; +import com.ruoyi.order.api.vo.*; import com.ruoyi.order.api.vo.ChargingOrderInfoVO; import com.ruoyi.order.api.vo.ChargingOrderVO; +import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.GetMyChargingOrderList; import com.ruoyi.order.dto.GetNoInvoicedOrder; @@ -37,12 +53,16 @@ import com.ruoyi.order.dto.OrderEvaluateVo; import com.ruoyi.order.dto.*; import com.ruoyi.order.service.*; +import com.ruoyi.order.util.PreviousSixMonths; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; import com.ruoyi.payment.api.vo.AliQueryOrder; +import com.ruoyi.payment.api.vo.WxRefundNotifyResp; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; +import jdk.nashorn.internal.runtime.ListAdapter; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @@ -51,12 +71,17 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; +import java.time.YearMonth; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAdjusters; +import java.util.*; import java.util.*; import java.util.List; +import java.util.stream.Collectors; /** * <p> - * 前端控制器 + * 前端控制器 * </p> * * @author xiaochen @@ -73,20 +98,21 @@ private TokenService tokenService; @Autowired private TOrderEvaluateService orderEvaluateService; - + @Resource private WxPaymentClient wxPaymentClient; - + @Resource private RedisService redisService; - + @Resource private AliPaymentClient aliPaymentClient; @Resource private TShoppingOrderService shoppingOrderService; - - @Autowired + + @Resource private AppUserClient appUserClient; + @Resource private TVipOrderService vipOrderService; @@ -110,11 +136,20 @@ @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; + + + @ResponseBody @PostMapping(value = "/pay/order/list") @ApiOperation(value = "列表", tags = {"管理后台-支付订单-订单信息"}) public R<PageInfo<PayOrderDto>> payOrderList(@RequestBody PayOrderQueryDto payOrderQueryDto) { return chargingOrderService.payOrderQuery(payOrderQueryDto); + } + @ResponseBody + @PostMapping(value = "/pay/order/refund") + @ApiOperation(value = "退款", tags = {"管理后台-支付订单-订单信息"}) + public R refund(@RequestBody PayOrderRefundDto payOrderQueryDto) { + return chargingOrderService.payRefund(payOrderQueryDto); } @ResponseBody @@ -168,11 +203,12 @@ // payOrderInfoDto3.setRefundAmount(new BigDecimal("0")); - } + + + } return R.ok(); } - @ResponseBody @GetMapping(value = "/pay/order/refund/detail") @ApiOperation(value = "退款信息", tags = {"管理后台-支付订单-订单信息"}) @@ -205,8 +241,10 @@ payOrderChargingInfo.setChargingName(data1.getName()); TChargingGun data2 = chargingGunClient.getChargingGunById(byId.getChargingGunId()).getData(); payOrderChargingInfo.setGunName(data2.getName()); - List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(byId.getAppUserCarId())).getData(); - payOrderChargingInfo.setCarNum(data3.get(0).getLicensePlate()); + if (byId.getAppUserCarId()!=null) { + List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(byId.getAppUserCarId())).getData(); + payOrderChargingInfo.setCarNum(data3.get(0).getLicensePlate()); + } return R.ok(); } @@ -219,13 +257,25 @@ } + @ResponseBody @PostMapping(value = "/pay/order/refund/list") - @ApiOperation(value = "充电信息", tags = {"管理后台-支付订单-退款订单"}) + @ApiOperation(value = "列表", tags = {"管理后台-支付订单-退款订单"}) public R<PageInfo<TChargingOrderRefund>> refundList(@RequestBody ChargingRefundDto chargingRefundDto) { return chargingOrderService.getRefundList(chargingRefundDto); } + @ResponseBody + @PostMapping(value = "/pay/order/refund/list1") + @ApiOperation(value = "列表1", tags = {"管理后台-支付订单-退款订单"}) + public R<PageInfo<TChargingOrderRefund>> refundList1(@RequestBody ChargingRefundDto chargingRefundDto) { + return chargingOrderService.getRefundList(chargingRefundDto); + + } + + + + @ResponseBody @@ -264,7 +314,6 @@ orderEvaluateService.addOrderEvaluate(dto); return AjaxResult.success(); } - /** * 查询用户最近一次充电记录使用的车辆 * @@ -276,18 +325,17 @@ List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>() .eq(TChargingOrder::getAppUserId, tokenService.getLoginUserApplet().getUserId()) .isNotNull(TChargingOrder::getAppUserCarId)); - if (!list.isEmpty()) { + if (!list.isEmpty()){ // 最近使用的车辆id Long size = list.get(0).getAppUserCarId(); return R.ok(size); - } else { + }else{ return R.ok(-1L); } } /** * 查询会员在本月有多少次享受了充电折扣 - * * @param req * @return */ @@ -299,7 +347,6 @@ .between(TChargingOrder::getStartTime, req.getStartTime(), req.getEndTime())).size(); return R.ok(size); } - //用户订单数量 @PostMapping(value = "/useOrderCount") public R<Long> useOrderCount(@RequestParam("userId") Long userId) { @@ -314,9 +361,22 @@ return R.ok(chargingOrderService.getById(orderId)); } + @PostMapping(value = "/getList") + public R<List<TChargingOrder>> getList(@RequestParam("siteId") Integer siteId) { + + List<TChargingOrder> list = chargingOrderService.lambdaQuery().eq(TChargingOrder::getSiteId, siteId).list(); + return R.ok(list); + } + + @PostMapping(value = "/getBySiteIdAndTime") + public R<List<ChargingOrderGroup>> getBySiteIdAndTime(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto) { + + List<ChargingOrderGroup> groups = chargingOrderService.chargingOrderGroup(chargingPercentProvinceDto); + return R.ok(groups); + } + /** * 根据充电枪id获取正在进行中的订单 - * * @param chargingGunId 充电枪id * @return */ @@ -326,8 +386,10 @@ .eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getStatus, 3)); return R.ok(one); } - - + + + + @ResponseBody @GetMapping(value = "/getMyChargingOrderList") @ApiOperation(value = "获取充电记录列表", tags = {"小程序-充电记录"}) @@ -335,8 +397,8 @@ Map<String, Object> orderList = chargingOrderService.getMyChargingOrderList(query); return AjaxResult.success(orderList); } - - + + @ResponseBody @GetMapping(value = "/getMyChargingOrderInfo") @ApiOperation(value = "获取充电记订单明细", tags = {"小程序-充电记录"}) @@ -344,8 +406,9 @@ MyChargingOrderInfo myChargingOrderInfo = chargingOrderService.getMyChargingOrderInfo(id); return AjaxResult.success(myChargingOrderInfo); } - - + + + @ResponseBody @GetMapping(value = "/getNoInvoicedOrder") @ApiOperation(value = "获取未开票的订单数据", tags = {"小程序-充电发票"}) @@ -353,18 +416,18 @@ List<MyChargingOrderList> list = chargingOrderService.getNoInvoicedOrder(query); return AjaxResult.success(list); } - - + + + @ResponseBody @PostMapping(value = "/paymentChargingOrder") @ApiOperation(value = "支付充电充值费用", tags = {"小程序-扫一扫"}) public AjaxResult paymentChargingOrder(@RequestBody AddChargingOrder addChargingOrder) { return chargingOrderService.paymentChargingOrder(addChargingOrder); } - + /** * 充电充值支付回调 - * * @param request */ @ResponseBody @@ -404,6 +467,27 @@ e.printStackTrace(); } } + + + /** + * 远程启动失败后退款回调 + * @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); + } + } + + + @ResponseBody @@ -417,8 +501,9 @@ Object cacheObject = redisService.getCacheObject(key); return AjaxResult.success(cacheObject); } - - + + + @ResponseBody @GetMapping(value = "/getChargingDetails/{id}") @ApiOperation(value = "获取充电中页面数据", tags = {"小程序-扫一扫"}) @@ -440,5 +525,622 @@ public AjaxResult stopCharging(@PathVariable String id) { return chargingOrderService.stopCharging(id); } -} + @ResponseBody + @GetMapping(value = "/six/charge") + @ApiOperation(value = "电站收入分析", tags = {"后台-数据分析-平台收入分析"}) + public R<List<SixChargingDto>> charge(Integer siteId) { + Long userId = SecurityUtils.getUserId(); + //如果没传siteId,获取当前登陆人所有的siteIds + List<Integer> siteIds = new ArrayList<>(); + if (siteId==null){ + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + }else { + siteIds.add(siteId); + } + LocalDate sixBefore = PreviousSixMonths.get(); + //通过siteIds进行sql查询统计 + List<SixChargingDto> chargingDtos = chargingOrderService.charge(sixBefore, siteIds); + + return R.ok(chargingDtos); + + } + + @ResponseBody + @GetMapping(value = "/six/circle") + @ApiOperation(value = "电站收入占比", tags = {"后台-数据分析-平台收入分析"}) + public R<List<SixCircleDto>> circle() { + Long userId = SecurityUtils.getUserId(); + //获取当前登录的siteIds + List<Integer> siteIds = new ArrayList<>(); + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + //进行统计groupBySiteId + LocalDate sixBefore = PreviousSixMonths.get(); + + List<SixCircleDto> sixCircleDtos = chargingOrderService.circle(siteIds,sixBefore); + for (SixCircleDto sixCircleDto : sixCircleDtos) { + Site site = siteClient.getSiteByIds(Arrays.asList(sixCircleDto.getSiteId())).getData().get(0); + sixCircleDto.setSiteName(site.getName()); + } + return R.ok(sixCircleDtos); + + } + + + @ResponseBody + @GetMapping(value = "/six/shop") + @ApiOperation(value = "购物收入", tags = {"后台-数据分析-平台收入分析"}) + public R<List<SixShopDto>> shop(Integer status) { + //count近6个月的数据 + LocalDate sixBefore = PreviousSixMonths.get(); + List<SixShopDto> sixShopDtos = shoppingOrderService.sixBefore(sixBefore,status); + return R.ok(sixShopDtos); + } + + @ResponseBody + @GetMapping(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() { + //count近6个月的数据 + LocalDate sixBefore = PreviousSixMonths.get(); + List<SixVipDto> vipDtos = vipOrderService.sixBefore(sixBefore); + return R.ok(vipDtos); + } + + @ResponseBody + @GetMapping(value = "/six/total") + @ApiOperation(value = "底部数据分类", tags = {"后台-数据分析-平台收入分析"}) + public R<Map<String,Object>> total() { + //count近6个月的数据 + LocalDate sixBefore = PreviousSixMonths.get(); + Map<String,Object> map = chargingOrderService.countAll(sixBefore); + BigDecimal data = parkingLotClient.getRecordAmount(sixBefore).getData(); + map.put("parkingAmount",data); + BigDecimal data1 = shoppingOrderService.getSumAmount(sixBefore); + map.put("shopAmount",data1); + BigDecimal data2 = vipOrderService.getSumAmout(sixBefore); + map.put("vipAmount",data2); + + return R.ok(map); + } + + @Resource + private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; + @ResponseBody + @PostMapping(value = "/watch/chargingOrder") + @ApiOperation(value = "监控订单", tags = {"管理后台-订单管理"}) + public AjaxResult<TCharingOrderVO> watchChargingOrder(@RequestBody ChargingOrderQuery dto) { + 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); + TCharingOrderVO res = chargingOrderService.chargingOrder(dto); + Map<String,TChargingOrder> map = new HashMap<>(); + //吧list放入map中 + for (ChargingOrderVO record : res.getList().getRecords()) { + map.put(record.getCode(),record); + } + Set<String> strings = map.keySet(); + + + List<UploadRealTimeMonitoringData> data1 = uploadRealTimeMonitoringDataClient.getAll(strings, page, pageSize).getData(); + + List<ChargingOrderAndUploadRealTimeMonitoringDataDto> dtos = new ArrayList<>(); + for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data1) { + ChargingOrderAndUploadRealTimeMonitoringDataDto dataDto = new ChargingOrderAndUploadRealTimeMonitoringDataDto(); + BeanUtils.copyProperties(uploadRealTimeMonitoringData,dataDto); + BeanUtils.copyProperties(map.get(uploadRealTimeMonitoringData.getCharging_pile_code()),dataDto); + dtos.add(dataDto); + } + + + return AjaxResult.success(res); + } + + + + + /** + * 处理充电订单实时监控数据相关的业务逻辑 + * @param query + */ + @PostMapping("/chargeMonitoring") + public void chargeMonitoring(@RequestBody UploadRealTimeMonitoringDataQuery query){ + chargingOrderService.chargeMonitoring(query); + } + /** + * 通过流水号查询订单 + * @param code + * @return + */ + @PostMapping(value = "/getOrderByCode/{code}") + public R<TChargingOrder> getOrderByCode(@PathVariable("code") String code){ + return R.ok(chargingOrderService.getOne(Wrappers.lambdaQuery(TChargingOrder.class) + .eq(TChargingOrder::getCode,code))); + } + + + + + + @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(); + //获取当前登录的siteIds + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + }else { + siteIds.add(statisticsQueryDto.getSiteId()); + } + TCharingOrderMapVO tCharingOrderMapVO = new TCharingOrderMapVO(); + + + LocalDate start = null; + LocalDate end = null; + if (statisticsQueryDto.getDayType()==1){ + start = LocalDate.now(); + + }else if (statisticsQueryDto.getDayType()==2){ + LocalDate today = LocalDate.now(); + + // 获取本周一的日期 + LocalDate mondayThisWeek = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); + + System.out.println("本周一是: " + mondayThisWeek); + } + else if (statisticsQueryDto.getDayType()==3){ + // 获取当前日期 + LocalDate today = LocalDate.now(); + + // 获取本月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 = LocalDate.of(currentYear, 1, 1); + System.out.println("今年1月1日是: " + start); + }else if (statisticsQueryDto.getDayType()==5){ + + // 获取今年1月1日的日期 + start = statisticsQueryDto.getStartTime(); + end = statisticsQueryDto.getEndTime(); + } + List<TChargingOrder> list = chargingOrderService.lambdaQuery().ge(TChargingOrder::getStartTime, start).le(TChargingOrder::getEndTime, end).in(TChargingOrder::getSiteId, siteIds).list(); + List<Long> chargingOrderIds = list.stream().map(TChargingOrder::getId).collect(Collectors.toList()); + //上方饼图 + List<Map<String,Object>> maps = chargingOrderService.getSumByType(chargingOrderIds); + + if (statisticsQueryDto.getDayType()==1){ + List<Map<String,Object>> maps1 = chargingOrderService.getDateData(chargingOrderIds); + tCharingOrderMapVO.setMaps1(maps1); + }else if (statisticsQueryDto.getDayType()==2){ + List<Map<String,Object>> maps1 = chargingOrderService.getWeekData(chargingOrderIds); + tCharingOrderMapVO.setMaps1(maps1); + }else if (statisticsQueryDto.getDayType()==3){ + List<Map<String,Object>> maps1 = chargingOrderService.getMonthData(chargingOrderIds); + tCharingOrderMapVO.setMaps1(maps1); + }else if (statisticsQueryDto.getDayType()==4){ + List<Map<String,Object>> maps1 = chargingOrderService.getYearData(chargingOrderIds); + tCharingOrderMapVO.setMaps1(maps1); + }else if (statisticsQueryDto.getDayType()==5){ + List<Map<String,Object>> maps1 = chargingOrderService.getByDate(chargingOrderIds); + tCharingOrderMapVO.setMaps1(maps1); + } + + + tCharingOrderMapVO.setMaps(maps); + + + return R.ok(tCharingOrderMapVO); + + } + + + @ResponseBody + @PostMapping(value = "/charging/power") + @ApiOperation(value = "功率", tags = {"管理后台-数据分析-充电运营分析"}) + public R<TCharingOrderPowerMapVO> power(@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<Map<String,Object>> maps1 = chargingOrderService.queryPower(siteIds); + + + Map<String,Object> map = chargingOrderService.qureryPowerLevel(siteIds,statisticsQueryDto); + + TCharingOrderPowerMapVO tCharingOrderPowerMapVO = new TCharingOrderPowerMapVO(); + tCharingOrderPowerMapVO.setMaps1(map); + tCharingOrderPowerMapVO.setMaps(maps1); + return R.ok(tCharingOrderPowerMapVO); + + } + + + @ResponseBody + @PostMapping(value = "/charging/users") + @ApiOperation(value = "除电站流量外", tags = {"管理后台-数据分析-充电用户分析"}) + public R<TCharingUserMapVO> users(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto){ + + TCharingUserMapVO tCharingUserMapVO = new TCharingUserMapVO(); + //上方折现 + if (statisticsQueryDto.getDayType()==1){ + List<Map<String,Object>> map = chargingOrderService.usersDay(); + tCharingUserMapVO.setMap(map); + }else { + List<Map<String,Object>> map = chargingOrderService.usersByQuery(statisticsQueryDto); + tCharingUserMapVO.setMap(map); + } + + //用户标签 + List<Map<String,Object>> maps = chargingOrderService.getUserTagCount(); + //会员标签 + List<Map<String,Object>> maps1 = chargingOrderService.getVipCount(); + + //单位消费 + List<Map<String, Object>> untiMap = chargingOrderService.unitConsumption(statisticsQueryDto); + + //车辆用途 + List<Map<String, Object>> carMap = chargingOrderService.carUserMethod(); + //车辆品牌 + List<Map<String, Object>> carBrandMap = chargingOrderService.carUserBrand(); + //本地车数量 + Map<String,Object> localCarMap = chargingOrderService.countLocalCar(); + + + tCharingUserMapVO.setUserMaps(maps); + tCharingUserMapVO.setVipMaps(maps1); + tCharingUserMapVO.setUntiMap(untiMap); + tCharingUserMapVO.setCarMap(carMap); + tCharingUserMapVO.setCarBrandMap(carBrandMap); + tCharingUserMapVO.setLocalCarMap(localCarMap); + return R.ok(tCharingUserMapVO); + + } + @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(); + //获取当前登录的siteIds + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + }else { + siteIds.add(statisticsQueryDto.getSiteId()); + } + //查询评价分 + Long aver = chargingOrderService.getAver(siteIds); + //查询各个分数 + List<Map<String,Object>> evaluate = chargingOrderService.getLevelEvaluate(siteIds); + //查询差评回复数 + Long count = orderEvaluateService.lambdaQuery().isNotNull(TOrderEvaluate::getResponseTime).count(); + TCharingUserEvaluateVO tCharingUserEvaluateVO = new TCharingUserEvaluateVO(); + tCharingUserEvaluateVO.setAver(aver); + tCharingUserEvaluateVO.setEvaluate(evaluate); + tCharingUserEvaluateVO.setBlackCount(count); + + + //好评标签 + List<Map<String,Object>> goodTop = orderEvaluateService.goodTop(siteIds); + //差评标签 + List<Map<String,Object>> badTop = orderEvaluateService.badTop(siteIds); + + //流量分析 + List<Map<String,Object>> sourceMap = chargingOrderService.countBySource(siteIds); + tCharingUserEvaluateVO.setGoodTop(goodTop); + tCharingUserEvaluateVO.setBadTop(badTop); + tCharingUserEvaluateVO.setFlow(sourceMap); + //流量 + return R.ok(tCharingUserEvaluateVO); + } + + @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(); + //获取当前登录的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>> equipmentMap1 = chargingOrderService.equipmentUserType1(siteIds,statisticsQueryDto); + //交流可用率 + List<Map<String,Object>> equipmentMap2= chargingOrderService.equipmentUserType2(siteIds,statisticsQueryDto); + //直流故障率 + List<Map<String,Object>> equipmentMapbroke1 = chargingOrderService.equipmentMapbroke1(siteIds,statisticsQueryDto); + //交流故障率 + List<Map<String,Object>> equipmentMapbroke2 = chargingOrderService.equipmentMapbroke2(siteIds,statisticsQueryDto); + //直流离网率 + List<Map<String,Object>> equipmentMapOut1 = chargingOrderService.equipmentMapOut1(siteIds,statisticsQueryDto); + //交流离网率 + List<Map<String,Object>> equipmentMapOut2 = chargingOrderService.equipmentMapOut2(siteIds,statisticsQueryDto); + + + //需求电流满足率 + List<Map<String,Object>> needElec = chargingOrderService.needElec(siteIds,statisticsQueryDto); + + TCharingUserEquimentVO tCharingUserEquimentVO = new TCharingUserEquimentVO(); + tCharingUserEquimentVO.setEquipmentMap1(equipmentMap1); + tCharingUserEquimentVO.setEquipmentMap2(equipmentMap2); + tCharingUserEquimentVO.setEquipmentMapbroke1(equipmentMapbroke1); + tCharingUserEquimentVO.setEquipmentMapbroke2(equipmentMapbroke2); + tCharingUserEquimentVO.setEquipmentMapOut1(equipmentMapOut1); + tCharingUserEquimentVO.setEquipmentMapOut2(equipmentMapOut2); + tCharingUserEquimentVO.setNeedElec(needElec); + return R.ok(tCharingUserEquimentVO); + } + + + @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>> charMap = chargingOrderService.getHourType(siteIds,statisticsQueryDto); + return R.ok(charMap); + }else if (statisticsQueryDto.getDayType()==2){ + List<Map<String,Object>> charMap = chargingOrderService.getDateType(siteIds,statisticsQueryDto); + return R.ok(charMap); + }else if (statisticsQueryDto.getDayType()==3){ + List<Map<String,Object>> charMap = chargingOrderService.getMonthType(siteIds,statisticsQueryDto); + } + + return R.ok(); + + + } + + @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); + }); + return R.ok(capMap); + + + } + + @Resource + private TOrderInvoiceService invoiceService; + @ResponseBody + @PostMapping(value = "/work/shopOrder") + @ApiOperation(value = "购物订单统计", tags = {"管理后台-工作台"}) + public R shopOrder(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto) { + 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 + @PostMapping(value = "/work/invoice") + @ApiOperation(value = "开票统计", tags = {"管理后台-工作台"}) + public R invoice(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto) { + 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 + @PostMapping(value = "/work/users/count") + @ApiOperation(value = "用户数量", tags = {"管理后台-工作台"}) + public R usersCount(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto) { + List<Map<String,Object>> userMap = chargingOrderService.countAllUserData(); + return R.ok(userMap); + + } + public static void main(String[] args) { + // 示例数据 + List<TChargingOrder> list = getSampleData(); + System.err.println(list); + List<Map<String, BigDecimal>> result = processData(list); + + result.forEach(System.out::println); + } + + + private static List<TChargingOrder> getSampleData() { + // 这里可以替换为实际查询逻辑 + List<TChargingOrder> list = new ArrayList<>(); + // 示例数据 + for (int i = 0; i < 24; i++) { + TChargingOrder order = new TChargingOrder(); + order.setStartTime(LocalDateTime.now().minusHours(23 - i)); + order.setOrderAmount(BigDecimal.valueOf(i + 1)); + list.add(order); + } + return list; + } + + private static List<Map<String, BigDecimal>> processData(List<TChargingOrder> list) { + Map<LocalDateTime, BigDecimal> hourlySum = new HashMap<>(); + + // 按每个小时分组并求和 + for (TChargingOrder order : list) { + LocalDateTime hour = order.getStartTime().truncatedTo(ChronoUnit.HOURS); + BigDecimal amount = order.getOrderAmount(); + hourlySum.merge(hour, amount, BigDecimal::add); + } + + // 创建结果列表 + List<Map<String, BigDecimal>> resultList = new ArrayList<>(); + for (int i = 1; i <= 23; i++) { + LocalDateTime keyHour = LocalDateTime.now().withHour(i); + BigDecimal sum = BigDecimal.ZERO; + + // 计算键之后的一小时的数据之和 + for (int j = i + 1; j <= 23; j++) { + LocalDateTime nextHour = LocalDateTime.now().withHour(j); + sum = sum.add(hourlySum.getOrDefault(nextHour, BigDecimal.ZERO)); + } + + Map<String, BigDecimal> entry = new HashMap<>(); + entry.put(String.valueOf(i), sum); + resultList.add(entry); + } + + return resultList; + } + + + /** + * 硬件充电结束后的处理逻辑 + * @param code + */ + @PostMapping("/endCharge") + public void endCharge(@RequestParam("code") String code){ + chargingOrderService.endCharge(code, 2); + } + + /** + * 硬件异常结束充电后的处理逻辑 + * @param code + */ + @PostMapping("/excelEndCharge") + public void excelEndCharge(@RequestParam("code") String code){ + chargingOrderService.excelEndCharge(code); + } + + + /** + * 根据车牌号和时间查询有效的充电数据 + * @param query + * @return + */ + @PostMapping("/getChargingOrderByLicensePlate") + public R<TChargingOrder> getChargingOrderByLicensePlate(@RequestBody GetChargingOrderByLicensePlate query){ + 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(); + } +} -- Gitblit v1.7.1