From 8115295a64e0809246897fefb8c45de06dce0799 Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期五, 23 五月 2025 21:09:12 +0800 Subject: [PATCH] 大屏 --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java | 2363 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 2,354 insertions(+), 9 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 2c37b8b..90f2041 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,16 +1,91 @@ package com.ruoyi.order.controller; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.time.*; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.domain.SiteMenu; +import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; +import com.ruoyi.chargingPile.api.feignClient.*; +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.order.api.model.TChargingOrder; -import com.ruoyi.order.service.TChargingOrderService; -import io.swagger.annotations.Api; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.dto.ChargingOrderGroup; +import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.core.web.domain.BasePojo; +import com.ruoyi.common.log.annotation.Log; +import com.ruoyi.common.log.enums.BusinessType; +import com.ruoyi.common.log.enums.OperatorType; +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.dto.ChargingStatisticeDTO; +import com.ruoyi.order.api.model.*; +import com.ruoyi.order.api.query.ChargingOrderQuery; +import com.ruoyi.common.core.dto.MongoChargingOrderQuery; +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.GetChargingOrderByLicensePlate; +import com.ruoyi.order.api.vo.TCharingOrderVO; +import com.ruoyi.order.dto.GetMyChargingOrderList; +import com.ruoyi.order.dto.GetNoInvoicedOrder; +import com.ruoyi.order.dto.MyChargingOrderInfo; +import com.ruoyi.order.dto.MyChargingOrderList; +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.order.vo.EndOfChargePageInfo; +import com.ruoyi.order.vo.StatisticsOfBatteryVO; +import com.ruoyi.order.vo.WatchChargingOrderVo; +import com.ruoyi.other.api.feignClient.RoleSiteClient; +import com.ruoyi.other.api.feignClient.UserSiteClient; +import com.ruoyi.payment.api.feignClient.AliPaymentClient; +import com.ruoyi.payment.api.feignClient.WxPaymentClient; +import com.ruoyi.payment.api.vo.AliQueryOrder; +import com.ruoyi.system.api.domain.SysUser; +import com.ruoyi.system.api.feignClient.SysUserClient; +import com.ruoyi.system.api.feignClient.SysUserRoleClient; +import com.ruoyi.system.api.model.SysUserRoleVo; +import io.swagger.annotations.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.http.HttpServletResponse; +import java.io.PrintWriter; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAdjusters; +import java.util.*; +import java.util.List; +import java.util.stream.Collectors; /** * <p> @@ -24,16 +99,2286 @@ @RestController @RequestMapping("/t-charging-order") public class TChargingOrderController { + + private Logger log = LoggerFactory.getLogger(TChargingOrderController.class); @Resource private TChargingOrderService chargingOrderService; + @Autowired + private TokenService tokenService; + @Autowired + private TOrderEvaluateService orderEvaluateService; + @Autowired + private TGrantVipService tGrantVipService; + @Resource + private WxPaymentClient wxPaymentClient; + + @Resource + private RedisService redisService; + + @Resource + private AliPaymentClient aliPaymentClient; + @Resource + private TShoppingOrderService shoppingOrderService; + + @Resource + private AppUserClient appUserClient; + + @Resource + private TVipOrderService vipOrderService; + @Resource + private ParkingLotClient parkingLotClient; + @Resource + private TChargingOrderRefundService chargingOrderRefundService; + + @Resource + private TShoppingOrderRefundService shoppingOrderRefundService; + @Resource + private TVipOrderRefundService vipOrderRefundService; + @Resource + private SiteClient siteClient; + @Resource + private ChargingPileClient chargingPileClient; + @Resource + private ChargingGunClient chargingGunClient; + @Resource + private AppUserCarClient appUserCarClient; + @Resource + private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; + + @Resource + private TOrderInvoiceService invoiceService; + @Resource + private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; + @Resource + private PartnerClient partnerClient; + @Resource + private SysUserClient sysUserClient; + + @Resource + private UserSiteClient userSiteClient; + + @Resource + private RoleSiteClient roleSiteClient; + @Resource + private SysUserRoleClient sysUserRoleClient; + + + + /** + * 远程调用 监管平台查询前一天用能统计 + * @return + */ + @ResponseBody + @PostMapping(value = "/getChargingStatistics") + public R<List<TChargingOrder>> getChargingStatistics(@RequestBody ChargingStatisticeDTO dto) { + List<Long> collect = chargingOrderAccountingStrategyService.lambdaQuery().between(TChargingOrderAccountingStrategy::getCreateTime, dto.getStartTime(), dto.getEndTime()) + .list().stream().map(TChargingOrderAccountingStrategy::getChargingOrderId).collect(Collectors.toList()); + if (!collect.isEmpty()){ + List<TChargingOrder> list = chargingOrderService.lambdaQuery() + .in(TChargingOrder::getId,collect).list(); + return R.ok(list); + } + return R.ok(new ArrayList<TChargingOrder>()); + } + + /** + * 远程调用 增加管理后台赠送会员记录 + * @return + */ + @ResponseBody + @PostMapping(value = "/management/give/vip") + public R managementGiveVip(@RequestBody TGrantVip grantVip) { + return R.ok(tGrantVipService.save(grantVip)); + } + + /** + * 远程调用根据枪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(); + } + + + @RequiresPermissions(value = {"/invoiceManagement/select_order", "/paymentOrder/order"}, logical = Logical.OR) + @ResponseBody + @PostMapping(value = "/pay/order/list") + @ApiOperation(value = "列表", tags = {"管理后台-支付订单-订单信息"}) + public R<PageInfo<PayOrderDto>> payOrderList(@RequestBody PayOrderQueryDto payOrderQueryDto) { + Integer pageCurr = payOrderQueryDto.getPageCurr(); + Integer pageSize = payOrderQueryDto.getPageSize(); + payOrderQueryDto.setPageCurr(1); + payOrderQueryDto.setPageSize(10000999); + PageInfo<PayOrderDto> data = chargingOrderService.payOrderQuery(payOrderQueryDto).getData(); + List<PayOrderDto> res = new ArrayList<>(); + // 查询当前登陆人按钮权限 + SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); + Integer roleType = sysUser.getRoleType(); + Long userId = tokenService.getLoginUser().getUserid(); + //如果没传siteId,获取当前登陆人所有的siteIds + List<Integer> siteIds = new ArrayList<>(); + if (userId != null){ + List<GetSiteListDTO> data2 = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data2) { + siteIds.add(datum.getId()); + } + } + if (siteIds.isEmpty()){ + siteIds.add(-1); + } + List<TChargingOrder> list = chargingOrderService.list(); + List<TParkingRecord> parkingRecord = parkingLotClient.getSiteIdAll().getData(); + for (PayOrderDto record : data.getRecords()) { + if (record.getType() == 1){ + TChargingOrder chargingOrder = list.stream().filter(e -> e.getId().equals(Long.valueOf(record.getId()))).findFirst().orElse(null); + if (chargingOrder!=null){ + record.setSiteId(chargingOrder.getSiteId()); + } + } + if (record.getType()==4){ + TParkingRecord tParkingRecord = parkingRecord.stream().filter(e -> e.getId().equals(Long.valueOf(record.getId()))).findFirst().orElse(null); + if (tParkingRecord!=null){ + record.setSiteId(tParkingRecord.getSiteId()); + } + } + if (roleType==1||(record.getType()!=1&&record.getType()!=4)){ + res.add(record); + continue; + } + if (roleType==2 && (record.getType()==1||record.getType()==4) && siteIds.contains(record.getSiteId())){ + res.add(record); + } + + } + List<PayOrderDto> res1 = testing5(res.size(), pageCurr, pageSize, res); + data.setTotal(res.size()); + data.setRecords(res1); + return R.ok(data); + } + + + + public static List<PayOrderDto> testing5(long total, long current, long size, List<PayOrderDto> str){ + List<PayOrderDto> result = new ArrayList<>(); + //获取初始化分页结构 + com.ruoyi.order.util.Page<PayOrderDto> page = new com.ruoyi.order.util.Page().getPage(total, size, current - 1); + //获取集合下标初始值 + long startIndex = page.getStartIndex(); + //获取集合下标结束值 + long endInddex = 0; + if(startIndex + page.getCurrent() >= total || size > total){ + endInddex = total; + }else { + endInddex = Math.min(startIndex + page.getSize(), total); + } + //如果输入的开始查询下标大于集合大小,则查询为空值 + if(startIndex > total){ + result = Collections.emptyList(); + }else{ + result = str.subList((int)startIndex,(int)endInddex); + } + return result; +} + + + + @ResponseBody + @PostMapping(value = "/pay/order/refund") + @ApiOperation(value = "退款", tags = {"管理后台-支付订单-订单信息"}) + 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 = {"管理后台-支付订单-订单信息"}) + public R<PayOrderInfoDto> payOrderList(Long orderId, Integer type) { + switch (type) { + case 1: + TChargingOrder byId = chargingOrderService.getById(orderId); + PayOrderInfoDto payOrderInfoDto = new PayOrderInfoDto(); + payOrderInfoDto.setOrderId(byId.getId().toString()); + payOrderInfoDto.setCode(byId.getCode()); + payOrderInfoDto.setTradeNo(byId.getRechargeSerialNumber()); + payOrderInfoDto.setPayType(byId.getRechargePaymentType()); + 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); + PayOrderInfoDto payOrderInfoDto1 = new PayOrderInfoDto(); + payOrderInfoDto1.setOrderId(byId1.getId().toString()); + payOrderInfoDto1.setCode(byId1.getCode()); + payOrderInfoDto1.setTradeNo(byId1.getSerialNumber()); + payOrderInfoDto1.setPayType(byId1.getPaymentType()); + 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); + PayOrderInfoDto payOrderInfoDto2 = new PayOrderInfoDto(); + payOrderInfoDto2.setOrderId(byId2.getId().toString()); + payOrderInfoDto2.setCode(byId2.getCode()); + payOrderInfoDto2.setTradeNo(byId2.getSerialNumber()); + payOrderInfoDto2.setPayType(byId2.getPaymentType()); + 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: + 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); + + + + } + return R.ok(); + + } + + + + + @ResponseBody + @GetMapping(value = "/pay/order/refund/detail") + @ApiOperation(value = "退款信息", tags = {"管理后台-支付订单-订单信息"}) + public R refundDetail(Long orderId, Integer type) { + switch (type) { + case 1: + List<TChargingOrderRefund> byId = chargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getChargingOrderId, orderId).orderByDesc(TChargingOrderRefund::getRefundTime).list(); + return R.ok(byId); + case 2: + List<TShoppingOrderRefund> list = shoppingOrderRefundService.lambdaQuery().eq(TShoppingOrderRefund::getShoppingOrderId, orderId).orderByDesc(TShoppingOrderRefund::getRefundTime).list(); + return R.ok(list); + case 3: + List<TVipOrderRefund> list1 = vipOrderRefundService.lambdaQuery().eq(TVipOrderRefund::getVipOrderId, orderId).orderByDesc(TVipOrderRefund::getRefundTime).list(); + return R.ok(list1); + + } + return R.ok(); + + } + + @ResponseBody + @GetMapping(value = "/pay/order/charging") + @ApiOperation(value = "充电信息", tags = {"管理后台-支付订单-订单信息"}) + public R<PayOrderChargingInfo> refundDetail(Long orderId) { + PayOrderChargingInfo payOrderChargingInfo = new PayOrderChargingInfo(); + TChargingOrder byId = chargingOrderService.getById(orderId); + List<Site> data = siteClient.getSiteByIds(Collections.singletonList(byId.getSiteId())).getData(); + payOrderChargingInfo.setSiteName(data.get(0).getName()); + TChargingPile data1 = chargingPileClient.getChargingPileById(byId.getChargingPileId()).getData(); + payOrderChargingInfo.setChargingName(data1.getName()); + TChargingGun data2 = chargingGunClient.getChargingGunById(byId.getChargingGunId()).getData(); + payOrderChargingInfo.setGunName(data2.getName()); + if (byId.getAppUserCarId()!=null) { + List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(byId.getAppUserCarId())).getData(); + payOrderChargingInfo.setCarNum(data3.get(0).getLicensePlate()); + }else{ + payOrderChargingInfo.setCarNum(byId.getPlateNum()); + } + payOrderChargingInfo.setTChargingOrder(byId); + + Long count = chargingOrderAccountingStrategyService.lambdaQuery().eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId).count(); + payOrderChargingInfo.setPeriodCount(count); + if (byId.getAppUserCarId()!=null) { + List<Long> carid = new ArrayList<>(); + carid.add(byId.getAppUserCarId()); + R<List<TAppUserCar>> carByIds = appUserCarClient.getCarByIds(carid); + payOrderChargingInfo.setCarNum(carByIds.getData().get(0).getLicensePlate()); + }else{ + payOrderChargingInfo.setCarNum(byId.getPlateNum()); + } + payOrderChargingInfo.setStartTime(byId.getStartTime()); + payOrderChargingInfo.setEndTime(byId.getEndTime()); + payOrderChargingInfo.setTimeCount(payOrderChargingInfo.calculateDuration()); + return R.ok(payOrderChargingInfo); + } + + @ResponseBody + @GetMapping(value = "/pay/order/charging/details") + @ApiOperation(value = "充电明细", tags = {"管理后台-支付订单-订单信息"}) + public R<List<TChargingOrderAccountingStrategy>> chargingDetail(Long orderId) { + TChargingOrder chargingOrder = chargingOrderService.getById(orderId); + List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery().eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId) + .orderByDesc(TChargingOrderAccountingStrategy::getStartTime).list(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + for (TChargingOrderAccountingStrategy tChargingOrderAccountingStrategy : list) { + LocalDateTime createTime = chargingOrder.getStartTime(); + String format = createTime.format(formatter); + String startTime = tChargingOrderAccountingStrategy.getStartTime(); + if("00:00".equals(startTime)){ + createTime = createTime.plusDays(1); + format = createTime.format(formatter); + } + tChargingOrderAccountingStrategy.setStartTime(format+" "+tChargingOrderAccountingStrategy.getStartTime()); + tChargingOrderAccountingStrategy.setEndTime(format+" "+tChargingOrderAccountingStrategy.getEndTime()); + } + //从新排序 + list.sort(new Comparator<TChargingOrderAccountingStrategy>() { + @Override + public int compare(TChargingOrderAccountingStrategy o1, TChargingOrderAccountingStrategy o2) { + String startTime = o1.getStartTime(); + String startTime1 = o2.getStartTime(); + LocalDateTime localDateTime = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + LocalDateTime localDateTime1 = LocalDateTime.parse(startTime1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + if(localDateTime.isBefore(localDateTime1)){ + return -1; + } + if(localDateTime.isAfter(localDateTime1)){ + return 1; + } + return 0; + } + }); + return R.ok(list); + } + + + + @RequiresPermissions(value = {"/paymentOrder/refund"}, logical = Logical.OR) + @ResponseBody + @PostMapping(value = "/pay/order/refund/list") + @ApiOperation(value = "列表", tags = {"管理后台-支付订单-退款订单"}) + public R<PageInfo<TChargingOrderRefund>> refundList(@RequestBody ChargingRefundDto chargingRefundDto) { + Integer pageCurr = chargingRefundDto.getPageCurr(); + Integer pageSize = chargingRefundDto.getPageSize(); +// R<PageInfo<TChargingOrderRefund>> refundList = chargingOrderService.getRefundList(chargingRefundDto); + chargingRefundDto.setPageCurr(1); + chargingRefundDto.setPageSize(199999999); + R<PageInfo<TChargingOrderRefund>> refundList1 = chargingOrderService.getRefundList(chargingRefundDto); + Long userId = tokenService.getLoginUser().getUserid(); + //如果没传siteId,获取当前登陆人所有的siteIds + List<Integer> siteIds = new ArrayList<>(); + if (userId != null){ + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + } + + if (siteIds.isEmpty()){ + siteIds.add(-1); + } + // 查询当前登陆人按钮权限 + SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); + Integer roleType = sysUser.getRoleType(); + List<TChargingOrderRefund> tChargingOrderRefunds = new ArrayList<>(); + for (TChargingOrderRefund record : refundList1.getData().getRecords()) { + if (roleType==1){ + tChargingOrderRefunds.add(record); + continue; + } + if (record.getType()!=1){ + tChargingOrderRefunds.add(record); + } + TChargingOrder byId = chargingOrderService.getById(record.getOrderId()); + record.setUid(record.getId().toString()); + if (byId==null){ + continue; + } + if (roleType==2&&siteIds.contains(byId.getSiteId())){ + + tChargingOrderRefunds.add(record); + } + } + PageInfo<TChargingOrderRefund> data = refundList1.getData(); + + List<TChargingOrderRefund> res1 = testing4(tChargingOrderRefunds.size(), pageCurr, pageSize, tChargingOrderRefunds); + data.setTotal(tChargingOrderRefunds.size()); + data.setRecords(res1); + return refundList1; + + } + + + + + public static List<TChargingOrderRefund> testing4(long total, long current, long size, List<TChargingOrderRefund> str){ + List<TChargingOrderRefund> result = new ArrayList<>(); + //获取初始化分页结构 + com.ruoyi.order.util.Page<TChargingOrderRefund> page = new com.ruoyi.order.util.Page().getPage(total, size, current - 1); + //获取集合下标初始值 + long startIndex = page.getStartIndex(); + //获取集合下标结束值 + long endInddex = 0; + if(startIndex + page.getCurrent() >= total || size > total){ + endInddex = total; + }else { + endInddex = Math.min(startIndex + page.getSize(), total); + } + //如果输入的开始查询下标大于集合大小,则查询为空值 + if(startIndex > total){ + result = Collections.emptyList(); + }else{ + result = str.subList((int)startIndex,(int)endInddex); + } + return result; + } + + + + + @ResponseBody + @PostMapping(value = "/pay/order/refund/list1") + @ApiOperation(value = "列表1", tags = {"管理后台-支付订单-退款订单"}) + public R<PageInfo<TChargingOrderRefund>> refundList1(@RequestBody ChargingRefundDto chargingRefundDto) { + return chargingOrderService.getRefundList(chargingRefundDto); + + } + + + + + + + @RequiresPermissions(value = {"/chargingPileOrder"}, logical = Logical.OR) + @ResponseBody + @PostMapping(value = "/chargingOrder") + @ApiOperation(value = "充电桩订单列表", tags = {"管理后台-订单管理"}) + public AjaxResult<TCharingOrderVO> chargingOrder(@RequestBody ChargingOrderQuery dto) { + List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); + dto.setUserIds(data); + 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)+"":""); + chargingOrderInfoVO.setTotalPower(byId.getPower()!=null?byId.getPower().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":""); + if (byId.getAppUserCarId()!=null){ + TAppUserCar data = appUserCarClient.getCarById(byId.getAppUserCarId()+"").getData(); + if (data!=null){ + chargingOrderInfoVO.setLicensePlate(data.getLicensePlate()); + chargingOrderInfoVO.setVehicleBrand(data.getVehicleBrand()); + chargingOrderInfoVO.setVehicleModel(data.getVehicleModel()); + chargingOrderInfoVO.setVehicleUse(data.getVehicleUse()); + } + }else{ + chargingOrderInfoVO.setLicensePlate(byId.getPlateNum()); + } + // 时段总服务费 + List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery().eq(TChargingOrderAccountingStrategy::getChargingOrderId, strategyId).orderByDesc(TChargingOrderAccountingStrategy::getStartTime).list(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + for (TChargingOrderAccountingStrategy tChargingOrderAccountingStrategy : list) { + LocalDateTime createTime = byId.getStartTime(); + String format = createTime.format(formatter); + String startTime = tChargingOrderAccountingStrategy.getStartTime(); + if("00:00".equals(startTime)){ + createTime = createTime.plusDays(1); + format = createTime.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); + } + if (byId.getCouponDiscountAmount()!=null && byId.getServiceCharge().compareTo(BigDecimal.ZERO) != 0){ + BigDecimal multiply = byId.getCouponDiscountAmount().divide(byId.getServiceCharge(), 2) + .multiply(tChargingOrderAccountingStrategy.getPeriodOriginalServicePrice()); + tChargingOrderAccountingStrategy.setCouponDiscount(multiply); + } + } + //从新排序 + list.sort(new Comparator<TChargingOrderAccountingStrategy>() { + @Override + public int compare(TChargingOrderAccountingStrategy o1, TChargingOrderAccountingStrategy o2) { + String startTime = o1.getStartTime(); + String startTime1 = o2.getStartTime(); + LocalDateTime localDateTime = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + LocalDateTime localDateTime1 = LocalDateTime.parse(startTime1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + if(localDateTime.isBefore(localDateTime1)){ + return -1; + } + if(localDateTime.isAfter(localDateTime1)){ + return 1; + } + return 0; + } + }); + chargingOrderInfoVO.setList(list); + return AjaxResult.success(chargingOrderInfoVO); + } + + + + + @Log(title = "【扫一扫】添加评价", businessType = BusinessType.INSERT,operatorType = OperatorType.MOBILE) + @ResponseBody + @PostMapping(value = "/addEvaluate") + @ApiOperation(value = "添加评价", tags = {"小程序-扫一扫"}) + public AjaxResult getMyChargingOrderList(@RequestBody OrderEvaluateVo dto) { + dto.setAppUserId(tokenService.getLoginUserApplet().getUserId()); + orderEvaluateService.addOrderEvaluate(dto); + return AjaxResult.success(); + } + + + + /** + * 查询用户最近一次充电记录使用的车辆 + * + * @param + * @return + */ + @GetMapping(value = "/getCar/{id}") + public R<Long> getCar(@PathVariable("id")String id) { + List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>() + .eq(TChargingOrder::getAppUserId, id) + .isNotNull(TChargingOrder::getAppUserCarId)); + if (!list.isEmpty()){ + // 最近使用的车辆id + Long size = list.get(0).getAppUserCarId(); + return R.ok(size); + }else{ + return R.ok(-1L); + } + } + + + + + /** + * 查询会员在本月有多少次享受了充电折扣 + * @param req + * @return + */ + @PostMapping(value = "/getChargingCount") + public R<Integer> getChargingCount(@RequestBody TChargingCountQuery req) { + int size = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>() + .eq(TChargingOrder::getAppUserId, req.getUserId()) + .eq(TChargingOrder::getRechargePaymentStatus, 2) + .between(TChargingOrder::getStartTime, req.getStartTime(), req.getEndTime())).size(); + return R.ok(size); + } + + + //用户订单数量 @PostMapping(value = "/useOrderCount") - public R<Long> useOrderCount(@RequestParam Long userId) { + public R<Long> useOrderCount(@RequestParam("userId") Long userId) { Long count = chargingOrderService.lambdaQuery().eq(TChargingOrder::getAppUserId, userId).count(); return R.ok(count); } -} + + //订单详情 + @PostMapping(value = "/detail") + public R<TChargingOrder> detail(@RequestParam("orderId") Long orderId) { + 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 chargingPercentProvinceDto + * @return + */ + @PostMapping(value = "/getOrderBySiteIdAndTime") + public R<List<TChargingOrder>> getOrderBySiteIdAndTime(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto){ + LocalDate date1 = chargingPercentProvinceDto.getDate1(); + LocalDate date2 = chargingPercentProvinceDto.getDate2(); + String tripartitePlatformName = chargingPercentProvinceDto.getTripartitePlatformName(); + List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>().in(TChargingOrder::getSiteId, chargingPercentProvinceDto.getSiteIds()) + .between(null != date1 && null != date2, TChargingOrder::getPayTime, date1.atTime(0, 0, 0), date2.atTime(23, 59, 59)) + .eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getStatus, 5) + .eq(StringUtils.isNotEmpty(tripartitePlatformName), TChargingOrder::getOrderSource, 2) + .eq(StringUtils.isNotEmpty(tripartitePlatformName), TChargingOrder::getTripartitePlatformName, tripartitePlatformName)); + return R.ok(list); + } + + + + /** + * 根据充电枪id获取正在进行中的订单 + * @param chargingGunId 充电枪id + * @return + */ + @PostMapping(value = "/getOrderDetailByGunId") + public R<TChargingOrder> getOrderDetailByGunId(@RequestParam("chargingGunId") Integer chargingGunId) { + TChargingOrder one = chargingOrderService.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGunId) + .eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getStatus, 3)); + return R.ok(one); + } + + + + + @ResponseBody + @GetMapping(value = "/getMyChargingOrderList") + @ApiOperation(value = "获取充电记录列表", tags = {"小程序-充电记录"}) + public AjaxResult<Map<String, Object>> getMyChargingOrderList(GetMyChargingOrderList query) { + Map<String, Object> orderList = chargingOrderService.getMyChargingOrderList(query); + return AjaxResult.success(orderList); + } + + + @ResponseBody + @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); + } + + + + @ResponseBody + @GetMapping(value = "/getNoInvoicedOrder") + @ApiOperation(value = "获取未开票的订单数据", tags = {"小程序-充电发票"}) + public AjaxResult<List<MyChargingOrderList>> getNoInvoicedOrder(GetNoInvoicedOrder query) { + List<MyChargingOrderList> list = chargingOrderService.getNoInvoicedOrder(query); + return AjaxResult.success(list); + } + + + @Log(title = "【扫一扫】支付充电充值费用", businessType = BusinessType.UPDATE,operatorType = OperatorType.MOBILE) + @ResponseBody + @PostMapping(value = "/paymentChargingOrder") + @ApiOperation(value = "支付充电充值费用", tags = {"小程序-扫一扫"}) + public AjaxResult paymentChargingOrder(@RequestBody AddChargingOrder addChargingOrder) { + return chargingOrderService.paymentChargingOrder(addChargingOrder); + } + + /** + * 充电充值支付回调 + */ + @ResponseBody + @PostMapping(value = "/chargingOrderWXCallback") + public void chargingOrderWXCallback(@RequestParam("out_trade_no") String out_trade_no, @RequestParam("transaction_id") String transaction_id, + @RequestParam("attach") String attach) { + chargingOrderService.chargingOrderCallback(1, out_trade_no, transaction_id, attach); + } + + + /** + * 修改安全检测数据 + * @param securityDetection + */ + @ResponseBody + @PostMapping(value = "/securityDetection") + public void securityDetection(@RequestBody SecurityDetectionVO securityDetection){ + log.info("-------------------安全检测数据-------------------:" + securityDetection); + chargingOrderService.securityDetection(securityDetection); + } + + /** + * 远程启动充电应答 + * @param message + */ + @ResponseBody + @PostMapping(value = "/startChargeSuccessfully") + public void startChargeSuccessfully(@RequestBody PlatformStartChargingReplyMessageVO message){ + log.info("-------------------远程启动充电请求应答-------------------:" + message); + chargingOrderService.startChargeSuccessfully(message); + } + + + + /** + * 支付宝支付成功后的回调 + */ + @ResponseBody + @PostMapping(value = "/chargingOrderALICallback") + 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); + } + + + /** + * + * @param code + */ + @ResponseBody + @PostMapping(value = "/refund") + public R refund(@RequestParam(value = "code") String code){ + chargingOrderService.refund(code); + return R.ok(); + } + + + /** + * + * @param code + */ + @ResponseBody + @PostMapping(value = "/refund1") + public R refund1(@RequestParam(value = "code") String code, @RequestParam(value = "money") BigDecimal money){ + chargingOrderService.refund1(code, money); + return R.ok(); + } + + + + /** + * 远程启动失败后退款回调 + */ + @ResponseBody + @PostMapping(value = "/chargingOrderStartupFailureWxRefund") + public void chargingOrderStartupFailureWxRefund(@RequestParam("out_refund_no") String out_refund_no, + @RequestParam("refund_id") String refund_id, + @RequestParam("tradeState") String tradeState, + @RequestParam("success_time") String success_time){ + chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time); + } + + + + + @ResponseBody + @GetMapping(value = "/preChargeCheck/{id}") + @ApiOperation(value = "获取安全检测数据", tags = {"小程序-扫一扫"}) + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "充电枪id", required = true) + }) + public AjaxResult<PreChargeCheck> preChargeCheck(@PathVariable Integer id) { + String key = "AQJC_" + id; + Object cacheObject = redisService.getCacheObject(key); + return AjaxResult.success(cacheObject); + } + + + @ResponseBody + @GetMapping(value = "/getChargingDetails/{id}") + @ApiOperation(value = "获取充电中页面数据", tags = {"小程序-扫一扫"}) + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "充电枪id", required = true) + }) + public AjaxResult<ChargingDetails> getChargingDetails(@PathVariable Integer id) { + ChargingDetails chargingDetails = chargingOrderService.getChargingDetails(id); + return AjaxResult.success(chargingDetails); + } + + @Log(title = "【扫一扫】手动停止充电", businessType = BusinessType.STOP,operatorType = OperatorType.MOBILE) + @ResponseBody + @PutMapping(value = "/stopCharging/{id}") + @ApiOperation(value = "手动停止充电", tags = {"小程序-扫一扫"}) + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "订单id", required = true) + }) + public AjaxResult stopCharging(@PathVariable String id) { + return chargingOrderService.stopCharging(id); + } + + + /** + * 停止充电应答处理逻辑 + * @param platformStopChargingReply + */ + @PostMapping("/terminateSuccessfulResponse") + public void terminateSuccessfulResponse(@RequestBody PlatformStopChargingReplyVO platformStopChargingReply){ + log.info("-------------------远程停止充电请求应答-------------------:" + platformStopChargingReply); + chargingOrderService.terminateSuccessfulResponse(platformStopChargingReply); + } + + + /** + * 停止充电返回账单后计算费用 + * @param vo + */ + @PostMapping("/endChargeBillingCharge") + public R endChargeBillingCharge(@RequestBody TransactionRecordMessageVO vo){ + log.info("-------------------停止充电返回账单后计算费用及修改业务状态-------------------:" + vo); + return 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 = tokenService.getLoginUser().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); + } + if (siteIds.isEmpty()){ + siteIds.add(-1); + } + LocalDate sixBefore = PreviousSixMonths.get(); + //通过siteIds进行sql查询统计 + List<SixChargingDto> sixChargingDtos = generateLastSixMonths(); + List<SixChargingDto> chargingDtos = chargingOrderService.charge(sixBefore, siteIds); + for (SixChargingDto sixChargingDto : sixChargingDtos) { + for (SixChargingDto chargingDto : chargingDtos) { + if (sixChargingDto.getMonth().equals(chargingDto.getMonth())){ + BeanUtils.copyProperties(chargingDto,sixChargingDto); + } + } + + } + + return R.ok(sixChargingDtos); + + } + + + public static List<SixChargingDto> generateLastSixMonths() { + LocalDate today = LocalDate.now(); + List<SixChargingDto> months = new ArrayList<>(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM"); + + for (int i = 5; i >= 0; i--) { + LocalDate date = today.minusMonths(i); + String month = date.format(formatter); + SixChargingDto sixChargingDto = new SixChargingDto(); + sixChargingDto.setMonth(month); + months.add(sixChargingDto); + } + + return months; + } + + @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) + @ResponseBody + @GetMapping(value = "/six/circle") + @ApiOperation(value = "电站收入占比", tags = {"后台-数据分析-平台收入分析"}) + public R<List<SixCircleDto>> circle() { + Long userId = tokenService.getLoginUser().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(); + if (siteIds.isEmpty()){ + siteIds.add(-1); + } + 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); + + } + + + @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) + @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); + List<SixShopDto> sixChargingDtos = generateLastSixMonths1(); + for (SixShopDto sixChargingDto : sixChargingDtos) { + for (SixShopDto chargingDto : sixShopDtos) { + if (sixChargingDto.getMonth().equals(chargingDto.getMonth())){ + BeanUtils.copyProperties(chargingDto,sixChargingDto); + } + } + + } + + return R.ok(sixChargingDtos); + } + + public static List<SixShopDto> generateLastSixMonths1() { + LocalDate today = LocalDate.now(); + List<SixShopDto> months = new ArrayList<>(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM"); + + for (int i = 5; i >= 0; i--) { + LocalDate date = today.minusMonths(i); + String month = date.format(formatter); + SixShopDto sixChargingDto = new SixShopDto(); + sixChargingDto.setMonth(month); + months.add(sixChargingDto); + } + + return months; + } + + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) + @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); + } + + @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) + @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); + } + + + + + + + @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) + @ResponseBody + @GetMapping(value = "/six/total") + @ApiOperation(value = "底部数据分类", tags = {"后台-数据分析-平台收入分析"}) + public R<Map<String,Object>> total() { + //count近6个月的数据 + Long userId = tokenService.getLoginUser().getUserid(); + //获取当前登录的siteIds + List<Integer> siteIds = new ArrayList<>(); + List<GetSiteListDTO> data9 = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data9) { + siteIds.add(datum.getId()); + } + //进行统计groupBySiteId + if (siteIds.isEmpty()){ + siteIds.add(-1); + } + Map<String,Object> map = chargingOrderService.countAll(siteIds); + BigDecimal data = parkingLotClient.getRecordAmount().getData(); + if (map ==null){ + map = new HashMap<String,Object>(); + } + map.put("parkingAmount",data); + BigDecimal data1 = shoppingOrderService.getSumAmount(); + map.put("shopAmount",data1); + BigDecimal data2 = vipOrderService.getSumAmout(); + map.put("vipAmount",data2); + List<TChargingOrder> list = chargingOrderService.lambdaQuery().eq(TChargingOrder::getStatus, 5).eq(TChargingOrder::getDelFlag, 0) + .eq(TChargingOrder::getRechargePaymentStatus, 2).list(); + BigDecimal sharingAmount = BigDecimal.ZERO; + BigDecimal commissionAmount = BigDecimal.ZERO; + //计算list中electrovalence的总和 + BigDecimal totalElectrovalence = BigDecimal.ZERO; + //计算list中serviceCharge的总和 + BigDecimal totalServiceCharge = BigDecimal.ZERO; + List<TChargingOrderAccountingStrategy> accountingStrategyList = chargingOrderAccountingStrategyService.list(); + for (TChargingOrder order : list) { + List<TChargingOrderAccountingStrategy> collect = accountingStrategyList.stream().filter(s -> s.getChargingOrderId().equals(order.getId())).collect(Collectors.toList()); + BigDecimal periodElectricPrice = collect.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal periodServicePrice = collect.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); + totalElectrovalence = totalElectrovalence.add(periodElectricPrice); + if(2 != order.getOrderSource()){ + totalServiceCharge = totalServiceCharge.add(periodServicePrice); + commissionAmount = commissionAmount.add((periodElectricPrice.add(periodServicePrice)).multiply(new BigDecimal("0.006"))); + }else{ + totalServiceCharge = totalServiceCharge.add(periodServicePrice.multiply(new BigDecimal("0.8"))); + sharingAmount = sharingAmount.add(periodServicePrice.multiply(new BigDecimal("0.2"))); + } + } + map.put("service_charge",totalServiceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + map.put("electrovalence",totalElectrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + map.put("commission_amount",commissionAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + map.put("sharing_amount",sharingAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + return R.ok(map); + } + + + @RequiresPermissions(value = {"/chargeOrderMonitoring"}, logical = Logical.OR) + @ResponseBody + @PostMapping(value = "/watch/chargingOrder") + @ApiOperation(value = "监控订单", tags = {"管理后台-订单管理"}) + public R watchChargingOrder(@RequestBody MongoChargingOrderQuery query) { + Set<Integer> ids = null; + //校验合作商权限 + SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); + Integer roleType = sysUser.getRoleType(); + Integer objectId = sysUser.getObjectId(); + R<Integer> admin = sysUserClient.isAdmin(tokenService.getLoginUser().getUserid()); + //合作商 + if(roleType == 2){ + ids = partnerClient.authSite(objectId, SiteMenu.SITE_LIST.getValue()).getData(); + }else{ + //非管理员需要根据角色和用户配置查询允许的站点数据 + //改用roleId=1来判断 + if(admin.getData()!=1){ + List<Integer> data = userSiteClient.getSiteIds(sysUser.getUserId()).getData(); + List<SysUserRoleVo> data2 = sysUserRoleClient.getRoleByUserId(sysUser.getUserId()).getData(); + if(data2.size() > 0){ + List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData(); + data.addAll(data1); + } + ids = new HashSet<>(data); + } + } + + LambdaQueryWrapper<TChargingOrder> queryWrapper = new LambdaQueryWrapper<TChargingOrder>().like(StringUtils.isNotEmpty(query.getCode()), TChargingOrder::getCode, query.getCode()) + .eq(null != query.getOrderType(), TChargingOrder::getOrderType, query.getOrderType()) + .eq(null != query.getSiteId(), TChargingOrder::getSiteId, query.getSiteId()) + .eq(null != query.getPileId(), TChargingOrder::getChargingPileId, query.getPileId()) + .eq(null != query.getGunId(), TChargingOrder::getChargingGunId, query.getGunId()) + .eq(null != query.getStatus(), TChargingOrder::getStatus, query.getStatus()) + .eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getRechargePaymentStatus, 2) + .in(null != ids && ids.size() > 0, TChargingOrder::getSiteId, ids); + if(StringUtils.isNotEmpty(query.getCreateTime())){ + String[] split = query.getCreateTime().split(" - "); + queryWrapper.between(TChargingOrder::getStartTime, split[0], split[1]); + } + if(StringUtils.isNotEmpty(query.getLastTime())){ + String[] split = query.getLastTime().split(" - "); + queryWrapper.between(TChargingOrder::getEndTime, split[0], split[1]); + } + PageInfo<TChargingOrder> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize()); + PageInfo<TChargingOrder> orderPageInfo = chargingOrderService.page(pageInfo, queryWrapper.orderByDesc(TChargingOrder::getCreateTime)); + List<Site> siteList = siteClient.getSiteAll().getData(); + + List<WatchChargingOrderVo> list = new ArrayList<>(); + for (TChargingOrder record : orderPageInfo.getRecords()) { + WatchChargingOrderVo vo = new WatchChargingOrderVo(); + BeanUtils.copyProperties(record, vo); + vo.setIdStr(record.getId().toString()); + Site site = siteList.stream().filter(s->s.getId().equals(record.getSiteId())).findFirst().get(); + vo.setSiteName(site.getName()); + TChargingPile chargingPile = chargingPileClient.getChargingPileById(record.getChargingPileId()).getData(); + vo.setTerminalName(chargingPile.getName()); + TChargingGun chargingGun = chargingGunClient.getChargingGunById(record.getChargingGunId()).getData(); + vo.setTerminalCode(chargingGun.getName()); + + if(null != record.getStartTime() && null != record.getEndTime()){ + long time = record.getEndTime().toEpochSecond(ZoneOffset.UTC) - record.getStartTime().toEpochSecond(ZoneOffset.UTC); + vo.setChargingTime(time + ""); + } + long count = chargingOrderAccountingStrategyService.count(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, record.getId())); + vo.setTimeFrame(count); + + vo.setAuthInfo(roleType == 1 ? true : partnerClient.authMenu(objectId, record.getSiteId(), SiteMenu.CHARGING_PILE_ORDER_MONITORING_RECORD_INFO.getValue())); + vo.setAuthDelete(roleType == 1 ? true : partnerClient.authMenu(objectId, record.getSiteId(), SiteMenu.CHARGING_PILE_ORDER_MONITORING_RECORD_DEL.getValue())); + list.add(vo); + } + PageInfo<WatchChargingOrderVo> pageInfos = new PageInfo<>(query.getPageCurr(), query.getPageSize()); + pageInfos.setRecords(list); + pageInfos.setCurrent(pageInfo.getCurrent()); + pageInfos.setPages(pageInfo.getPages()); + pageInfos.setSize(pageInfo.getSize()); + pageInfos.setStartIndex(pageInfo.getStartIndex()); + pageInfos.setTotal(pageInfo.getTotal()); + return R.ok(pageInfos); + } + + + @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(); + } + + /** + * 处理充电订单实时监控数据相关的业务逻辑 + * @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))); + } + + + + + @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 = tokenService.getLoginUser().getUserid(); + //获取当前登录的siteIds + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + }else { + siteIds.add(statisticsQueryDto.getSiteId()); + } + if (siteIds.isEmpty())siteIds.add(-1); + TCharingOrderMapVO tCharingOrderMapVO = new TCharingOrderMapVO(); + + LocalDate start = null; + LocalDate end = null; + if (statisticsQueryDto.getDayType()==1){ + start = LocalDate.now(); + end = LocalDate.now().plusDays(1); + }else if (statisticsQueryDto.getDayType()==2){ + LocalDate today = LocalDate.now(); + // 获取本周一的日期 + start = statisticsQueryDto.getStartTime(); + end = statisticsQueryDto.getEndTime(); + } else if (statisticsQueryDto.getDayType()==3){ + // 获取当前日期 + start = statisticsQueryDto.getStartTime(); + end = statisticsQueryDto.getEndTime(); + }else if (statisticsQueryDto.getDayType()==4){ + // 获取今年1月1日的日期 + start = statisticsQueryDto.getStartTime(); + end = statisticsQueryDto.getEndTime(); + }else if (statisticsQueryDto.getDayType()==5){ + start = statisticsQueryDto.getStartTime(); + end = statisticsQueryDto.getEndTime(); + if (start.equals(end)){ + end = end.plusDays(1); + } + } + //上方饼图 + List<Map<String,Object>> maps = chargingOrderService.getSumByType(start,end, siteIds); + + if (statisticsQueryDto.getDayType()==1){ + List<Map<String,Object>> maps1 = chargingOrderService.getDateData(start,end, siteIds); + + 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(start,end, siteIds); + + 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(start,end, siteIds); + + 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(start,end, siteIds); + + 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(start,end, siteIds); + + 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); + } + + + tCharingOrderMapVO.setMaps(maps); + BigDecimal allMoney = new BigDecimal(0); + BigDecimal commissionAmount = BigDecimal.ZERO; + for (Map<String, Object> map : maps) { + BigDecimal periodElectricPrice = (BigDecimal) map.get("period_electric_price"); + Long order_source = (Long)map.get("order_source"); + if(2 != order_source){ + allMoney = allMoney.add(periodElectricPrice); + } + BigDecimal total_amount = (BigDecimal) map.get("total_amount"); + allMoney = allMoney.add(total_amount); + commissionAmount = commissionAmount.add((BigDecimal) map.get("commissionAmount")); + } + allMoney = allMoney.multiply(new BigDecimal("0.006")); + tCharingOrderMapVO.setAllMoney(allMoney); + tCharingOrderMapVO.setCommissionAmount(commissionAmount); + 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 = tokenService.getLoginUser().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); + + } + + + @RequiresPermissions(value = {"/chargingUserAnalysis"}, logical = Logical.OR) + @ResponseBody + @PostMapping(value = "/charging/users") + @ApiOperation(value = "除电站流量外", tags = {"管理后台-数据分析-充电用户分析"}) + public R<TCharingUserMapVO> users(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto){ + Long userId = tokenService.getLoginUser().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()); + } + if (siteIds.isEmpty())siteIds.add(-1); + statisticsQueryDto.setSiteIds(siteIds); + + + TCharingUserMapVO tCharingUserMapVO = new TCharingUserMapVO(); + //上方折现 + if (statisticsQueryDto.getDayType()==1){ + List<Map<String,Object>> map = chargingOrderService.usersDay(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(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(dateRangeStatistics); + + + List<Map<String,Object>> map1 = chargingOrderService.usersByQuery1(statisticsQueryDto); + + + + LocalDate startDate1 = statisticsQueryDto.getStartTime(); + LocalDate endDate1 = statisticsQueryDto.getEndTime(); + + List<Map<String, Object>> dateRangeStatistics1 = new ArrayList<>(); + + // 遍历日期范围 + while (!startDate1.isAfter(endDate1)) { + String formattedDate = startDate1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + Map<String, Object> dailyStats = findMapWithDateValue(map1, formattedDate); + + if (dailyStats != null) { + dateRangeStatistics1.add(dailyStats); + } else { + Map<String, Object> dateMap = new HashMap<>(); + dateMap.put("time", formattedDate); + dateMap.put("counts", 0); + dateRangeStatistics1.add(dateMap); + } + + // 移动到下一天 + startDate1 = startDate1.plusDays(1); + } + + tCharingUserMapVO.setMap1(dateRangeStatistics1); + + + + + } + + //用户标签 + List<Map<String,Object>> maps = chargingOrderService.getUserTagCount(); + Map<String,Object> stringObjectMap = new HashMap<>(); + Long noTagCount = chargingOrderService.countNoTag(); + stringObjectMap.put("count",noTagCount); + maps.add(stringObjectMap); + + //会员标签 + 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(); + 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(); + + + tCharingUserMapVO.setUserMaps(maps); + tCharingUserMapVO.setVipMaps(maps1); + tCharingUserMapVO.setUntiMap(untiMap); + tCharingUserMapVO.setCarMap(carMap); + tCharingUserMapVO.setCarBrandMap(carBrandMap); + tCharingUserMapVO.setLocalCarMap(localCarMap); + 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 = tokenService.getLoginUser().getUserid(); + //获取当前登录的siteIds + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + }else { + siteIds.add(statisticsQueryDto.getSiteId()); + } + //查询评价分 + Double aver = chargingOrderService.getAver(siteIds); + //查询各个分数 + List<Map<String,Object>> evaluate = chargingOrderService.getLevelEvaluate(siteIds); + //查询差评回复数 + List<Integer> mark = new ArrayList<>(); + mark.add(1); + mark.add(2); + Long count = orderEvaluateService.lambdaQuery().in(TOrderEvaluate::getMark, mark).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,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||statisticsQueryDto.getSiteId()==0) { + Long userId = tokenService.getLoginUser().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); + 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的平均值保留两位小数 + + 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 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; + + // 累加两个列表中所有元素的 "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; + } + + // 计算平均值 + 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 = tokenService.getLoginUser().getUserid(); + //获取当前登录的siteIds + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + } else { + siteIds.add(statisticsQueryDto.getSiteId()); + } + LocalDateTime selectDate = statisticsQueryDto.getSelectDate(); + LocalDateTime min = selectDate.with(LocalTime.MIN); + LocalDateTime max = selectDate.with(LocalTime.MAX); + + List<TChargingOrder> list = chargingOrderService.lambdaQuery().in(!siteIds.isEmpty(), TChargingOrder::getSiteId, siteIds) + .between(TChargingOrder::getCreateTime, min, max).eq(TChargingOrder::getStatus,5).eq(TChargingOrder::getDelFlag, 0) + .eq(TChargingOrder::getRechargePaymentStatus, 2) + .eq(statisticsQueryDto.getSiteId() != null, TChargingOrder::getSiteId, statisticsQueryDto.getSiteId()).list(); + //当日的订单总数 + int size = list.size(); + //计算list中paymentAmount的总和 + BigDecimal totalPaymentAmount = BigDecimal.ZERO; + //计算list中electrovalence的总和 + BigDecimal totalElectrovalence = BigDecimal.ZERO; + //计算list中serviceCharge的总和 + BigDecimal totalServiceCharge = BigDecimal.ZERO; + //计算list中charging_capacity的总和 + BigDecimal totalChargingCapacity = BigDecimal.ZERO; + List<TChargingOrderAccountingStrategy> accountingStrategyList = chargingOrderAccountingStrategyService.list(); + for (TChargingOrder order : list) { + List<TChargingOrderAccountingStrategy> collect = accountingStrategyList.stream().filter(s -> s.getChargingOrderId().equals(order.getId())).collect(Collectors.toList()); + BigDecimal periodElectricPrice = collect.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal periodServicePrice = collect.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal chargingCapacity = collect.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); + totalElectrovalence = totalElectrovalence.add(periodElectricPrice); + totalChargingCapacity = totalChargingCapacity.add(chargingCapacity); + if(2 != order.getOrderSource()){ + totalServiceCharge = totalServiceCharge.add(periodServicePrice); + totalPaymentAmount = totalPaymentAmount.add(periodElectricPrice).add(periodServicePrice); + }else{ + totalServiceCharge = totalServiceCharge.add(periodServicePrice.multiply(new BigDecimal("0.8"))); + totalPaymentAmount = totalPaymentAmount.add(periodElectricPrice).add(periodServicePrice.multiply(new BigDecimal("0.8"))); + } + } + + TCharingWorkVO tCharingWorkVO = new TCharingWorkVO(); + tCharingWorkVO.setCount(size); + tCharingWorkVO.setTotalPaymentAmount(totalPaymentAmount); + tCharingWorkVO.setTotalElectrovalence(totalElectrovalence); + tCharingWorkVO.setTotalServiceCharge(totalServiceCharge); + 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) { + try { + List<Integer> siteIds = new ArrayList<>(); + if (statisticsQueryDto.getSiteId() == null) { + Long userId = tokenService.getLoginUser().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); + + } + }catch (Exception e){ + e.printStackTrace(); + } + 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; + } + + + + + @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 = tokenService.getLoginUser().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(); + BigDecimal totalRatedPower = chargingPiles.stream().map(TChargingPile::getRatedPower).reduce(BigDecimal.ZERO, BigDecimal::add); + + //每日利用率=当日充电度数/(桩总功率*24小时) + BigDecimal multiply1 = totalRatedPower.multiply(new BigDecimal(24)); + System.err.println(JSON.toJSONString(capMap) + "---" + chargingPiles.size() + "---" + totalRatedPower + "---" + multiply1); + capMap.forEach(map -> { + BigDecimal chargingCapacity = (BigDecimal) map.get("chargingCapacity"); + BigDecimal result = chargingCapacity.divide(multiply1, 4, RoundingMode.HALF_UP); + BigDecimal multiply = result.multiply(new BigDecimal(100)); + map.put("chargingCapacity", multiply); + }); + + // 解析 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); + } + + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) + @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); + } + + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) + @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); + } + + @RequiresPermissions(value = {"/workbench"}, logical = Logical.OR) + @ResponseBody + @GetMapping(value = "/work/users/count") + @ApiOperation(value = "用户数量", tags = {"管理后台-工作台"}) + public R usersCount() { + List<Map<String,Object>> userMap = chargingOrderService.countAllUserData(); + return R.ok(userMap); + + } + + @GetMapping(value = "/getGunIdsByUserId") + @ApiOperation(value = "查询当前用户正在充电中的枪id集合", tags = {"小程序-首页-用户充电订单信息"}) + public R<List<Integer>> getGunIdsByUserId() { + Long userId = tokenService.getLoginUserApplet().getUserId(); + List<TChargingOrder> list = chargingOrderService.list(Wrappers.lambdaQuery(TChargingOrder.class) + .eq(TChargingOrder::getAppUserId, userId) + .in(TChargingOrder::getStatus, Arrays.asList(1,2,3,4))); + List<Integer> gunIds = list.stream().map(TChargingOrder::getChargingGunId).collect(Collectors.toList()); + return R.ok(gunIds); + } + + + + + /** + * 硬件充电结束后的处理逻辑 + * @param code + */ + @PostMapping("/endCharge") + public void endCharge(@RequestParam("code") String code){ + log.info(code + ":-------------------充电桩自动结束充电-------------------"); + chargingOrderService.endCharge(code, 2); + } + + + + /** + * 硬件异常结束充电后的处理逻辑 + * @param code + */ + @PostMapping("/excelEndCharge") + public void excelEndCharge(@RequestParam("code") String code){ + log.info(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(); + } + + + @ResponseBody + @GetMapping(value = "/getEndOfChargePageInfo/{id}") + @ApiOperation(value = "获取充电结束页面数据", tags = {"小程序-扫一扫"}) + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "订单id", required = true) + }) + public AjaxResult<EndOfChargePageInfo> getEndOfChargePageInfo(@PathVariable("id") String id){ + 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); + } + + + /** + * 根据车牌号查询指定时间范围内的数据 + * @param plateNum + * @param startTime + * @param endTime + * @return + */ + @PostMapping("/getCarChargingOrderByPlateNum") + public R<List<TChargingOrder>> getCarChargingOrderByPlateNum(@RequestParam("plateNum") String plateNum, @RequestParam("startTime") String startTime, + @RequestParam("endTime") String endTime){ + List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getPlateNum, plateNum).eq(TChargingOrder::getDelFlag, 0) + .in(TChargingOrder::getStatus, Arrays.asList(4, 5)).between(TChargingOrder::getStartTime, startTime, endTime)); + return R.ok(list); + } + + + /** + * 添加三方平台充电订单数据 + * @return + */ + @PostMapping("/addTripartitePlatformOrder") + public R addTripartitePlatformOrder(@RequestBody AddTripartitePlatformOrder query){ + return chargingOrderService.addTripartitePlatformOrder(query); + } + + + + + + /** + * 根据三方平台订单id获取充电数据 + * @param startChargeSeq + * @return + */ + @PostMapping("/getChargingOrderByStartChargeSeq") + public R<TChargingOrder> getChargingOrderByStartChargeSeq(@RequestParam("startChargeSeq") String startChargeSeq){ + TChargingOrder chargingOrder = chargingOrderService.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getStartChargeSeq, startChargeSeq)); + return R.ok(chargingOrder); + } + + + + + /** + * 根据三方平台订单ids获取充电数据 + * @param startChargeSeqs + * @return + */ + @PostMapping("/getChargingOrderByStartChargeSeqs") + public R<List<TChargingOrder>> getChargingOrderByStartChargeSeqs(@RequestParam("startChargeSeqs") List<String> startChargeSeqs){ + List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>().in(TChargingOrder::getStartChargeSeq, startChargeSeqs)); + return R.ok(list); + } + + + /** + * 三方平台请求停止充电 + * @param startChargeSeq + * @return + */ + @PostMapping("/tripartitePlatformStopCharge") + public R tripartitePlatformStopCharge(@RequestParam("startChargeSeq") String startChargeSeq){ + return chargingOrderService.tripartitePlatformStopCharge(startChargeSeq); + } + + + /** + * 临时接口 + * 获取充电后没有扣除费用的数据 + * @return + */ + @GetMapping("/getNotPaymentChargingOrder") + public R getNotPaymentChargingOrder(){ + return chargingOrderService.getNotPaymentChargingOrder(); + } + + + /** + * 手动推送订单给三方平台 + * @param code + * @return + */ + @PostMapping("/pushOrderInfo") + public R pushOrderInfo(@RequestParam String code){ + return chargingOrderService.pushOrderInfo(code); + } + + + /** + * 添加汇总数据(临时) + * @return + */ + @ResponseBody + @GetMapping(value = "/addChargingOrderSummaryData") + public R addChargingOrderSummaryData(){ + return chargingOrderService.addChargingOrderSummaryData(); + } + + /** + * 充电桩数据大屏 新能源汽车电池安全检测次数统计 + */ + @ResponseBody + @GetMapping(value = "/getStatisticsOfBattery") + @ApiOperation(value = "新能源汽车电池安全检测次数统计", tags = {"充电桩数据大屏"}) + public R<StatisticsOfBatteryVO> getStatisticsOfBattery(){ + + return chargingOrderService.getStatisticsOfBattery(); + } + + /** + * 充电桩数据大屏 获取站点集合中总的充电量 + */ + @GetMapping("/getSumDegreeBySiteIds") + public R<BigDecimal> getSumDegreeBySiteIds(@RequestParam("siteIds") List<Integer> SiteIds){ + return R.ok(chargingOrderService.getSumDegreeBySiteIds(SiteIds)); + } + +} -- Gitblit v1.7.1