From 7a4f9541331bef779a506b38a27ed5c3373c0bec Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期四, 15 五月 2025 13:53:22 +0800 Subject: [PATCH] 开发二级等保功能及心跳消息队列修改 --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 3269 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 2,563 insertions(+), 706 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java index 3d0b7e4..896a517 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java @@ -1,9 +1,7 @@ package com.ruoyi.order.service.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -11,8 +9,10 @@ import com.ruoyi.account.api.model.*; import com.ruoyi.account.api.vo.GetAppUserVipDetail; import com.ruoyi.account.api.vo.GetInviteUser; +import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.feignClient.*; import com.ruoyi.chargingPile.api.model.*; +import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.ChargingOrderGroup; import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; @@ -20,6 +20,7 @@ import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient; import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient; import com.ruoyi.integration.api.feignClient.SendMessageClient; @@ -31,14 +32,16 @@ import com.ruoyi.integration.api.feignClient.*; import com.ruoyi.integration.api.model.*; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; +import com.ruoyi.integration.api.vo.StartChargeResult; import com.ruoyi.order.api.dto.SettlementConfirmAdd; import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient; -import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; +import com.ruoyi.order.api.feignClient.AccountingStrategyOrderClient; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.SettlementListQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.*; +import com.ruoyi.order.api.vo.PlatformStopChargingReplyVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.mapper.TSettlementConfirmMapper; @@ -47,24 +50,20 @@ import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TOrderEvaluateService; import com.ruoyi.order.service.*; -import com.ruoyi.other.api.domain.TCoupon; -import com.ruoyi.other.api.domain.TGoods; +import com.ruoyi.order.vo.EndOfChargePageInfo; +import com.ruoyi.other.api.domain.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; -import com.ruoyi.other.api.domain.TIntegralRule; -import com.ruoyi.other.api.feignClient.IntegralRuleClient; -import com.ruoyi.other.api.feignClient.OtherClient; -import com.ruoyi.other.api.feignClient.RoleSiteClient; -import com.ruoyi.other.api.feignClient.UserSiteClient; +import com.ruoyi.other.api.domain.TVip; +import com.ruoyi.other.api.feignClient.*; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; import com.ruoyi.payment.api.model.RefundReq; import com.ruoyi.payment.api.model.RefundResp; import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.*; +import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; -import com.sun.org.apache.bcel.internal.generic.NEW; import io.seata.spring.annotation.GlobalTransactional; -import io.swagger.annotations.ApiModelProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -73,14 +72,18 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; +import javax.crypto.MacSpi; +import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; +import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneOffset; +import java.time.*; import java.time.format.DateTimeFormatter; +import java.time.format.TextStyle; +import java.time.temporal.ChronoUnit; +import java.time.temporal.WeekFields; import java.util.*; import java.util.concurrent.*; import java.util.stream.Collectors; @@ -102,11 +105,11 @@ private ChargingGunClient chargingGunClient; @Resource private TSettlementConfirmMapper tSettlementConfirmMapper; - + @Resource + private PartnerClient partnerClient; @Resource private SiteClient siteClient; - - + @Resource private AppUserCarClient appUserCarClient; @Resource @@ -140,15 +143,14 @@ private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; @Resource - private ChargingHandshakeClient chargingHandshakeClient; + private TCECClient tcecClient; @Resource private SendMessageClient sendMessageClient; @Resource private TOrderEvaluateService orderEvaluateService; - - + @Resource private AccountingStrategyDetailClient accountingStrategyDetailClient; @@ -181,9 +183,36 @@ @Resource private IntegralRuleClient integralRuleClient; + + @Resource + private VipClient vipClient; + + @Resource + private UserTagClient userTagClient; + + @Resource + private AppUserTagClient appUserTagClient; + + @Resource + private SecurityDetectionClient securityDetectionClient; + + @Resource + private BmsDemandAndChargerExportationClient bmsDemandAndChargerExportationClient; //计数器 private Map<String, Integer> counter_map = new HashMap<>(); + + //计数器 + private Map<String, Integer> boot_failed_map = new HashMap<>(); + + @Resource + private OperatorClient operatorClient; + + @Resource + private TransactionRecordClient transactionRecordClient; + + @Resource + private ITChargingOrderSummaryDataService chargingOrderSummaryDataService; @@ -199,6 +228,7 @@ Map<String, Object> map = new HashMap<>(); int size = this.baseMapper.getMyChargingOrderList(appUserId, 1, null, null).size(); map.put("number", size); + query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize()); List<TChargingOrder> list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize()); List<MyChargingOrderList> orderLists = new ArrayList<>(); for (TChargingOrder tChargingOrder : list) { @@ -246,14 +276,18 @@ myChargingOrderInfo.setChargeMode(chargingGun.getChargeMode()); String name = chargingGunClient.getAllName(chargingOrder.getChargingGunId()).getData(); myChargingOrderInfo.setName(name); - if(null != chargingOrder.getAppUserCarId()){ - TAppUserCar tAppUserCar = appUserCarClient.getCarByIds(Arrays.asList(chargingOrder.getAppUserCarId())).getData().get(0); - myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate()); + if(Objects.nonNull(chargingOrder.getAppUserCarId())){ + TAppUserCar tAppUserCar = appUserCarClient.getCarById(chargingOrder.getAppUserCarId().toString()).getData(); + if(null != tAppUserCar){ + myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate()); + }else{ + myChargingOrderInfo.setLicensePlate("无"); + } }else{ - myChargingOrderInfo.setLicensePlate("无"); + myChargingOrderInfo.setLicensePlate(chargingOrder.getPlateNum()); } - myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()); - myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()); + myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); + myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount()); myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount()); myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount()); @@ -269,9 +303,18 @@ if(null != dataList){ //在MongoDB中获取数据 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); - List<String> time = dataList.stream().map(s -> sdf.format(s.getCreate_time())).collect(Collectors.toList()); - List<BigDecimal> outputVoltage = dataList.stream().map(UploadRealTimeMonitoringData::getOutput_voltage).collect(Collectors.toList()); - List<BigDecimal> outputCurrent = dataList.stream().map(UploadRealTimeMonitoringData::getOutput_current).collect(Collectors.toList()); + List<UploadRealTimeMonitoringData> dataLists = new ArrayList<>(); + String t = ""; + for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : dataList) { + if(!sdf.format(uploadRealTimeMonitoringData.getCreate_time()).equals(t)){ + dataLists.add(uploadRealTimeMonitoringData); + t = sdf.format(uploadRealTimeMonitoringData.getCreate_time()); + } + } + + List<String> time = dataLists.stream().map(s -> sdf.format(s.getCreate_time())).collect(Collectors.toList()); + List<BigDecimal> outputVoltage = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_voltage).collect(Collectors.toList()); + List<BigDecimal> outputCurrent = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_current).collect(Collectors.toList()); List<Map<String, Object>> currentAndVoltage = new ArrayList<>(); for (int i = 0; i < time.size(); i++) { Map<String, Object> map = new HashMap<>(); @@ -284,8 +327,8 @@ } myChargingOrderInfo.setCurrentAndVoltage(currentAndVoltage); //在MongoDB中获取数据 - List<Integer> soc = dataList.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList()); - List<BigDecimal> po = dataList.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000))).collect(Collectors.toList()); + List<Integer> soc = dataLists.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList()); + List<BigDecimal> po = dataLists.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN)).collect(Collectors.toList()); List<Map<String, Object>> power = new ArrayList<>(); for (int i = 0; i < time.size(); i++) { Map<String, Object> map = new HashMap<>(); @@ -298,7 +341,7 @@ } myChargingOrderInfo.setPower(power); } - myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L > System.currentTimeMillis() ? 0 : 1); + myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L < System.currentTimeMillis() ? 0 : 1); return myChargingOrderInfo; } @@ -311,6 +354,8 @@ @Override public List<MyChargingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query) { Long appUserId = tokenService.getLoginUserApplet().getUserId(); + + query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize()); List<TChargingOrder> orderList = this.baseMapper.getNoInvoicedOrder(appUserId, query.getMonth(), query.getPageCurr(), query.getPageSize()); List<MyChargingOrderList> list = new ArrayList<>(); for (TChargingOrder tChargingOrder : orderList) { @@ -364,7 +409,7 @@ if(null != data){ //支付失败,删除无效的订单 String tradeStatus = data.getTradeStatus(); - if(tradeStatus.equals("TRADE_CLOSED")){ + if(null != tradeStatus && tradeStatus.equals("TRADE_CLOSED")){ this.removeById(tChargingOrder.getId()); } } @@ -375,7 +420,7 @@ TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId()) .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0)); if(null != one){ - return AjaxResult.error("充电枪正在充电桩中,启动失败"); + return AjaxResult.error("充电枪正在充电中,启动失败"); } //查询当前充电枪是否有正在支付的订单 one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId()) @@ -423,7 +468,14 @@ chargingOrder.setOrderClassification(1); chargingOrder.setAppUserId(userId); chargingOrder.setAppUserCarId(addChargingOrder.getAppUserCarId()); + if(null != addChargingOrder.getAppUserCarId()){ + TAppUserCar userCar = appUserCarClient.getCarById(addChargingOrder.getAppUserCarId().toString()).getData(); + if(null != userCar){ + chargingOrder.setPlateNum(userCar.getLicensePlate()); + } + } TChargingGun tChargingGun = chargingGunClient.getChargingGunById(addChargingOrder.getId()).getData(); + TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData(); chargingOrder.setSiteId(tChargingGun.getSiteId()); chargingOrder.setChargingPileId(tChargingGun.getChargingPileId()); chargingOrder.setChargingGunId(addChargingOrder.getId()); @@ -431,32 +483,43 @@ chargingOrder.setRechargePaymentStatus(1); chargingOrder.setRechargeAmount(addChargingOrder.getPaymentAmount()); chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId()); - if(null != appUser.getVipId()){ + chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); + chargingOrder.setOrderSource(1); + chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪"); + + Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0); + Integer accountingStrategyId = tChargingGun.getAccountingStrategyId(); + if(null == accountingStrategyId){ + //查询站点上面的计费策略 + accountingStrategyId = site.getAccountingStrategyId(); + } + TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData(); + + //直营站点才可以享受会员折扣 + if(null != appUser.getVipId() && 1 == site.getBusinessCategory()){ + TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); + BigDecimal discount = null; + if(1 == vip.getType()){ + //普通会员折扣使用积分策略上的折扣,且有最高优惠金额 + discount = accountingStrategy.getDiscount(); + }else{ + //内部会员使用会员信息设置的折扣,没有最高优惠金额 + discount = vip.getDiscount(); + } GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail(); getAppUserVipDetail.setAppUserId(appUser.getId()); getAppUserVipDetail.setVipId(appUser.getVipId()); TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData(); if(null != vipDetail){ Integer chargeNum = vipDetail.getChargeNum(); - if(0 > chargeNum){ - chargingOrder.setVipDiscount(vipDetail.getDiscount()); - BigDecimal discountAmount = addChargingOrder.getPaymentAmount().multiply((new BigDecimal(10) - .subtract(vipDetail.getDiscount())).divide(new BigDecimal(10))).setScale(4, BigDecimal.ROUND_HALF_EVEN); - chargingOrder.setVipDiscountAmount(discountAmount); + if(0 < chargeNum){ + chargingOrder.setVipDiscount(discount); } } - } this.save(chargingOrder); //添加订单的计费策略 - Integer accountingStrategyId = tChargingGun.getAccountingStrategyId(); - if(null == accountingStrategyId){ - //查询站点上面的计费策略 - Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0); - accountingStrategyId = site.getAccountingStrategyId(); - } - TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData(); List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData(); AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder(); BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder); @@ -479,20 +542,20 @@ paymentOrder.setAmount(addChargingOrder.getPaymentAmount()); paymentOrder.setOpenId(appUser.getWxOpenid()); paymentOrder.setDescription("充电充值"); - paymentOrder.setNotifyUrl("/order/t-charging-order/chargingOrderWXCallback"); + paymentOrder.setNotifyUrl("/payment/wx/pay/notify"); Map<String, Object> data = wxPaymentClient.orderPay(paymentOrder).getData(); return AjaxResult.success(data); } if(2 == addChargingOrder.getPaymentType()){ AliPaymentReq req = new AliPaymentReq(); req.setOutTradeNo(chargingOrder.getCode()); - req.setTotalAmount(chargingOrder.getPaymentAmount().toString()); + req.setTotalAmount(addChargingOrder.getPaymentAmount().toString()); req.setSubject("充电充值"); req.setBuyerOpenId(appUser.getAliOpenid()); req.setBody("充电充值"); + req.setNotifyUrl("/payment/ali/callBack"); AliPaymentResp data = aliPaymentClient.payment(req).getData(); if(null != data){ - data.setNotifyUrl(data.getNotifyUrl() + "/t-charging-order/chargingOrderALICallback"); return AjaxResult.success(data); } } @@ -518,6 +581,7 @@ chargingOrder.setRechargePaymentStatus(2); chargingOrder.setRechargeSerialNumber(transaction_id); chargingOrder.setStatus(2); + chargingOrder.setPayTime(LocalDateTime.now()); //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据 PreChargeCheck preChargeCheck = new PreChargeCheck(); @@ -526,107 +590,306 @@ preChargeCheck.setSecureConnectionDetection(false); preChargeCheck.setStartupSuccess(1); String key = "AQJC_" + chargingOrder.getChargingGunId(); - redisService.setCacheObject(key, preChargeCheck); + redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS); //根据当前充值的金额和计费模板算出充电的金额 BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); - //计算充电金额,会员需要将折扣金额加入到充电总金额中 - TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); - AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); - //总单价 - BigDecimal totalUnitPrice = strategyDetail.getServiceCharge().add(strategyDetail.getElectrovalence()); - //计算能充电的度数 - BigDecimal degrees = rechargeAmount.divide(totalUnitPrice); + BigDecimal rechargeAmount1 = new BigDecimal(rechargeAmount.toString()); + SimpleDateFormat sdf = new SimpleDateFormat("HHmm"); + Long now = Long.valueOf(sdf.format(new Date())); + Long nowTimeMillis = System.currentTimeMillis(); + //根据支付金额,获取出使用的计费策略明细 //计算电费金额和服务费 - BigDecimal serviceCharge = strategyDetail.getServiceCharge().multiply(degrees); - BigDecimal electrovalence = strategyDetail.getElectrovalence().multiply(degrees); - - //再处理会员折扣 - BigDecimal discount = BigDecimal.ZERO; + BigDecimal serviceCharge = BigDecimal.ZERO; + BigDecimal discountAmount = BigDecimal.ZERO; + BigDecimal discount = chargingOrder.getVipDiscount(); + //先根据额定功率计算出每秒充电度数,然后计算出支付金额能充多少度电 + TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); + //1秒充电度数 + BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600), 6, RoundingMode.HALF_EVEN); + TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); + //判断会员是否还有充电优惠次数,计算会员优惠的折扣金额 if(null != appUser.getVipId()){ GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail(); getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId()); getAppUserVipDetail.setVipId(appUser.getVipId()); TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData(); - if(data.getChargeNum() > 0){ - discount = serviceCharge.multiply(data.getDiscount().divide(new BigDecimal(10))); - data.setChargeNum(data.getChargeNum() - 1); - appUserVipDetailClient.updateAppUserVipDetail(data); + if(null != data && data.getChargeNum() > 0){ + //计算折扣 + List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); + list.get(list.size() - 1).setEndTime("23:59"); + //将数据叠加两份,处理跨天的情况 + list.addAll(list); + boolean sta = false; + for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) { + Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", "")); + Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", "")); + String[] split = accountingStrategyDetailOrder.getEndTime().split(":"); + if(sta || (now >= start && now < end)){ + sta = true; + + Calendar end_calendar = Calendar.getInstance(); + end_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0])); + end_calendar.set(Calendar.MINUTE, Integer.valueOf(split[1])); + //到此策略结束的秒数 + if(null == nowTimeMillis){ + String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":"); + Calendar start_calendar = Calendar.getInstance(); + start_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0])); + start_calendar.set(Calendar.MINUTE, Integer.valueOf(split1[1])); + nowTimeMillis = start_calendar.getTimeInMillis(); + } + //间隔秒数 + long m = (end_calendar.getTimeInMillis() - nowTimeMillis) / 1000; + //每秒需要支付的服务费金额 + BigDecimal total_until = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge()); + BigDecimal s_total_amount = s_degrees.multiply(total_until); + //每秒需要支付的服务费金额 + BigDecimal s_server_amount = s_degrees.multiply(accountingStrategyDetailOrder.getServiceCharge()); + //计算剩余金额能充多长时间的电 + long times = rechargeAmount1.divide(s_total_amount, 0, RoundingMode.DOWN).longValue(); + if(times > m){ + //充电时间跨度两个计费策略,需要继续对下一个策略进行计算 + serviceCharge = serviceCharge.add(s_server_amount.multiply(new BigDecimal(m))); + rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m))); + nowTimeMillis = null; + }else{ + serviceCharge = serviceCharge.add(s_server_amount.multiply(new BigDecimal(times))); + break; + } + } + } + if(null != discount){ + discountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(discount)); + } + + if(discountAmount.compareTo(BigDecimal.ZERO) >= 0){ + //计算会员最大优惠金额 + TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); + BigDecimal maximumDeduction = vip.getMaximumDeduction(); + //普通会员有最高优惠限制 + if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){ + discountAmount = maximumDeduction; + } + } + discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN); + if(discountAmount.compareTo(BigDecimal.ZERO) >= 0){ + data.setChargeNum(data.getChargeNum() - 1); + appUserVipDetailClient.updateAppUserVipDetail(data); + } } } - electrovalence = electrovalence.add(discount); - chargingOrder.setChargeAmount(electrovalence); + + //机子上显示的金额为用户充值的金额+会员折扣金额 + BigDecimal account_balance = chargingOrder.getRechargeAmount().add(discountAmount).setScale(4, RoundingMode.HALF_EVEN); + chargingOrder.setChargeAmount(account_balance); + chargingOrder.setVipDiscountAmount(discountAmount); this.updateById(chargingOrder); - TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData(); + TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData(); //调用远程启动充电消息 PlatformStartCharging platformStartCharging = new PlatformStartCharging(); platformStartCharging.setTransaction_serial_number(chargingOrder.getCode()); platformStartCharging.setCharging_pile_code(chargingPile.getCode()); - platformStartCharging.setCharging_gun_code(chargingGun.getCode()); + platformStartCharging.setCharging_gun_code(tChargingGun.getCode()); //使用订单id作为逻辑卡号 platformStartCharging.setCard_number(chargingOrder.getId().toString()); - platformStartCharging.setAccount_balance(electrovalence); + platformStartCharging.setAccount_balance(account_balance); + + log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString()); sendMessageClient.platformStartCharging(platformStartCharging); - //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 - String code = chargingOrder.getCode(); - //执行5分钟的定时任务检测 - ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - scheduler.scheduleAtFixedRate(()->{ - List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData(); - if(data.size() != 0){ - PlatformStartChargingReply platformStartChargingReply = data.get(1); - Integer startup_result = platformStartChargingReply.getStartup_result(); - Integer failure_cause = platformStartChargingReply.getFailure_cause(); - Integer counter = counter_map.get(code); - PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); - //状态为5的时候,硬件会间隔60秒后再次检测,依然未插枪,则不启动充电 - //因这里是间隔5秒执行检测,所以累计次数在30次以上 - if(failure_cause == 5 && null == counter || counter < 35){ - counter++; - counter_map.put(code, counter); - //启动失败 - preChargeCheck1.setStartupSuccess(3); - preChargeCheck1.setFailureCause(failure_cause); - redisService.setCacheObject(key, preChargeCheck1); - return; - } - //清除计时器中的无效数据 - counter_map.remove(code); - //开始处理退款 - TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); - if(0 == startup_result){ - //启动失败 - preChargeCheck1.setStartupSuccess(3); - preChargeCheck1.setFailureCause(failure_cause); - //启动失败后取消订单,退款操作 - refund(code); - order.setStatus(-1); - order.setEndMode(0); - }else{ - preChargeCheck1.setStartupSuccess(2); - order.setStatus(3); - order.setStartTime(LocalDateTime.now()); - } - this.updateById(order); - redisService.setCacheObject(key, preChargeCheck1); - //提前结束定时任务 - scheduler.shutdown(); - } - }, 5, 300, TimeUnit.SECONDS); +// //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 +// Long id = chargingOrder.getId(); +// //执行5分钟的定时任务检测 +// ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); +// scheduler.scheduleAtFixedRate(()->{ +// if(timingDetection(id)){ +// scheduler.shutdown(); +// } +// }, 5, 1, TimeUnit.SECONDS); return AjaxResult.success(); } + + /** + * 定时检测mongodb数据库数据 + * @param id + * @return + */ + public boolean timingDetection(Long id){ + TChargingOrder chargingOrder = this.getById(id); + if(chargingOrder.getStatus() != 2){ + return true; + } + String code = chargingOrder.getCode(); + String key = "AQJC_" + chargingOrder.getChargingGunId(); + List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData(); + log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString()); + if(data.size() != 0){ + PlatformStartChargingReply platformStartChargingReply = data.get(1); + Integer startup_result = platformStartChargingReply.getStartup_result(); + Integer failure_cause = platformStartChargingReply.getFailure_cause(); + Integer counter = counter_map.get(code); + PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); + //5分钟内还未插枪则取消充电,退回金额。 + if(failure_cause == 5 && (null == counter || counter < 1800)){ + counter = (null == counter ? 0 : counter) + 1; + counter_map.put(code, counter); + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(failure_cause); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + return false; + } + + //清除计时器中的无效数据 + counter_map.remove(code); + TChargingOrder order = new TChargingOrder(); + order.setId(id); + order.setAppUserId(chargingOrder.getAppUserId()); + if(0 == startup_result){ + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(failure_cause); + //启动失败后取消订单,退款操作 + refund(code); + order.setStatus(-1); + order.setEndMode(0); + }else{ + //启动成功 + preChargeCheck1.setStartupSuccess(2); + order.setStatus(3); + order.setStartTime(LocalDateTime.now()); + } + this.updateById(order); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + //推送三方平台订单状态 + if(2 == chargingOrder.getOrderSource()){ + tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); + } + return true; + }else{ + Integer counter = boot_failed_map.get(code); + log.info(code + ":-------------------未上传开启充电结果-------------------" + counter); + PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); + //5分钟内未启动成功,退回金额。 + if(null == counter || counter < 1800){ + counter = (null == counter ? 0 : counter) + 1; + boot_failed_map.put(code, counter); + //启动失败 + preChargeCheck1.setStartupSuccess(1); + preChargeCheck1.setFailureCause(0); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + return false; + } + + //清除计时器中的无效数据 + boot_failed_map.remove(code); + TChargingOrder order = new TChargingOrder(); + order.setId(id); + order.setAppUserId(chargingOrder.getAppUserId()); + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(0); + //启动失败后取消订单,退款操作 + refund(code); + order.setStatus(-1); + order.setEndMode(0); + this.updateById(order); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + //推送三方平台订单状态 + if(2 == chargingOrder.getOrderSource()){ + tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); + } + return true; + } + } + + + /** + * 修改安全检测数据 + * @param securityDetection + */ + @Override + public void securityDetection(SecurityDetectionVO securityDetection){ + GetChargingGunByCode code = new GetChargingGunByCode(); + code.setCharging_pile_code(securityDetection.getCharging_pile_code()); + code.setCharging_gun_code(securityDetection.getCharging_gun_code()); + TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData(); + PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + chargingGun.getId()); + if(null != preChargeCheck1){ + preChargeCheck1.setElectronicLockLock(true); + preChargeCheck1.setInsulationTesting(true); + preChargeCheck1.setSecureConnectionDetection(securityDetection.getSecure_connection() == 1); + redisService.setCacheObject("AQJC_" + chargingGun.getId(), preChargeCheck1, 24L, TimeUnit.HOURS); + } + } + + /** + * 启动充电应答 + * @param message + */ + @Override + public void startChargeSuccessfully(PlatformStartChargingReplyMessageVO message) { + Integer startup_result = message.getStartup_result(); + Integer failure_cause = message.getFailure_cause(); + TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, message.getTransaction_serial_number())); + if(order.getStatus() != 2){ + return; + } + String code = order.getCode(); + PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + order.getChargingGunId()); + if(null != preChargeCheck1){ + preChargeCheck1.setElectronicLockLock(true); + preChargeCheck1.setInsulationTesting(true); + preChargeCheck1.setStartupSuccess(1); + } + if(0 == startup_result){ + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(failure_cause); + //启动失败后取消订单,退款操作 + refund(code); + order.setStatus(-1); + order.setEndMode(0); + }else{ + //启动成功 + preChargeCheck1.setStartupSuccess(2); + order.setStatus(3); + order.setStartTime(LocalDateTime.now()); + TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); + chargingGun.setStatus(4); + chargingGunClient.updateChargingGunById(chargingGun); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus()); + } + redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); + this.updateById(order); + //推送三方平台启动充电结果 + if(2 == order.getOrderSource()){ + StartChargeResult result = new StartChargeResult(); + result.setStartChargeSeq(order.getStartChargeSeq()); + result.setStartChargeSeqStat(3 == order.getStatus() ? 2 : 4); + result.setConnectorID(order.getChargingGunId().toString()); + result.setStartTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + Operator operator = operatorClient.getOperatorById(order.getOperatorId()).getData(); + result.setOperatorID(operator.getOperatorId()); + tcecClient.notificationStartChargeResult(result); + + tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); + } + } /** * 启动失败后的退款,取消订单 * @param code */ public void refund(String code){ + log.info(code + ":-------------------充电启动失败,执行退款-------------------"); TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); - if(chargingOrder.getStatus() == 2){ + if(chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2){ Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); //构建退款明细 @@ -650,15 +913,33 @@ model.setOut_trade_no(chargingOrder.getCode()); model.setOut_refund_no(chargingOrderRefund.getRefundCode()); model.setReason("充电失败,取消充电订单"); - model.setNotify_url("http://221.182.45.100:9000/order/t-charging-order/chargingOrderStartupFailureWxRefund"); + model.setNotify_url("/payment/wx/refund/notify"); WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); amount.setRefund(rechargeAmount.multiply(new BigDecimal(100)).intValue()); amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); - R<String> orderR = wxPaymentClient.refundOrderR(model); + R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); if(200 == orderR.getCode()){ chargingOrderRefundService.save(chargingOrderRefund); + //手续费 + Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount"); + Object refund_fee1 = amount1.get("refund_fee"); + BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); + chargingOrderRefund.setRefundFee(refund_fee); + chargingOrderRefundService.updateById(chargingOrderRefund); + //回退会员折扣次数 + if(chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0){ + TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); + GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail(); + getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId()); + getAppUserVipDetail.setVipId(appUser.getVipId()); + TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData(); + if(null != data){ + data.setChargeNum(data.getChargeNum() + 1); + appUserVipDetailClient.updateAppUserVipDetail(data); + } + } } } if(2 == rechargePaymentType){ @@ -669,14 +950,96 @@ dto.setRefundReason("充电失败,取消充电订单"); RefundResp resp = aliPaymentClient.refund(dto).getData(); if(null != resp){ - SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); - AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date())); - if(success.isSuccess()){ - chargingOrderRefundService.save(chargingOrderRefund); + chargingOrderRefundService.save(chargingOrderRefund); + //回退会员折扣次数 + if(chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0){ + TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); + GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail(); + getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId()); + getAppUserVipDetail.setVipId(appUser.getVipId()); + TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData(); + if(null != data){ + data.setChargeNum(data.getChargeNum() + 1); + appUserVipDetailClient.updateAppUserVipDetail(data); + } } + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); } } + } + } + + + + public void refund1(String code, BigDecimal money){ + log.info(code + ":-------------------充电成功,执行手动退款-------------------"); + TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); + if(chargingOrder.getOrderSource() == 1){ + BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); + Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); + //构建退款明细 + TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); + chargingOrderRefund.setChargingOrderId(chargingOrder.getId()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue()); + chargingOrderRefund.setRefundAmount(money); + chargingOrderRefund.setRefundStatus(1); + chargingOrderRefund.setPayType(rechargePaymentType); + chargingOrderRefund.setRefundStatus(1); + chargingOrderRefund.setCode(code); + chargingOrderRefund.setRefundTitle("充电完成退款"); + chargingOrderRefund.setRefundContent("充电完成退款"); + chargingOrderRefund.setRefundReason("充电完成退款"); + chargingOrderRefund.setRefundRemark("充电完成退款,手动退款"); + chargingOrderRefund.setRefundTotalAmount(money); + chargingOrderRefund.setPayAmount(money); + if(1 == rechargePaymentType){ + WxPaymentRefundModel model = new WxPaymentRefundModel(); + model.setOut_trade_no(chargingOrder.getCode()); + model.setOut_refund_no(chargingOrderRefund.getRefundCode()); + model.setReason("充电完成退款"); + model.setNotify_url("/payment/wx/refund/notify"); + WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); + amount.setRefund(money.multiply(new BigDecimal(100)).intValue()); + amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); + amount.setCurrency("CNY"); + model.setAmount(amount); + R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); + if(200 == orderR.getCode()){ + chargingOrderRefundService.save(chargingOrderRefund); + //手续费 + Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount"); + Object refund_fee1 = amount1.get("refund_fee"); + BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); + chargingOrderRefund.setRefundFee(refund_fee); + chargingOrderRefundService.updateById(chargingOrderRefund); + } + } + if(2 == rechargePaymentType){ + RefundReq dto = new RefundReq(); + dto.setOutTradeNo(chargingOrder.getCode()); + dto.setOutRequestNo(chargingOrderRefund.getCode()); + dto.setRefundAmount(money.toString()); + dto.setRefundReason("充电完成退款"); + RefundResp resp = aliPaymentClient.refund(dto).getData(); + if(null != resp){ + chargingOrderRefundService.save(chargingOrderRefund); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); + } + } + } } @@ -690,13 +1053,20 @@ * @return */ public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time){ - if("SUCCESS".equals(tradeState)){ - TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no)); - one.setRefundSerialNumber(refund_id); - one.setRefundStatus(2); - one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE"))); - chargingOrderRefundService.updateById(one); - } + TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no)); + one.setRefundSerialNumber(refund_id); + one.setRefundStatus(2); + one.setRefundTime(LocalDateTime.now()); + chargingOrderRefundService.updateById(one); + + TChargingOrder order = this.getById(one.getChargingOrderId()); + TChargingOrder chargingOrder = new TChargingOrder(); + chargingOrder.setId(one.getChargingOrderId()); + chargingOrder.setAppUserId(order.getAppUserId()); + chargingOrder.setRefundStatus(2); + chargingOrder.setRefundSerialNumber(refund_id); + chargingOrder.setRefundTime(LocalDateTime.now()); + this.updateById(chargingOrder); return AjaxResult.success(); } @@ -712,8 +1082,8 @@ public ChargingDetails getChargingDetails(Integer id) { Long userId = tokenService.getLoginUserApplet().getUserId(); TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id) - .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0)); - if(null == one){ + .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0).orderByDesc(TChargingOrder::getStartTime).last(" limit 0, 1")); + if(null == one || !one.getAppUserId().equals(userId)){ return null; } ChargingDetails chargingDetails = new ChargingDetails(); @@ -729,21 +1099,20 @@ if(null != data){ chargingDetails.setChargeCurrent(data.getOutput_current()); chargingDetails.setChargeVoltage(data.getOutput_voltage()); - BigDecimal power = data.getOutput_current().multiply(data.getOutput_voltage()).divide(new BigDecimal(1000)); + BigDecimal power = data.getOutput_current().multiply(data.getOutput_voltage()).divide(new BigDecimal(1000), new MathContext(4, RoundingMode.HALF_EVEN)); chargingDetails.setChargePower(power); chargingDetails.setCompletionRatio(data.getSoc()); chargingDetails.setRemainingChargeTime(data.getTime_remaining()); chargingDetails.setChargedDegrees(data.getCharging_degree()); - chargingDetails.setChargedTime(data.getCumulative_charging_time()); - } - ChargingHandshake chargingHandshake = chargingHandshakeClient.getDataByOrderCode(one.getCode()).getData(); - if(null != chargingHandshake && null != data && null != one.getAppUserCarId()){ - BigDecimal bms_battery_capacity = chargingHandshake.getBms_battery_capacity(); - TAppUserCar appUserCar = appUserCarClient.getCarByIds(Arrays.asList(one.getAppUserCarId())).getData().get(0); - // 续航 = 电池容量 / 续航里程 * soc - BigDecimal divide = bms_battery_capacity.divide(new BigDecimal(appUserCar.getEndurance())); - BigDecimal multiply = new BigDecimal(data.getSoc() / 100).multiply(divide); - chargingDetails.setEndurance(multiply); + Integer h = Integer.valueOf(data.getCumulative_charging_time() / 60); + Integer m = Integer.valueOf(data.getCumulative_charging_time() % 60); + chargingDetails.setChargedTime(String.format("%02d", h) + ":" + String.format("%02d", m)); + if(null != one.getAppUserCarId()){ + TAppUserCar appUserCar = appUserCarClient.getCarById(one.getAppUserCarId().toString()).getData(); + // 续航 = 续航里程 * soc + BigDecimal multiply = new BigDecimal(data.getSoc()).divide(new BigDecimal(100)).multiply(new BigDecimal(appUserCar.getEndurance())); + chargingDetails.setEndurance(multiply.setScale(2, RoundingMode.HALF_EVEN)); + } } return chargingDetails; } @@ -757,83 +1126,136 @@ @Override @GlobalTransactional(rollbackFor = Exception.class) public AjaxResult stopCharging(String id) { - TChargingOrder chargingOrder = this.getById(id); - Integer status = chargingOrder.getStatus(); + TChargingOrder order = this.getById(id); + Integer status = order.getStatus(); + if(status != 3){ + return AjaxResult.error("还未开始充电"); + } if(status == 4 || status == 5){ return AjaxResult.error("不能重复操作"); } + Long userId = tokenService.getLoginUserApplet().getUserId(); + if(!order.getAppUserId().equals(userId)){ + return AjaxResult.error("权限不足"); + } + TChargingOrder chargingOrder = new TChargingOrder(); + chargingOrder.setId(Long.valueOf(id)); + chargingOrder.setAppUserId(order.getAppUserId()); + chargingOrder.setEndTime(LocalDateTime.now()); chargingOrder.setStatus(4); chargingOrder.setEndMode(1); this.updateById(chargingOrder); - + String code1 = order.getCode(); + TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); //异步线程处理停机 ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1); cachedThreadPool.execute(()->{ //调用硬件停止充电,停止成功后开始计算费用退款 - TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingOrder.getChargingPileId()).getData(); - TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); + TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData(); PlatformStopCharging platformStopCharging = new PlatformStopCharging(); platformStopCharging.setCharging_pile_code(chargingPile.getCode()); platformStopCharging.setCharging_gun_code(chargingGun.getCode()); sendMessageClient.platformStopCharging(platformStopCharging); - //开始查询停机应答,成功后开始计费费用 - for (int i = 0; i < 60; i++) { - GetPlatformStopChargingReply query = new GetPlatformStopChargingReply(); - query.setCharging_gun_code(chargingGun.getCode()); - query.setCharging_pile_code(chargingPile.getCode()); - PlatformStopChargingReply reply = platformStopChargingReplyClient.getPlatformStopChargingReply(query).getData(); - if(null == reply){ - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - continue; - } - - if(0 == reply.getStop_result()){ - String failure_cause = ""; - switch (reply.getFailure_cause()){ - case 0: - failure_cause = "无"; - break; - case 1: - failure_cause = "设备编号不匹配"; - break; - case 2: - failure_cause = "枪未处于充电状态"; - break; - case 3: - failure_cause = "其他"; - break; - } - log.error("停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause); - throw new RuntimeException(failure_cause); - } - - //计算费用,处理退款 - endCharge(chargingOrder); - break; - } + log.info(code1 + ":-------------------远程停止充电请求-------------------"); + log.info(platformStopCharging.toString()); }); - - + //推送三方平台 + if(2 == order.getOrderSource()){ + tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); + } + + return AjaxResult.success(); + } + + + /** + * 结束充电后处理用户标签数据 + * @param chargingOrder + */ + public void editUserTag(TChargingOrder chargingOrder){ + //处理用户标签数据 + List<TUserTag> data = userTagClient.getAllUserTag().getData(); + //累计充电次数 + List<TUserTag> userTagList1 = data.stream().filter(s -> s.getStandardCondition() == 1).collect(Collectors.toList()); + for (TUserTag tUserTag : userTagList1) { + Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times"); + TAppUserTag appUserTag = new TAppUserTag(); + appUserTag.setAppUserId(chargingOrder.getAppUserId()); + appUserTag.setUserTagId(tUserTag.getId()); + TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData(); + + String start = tUserTag.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + String end = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) + .eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0)); + if(null == data1 && count1 >= times){ + data1 = new TAppUserTag(); + data1.setAppUserId(chargingOrder.getAppUserId()); + data1.setUserTagId(tUserTag.getId()); + data1.setCreateTime(LocalDateTime.now()); + appUserTagClient.addUserTag(data1); + } + } + //充电频率 + List<TUserTag> userTagList2 = data.stream().filter(s -> s.getStandardCondition() == 2).collect(Collectors.toList()); + for (TUserTag tUserTag : userTagList2) { + TAppUserTag appUserTag = new TAppUserTag(); + appUserTag.setAppUserId(chargingOrder.getAppUserId()); + appUserTag.setUserTagId(tUserTag.getId()); + TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData(); + + Integer day = JSON.parseObject(tUserTag.getConditions()).getInteger("day"); + Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times"); + LocalDateTime endTime = LocalDateTime.now(); + endTime.plusDays(day); + String start = tUserTag.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + String end = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) + .eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0)); + if(null == data1 && count1 >= times){ + data1 = new TAppUserTag(); + data1.setAppUserId(chargingOrder.getAppUserId()); + data1.setUserTagId(tUserTag.getId()); + data1.setCreateTime(LocalDateTime.now()); + appUserTagClient.addUserTag(data1); + } + } + } + + + /** + * 推荐奖励(被推荐首单奖励) + * @param chargingOrder + */ + public void referralReward(TChargingOrder chargingOrder){ //处理推荐奖励(被推荐首单奖励) TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) - .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0)); + .in(TChargingOrder::getStatus, Arrays.asList(4, 5)).eq(TChargingOrder::getDelFlag, 0)); if(null != appUser.getInviteUserId() && 1 == count){ TIntegralRule integralRule = integralRuleClient.getSet().getData(); String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints(); JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints); Integer num1 = jsonObject.getInteger("num1"); + + TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData(); + if(null != appUser1.getVipId()){ + TVip vip = vipClient.getInfo1(appUser1.getVipId()).getData(); + Integer doubleIntegration = vip.getDoubleIntegration(); + //双倍积分 + if(1 == doubleIntegration){ + num1 *= 2; + } + + } + GetInviteUser query = new GetInviteUser(); - query.setAppUserId(appUser.getInviteUserId()); + query.setAppUserId(appUser1.getId()); query.setBeInvitedAppUserId(chargingOrder.getAppUserId()); TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData(); if(null == inviteUser){ inviteUser = new TInviteUser(); - inviteUser.setAppUserId(appUser.getInviteUserId()); + inviteUser.setAppUserId(appUser1.getId()); inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId()); inviteUser.setAward(num1); inviteUser.setCreateTime(LocalDateTime.now()); @@ -842,154 +1264,71 @@ inviteUser.setAward(num1); inviteUserClient.updateInviteUser(inviteUser); } - TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData(); - TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); - String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); - appUserIntegralChange.setCode(code); - appUserIntegralChange.setAppUserId(appUser.getInviteUserId()); - appUserIntegralChange.setChangeType(5); - appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints()); - appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1); - appUserIntegralChange.setCreateTime(LocalDateTime.now()); - appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); - - appUser1.setPoints(appUser1.getPoints() + num1); - appUserClient.updateAppUser(appUser1); + if(num1 > 0){ + TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); + String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); + appUserIntegralChange.setCode(code); + appUserIntegralChange.setAppUserId(appUser1.getId()); + appUserIntegralChange.setChangeType(4); + appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints()); + appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1); + appUserIntegralChange.setCreateTime(LocalDateTime.now()); + appUserIntegralChange.setOrderCode(chargingOrder.getCode()); + appUserIntegralChange.setExtension(appUser.getId().toString()); + appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); + + appUser1.setPoints(appUser1.getPoints() + num1); + appUserClient.updateAppUser(appUser1); + } } - - return AjaxResult.success(); } - - + + + /** - * 手动结束后的费用计算和退款逻辑 + * 停止充电应答结果处理 + * @param platformStopChargingReply */ - @GlobalTransactional(rollbackFor = Exception.class) - public void endCharge(TChargingOrder chargingOrder){ - //如果使用优惠券需要判断优惠券是否满足使用条件 - //根据实际的充电金额计算退款金额 退回费用=(原金额/总金额)*(总金额-实际充电金额) - //退款金额=优惠券金额+剩余充电金额 - List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); - BigDecimal total = BigDecimal.ZERO; - for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) { - BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice(); - BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice(); - total = total.add(periodElectricPrice).add(periodServicePrice); + @Override + public void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply){ + GetChargingGunByCode code = new GetChargingGunByCode(); + code.setCharging_gun_code(platformStopChargingReply.getCharging_gun_code()); + code.setCharging_pile_code(platformStopChargingReply.getCharging_pile_code()); + TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData(); + TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGun.getId()) + .orderByDesc(TChargingOrder::getEndTime).eq(TChargingOrder::getRechargePaymentStatus, 2).last(" limit 0, 1")); + if(null != order && order.getStatus() != 4){ + return; } - BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); - BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount(); - BigDecimal decimal = rechargeAmount.add(vipDiscountAmount); - //退款金额(已经计算了折扣优惠部分) - BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total)); - BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue()); - BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue()); - if(null != chargingOrder.getVipDiscount()){ - orderAmount = orderAmount.divide(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); - chargingOrder.setOrderAmount(total); - } - - if(chargingOrder.getEndMode() == 2){ - chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3); - } - chargingOrder.setStatus(5); - chargingOrder.setPaymentAmount(payAmount); - this.updateById(chargingOrder); - - //计算优惠券 - if(null != chargingOrder.getAppCouponId()){ - //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。 - TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData(); - String couponJson = appCoupon.getCouponJson(); - TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class); - Integer preferentialMode = tCoupon.getPreferentialMode(); - if(1 == preferentialMode){ - //满减 - if(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){ - refundAmount = refundAmount.add(tCoupon.getDiscountAmount()); - chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount()); - payAmount = payAmount.subtract(tCoupon.getDiscountAmount()); - }else{ - chargingOrder.setAppCouponId(null); - chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); - appCouponClient.refund(chargingOrder.getAppCouponId().toString()); - } + + String code1 = order.getCode(); + if(0 == platformStopChargingReply.getStop_result()){ + String failure_cause = ""; + switch (platformStopChargingReply.getFailure_cause()){ + case 0: + failure_cause = "无"; + break; + case 1: + failure_cause = "设备编号不匹配"; + break; + case 2: + failure_cause = "枪未处于充电状态"; + break; + case 3: + failure_cause = "其他"; + break; } - if(2 == preferentialMode){ - //抵扣 - if(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){ - //折扣金额 - BigDecimal divide = total.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10)); - divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide; - refundAmount = refundAmount.add(divide); - chargingOrder.setCouponDiscountAmount(divide); - payAmount = payAmount.subtract(divide); - }else{ - chargingOrder.setAppCouponId(null); - chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); - appCouponClient.refund(chargingOrder.getAppCouponId().toString()); - } - } + log.info(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause); + }else{ + TChargingOrder chargingOrder = new TChargingOrder(); + chargingOrder.setId(order.getId()); + chargingOrder.setAppUserId(order.getAppUserId()); + chargingOrder.setEndMode(1); + this.updateById(chargingOrder); } - - if(null != chargingOrder.getVipDiscount()){ - BigDecimal subtract = orderAmount.subtract(total); - chargingOrder.setVipDiscountAmount(subtract); - payAmount = payAmount.subtract(subtract); - } - //开始构建退款费用 - if(refundAmount.compareTo(BigDecimal.ZERO) > 0){ - Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); - //构建退款明细 - TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); - chargingOrderRefund.setChargingOrderId(chargingOrder.getId()); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); - chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); - chargingOrderRefund.setRefundAmount(refundAmount); - chargingOrderRefund.setRefundStatus(1); - chargingOrderRefund.setPayType(rechargePaymentType); - chargingOrderRefund.setRefundStatus(1); - chargingOrderRefund.setCode(chargingOrder.getCode()); - chargingOrderRefund.setRefundTitle("充电完成退款"); - chargingOrderRefund.setRefundContent("充电完成退款"); - chargingOrderRefund.setRefundReason("充电完成退款"); - chargingOrderRefund.setRefundRemark("充电完成退款"); - chargingOrderRefund.setRefundTotalAmount(refundAmount); - chargingOrderRefund.setPayAmount(rechargeAmount); - if(1 == rechargePaymentType){ - WxPaymentRefundModel model = new WxPaymentRefundModel(); - model.setOut_trade_no(chargingOrder.getCode()); - model.setOut_refund_no(chargingOrderRefund.getRefundCode()); - model.setReason("充电完成退款"); - model.setNotify_url("http://221.182.45.100:9000/order/t-charging-order/chargingOrderStartupFailureWxRefund"); - WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); - amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue()); - amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); - amount.setCurrency("CNY"); - model.setAmount(amount); - R<String> orderR = wxPaymentClient.refundOrderR(model); - if(200 == orderR.getCode()){ - chargingOrderRefundService.save(chargingOrderRefund); - } - } - if(2 == rechargePaymentType){ - RefundReq dto = new RefundReq(); - dto.setOutTradeNo(chargingOrder.getCode()); - dto.setOutRequestNo(chargingOrderRefund.getCode()); - dto.setRefundAmount(rechargeAmount.toString()); - dto.setRefundReason("充电完成退款"); - RefundResp resp = aliPaymentClient.refund(dto).getData(); - if(null != resp){ - SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); - AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date())); - if(success.isSuccess()){ - chargingOrderRefundService.save(chargingOrderRefund); - } - } - } - - } - } + + @@ -997,8 +1336,11 @@ @Override public TCharingOrderVO chargingOrder(ChargingOrderQuery dto) { TCharingOrderVO tCharingOrderVO = new TCharingOrderVO(); - - + List<TChargingGun> allGun = chargingGunClient.getAllGun().getData(); + List<TChargingPile> allPile = chargingGunClient.getAllPile().getData(); + List<Site> data9 = siteClient.getSiteAll().getData(); + List<TAppUser> data6 = appUserClient.getAllUser().getData(); + List<TAppUserCar> data4 = appUserCarClient.getAllCar().getData(); String startTime1 = null; String startTime2 = null; String endTime1 = null; @@ -1024,74 +1366,163 @@ } dto.setUserIds(data); } + Long userId = tokenService.getLoginUser().getUserid(); + // 查询当前登陆人按钮权限 + SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); + Integer roleType = sysUser.getRoleType(); + //如果没传siteId,获取当前登陆人所有的siteIds + List<Integer> siteIds = new ArrayList<>(); + if (dto.getSiteId()==null){ + if (userId != null){ + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + } + }else { + siteIds.add(dto.getSiteId()); + } + if (siteIds.isEmpty()){ + siteIds.add(-1); + }else{ + if (roleType == 2){ + List<Integer> integers = new ArrayList<>(); + for (Integer siteId : siteIds) { + // 校验有没有这个站点的权限 + List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData(); + + Boolean b = t1.get(1); + if (b){ + integers.add(siteId); + } + } + siteIds = integers; + } + } + if (siteIds.isEmpty())siteIds.add(-1); + dto.setSiteIds(siteIds); List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); BigDecimal total = new BigDecimal("0"); long time = 0L; - BigDecimal income = new BigDecimal("0"); BigDecimal electronicMoney = new BigDecimal("0"); BigDecimal serviceMoney = new BigDecimal("0"); - for (ChargingOrderVO chargingOrderVO : list) { - TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData(); - TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData(); - if (data2!=null && data3!=null){ - chargingOrderVO.setTerminalName(data2.getName()+"-"+data3.getName()); + BigDecimal commissionMoney = new BigDecimal("0"); +// BigDecimal refundMoney = new BigDecimal("0"); + BigDecimal paymentMoney = new BigDecimal("0"); + List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list(); - } - if (chargingOrderVO.getChargingCapacity()!=null){ - total = total.add(chargingOrderVO.getChargingCapacity()); - } - // 充电订单 明细记录 - List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>() - .eq("charging_order_id", chargingOrderVO.getId())); - // 单个订单累计电费 - BigDecimal electronicMoney1 = new BigDecimal("0"); - // 单个订单累计服务费 - BigDecimal serviceMoney1 = new BigDecimal("0"); - UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData(); - chargingOrderVO.setChargingSecond(data5.getTime_remaining()*60L); - // 总收入 - if (chargingOrderVO.getRefundStatus() !=null && chargingOrderVO.getRefundStatus() == 2){ - income = income.add(chargingOrderVO.getPaymentAmount().subtract(chargingOrderVO.getRefundAmount())); - }else{ - if (chargingOrderVO.getPaymentAmount()!=null){ - income = income.add(chargingOrderVO.getPaymentAmount()); + for (ChargingOrderVO chargingOrderVO : list) { + if (roleType == 2){ + for (Integer siteId : siteIds) { + // 校验有没有这个站点的权限 + List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData(); + chargingOrderVO.setAuthRecord(t1.get(0)); } } - for (TChargingOrderAccountingStrategy tChargingOrderAccountingStrategy : chargingOrderId) { - // 累计电费 - electronicMoney1 = electronicMoney1.add(tChargingOrderAccountingStrategy.getElectrovalence() - .multiply(tChargingOrderAccountingStrategy.getChargingCapacity())); - electronicMoney = electronicMoney.add(electronicMoney1); - // 累计服务费 - serviceMoney1 = serviceMoney1.add(tChargingOrderAccountingStrategy.getServiceCharge()); - serviceMoney = serviceMoney.add(serviceMoney1); + chargingOrderVO.setCommissionAmount(chargingOrderVO.getRechargeAmount()!=null?chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0")); + chargingOrderVO.setPlatFormMoney(chargingOrderVO.getRechargeAmount()!=null?chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN):new BigDecimal("0")); + chargingOrderVO.setUid(chargingOrderVO.getId()+""); + TChargingGun data3 = allGun.stream().filter(e->e.getId().equals(chargingOrderVO.getChargingGunId())).findFirst().orElse(null); + TChargingPile data2 = allPile.stream().filter(e->e.getId().equals(chargingOrderVO.getChargingPileId())).findFirst().orElse(null); + if (chargingOrderVO.getSiteId()!=null){ + List<Integer> integers = new ArrayList<>(); + integers.add(chargingOrderVO.getSiteId()); + Site site = data9.stream().filter(e -> e.getId().equals(chargingOrderVO.getSiteId())).findFirst().orElse(null); + if (site!=null)chargingOrderVO.setSiteName(site.getName()); } - chargingOrderVO.setServiceCharge(serviceMoney1); - chargingOrderVO.setElectrovalence(electronicMoney1); + if (data2!=null && data3!=null){ + chargingOrderVO.setTerminalName(data2.getName()+"-"+data3.getName()); + } + // 充电订单 明细记录 + List<TChargingOrderAccountingStrategy> chargingOrderId = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList()); + if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){ + LocalDateTime startTime = chargingOrderVO.getStartTime(); + LocalDateTime endTime = chargingOrderVO.getEndTime(); + // 计算时间差 单位秒 + long between = ChronoUnit.SECONDS.between(startTime, endTime); + chargingOrderVO.setChargingSecond(between); + + BigDecimal electronic_reduce = chargingOrderId.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + chargingOrderVO.setElectrovalence(electronic_reduce); + BigDecimal service_reduce = chargingOrderId.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); + if (!chargingOrderVO.getOrderSource().equals(2)){ + chargingOrderVO.setServiceCharge(service_reduce); + chargingOrderVO.setSharingAmount(BigDecimal.ZERO); + }else{ + chargingOrderVO.setServiceCharge(service_reduce.multiply(new BigDecimal("0.8"))); + chargingOrderVO.setSharingAmount(service_reduce.multiply(new BigDecimal("0.2"))); + } + } // 充电时段数 int size = chargingOrderId.size(); chargingOrderVO.setCount(size); // 用户手机号 - TAppUser data = appUserClient.getUserById(chargingOrderVO.getAppUserId()).getData(); + TAppUser data = data6.stream().filter(e -> e.getId().equals(chargingOrderVO.getAppUserId())).findFirst().orElse(null); if (data!=null){ // 车牌号 chargingOrderVO.setPhone(data.getPhone()); List<Long> longs = new ArrayList<>(); if (chargingOrderVO.getAppUserCarId()!=null){ longs.add(chargingOrderVO.getAppUserCarId()); - List<TAppUserCar> data1 = appUserCarClient.getCarByIds(longs).getData(); - if (!data1.isEmpty()){ - chargingOrderVO.setLicensePlate(data1.get(0).getLicensePlate()); + TAppUserCar tAppUserCar = data4.stream().filter(e -> e.getId().equals(chargingOrderVO.getAppUserCarId())).findFirst().orElse(null); + if (tAppUserCar!=null){ + chargingOrderVO.setLicensePlate(tAppUserCar.getLicensePlate()); } + }else{ + chargingOrderVO.setLicensePlate(chargingOrderVO.getPlateNum()); } } } - tCharingOrderVO.setTotal(total); - tCharingOrderVO.setTime(time); - tCharingOrderVO.setIncome(income); - tCharingOrderVO.setElectronicMoney(electronicMoney); - tCharingOrderVO.setServiceMoney(serviceMoney); + +// List<TChargingOrderRefund> chargingOrderRefunds = chargingOrderRefundService.lambdaQuery() +// .eq(TChargingOrderRefund::getRefundStatus,2).list(); + + + Map<String, Object> map = this.baseMapper.chargingOrderNolimit(dto,startTime1,startTime2,endTime1,endTime2); +// for (ChargingOrderVO chargingOrderVO : list1) { +// if(null == chargingOrderVO.getStatus() || 5 != chargingOrderVO.getStatus()){ +// continue; +// } +// List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList()); +// BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); +// BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); +// BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); +// electronicMoney = electronicMoney.add(electronic_reduce); +// total = total.add(chargingCapacity); +// if (!chargingOrderVO.getOrderSource().equals(2)) { +// serviceMoney = serviceMoney.add(service_reduce); +// paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce); +// }else{ +// serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8"))); +// paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8"))); +// } +// if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){ +// LocalDateTime startTime = chargingOrderVO.getStartTime(); +// LocalDateTime endTime = chargingOrderVO.getEndTime(); +// // 计算时间差 单位秒 +// long between = ChronoUnit.SECONDS.between(startTime, endTime); +// time+=between; +// } +//// List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId())) +//// .collect(Collectors.toList()); +//// for (TChargingOrderRefund tChargingOrderRefund : list2) { +//// refundMoney = refundMoney.add(tChargingOrderRefund.getRefundTotalAmount()); +//// } +// } + if(null != map){ + tCharingOrderVO.setTotal(map.get("total")==null?BigDecimal.ZERO:(BigDecimal) map.get("total")); + tCharingOrderVO.setTime(map.get("time")==null?0L:(Long) map.get("time")); + tCharingOrderVO.setIncome((map.get("paymentMoney")==null?BigDecimal.ZERO:(BigDecimal) map.get("paymentMoney")).setScale(2, BigDecimal.ROUND_HALF_EVEN)); + tCharingOrderVO.setElectronicMoney((map.get("electronicMoney")==null?BigDecimal.ZERO:(BigDecimal) map.get("electronicMoney")).setScale(2, BigDecimal.ROUND_HALF_EVEN)); + tCharingOrderVO.setServiceMoney((map.get("serviceMoney")==null?BigDecimal.ZERO:(BigDecimal) map.get("serviceMoney")).setScale(2, BigDecimal.ROUND_HALF_EVEN)); + }else{ + tCharingOrderVO.setTotal(BigDecimal.ZERO); + tCharingOrderVO.setTime(0L); + tCharingOrderVO.setIncome(BigDecimal.ZERO); + tCharingOrderVO.setElectronicMoney(BigDecimal.ZERO); + tCharingOrderVO.setServiceMoney(BigDecimal.ZERO); + } pageInfo.setRecords(list); tCharingOrderVO.setList(pageInfo); return tCharingOrderVO; @@ -1101,6 +1532,16 @@ public R<PageInfo<PayOrderDto>> payOrderQuery(PayOrderQueryDto payOrderQueryDto) { PageInfo<PayOrderDto> pageInfo = new PageInfo<>(payOrderQueryDto.getPageCurr(),payOrderQueryDto.getPageSize()); List<PayOrderDto> list = this.baseMapper.payOrderQuery(pageInfo,payOrderQueryDto); + for (PayOrderDto payOrderDto : list) { + if (payOrderDto.getType()==2||payOrderDto.getType()==3){ + payOrderDto.setFinalAmount(payOrderDto.getOrderAmount()); + } + if (payOrderDto.getType()==1&&payOrderDto.getStatus()==3){ + payOrderDto.setFinalAmount(payOrderDto.getOrderAmount()); + payOrderDto.setOrderAmount(payOrderDto.getOrderAmount()); + payOrderDto.setPaymentAmount(payOrderDto.getOrderAmount()); + } + } pageInfo.setRecords(list); return R.ok(pageInfo); } @@ -1131,41 +1572,49 @@ } @Override - public Map<String, Object> countAll(LocalDate sixBefore) { - return this.baseMapper.countAll(sixBefore); + public Map<String, Object> countAll(List<Integer> siteIds) { + return this.baseMapper.countAll(siteIds); } @Override - public List<Map<String, Object>> getSumByType(List<Long> chargingOrderIds) { - return this.baseMapper.getSumByType(chargingOrderIds); + public List<Map<String, Object>> getSumByType(LocalDate start,LocalDate end,List<Integer> siteIds) { + LocalDateTime start1 = start.atStartOfDay(); + LocalDateTime end1 = end.atTime(LocalTime.MAX); + return this.baseMapper.getSumByType(start1,end1, siteIds); } @Override - public List<Map<String, Object>> getDateData(List<Long> chargingOrderIds) { - return this.baseMapper.getDateData(chargingOrderIds); + public List<Map<String, Object>> getDateData(LocalDate start,LocalDate end,List<Integer> siteIds) { + LocalDateTime start1 = start.atStartOfDay(); + LocalDateTime end1 = end.atTime(LocalTime.MAX); + return this.baseMapper.getDateData(start1,end1, siteIds); } @Override - public List<Map<String, Object>> getWeekData(List<Long> chargingOrderIds) { - return this.baseMapper.getWeekData(chargingOrderIds); + public List<Map<String, Object>> getWeekData(LocalDate start,LocalDate end,List<Integer> siteIds) { + LocalDateTime start1 = start.atStartOfDay(); + LocalDateTime end1 = end.atTime(LocalTime.MAX); + return this.baseMapper.getWeekData(start1,end1,siteIds); } @Override - public List<Map<String, Object>> getMonthData(List<Long> chargingOrderIds) { - return this.baseMapper.getMonthData(chargingOrderIds); + public List<Map<String, Object>> getMonthData(LocalDate start,LocalDate end,List<Integer> siteIds) { + LocalDateTime start1 = start.atStartOfDay(); + LocalDateTime end1 = end.atTime(LocalTime.MAX); + return this.baseMapper.getMonthData(start1,end1,siteIds); } @Override - public List<Map<String, Object>> getYearData(List<Long> chargingOrderIds) { - return this.baseMapper.getYearData(chargingOrderIds); + public List<Map<String, Object>> getYearData(LocalDate start,LocalDate end,List<Integer> siteIds) { + LocalDateTime start1 = start.atStartOfDay(); + LocalDateTime end1 = end.atTime(LocalTime.MAX); + return this.baseMapper.getYearData(start1,end1,siteIds); } + @Resource private SysUserClient sysUserClient; - @Resource - private UserSiteClient userSiteClient; - @Resource - private RoleSiteClient roleSiteClient; + @Override public ChargingOrderTimeVO chargingList(ChargingListQuery dto) { String startTime1 = null; @@ -1173,45 +1622,135 @@ String endTime1 = null; String endTime2 = null; + List<TChargingGun> allGun = chargingGunClient.getAllGun().getData(); + List<TChargingPile> allPile = chargingGunClient.getAllPile().getData(); + if (StringUtils.hasLength(dto.getStartTime())){ String[] split = dto.getStartTime().split(" - "); startTime1 = split[0]; startTime2 = split[1]; } ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO(); + if (StringUtils.hasLength(dto.getPhone())){ + List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); + if(data!=null){ + if (!data.isEmpty()){ + dto.setUserIds(data); + } + }else{ + dto.setUserIds(new ArrayList<Long>()); + } + if (dto.getUserIds().isEmpty()){ + List<Long> carIds = dto.getUserIds(); + carIds.add(-1L); + dto.setUserIds(carIds); + } + } + if (StringUtils.hasLength(dto.getLicensePlate())){ + List<Long> data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData(); + if(data!=null){ + if (!data.isEmpty()){ + dto.setCarIds(data); + } + }else{ + dto.setCarIds(new ArrayList<Long>()); + } + if (dto.getCarIds().isEmpty()){ + List<Long> carIds = dto.getCarIds(); + carIds.add(-1L); + dto.setCarIds(carIds); + } + } + Long userId = tokenService.getLoginUser().getUserid(); + // 查询当前登陆人按钮权限 + SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); + Integer roleType = sysUser.getRoleType(); + //如果没传siteId,获取当前登陆人所有的siteIds + List<Integer> siteIds = new ArrayList<>(); + if (dto.getSiteId()==null){ + if (userId != null){ + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + } + }else { + siteIds.add(dto.getSiteId()); + } + if (siteIds.isEmpty()){ + siteIds.add(-1); + }else{ + if (roleType == 2){ + List<Integer> integers = new ArrayList<>(); + for (Integer siteId : siteIds) { + // 校验有没有这个站点的权限 + List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData(); + Boolean b = t1.get(1); + if (b){ + integers.add(siteId); + } + } + siteIds = integers; + } + } + dto.setSiteIds(siteIds); PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); + List<Integer> siteIdsList = list.stream().map(ChargingOrderListVO::getSiteId).collect(Collectors.toList()); + if (siteIdsList.isEmpty())siteIdsList.add(-1); + List<Site> sites = siteClient.getSiteByIds(siteIdsList).getData(); + for (ChargingOrderListVO chargingOrderListVO : list) { + if (roleType==2){ + List<Boolean> data = partnerClient.getChargingListMenu(sysUser.getObjectId(), chargingOrderListVO.getSiteId()).getData(); + chargingOrderListVO.setAuthInfo(data.get(0)); + chargingOrderListVO.setAuthCurve(data.get(1)); + } + chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity()); + BigDecimal bigDecimal = new BigDecimal("0.006"); + if (chargingOrderListVO.getOrderAmount()!=null){ + chargingOrderListVO.setCommissionAmount(chargingOrderListVO.getRechargeAmount().multiply(bigDecimal)); + } + chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getPaymentAmount()); chargingOrderListVO.setUid(chargingOrderListVO.getId()+""); List<Integer> integers = new ArrayList<>(); integers.add(chargingOrderListVO.getSiteId()); - List<Site> data = siteClient.getSiteByIds(integers).getData(); - if (!data.isEmpty()) { - chargingOrderListVO.setSiteName(data.get(0).getName()); + Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null); + if (site!=null){ + chargingOrderListVO.setSiteName(site.getName()); } if (chargingOrderListVO.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){ - TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData(); - TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderListVO.getChargingPileId()).getData(); + TChargingGun data1 = allGun.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingGunId())).findFirst().orElse(null); + TChargingPile data2 = allPile.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingPileId())).findFirst().orElse(null); if (data2 != null && data1 != null) { chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName()); } } - // 获取充电时间 - UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderListVO.getCode()).getData(); - if (data5!=null){ - if (data5.getTime_remaining()!=null){ - chargingOrderListVO.setChargingSecond(data5.getTime_remaining()*60L); - - } + if (chargingOrderListVO.getStartTime()!=null && chargingOrderListVO.getEndTime()!=null){ + LocalDateTime startTime = chargingOrderListVO.getStartTime(); + LocalDateTime endTime = chargingOrderListVO.getEndTime(); + // 计算时间差 单位秒 + long between = ChronoUnit.SECONDS.between(startTime, endTime); + chargingOrderListVO.setChargingSecond(between); } // 获取开始SOC 结束soc if (chargingOrderListVO.getCode()!=null){ List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrderListVO.getCode()).getData(); - if (!data6.isEmpty()){ - // 第一条数据soc为开始 最后一条数据soc为结束soc - chargingOrderListVO.setStartSoc(data6.get(0).getSoc().toString()); - chargingOrderListVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString()); + + if (data6!=null && !data6.isEmpty()){ + int min = 100; + int max = 0; + for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) { + if (uploadRealTimeMonitoringData.getSoc()>max){ + max = uploadRealTimeMonitoringData.getSoc(); + } + if (uploadRealTimeMonitoringData.getSoc()!=0 &&uploadRealTimeMonitoringData.getSoc()<min){ + min = uploadRealTimeMonitoringData.getSoc(); + } + } + chargingOrderListVO.setEndSoc(max+""); + chargingOrderListVO.setStartSoc(min+""); } } @@ -1223,11 +1762,14 @@ carId.add(chargingOrderListVO.getAppUserCarId()); if (!carId.isEmpty()){ List<TAppUserCar> data4 = appUserCarClient.getCarByIds(carId).getData(); - if (data4!=null && !data4.isEmpty()) chargingOrderListVO.setLicensePlate(data4.get(0).getLicensePlate()); + if (data4!=null && !data4.isEmpty()) { + chargingOrderListVO.setLicensePlate(data4.get(0).getLicensePlate()); + } } + }else{ + chargingOrderListVO.setLicensePlate(chargingOrderListVO.getPlateNum()); } - if (data3 != null) chargingOrderListVO.setPhone(data3.getPhone()); - + chargingOrderListVO.setPhone(data3.getPhone()); } } List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery() @@ -1239,6 +1781,9 @@ BigDecimal gu = new BigDecimal("0"); BigDecimal total = new BigDecimal("0"); for (TChargingOrderAccountingStrategy temp : list2) { + if (temp.getChargingCapacity() == null){ + temp.setChargingCapacity(BigDecimal.ZERO); + } switch (temp.getType()) { case 1: jian = jian.add(temp.getChargingCapacity()); @@ -1268,11 +1813,39 @@ "0"+"%(平)/"+ "0"+"%(谷)"); } - + if (chargingOrderListVO.getOrderSource().equals(2)){ + chargingOrderListVO.setSharingAmount(chargingOrderListVO.getServiceCharge()!=null? + chargingOrderListVO.getServiceCharge().multiply(new BigDecimal("0.2")).setScale(2,BigDecimal.ROUND_HALF_UP) + :new BigDecimal("0")); + }else{ + chargingOrderListVO.setSharingAmount(new BigDecimal("0")); + } } // 不分页 PageInfo<ChargingOrderListVO> pageInfo1 = new PageInfo<>(1,999999999); List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(pageInfo1,dto,startTime1,startTime2,endTime1,endTime2); + for (ChargingOrderListVO chargingOrderListVO : list1) { + List<Integer> integers = new ArrayList<>(); + integers.add(chargingOrderListVO.getSiteId()); + Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null); + if (site!=null){ + chargingOrderListVO.setSiteName(site.getName()); + } + if (chargingOrderListVO.getStartTime()!=null && chargingOrderListVO.getEndTime()!=null){ + LocalDateTime startTime = chargingOrderListVO.getStartTime(); + LocalDateTime endTime = chargingOrderListVO.getEndTime(); + // 计算时间差 单位秒 + long between = ChronoUnit.SECONDS.between(startTime, endTime); + chargingOrderListVO.setChargingSecond(between); + } + if (chargingOrderListVO.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){ + TChargingGun data1 = allGun.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingGunId())).findFirst().orElse(null); + TChargingPile data2 = allPile.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingPileId())).findFirst().orElse(null); + if (data2 != null && data1 != null) { + chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName()); + } + } + } chargingOrderTimeVO.setExportList(list1); chargingOrderTimeVO.setOrderCount(list1.size()); // 计算充电总度数 @@ -1298,66 +1871,105 @@ BigDecimal feng = new BigDecimal("0"); BigDecimal ping = new BigDecimal("0"); BigDecimal gu = new BigDecimal("0"); + List<TChargingOrderAccountingStrategy> chargingOrderAccountingStrategies = chargingOrderAccountingStrategyService.list(); for (ChargingOrderListVO chargingOrderListVO : list1) { - if (chargingOrderListVO.getChargingCapacity()!=null)electronic = electronic.add(chargingOrderListVO.getChargingCapacity()); - - if (chargingOrderListVO.getPaymentAmount()!=null)paymentAmount = paymentAmount.add(chargingOrderListVO.getPaymentAmount()); - if (chargingOrderListVO.getElectrovalence()!=null)electrovalence = electrovalence.add(chargingOrderListVO.getElectrovalence()); - if (chargingOrderListVO.getServiceCharge()!=null)serviceCharge = serviceCharge.add(chargingOrderListVO.getServiceCharge()); - List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery() - .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list(); - for (TChargingOrderAccountingStrategy temp : list2) { - switch (temp.getType()){ - case 1: - if (temp.getChargingCapacity()!=null)jian = jian.add(temp.getChargingCapacity()); - if (temp.getChargingCapacity()!=null)jianElectronic = jianElectronic.add(temp.getElectrovalence()); - if (temp.getChargingCapacity()!=null)jianService = jianService.add(temp.getServiceCharge()); - break; - case 2: - if (temp.getChargingCapacity()!=null)feng = feng.add(temp.getChargingCapacity()); - if (temp.getChargingCapacity()!=null)fengElectronic = fengElectronic.add(temp.getElectrovalence()); - if (temp.getChargingCapacity()!=null)fengService = fengService.add(temp.getServiceCharge()); - break; - case 3: - if (temp.getChargingCapacity()!=null)ping = ping.add(temp.getChargingCapacity()); - if (temp.getChargingCapacity()!=null)pingElectronic = pingElectronic.add(temp.getElectrovalence()); - if (temp.getChargingCapacity()!=null)pingService = pingService.add(temp.getServiceCharge()); - break; - case 4: - if (temp.getChargingCapacity()!=null)gu = gu.add(temp.getChargingCapacity()); - if (temp.getChargingCapacity()!=null)guElectronic = guElectronic.add(temp.getElectrovalence()); - if (temp.getChargingCapacity()!=null)guService = guService.add(temp.getServiceCharge()); - break; + List<TChargingOrderAccountingStrategy> collect = chargingOrderAccountingStrategies.stream().filter(s -> s.getChargingOrderId().equals(chargingOrderListVO.getId())).collect(Collectors.toList()); + BigDecimal periodServicePrice = collect.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal periodElectricPrice = collect.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal chargingCapacity = collect.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); + electronic = electronic.add(chargingCapacity); + electrovalence = electrovalence.add(periodElectricPrice); + if (chargingOrderListVO.getOrderSource().equals(2)){ + serviceCharge = serviceCharge.add(periodServicePrice.multiply(new BigDecimal("0.8"))); + paymentAmount = paymentAmount.add(periodElectricPrice).add(periodServicePrice.multiply(new BigDecimal("0.8"))); + }else{ + serviceCharge = serviceCharge.add(periodServicePrice); + paymentAmount = paymentAmount.add(periodElectricPrice).add(periodServicePrice); + } + if (!chargingOrderListVO.getOrderSource().equals(2)){ + List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId())) + .collect(Collectors.toList()); + for (TChargingOrderAccountingStrategy temp : list2) { + switch (temp.getType()){ + case 1: + jian = jian.add(temp.getChargingCapacity()); + jianElectronic = jianElectronic.add(temp.getPeriodElectricPrice()).add(temp.getPeriodServicePrice()); + jianService = jianService.add(temp.getPeriodServicePrice()); + break; + case 2: + feng = feng.add(temp.getChargingCapacity()); + fengElectronic = fengElectronic.add(temp.getPeriodElectricPrice()).add(temp.getPeriodServicePrice()); + fengService = fengService.add(temp.getPeriodServicePrice()); + break; + case 3: + ping = ping.add(temp.getChargingCapacity()); + pingElectronic = pingElectronic.add(temp.getPeriodElectricPrice()).add(temp.getPeriodServicePrice()); + pingService = pingService.add(temp.getPeriodServicePrice()); + break; + case 4: + gu = gu.add(temp.getChargingCapacity()); + guElectronic = guElectronic.add(temp.getPeriodElectricPrice()).add(temp.getPeriodServicePrice()); + guService = guService.add(temp.getPeriodServicePrice()); + break; + } + } + }else{ + List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId())) + .collect(Collectors.toList()); + for (TChargingOrderAccountingStrategy temp : list2) { + BigDecimal multiply = temp.getPeriodServicePrice().multiply(new BigDecimal("0.8")); + switch (temp.getType()){ + case 1: + jian = jian.add(temp.getChargingCapacity()); + jianElectronic = jianElectronic.add(temp.getPeriodElectricPrice()).add(multiply); + jianService = jianService.add(multiply); + break; + case 2: + feng = feng.add(temp.getChargingCapacity()); + fengElectronic = fengElectronic.add(temp.getPeriodElectricPrice()).add(multiply); + fengService = fengService.add(multiply); + break; + case 3: + ping = ping.add(temp.getChargingCapacity()); + pingElectronic = pingElectronic.add(temp.getPeriodElectricPrice()).add(multiply); + pingService = pingService.add(multiply); + break; + case 4: + gu = gu.add(temp.getChargingCapacity()); + guElectronic = guElectronic.add(temp.getPeriodElectricPrice()).add(multiply); + guService = guService.add(multiply); + break; + } } } } - chargingOrderTimeVO.setChargingCapacity(electronic); - chargingOrderTimeVO.setPaymentAmount(paymentAmount); - chargingOrderTimeVO.setElectrovalence(electrovalence); - chargingOrderTimeVO.setServiceCharge(serviceCharge); - // 计算尖峰平谷充电量占比 + chargingOrderTimeVO.setChargingCapacity(electronic.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + chargingOrderTimeVO.setPaymentAmount(paymentAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + chargingOrderTimeVO.setElectrovalence(electrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + chargingOrderTimeVO.setServiceCharge(serviceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + // 计算尖峰平谷充电到账占比 BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic); // 计算尖峰平谷服务费占比 BigDecimal add1 = jianService.add(fengService).add(pingService).add(guService); - // 计算尖峰平谷充电到账占比 + // 计算尖峰平谷充电量占比 BigDecimal add2 = jian.add(feng).add(ping).add(gu); if (add.compareTo(new BigDecimal("0"))!=0){ - chargingOrderTimeVO.setCapacityProportion(jianElectronic+"度/"+fengElectronic+"度/"+pingElectronic+"度/"+guElectronic+"度-" - +jianElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" - +fengElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" - +pingElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" - +guElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); + chargingOrderTimeVO.setCapacityProportion(jian+"度/"+feng+"度/"+ping+"度/"+gu+"度-" + +jian.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" + +feng.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" + +ping.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" + +gu.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); chargingOrderTimeVO.setServiceProportion(jianService+"元/"+fengService+"元/"+pingService+"元/"+guService+"元-" +jianService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +fengService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +pingService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +guService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); - chargingOrderTimeVO.setElectronicProportion(jian+"元/"+feng+"元/"+ping+"元/"+gu+"元-" - +jian.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" - +feng.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" - +ping.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" - +gu.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); + chargingOrderTimeVO.setElectronicProportion(jianElectronic+"元/"+fengElectronic+"元/"+pingElectronic+"元/"+guElectronic+"元-" + +jianElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" + +fengElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" + +pingElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" + +guElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); }else{ chargingOrderTimeVO.setCapacityProportion(jianElectronic+"度/"+fengElectronic+"度/"+pingElectronic+"度/"+guElectronic+"度-" +"0"+"%/" @@ -1380,16 +1992,21 @@ return chargingOrderTimeVO; } -// @Override -// public R payRefund(PayOrderRefundDto payOrderQueryDto) { -// return null; -// } + + @Override public ChargingOrderListInfoVO chargingInfo(String uid) { TChargingOrder chargingOrder= this.getById(uid); - ChargingOrderListInfoVO chargingOrderListInfoVO = new ChargingOrderListInfoVO(); + chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime()); + chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime()); + chargingOrderListInfoVO.setStatus(chargingOrder.getStatus()); + BigDecimal bigDecimal = new BigDecimal("0.006"); + if (chargingOrder.getOrderAmount()!=null){ + BigDecimal multiply = chargingOrder.getPaymentAmount().multiply(bigDecimal); + chargingOrderListInfoVO.setCommissionAmount(multiply.setScale(2, BigDecimal.ROUND_HALF_UP)); + } chargingOrderListInfoVO.setElectrovalence(chargingOrder.getElectrovalence()); chargingOrderListInfoVO.setServiceCharge(chargingOrder.getServiceCharge()); if (chargingOrder.getElectrovalence()!=null && chargingOrder.getServiceCharge()!=null){ @@ -1422,6 +2039,7 @@ } } } + chargingOrderListInfoVO.setChargingCapacity(chargingOrder.getChargingCapacity()); chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode()); @@ -1429,25 +2047,51 @@ if (chargingOrder.getCode()!=null){ List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData(); if (data6!=null){ + for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) { + if (uploadRealTimeMonitoringData.getOutput_current()!=null&& + uploadRealTimeMonitoringData.getOutput_voltage()!=null){ + uploadRealTimeMonitoringData.setPower(uploadRealTimeMonitoringData.getOutput_voltage() + .multiply(uploadRealTimeMonitoringData.getOutput_current()).divide(new BigDecimal(1000),2, BigDecimal.ROUND_HALF_UP)); + } + } if (!data6.isEmpty()){ - // 第一条数据soc为开始 最后一条数据soc为结束soc - chargingOrderListInfoVO.setStartSoc(data6.get(0).getSoc().toString()); - chargingOrderListInfoVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString()); - chargingOrderListInfoVO.setChargingCapacity(data6.get(data6.size()-1).getCharging_degree()); - chargingOrderListInfoVO.setChargingSecond(data6.get(data6.size()-1).getCumulative_charging_time()*60+""); + int min = 100; + int max = 0; + for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) { + if (uploadRealTimeMonitoringData.getSoc()>max){ + max = uploadRealTimeMonitoringData.getSoc(); + } + if (uploadRealTimeMonitoringData.getSoc()!=0 &&uploadRealTimeMonitoringData.getSoc()<min){ + min = uploadRealTimeMonitoringData.getSoc(); + } + } + chargingOrderListInfoVO.setEndSoc(max+""); + chargingOrderListInfoVO.setStartSoc(min+""); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) { uploadRealTimeMonitoringData.setCreateTime(simpleDateFormat.format(uploadRealTimeMonitoringData.getCreate_time())); } } } + chargingOrderListInfoVO.setList(data6); } - + if (chargingOrderListInfoVO.getStartTime()!=null && chargingOrderListInfoVO.getEndTime()!=null){ + LocalDateTime startTime = chargingOrderListInfoVO.getStartTime(); + LocalDateTime endTime = chargingOrderListInfoVO.getEndTime(); + // 计算时间差 单位秒 + long between = ChronoUnit.SECONDS.between(startTime, endTime); + chargingOrderListInfoVO.setChargingSecond(between+""); + } if (chargingOrder.getAppUserCarId()!=null){ List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(chargingOrder.getAppUserCarId())).getData(); - if (data3!=null && !data3.isEmpty())chargingOrderListInfoVO.setLicensePlate(data3.get(0).getLicensePlate()); + if (data3!=null && !data3.isEmpty()) { + chargingOrderListInfoVO.setLicensePlate(data3.get(0).getLicensePlate()); + } + }else{ + chargingOrderListInfoVO.setLicensePlate(chargingOrder.getPlateNum()); } chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime()); chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime()); @@ -1455,8 +2099,12 @@ chargingOrderListInfoVO.setUid(chargingOrder.getId().toString()); chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount()); chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount()); - chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount()); - chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getCommissionAmount()); + if (chargingOrder.getOrderSource().equals(2)){ + chargingOrderListInfoVO.setSharingAmount(chargingOrder.getServiceCharge().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)); + }else{ + chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount()); + + } // 查询费用明细列表 List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()) @@ -1471,96 +2119,36 @@ * @param query */ @Override + @GlobalTransactional(rollbackFor = Exception.class) public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) { - if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getCharging_gun_code())){ + if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())){ //获取当前的计费策略 - TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getCharging_gun_code())); - AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); - TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = chargingOrderAccountingStrategyService.getOne(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>() - .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()).orderByDesc(TChargingOrderAccountingStrategy::getCreateTime).last(" limit 0, 1")); - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); - if(null == chargingOrderAccountingStrategy){ - chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy(); - chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId()); - chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId()); - chargingOrderAccountingStrategy.setType(strategyDetail.getType()); - chargingOrderAccountingStrategy.setStartTime(sdf.format(chargingOrder.getStartTime())); - chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date())); - chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence()); - chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge()); - chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge()); - BigDecimal charging_degree = query.getCharging_degree(); - BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree); - BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree); - BigDecimal serviceCharge = originalServicePrice; - //计算优惠金额 - if(null != chargingOrder.getVipDiscount()){ - serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); - } - chargingOrderAccountingStrategy.setChargingCapacity(charging_degree); - chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc); - chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge); - chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice); - chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); - chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy); - }else{ - if(chargingOrderAccountingStrategy.getAccountingStrategyDetailId().equals(strategyDetail.getId())){ - BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice(); - BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice(); - BigDecimal periodOriginalServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice(); - BigDecimal charging_degree = query.getCharging_degree(); - BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree); - BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree); - BigDecimal serviceCharge = originalServicePrice; - //计算优惠金额 - if(null != chargingOrder.getVipDiscount()){ - serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); - } - periodServicePrice = periodServicePrice.add(serviceCharge); - periodOriginalServicePrice = periodOriginalServicePrice.add(originalServicePrice); - periodElectricPrice = periodElectricPrice.add(electrovalenc); - chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice); - chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(periodOriginalServicePrice); - chargingOrderAccountingStrategy.setPeriodElectricPrice(periodElectricPrice); - chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date())); - chargingOrderAccountingStrategyService.updateById(chargingOrderAccountingStrategy); - }else{ - TChargingOrderAccountingStrategy chargingOrderAccountingStrategy1 = new TChargingOrderAccountingStrategy(); - chargingOrderAccountingStrategy1.setChargingOrderId(chargingOrder.getId()); - chargingOrderAccountingStrategy1.setAccountingStrategyDetailId(strategyDetail.getId()); - chargingOrderAccountingStrategy1.setType(strategyDetail.getType()); - chargingOrderAccountingStrategy1.setStartTime(sdf.format(chargingOrderAccountingStrategy.getEndTime())); - chargingOrderAccountingStrategy1.setEndTime(sdf.format(new Date())); - chargingOrderAccountingStrategy1.setElectrovalence(strategyDetail.getElectrovalence()); - chargingOrderAccountingStrategy1.setServiceCharge(strategyDetail.getServiceCharge()); - chargingOrderAccountingStrategy1.setCostServiceCharge(strategyDetail.getCostServiceCharge()); - BigDecimal charging_degree = query.getCharging_degree(); - BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree); - BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree); - BigDecimal serviceCharge = originalServicePrice; - //计算优惠金额 - if(null != chargingOrder.getVipDiscount()){ - serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); - } - chargingOrderAccountingStrategy1.setChargingCapacity(charging_degree); - chargingOrderAccountingStrategy1.setPeriodElectricPrice(electrovalenc); - chargingOrderAccountingStrategy1.setPeriodOriginalServicePrice(originalServicePrice); - chargingOrderAccountingStrategy1.setPeriodServicePrice(serviceCharge); - chargingOrderAccountingStrategy1.setCreateTime(LocalDateTime.now()); - chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy1); - } - } - - List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>() - .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); - BigDecimal t = BigDecimal.ZERO; - for (TChargingOrderAccountingStrategy coas : list) { - t = t.add(coas.getPeriodServicePrice()).add(coas.getPeriodElectricPrice()); - } - BigDecimal residualAmount = chargingOrder.getRechargeAmount().subtract(t).setScale(2, RoundingMode.HALF_EVEN); + TChargingOrder chargingOrder1 = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getTransaction_serial_number())); + BigDecimal residualAmount = chargingOrder1.getRechargeAmount().add(chargingOrder1.getVipDiscountAmount()).subtract(query.getPaid_amount()); + TChargingOrder chargingOrder = new TChargingOrder(); + chargingOrder.setId(chargingOrder1.getId()); + chargingOrder.setAppUserId(chargingOrder1.getAppUserId()); chargingOrder.setResidualAmount(residualAmount); - BigDecimal divide = query.getOutput_current().multiply(query.getOutput_voltage()).divide(new BigDecimal(1000)); - chargingOrder.setChargingPower(divide); + if(query.getOutput_current().compareTo(BigDecimal.ZERO) != 0){ + BigDecimal divide = (query.getOutput_current().multiply(query.getOutput_voltage())).divide(new BigDecimal(1000)); + chargingOrder.setChargingPower(divide); + chargingOrder.setCurrent(query.getOutput_current()); + chargingOrder.setVoltage(query.getOutput_voltage()); + chargingOrder.setPower(divide); + chargingOrder.setNeedElec(query.getOutput_current()); + + TChargingGun chargingGun = new TChargingGun(); + chargingGun.setId(chargingOrder1.getChargingGunId()); + chargingGun.setChargingPower(divide); + chargingGunClient.updateChargingGunById(chargingGun); + } + chargingOrder.setChargingCapacity(query.getCharging_degree()); + chargingOrder.setElectricity(query.getCharging_degree()); + chargingOrder.setTotalElectricity(new BigDecimal(100 - query.getSoc())); + BmsDemandAndChargerExportation data = bmsDemandAndChargerExportationClient.getBmsDemandAndChargerExportation(chargingOrder1.getCode()).getData(); + if(null != data){ + chargingOrder.setNeedElec(data.getBms_current_requirements()); + } this.updateById(chargingOrder); } } @@ -1573,56 +2161,12 @@ @Override @GlobalTransactional(rollbackFor = Exception.class) public void endCharge(String orderCode, Integer endMode) { - TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode)); - Integer status = chargingOrder.getStatus(); - if(status == 4 || status == 5){ - return; - } - chargingOrder.setStatus(5); + TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode)); + TChargingOrder chargingOrder = new TChargingOrder(); + chargingOrder.setId(order.getId()); + chargingOrder.setAppUserId(order.getAppUserId()); chargingOrder.setEndMode(endMode); this.updateById(chargingOrder); - - //计算费用,处理退款 - endCharge(chargingOrder); - - //处理推荐奖励(被推荐首单奖励) - TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); - long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) - .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0)); - if(null != appUser.getInviteUserId() && 1 == count){ - TIntegralRule integralRule = integralRuleClient.getSet().getData(); - String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints(); - JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints); - Integer num1 = jsonObject.getInteger("num1"); - GetInviteUser query = new GetInviteUser(); - query.setAppUserId(appUser.getInviteUserId()); - query.setBeInvitedAppUserId(chargingOrder.getAppUserId()); - TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData(); - if(null == inviteUser){ - inviteUser = new TInviteUser(); - inviteUser.setAppUserId(appUser.getInviteUserId()); - inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId()); - inviteUser.setAward(num1); - inviteUser.setCreateTime(LocalDateTime.now()); - inviteUserClient.saveInviteUser(inviteUser); - }else{ - inviteUser.setAward(num1); - inviteUserClient.updateInviteUser(inviteUser); - } - TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData(); - TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); - String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); - appUserIntegralChange.setCode(code); - appUserIntegralChange.setAppUserId(appUser.getInviteUserId()); - appUserIntegralChange.setChangeType(5); - appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints()); - appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1); - appUserIntegralChange.setCreateTime(LocalDateTime.now()); - appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); - - appUser1.setPoints(appUser1.getPoints() + num1); - appUserClient.updateAppUser(appUser1); - } } /** @@ -1633,10 +2177,496 @@ public void excelEndCharge(String orderCode) { endCharge(orderCode, 0); } - + + + /** + * 停止充电返回账单后计算费用 + * @param vo + */ @Override - public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) { - return this.baseMapper.getByDate(chargingOrderIds); + @GlobalTransactional(rollbackFor = Exception.class) + public R endChargeBillingCharge(TransactionRecordMessageVO vo) { + TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number())); + if(null == chargingOrder){ + return R.ok(); + } + Integer status = chargingOrder.getStatus(); + if(status == 5){ + return R.ok(); + } + + //如果使用优惠券需要判断优惠券是否满足使用条件 + //退款金额=优惠券金额+剩余充电金额 + BigDecimal periodElectricPrice_total = BigDecimal.ZERO; + BigDecimal periodServicePrice_total = BigDecimal.ZERO; + BigDecimal vipDiscountAmount_total = BigDecimal.ZERO; + BigDecimal serviceCharge_total = BigDecimal.ZERO; + BigDecimal total = BigDecimal.ZERO; + + //获取订单的计费策略 + List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); + accountingStrategyDetailOrderList.get(accountingStrategyDetailOrderList.size() - 1).setEndTime("23:59"); + //开始处理计费明细数据和优惠数据 + chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); + SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>(); + try { + //跨天 + if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){ + //当天的 + //开始通过计费策略遍历解析每个时段的费用明细 + String start_time = vo.getStart_time(); + String end_time = vo.getEnd_time(); + long start = sdfs.parse(start_time).getTime(); + long end = sdfs.parse(end_time).getTime(); + Class<? extends TransactionRecordMessageVO> clazz = vo.getClass(); + /** + * "start_time": "2025-01-03 23:06:43.00", + * "end_time": "2025-01-04 00:39:39.00", + */ + for (int i = accountingStrategyDetailOrderList.size(); i > 0; i--) { + AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i - 1); + long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime(); + if(time < start){ + break; + } + //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) + Object invoke = null; + switch (strategyDetail.getType()){ + case 1: + //充电度数 + invoke = clazz.getMethod("getSpike_charge" + (i)).invoke(vo); + break; + case 2: + //充电度数 + invoke = clazz.getMethod("getPeak_charge" + (i)).invoke(vo); + break; + case 3: + //充电度数 + invoke = clazz.getMethod("getFlat_charge" + (i)).invoke(vo); + break; + case 4: + //充电度数 + invoke = clazz.getMethod("getValley_charge" + (i)).invoke(vo); + break; + } + if(null == invoke || Double.valueOf(invoke.toString()) == 0){ + continue; + } + BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); + AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); + BeanUtils.copyProperties(strategyDetail, vo1); + vo1.setChargingCapacity(sharp_peak_charge); + lists.add(0, vo1); + } + + //第二天的 + //开始通过计费策略遍历解析每个时段的费用明细 + for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { + AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i); + long time = sdfs.parse(end_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime(); + if(time > end){ + break; + } + //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) + Object invoke = null; + switch (strategyDetail.getType()){ + case 1: + //充电度数 + invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo); + break; + case 2: + //充电度数 + invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo); + break; + case 3: + //充电度数 + invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo); + break; + case 4: + //充电度数 + invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo); + break; + } + if(null == invoke || Double.valueOf(invoke.toString()) == 0){ + continue; + } + BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); + AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); + BeanUtils.copyProperties(strategyDetail, vo1); + vo1.setChargingCapacity(sharp_peak_charge); + lists.add(vo1); + } + }else{ + for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { + Class<? extends TransactionRecordMessageVO> clazz = vo.getClass(); + AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i); + //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) + Object invoke = null; + switch (strategyDetail.getType()){ + case 1: + //充电度数 + invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo); + break; + case 2: + //充电度数 + invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo); + break; + case 3: + //充电度数 + invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo); + break; + case 4: + //充电度数 + invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo); + break; + } + if(null == invoke || Double.valueOf(invoke.toString()) == 0){ + continue; + } + BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); + AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); + BeanUtils.copyProperties(strategyDetail, vo1); + vo1.setChargingCapacity(sharp_peak_charge); + lists.add(vo1); + } + } + }catch (Exception e){ + e.printStackTrace(); + R.fail("处理失败"); + } + + //开始处理明细 + for (int i = 0; i < lists.size(); i++) { + AccountingStrategyDetailOrderVo strategyDetail = lists.get(i); + BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity(); + TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy(); + chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId()); + chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId()); + chargingOrderAccountingStrategy.setType(strategyDetail.getType()); + chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence()); + chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge()); + chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge()); + if(i == 0){ + String time = vo.getStart_time().split(" ")[1]; + chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":"))); + }else{ + chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime()); + } + if(i == lists.size() - 1){ + String time = vo.getEnd_time().split(" ")[1]; + chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":"))); + }else{ + chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime()); + } + + //已充电总度数 + BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge); + BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge); + BigDecimal serviceCharge = originalServicePrice; + BigDecimal vipDiscountAmount = BigDecimal.ZERO; + //计算优惠金额 + if(null != chargingOrder.getVipDiscount()){ + //0.58折 + vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount())); + serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount()); + } + chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge); + chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN)); + chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN)); + chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN)); + chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN)); + chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); + chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy); + //电费 + periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc); + //服务费(含折扣) + serviceCharge_total = serviceCharge_total.add(serviceCharge); + //服务费(不含折扣) + periodServicePrice_total = periodServicePrice_total.add(originalServicePrice); + //会员折扣优惠金额 + vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount); + //原始总金额(不含折扣) + total = total.add(electrovalenc.add(originalServicePrice)); + } + + BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue()); + //原金额 + BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); + //支付金额 + BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total); + //退款金额=充值金额-实际支付金额 + BigDecimal refundAmount = rechargeAmount.subtract(payAmount); + + TChargingOrder order = new TChargingOrder(); + order.setId(chargingOrder.getId()); + order.setAppUserId(chargingOrder.getAppUserId()); + UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData(); + if(null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()){ + Integer soc = uploadRealTimeMonitoringData.getSoc(); + if(soc >= 98){ + order.setEndMode(2); + }else if(chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0){ + order.setEndMode(3); + }else{ + order.setEndMode(0); + } + } + order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN)); + order.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))); + order.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))); + order.setStatus(5); + order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN)); + order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN)); + order.setChargingCapacity(vo.getTotal_electricity()); + order.setElectricity(vo.getTotal_electricity()); + order.setVipDiscountAmount(vipDiscountAmount_total); + if(vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0){ + order.setVipDiscount(BigDecimal.valueOf(1)); + } + + //计算优惠券 + BigDecimal couponDiscount = BigDecimal.ZERO; + if(null != chargingOrder.getAppCouponId()){ + //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。 + TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData(); + String couponJson = appCoupon.getCouponJson(); + TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class); + Integer preferentialMode = tCoupon.getPreferentialMode(); + if(1 == preferentialMode){ + //满减 + if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){ + BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount(); + //如果优惠金额大于服务费金额,以服务费作为最大限制 + if(serviceCharge_total.compareTo(couponDiscountAmount) < 0){ + couponDiscount = serviceCharge_total; + serviceCharge_total = BigDecimal.ZERO; + }else{ + couponDiscount = couponDiscountAmount; + } + appCoupon.setStatus(2); + appCouponClient.updateAppCoupon(appCoupon); + }else{ + order.setAppCouponId(null); + order.setCouponDiscountAmount(BigDecimal.ZERO); + appCouponClient.refund(chargingOrder.getAppCouponId().toString()); + } + } + if(2 == preferentialMode){ + //抵扣 + if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){ + //折扣金额 + BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10)); + divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide; + //如果优惠金额大于服务费金额,以服务费作为最大限制 + if(serviceCharge_total.compareTo(divide) < 0){ + couponDiscount = serviceCharge_total; + serviceCharge_total = BigDecimal.ZERO; + }else{ + couponDiscount = divide; + } + + appCoupon.setStatus(2); + appCouponClient.updateAppCoupon(appCoupon); + }else{ + order.setAppCouponId(null); + order.setCouponDiscountAmount(BigDecimal.ZERO); + appCouponClient.refund(chargingOrder.getAppCouponId().toString()); + } + } + } + //优惠券优惠金额 + couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN); + //退款金额+优惠券 + refundAmount = refundAmount.add(couponDiscount); + //实际支付金额-优惠券 + payAmount = payAmount.subtract(couponDiscount); + if(serviceCharge_total.compareTo(BigDecimal.ZERO) > 0){ + serviceCharge_total = serviceCharge_total.subtract(couponDiscount); + } + order.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN)); + order.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN)); + order.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN)); + order.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN)); + order.setRefundStatus(1); + this.updateById(order); + chargingOrder = this.getById(order.getId()); + + //推送三方平台 + if(2 == chargingOrder.getOrderSource()){ + TChargingOrder finalChargingOrder = chargingOrder; + new Thread(new Runnable() { + @Override + public void run() { + tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId()); + tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(), + finalChargingOrder.getOperatorId()); + tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId()); + } + }).start(); + } + + //开始将优惠券优惠的金额添加到明细中 + BigDecimal couponDiscountAmount = order.getCouponDiscountAmount(); + if(null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){ + List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId())); + BigDecimal reduce = list.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); + for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) { + BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice(); + BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN))); + periodServicePrice = periodServicePrice.subtract(multiply); + chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN)); + chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN)); + } + chargingOrderAccountingStrategyService.updateBatchById(list); + } + + // 将枪状态重置为空闲 + TChargingGun chargingGun = new TChargingGun(); + chargingGun.setId(chargingOrder.getChargingGunId()); + chargingGun.setStatus(2); + chargingGun.setChargingPower(BigDecimal.ZERO); + chargingGunClient.updateChargingGunById(chargingGun); + //推送状态给三方平台 + if(2 == chargingOrder.getOrderSource()){ + tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus()); + } + + //添加积分 + if(1 == chargingOrder.getOrderSource()){ + TIntegralRule integralRule = integralRuleClient.getSet().getData(); + if(null != integralRule){ + TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); + Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1"); + Integer integral = chargingOrder.getServiceCharge().intValue() * num1; + if(null != appUser.getVipId()){ + TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); + Integer doubleIntegration = vip.getDoubleIntegration(); + //双倍积分 + if(1 == doubleIntegration){ + integral *= 2; + } + } + + if(integral > 0){ + TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); + appUserIntegralChange.setAppUserId(appUser.getId()); + appUserIntegralChange.setChangeType(2); + appUserIntegralChange.setHistoricalIntegral(appUser.getPoints()); + appUser.setPoints(appUser.getPoints() + integral); + appUserIntegralChange.setCurrentIntegral(appUser.getPoints()); + appUserIntegralChange.setCreateTime(LocalDateTime.now()); + appUserIntegralChange.setOrderCode(chargingOrder.getCode()); + appUserIntegralChange.setExtension(chargingOrder.getId().toString()); + appUserClient.updateAppUser(appUser); + appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); + } + } + + //计算用户标签 + editUserTag(chargingOrder); + //用户推荐奖励 + referralReward(chargingOrder); + + //开始构建退款费用 + refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN); + if(refundAmount.compareTo(BigDecimal.ZERO) > 0){ + Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); + //构建退款明细 + TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); + chargingOrderRefund.setChargingOrderId(chargingOrder.getId()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); + chargingOrderRefund.setRefundAmount(refundAmount); + chargingOrderRefund.setRefundStatus(1); + chargingOrderRefund.setPayType(rechargePaymentType); + chargingOrderRefund.setRefundStatus(1); + chargingOrderRefund.setCode(chargingOrder.getCode()); + chargingOrderRefund.setRefundTitle("充电完成退款"); + chargingOrderRefund.setRefundContent("充电完成退款"); + chargingOrderRefund.setRefundReason("充电完成退款"); + chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount()); + chargingOrderRefund.setRefundTotalAmount(refundAmount); + chargingOrderRefund.setPayAmount(rechargeAmount); + if(1 == rechargePaymentType){ + WxPaymentRefundModel model = new WxPaymentRefundModel(); + model.setOut_trade_no(chargingOrder.getCode()); + model.setOut_refund_no(chargingOrderRefund.getRefundCode()); + model.setReason("充电完成退款"); + model.setNotify_url("/payment/wx/refund/notify"); + WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); + amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue()); + amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); + amount.setCurrency("CNY"); + model.setAmount(amount); + R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model); + if(200 == result.getCode()){ + chargingOrderRefundService.save(chargingOrderRefund); + //手续费 + Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount"); + Object refund_fee1 = amount1.get("refund_fee"); + BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); + chargingOrderRefund.setRefundFee(refund_fee); + chargingOrderRefundService.updateById(chargingOrderRefund); + } + } + if(2 == rechargePaymentType){ + RefundReq dto = new RefundReq(); + dto.setOutTradeNo(chargingOrder.getCode()); + dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); + dto.setRefundAmount(refundAmount.toString()); + dto.setRefundReason("充电完成退款"); + RefundResp resp = aliPaymentClient.refund(dto).getData(); + if(null != resp){ + chargingOrderRefundService.save(chargingOrderRefund); + this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); + } + } + + } + } + + //添加汇总统计数据 + List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", chargingOrder.getId())); + BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal serviceMoney = BigDecimal.ZERO; + BigDecimal paymentMoney = BigDecimal.ZERO; + long time = 0; + if (!chargingOrder.getOrderSource().equals(2)) { + serviceMoney = serviceMoney.add(service_reduce); + paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce); + }else{ + serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8"))); + paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8"))); + } + if (chargingOrder.getStartTime()!=null && chargingOrder.getEndTime()!=null){ + LocalDateTime startTime = chargingOrder.getStartTime(); + LocalDateTime endTime = chargingOrder.getEndTime(); + // 计算时间差 单位秒 + time = ChronoUnit.SECONDS.between(startTime, endTime); + } + TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData(); + summaryData.setChargingOrderId(chargingOrder.getId()); + summaryData.setChargingCapacity(chargingCapacity); + summaryData.setChargingDuration(time); + summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + chargingOrderSummaryDataService.save(summaryData); + return R.ok(); + } + + + + + @Override + public List<Map<String, Object>> getByDate(LocalDate start,LocalDate end,List<Integer> siteIds) { + + LocalDateTime start1 = start.atStartOfDay(); + LocalDateTime end1 = end.atTime(LocalTime.MAX); + return this.baseMapper.getByDate(start1,end1,siteIds); } @Override @@ -1649,19 +2679,25 @@ return this.baseMapper.queryPowerLevel(siteIds,statisticsQueryDto); } + + @Override - public List<Map<String, Object>> queryOrderCountAndMoneyBySiteIdDate(List<Integer> siteIds) { - return this.baseMapper.queryOrderCountAndMoneyBySiteIdDate(siteIds); + public List<Map<String, Object>> usersDay(ChargingStatisticsQueryDto statisticsQueryDto) { + return this.baseMapper.usersDay(statisticsQueryDto); } @Override - public List<Map<String, Object>> usersDay() { - return this.baseMapper.usersDay(); + public List<Map<String, Object>> usersDay1() { + return this.baseMapper.usersDay1(); } @Override public List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.usersByQuery(statisticsQueryDto); + } + @Override + public List<Map<String, Object>> usersByQuery1(ChargingStatisticsQueryDto statisticsQueryDto) { + return this.baseMapper.usersByQuery1(statisticsQueryDto); } @Override @@ -1695,7 +2731,7 @@ } @Override - public Long getAver(List<Integer> siteIds) { + public Double getAver(List<Integer> siteIds) { return this.baseMapper.getAver(siteIds); } @@ -1705,10 +2741,30 @@ } + @Resource + private TShoppingOrderService shoppingOrderService; + @Resource + private TShoppingOrderRefundService shoppingOrderRefundService; + @Resource + private TVipOrderService vipOrderService; + @Resource + private TVipOrderRefundService vipOrderRefundService; + + + + @Override public R payRefund(PayOrderRefundDto payOrderQueryDto) { if (payOrderQueryDto.getType()==1){ TChargingOrder tChargingOrder = this.baseMapper.selectById(payOrderQueryDto.getOrderId()); + if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){ + return R.fail("退款金额需小于支付金额"); + } + if ((tChargingOrder.getRechargeAmount().subtract(tChargingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount()))==0){ + tChargingOrder.setStatus(5); + } + + TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); chargingOrderRefund.setChargingOrderId(tChargingOrder.getId()); chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); @@ -1721,7 +2777,7 @@ chargingOrderRefund.setRefundTitle("后台退款"); chargingOrderRefund.setRefundContent("后台退款"); chargingOrderRefund.setRefundReason("后台退款"); - chargingOrderRefund.setRefundRemark("后台退款"); + chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark()); chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount())); chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount()); @@ -1731,15 +2787,24 @@ model.setOut_refund_no(chargingOrderRefund.getRefundCode()); model.setTransaction_id(tChargingOrder.getRechargeSerialNumber()); model.setReason("取消订单"); - model.setNotify_url("http://221.182.45.100:9000/order/t-shopping-order/cancelShoppingOrderWxRefund"); + model.setNotify_url("/order/t-shopping-order/cancelShoppingOrderWxRefund"); WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue()); - amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); + amount.setTotal(tChargingOrder.getRechargeAmount().multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); - R<String> orderR = wxPaymentClient.refundOrderR(model); + R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); if(200 == orderR.getCode()){ + tChargingOrder.setRefundStatus(2); + tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + this.baseMapper.updateById(tChargingOrder); chargingOrderRefundService.save(chargingOrderRefund); + //手续费 + Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount"); + Object refund_fee1 = amount1.get("refund_fee"); + BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); + chargingOrderRefund.setRefundFee(refund_fee); + chargingOrderRefundService.updateById(chargingOrderRefund); } } @@ -1751,21 +2816,147 @@ dto.setRefundReason("取消订单"); RefundResp resp = aliPaymentClient.refund(dto).getData(); if(null != resp){ - SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); - chargingOrderRefundService.save(chargingOrderRefund); + chargingOrderRefund.setRefundStatus(2); + chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + this.baseMapper.updateById(tChargingOrder); + chargingOrderRefundService.save(chargingOrderRefund); } } + } + if (payOrderQueryDto.getType()==2){ + TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId()); + if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){ + return R.fail("退款金额需小于支付金额"); + } + if ((tChargingOrder.getPaymentAmount().subtract(tChargingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount()))==0){ + tChargingOrder.setStatus(5); + } + TShoppingOrderRefund chargingOrderRefund = new TShoppingOrderRefund(); + chargingOrderRefund.setShoppingOrderId(tChargingOrder.getId()); + chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); + chargingOrderRefund.setRefundStatus(1); + chargingOrderRefund.setPayType(tChargingOrder.getPaymentType()); + chargingOrderRefund.setRefundTime(LocalDateTime.now()); + chargingOrderRefund.setCode(tChargingOrder.getCode()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + chargingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); + chargingOrderRefund.setRefundTitle("后台退款"); + chargingOrderRefund.setRefundContent("后台退款"); + chargingOrderRefund.setRefundReason("后台退款"); + chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark()); + chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount())); + chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount()); + if(1 == tChargingOrder.getPaymentType()){ + WxPaymentRefundModel model = new WxPaymentRefundModel(); + model.setOut_trade_no(tChargingOrder.getCode()); + model.setOut_refund_no(chargingOrderRefund.getRefundCode()); + model.setTransaction_id(tChargingOrder.getSerialNumber()); + model.setReason("取消订单"); + model.setNotify_url("/order/t-shopping-order/cancelShoppingOrderWxRefund"); + WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); + amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue()); + amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); + amount.setCurrency("CNY"); + model.setAmount(amount); + R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); + if(200 == orderR.getCode()){ + tChargingOrder.setRefundStatus(2); + tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + shoppingOrderService.updateById(tChargingOrder); + shoppingOrderRefundService.save(chargingOrderRefund); + //手续费 + Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount"); + Object refund_fee1 = amount1.get("refund_fee"); + BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); + chargingOrderRefund.setRefundFee(refund_fee); + shoppingOrderRefundService.updateById(chargingOrderRefund); + } + } - + if(2 == tChargingOrder.getPaymentType()){ + RefundReq dto = new RefundReq(); + dto.setOutTradeNo(tChargingOrder.getCode()); + dto.setOutRequestNo(tChargingOrder.getCode()); + dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); + dto.setRefundReason("取消订单"); + RefundResp resp = aliPaymentClient.refund(dto).getData(); + if(null != resp){ + tChargingOrder.setRefundStatus(2); + tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + shoppingOrderService.updateById(tChargingOrder); + shoppingOrderRefundService.save(chargingOrderRefund); + } + } } + if (payOrderQueryDto.getType()==3){ + TVipOrder tChargingOrder = vipOrderService.getById(payOrderQueryDto.getOrderId()); + if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){ + return R.fail("退款金额需小于支付金额"); + } + TVipOrderRefund chargingOrderRefund = new TVipOrderRefund(); + chargingOrderRefund.setVipOrderId(tChargingOrder.getId()); + chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); + chargingOrderRefund.setRefundStatus(1); + chargingOrderRefund.setPayType(tChargingOrder.getPaymentType()); + chargingOrderRefund.setRefundTime(LocalDateTime.now()); + chargingOrderRefund.setCode(tChargingOrder.getCode()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + chargingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); + chargingOrderRefund.setRefundTitle("后台退款"); + chargingOrderRefund.setRefundContent("后台退款"); + chargingOrderRefund.setRefundReason("后台退款"); + chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark()); + chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount())); + chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount()); + if(1 == tChargingOrder.getPaymentType()){ + WxPaymentRefundModel model = new WxPaymentRefundModel(); + model.setOut_trade_no(tChargingOrder.getCode()); + model.setOut_refund_no(chargingOrderRefund.getRefundCode()); + model.setTransaction_id(tChargingOrder.getSerialNumber()); + model.setReason("取消订单"); + model.setNotify_url("/order/t-shopping-order/cancelShoppingOrderWxRefund"); + WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); + amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue()); + amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); + amount.setCurrency("CNY"); + model.setAmount(amount); + R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); + if(200 == orderR.getCode()){ + tChargingOrder.setRefundStatus(2); + tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + vipOrderService.updateById(tChargingOrder); + vipOrderRefundService.save(chargingOrderRefund); + //手续费 + Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount"); + Object refund_fee1 = amount1.get("refund_fee"); + BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); + chargingOrderRefund.setRefundFee(refund_fee); + vipOrderRefundService.updateById(chargingOrderRefund); + } + } - return null; + if(2 == tChargingOrder.getPaymentType()){ + RefundReq dto = new RefundReq(); + dto.setOutTradeNo(tChargingOrder.getCode()); + dto.setOutRequestNo(tChargingOrder.getCode()); + dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); + dto.setRefundReason("取消订单"); + RefundResp resp = aliPaymentClient.refund(dto).getData(); + if(null != resp){ + tChargingOrder.setRefundStatus(2); + tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + vipOrderService.updateById(tChargingOrder); + vipOrderRefundService.save(chargingOrderRefund); + } + } + } + return R.ok(); } @@ -1776,19 +2967,17 @@ */ @Override public TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) { - TAppUserCar appUserCar = appUserCarClient.getAppUserCarByLicensePlate(query.getLicensePlate()).getData(); - if(null == appUserCar){ - return null; - } - TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserCarId, appUserCar.getId()) - .eq(TChargingOrder::getDelFlag, 0).gt(TChargingOrder::getStartTime, query.getStartTime()) - .eq(TChargingOrder::getRechargePaymentStatus, 2).ne(TChargingOrder::getStatus, -1)); + TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getPlateNum, query.getLicensePlate()) + .eq(TChargingOrder::getDelFlag, 0).between(TChargingOrder::getStartTime, query.getStartTime(), LocalDateTime.now()) + .eq(TChargingOrder::getRechargePaymentStatus, 2).in(TChargingOrder::getStatus, Arrays.asList(4, 5))); return one; } @Override public TSettlementConfirm settlementAdd(SettlementConfirmAdd dto) { List<Site> data = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData(); + List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list(); + TSettlementConfirm tSettlementConfirm = new TSettlementConfirm(); if (!data.isEmpty()){ tSettlementConfirm.setSiteName(data.get(0).getName()); @@ -1815,11 +3004,10 @@ // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表 QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>() - .eq("site_id", dto.getSiteId()) - .eq("recharge_payment_status",2); + .eq("site_id", dto.getSiteId()); switch (dto.getType()){ case 1: - eq.between("start_time", localDateTime, localDateTime1); + eq.between("pay_time", localDateTime, localDateTime1); break; case 2: eq.between("end_time", localDateTime, localDateTime1); @@ -1845,23 +3033,38 @@ // 支付订单金额 需要减去退款金额 BigDecimal paymentAmount = new BigDecimal("0"); for (TChargingOrder tChargingOrder : tChargingOrders) { - // 累加充电总度数 - if (tChargingOrder.getChargingCapacity()!=null){ - chargingElectronic = chargingElectronic.add(tChargingOrder.getChargingCapacity()); - + if(null == tChargingOrder.getStatus() || 5 != tChargingOrder.getStatus()){ + continue; } + List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); + BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); + // 累加充电总度数 + chargingElectronic = chargingElectronic.add(chargingCapacity); // 累加分佣 - if (tChargingOrder.getSharingAmount()!=null) { - sharingAmount = sharingAmount.add(tChargingOrder.getSharingAmount()); + if (tChargingOrder.getOrderSource()==2) { + sharingAmount = sharingAmount.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2,BigDecimal.ROUND_DOWN)); } // 累加电费 - if (tChargingOrder.getElectrovalence()!=null) { - electrovalence = electrovalence.add(tChargingOrder.getElectrovalence()); + electrovalence = electrovalence.add(electronic_reduce); + if (tChargingOrder.getPaymentAmount()!=null && tChargingOrder.getOrderSource()!=2){ + paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount()); + } + if (tChargingOrder.getRechargeAmount()!=null){ + orderCommission = orderCommission.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006")) + .setScale(2,BigDecimal.ROUND_DOWN)); + } + // 累加服务费 if (tChargingOrder.getServiceCharge()!=null){ - serviceCharge = serviceCharge.add(tChargingOrder.getServiceCharge()); - + if (tChargingOrder.getOrderSource()==2) { + serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2,BigDecimal.ROUND_DOWN)); + paymentAmount = paymentAmount.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8"))); + }else{ + serviceCharge = serviceCharge.add(service_reduce); + } } // 累加会员折扣 if (tChargingOrder.getVipDiscountAmount()!=null){ @@ -1871,38 +3074,29 @@ if (tChargingOrder.getCouponDiscountAmount()!=null){ couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount()); } - if (tChargingOrder.getRefundStatus()!=null &&tChargingOrder.getRefundStatus() == 2){ - // 如果成功退款 那么减去退款金额 - paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount().subtract(tChargingOrder.getRefundAmount())); - }else{ - if (tChargingOrder.getPaymentAmount()!=null){ - paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount()); - } - } + + } + // 三方交易手续费 三方收费*0.6% commissionAmount = sharingAmount.multiply(new BigDecimal("0.006")); - // 订单手续费 订单支付金额 - 退款金额*0.6% - orderCommission = paymentAmount.multiply(new BigDecimal("0.006")); - tSettlementConfirm.setSharingAmount(sharingAmount); - tSettlementConfirm.setCommissionAmount(commissionAmount); - tSettlementConfirm.setElectrovalence(electrovalence); - // 服务费=总服务费-三费收费-交易手续费-交易手续费-服务费会员抵扣-服务费优惠券抵扣 - tSettlementConfirm.setServiceCharge(serviceCharge.subtract(commissionAmount).subtract(sharingAmount).subtract(orderCommission).subtract(vipDiscount).subtract(couponDiscount)); + tSettlementConfirm.setSharingAmount(sharingAmount.setScale(2, RoundingMode.HALF_DOWN)); + tSettlementConfirm.setCommissionAmount(commissionAmount.setScale(2, RoundingMode.HALF_DOWN)); + tSettlementConfirm.setElectrovalence(electrovalence.setScale(2, RoundingMode.HALF_DOWN)); + tSettlementConfirm.setServiceCharge(serviceCharge.subtract(orderCommission).setScale(2, RoundingMode.HALF_DOWN)); tSettlementConfirm.setOrderCommission(orderCommission); tSettlementConfirm.setVipDiscount(vipDiscount); tSettlementConfirm.setCouponDiscount(couponDiscount); tSettlementConfirm.setSiteId(dto.getSiteId()); tSettlementConfirm.setChargingElectronic(chargingElectronic); tSettlementConfirm.setIncome(chargingElectronic.add(serviceCharge)); - tSettlementConfirm.setProfitMoney(new BigDecimal("0")); - tSettlementConfirm.setNewMoney(new BigDecimal("0")); - tSettlementConfirm.setNewSettlement(new BigDecimal("0")); tSettlementConfirm.setVipDiscount(vipDiscount); tSettlementConfirm.setCouponDiscount(couponDiscount); tSettlementConfirm.setType(dto.getType()); if (dto.getState() == 2){ + tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean()) + .subtract(dto.getMaintain()).multiply(dto.getServicePartner())); tSettlementConfirm.setSupplyElectronic(dto.getSupplyElectronic()); tSettlementConfirm.setVenue(dto.getVenue()); tSettlementConfirm.setMetering(dto.getMetering()); @@ -1917,12 +3111,26 @@ tSettlementConfirm.setTotalService(dto.getTotalService()); tSettlementConfirm.setRemark(dto.getRemark()); tSettlementConfirm.setServicePartner(dto.getServicePartner()); - tSettlementConfirm.setServiceMoney(dto.getServiceMoney()); + BigDecimal subtract = new BigDecimal("1").subtract(dto.getProportionPartner()); + BigDecimal subtract9 = new BigDecimal("1").subtract(dto.getServicePartner()); + // 总电损费用 + BigDecimal divide = tSettlementConfirm.getProportionMoney().divide(subtract, 2, BigDecimal.ROUND_DOWN); + // 平台承担电损 + BigDecimal subtract1 = divide.subtract(tSettlementConfirm.getProportionMoney()); + BigDecimal multiply = dto.getServiceMoney().multiply(subtract); + BigDecimal subtract2 = multiply.subtract(subtract1); + tSettlementConfirm.setNewMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean()) + .subtract(dto.getMaintain()).multiply(subtract9).subtract(subtract1)); + tSettlementConfirm.setTotalService(dto.getTotalService()); tSettlementConfirm.setServiceRemark(dto.getServiceRemark()); tSettlementConfirm.setDistribution(dto.getDistribution()); tSettlementConfirm.setIncome(dto.getElectrovalence().add(dto.getServiceCharge())); - tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain())); + tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain()).add(dto.getSupplyElectronic())); + tSettlementConfirm.setProfitMoney(tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost())); + tSettlementConfirm.setNewSettlement(tSettlementConfirm.getProfitMoney().add(tSettlementConfirm.getCost())); + tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean()) + .subtract(dto.getMaintain()).multiply(dto.getServicePartner())); tSettlementConfirmMapper.insert(tSettlementConfirm); } return tSettlementConfirm; @@ -1930,9 +3138,65 @@ @Override public PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto) { + String startTime = null; + String endTime = null; + if (StringUtils.hasLength(dto.getStartTime())){ + dto.setType(1); + String[] split = dto.getStartTime().split(" - "); + startTime = split[0]; + endTime = split[1]; + } + if (StringUtils.hasLength(dto.getEndTime())){ + dto.setType(2); + String[] split = dto.getEndTime().split(" - "); + startTime = split[0]; + endTime = split[1]; + } + dto.setStartTime(startTime); + dto.setEndTime(endTime); + Long userId = tokenService.getLoginUser().getUserid(); + // 查询当前登陆人按钮权限 + SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); + Integer roleType = sysUser.getRoleType(); + //如果没传siteId,获取当前登陆人所有的siteIds + List<Integer> siteIds = new ArrayList<>(); + if (dto.getSiteIds()==null){ + if (userId != null){ + List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); + for (GetSiteListDTO datum : data) { + siteIds.add(datum.getId()); + } + } + }else { + siteIds.add(dto.getSiteIds()); + } + if (siteIds.isEmpty()){ + siteIds.add(-1); + }else{ + if (roleType == 2){ + List<Integer> integers = new ArrayList<>(); + for (Integer siteId : siteIds) { + // 校验有没有这个站点的权限 + List<Boolean> t1= partnerClient.getSettlementListMenu(sysUser.getObjectId(),siteId).getData(); + + Boolean b = t1.get(2); + if (b){ + integers.add(siteId); + } + } + siteIds = integers; + } + } + dto.setSiteIdss(siteIds); PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo,dto); + for (TSettlementConfirm tSettlementConfirm : list) { + if (roleType==2){ + List<Boolean> data = partnerClient.getSettlementListMenu(sysUser.getObjectId(), tSettlementConfirm.getSiteId()).getData(); + tSettlementConfirm.setAuthDownLoad(data.get(0)); + tSettlementConfirm.setAuthDelete(data.get(1)); + } tSettlementConfirm.setUid(tSettlementConfirm.getId().toString()); List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData(); if (!data1.isEmpty()){ @@ -1953,14 +3217,32 @@ return pageInfo; } + @Autowired + private TChargingOrderService chargingOrderService; @Override public SettlementTotalVO settlementTotal(String time) { + 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); + } + List<Site> siteList = siteClient.getSiteAll().getData(); + List<TChargingPile> pileList = chargingGunClient.getAllPile().getData(); + List<TChargingOrder> totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class) + .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getStatus, 5)); SettlementTotalVO res = new SettlementTotalVO(); - List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time); + List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time,siteIds); LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); // 减少一个月 LocalDateTime minus = parse.minusMonths(1); - List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time); + List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time,siteIds); // 合计 List<TSettlementConfirm> total = new ArrayList<>(); @@ -1991,21 +3273,26 @@ BigDecimal orderCommission = new BigDecimal("0"); BigDecimal vipDiscount = new BigDecimal("0"); BigDecimal couponDiscount = new BigDecimal("0"); -// tSettlementConfirm1.setIncomePercentage(); -// tSettlementConfirm1.setTotalPercentage(); tSettlementConfirm1.setElectronicRefund(0); -// 上月成本合计 + // 上月成本合计 BigDecimal beforeCost= new BigDecimal("0"); // 上月利润合计 BigDecimal beforeIncome= new BigDecimal("0"); + int i = 1; for (TSettlementConfirm tSettlementConfirm : list1) { - List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData(); - if (!data1.isEmpty()){ - tSettlementConfirm.setSiteName(data1.get(0).getName()); + tSettlementConfirm.setXuhao(i); + tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); + Site site = siteList.stream().filter(e -> e.getId().equals(tSettlementConfirm.getSiteId())).findFirst().orElse(null); + if (site!=null){ + tSettlementConfirm.setSiteName(site.getName()); } - meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic()); - chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic()); - lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic()); + if (tSettlementConfirm.getMeteringElectronic()!=null){ + meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic()); + chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic()); + } + if (tSettlementConfirm.getLossElectronic()!=null){ + lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic()); + } income = income.add(tSettlementConfirm.getIncome()); venue = venue.add(tSettlementConfirm.getVenue()); metering = metering.add(tSettlementConfirm.getMetering()); @@ -2042,16 +3329,17 @@ eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime()); break; } - List<TChargingOrder> tChargingOrders = this.baseMapper.selectList(eq); - Map<String,TChargingOrder> map = new HashMap<>(); - StringBuilder stringBuilder = new StringBuilder(); - for (TChargingOrder tChargingOrder : tChargingOrders) { - stringBuilder.append(tChargingOrder.getCode()).append(","); - } + List<TChargingOrder> tChargingOrders = totalOrder.stream().filter(e-> e.getPayTime() + .isBefore(tSettlementConfirm.getEndTime()) + && e.getPayTime().isAfter(tSettlementConfirm.getStartTime())&&e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList()); + // 充电总时长 Long temp = 0L; - if (StringUtils.hasLength(stringBuilder.toString())){ - List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getOrderInfoByCodes(stringBuilder.substring(0,stringBuilder.length()-1)).getData(); - temp+=data6.stream().mapToLong(UploadRealTimeMonitoringData::getCumulative_charging_time).sum(); + for (TChargingOrder tChargingOrder : tChargingOrders) { + LocalDateTime startTime = tChargingOrder.getStartTime(); + LocalDateTime endTime = tChargingOrder.getEndTime(); + // 计算时间差 单位秒 + long between = ChronoUnit.SECONDS.between(startTime, endTime); + temp+=between; } List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData(); // 计算充电桩的功率平均值 @@ -2060,29 +3348,60 @@ bigDecimal = bigDecimal.add(datum.getRatedPower()); } - tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge())); - // todo 计算利用率 该电站充电桩本月利用率: //利用率=充电量/(桩数量*功率*时间) + List<TChargingPile> data2 = pileList.stream().filter(e -> e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList()); + BigDecimal bigDecimal2 = new BigDecimal("0"); + + if (data2!=null && (!data2.isEmpty())){ + for (TChargingPile tChargingPile : data2) { + bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower()); + } + BigDecimal bigDecimal1 = new BigDecimal(data2.size()+""); + // 平均功率 + BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN); + // 充电量 + BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic(); + // 桩数量 + BigDecimal bigDecimal3 = new BigDecimal(data2.size()); + BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24")); + BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp)); + tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1,2,RoundingMode.HALF_DOWN)+""); + }else{ + tSettlementConfirm.setRate(""); + } + for (TSettlementConfirm settlementConfirm : list2) { + int value = parse.getMonth().getValue(); + settlementConfirm.setMonth(value); settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge())); + tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())){ // 电站相同比较收入涨幅跌幅 - BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome()).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); - tSettlementConfirm.setIncomePercentage(subtract+"%"); + if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO)>0){ + BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome(),2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); + tSettlementConfirm.setIncomePercentage(subtract+"%"); + }else { + tSettlementConfirm.setIncomePercentage("100"+"%"); + + } + // 比较总利润 收入合计-成本合计 BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost()); BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost()); - tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%"); - } + BigDecimal bigDecimal1 = subtract1.subtract(subtract2) + .divide(subtract2, 2, RoundingMode.HALF_DOWN) + .multiply(new BigDecimal("100")) + .setScale(2, RoundingMode.HALF_DOWN); + tSettlementConfirm.setTotalPercentage(bigDecimal1+"%"); } beforeCost = beforeCost.add(settlementConfirm.getCost()); beforeIncome = beforeIncome.add(settlementConfirm.getIncome()); - - } + i++; } TSettlementConfirm tSettlementConfirm = new TSettlementConfirm(); + tSettlementConfirm.setMonth(parse.getMonthValue()); tSettlementConfirm.setMeteringElectronic(meteringElectronic); tSettlementConfirm.setChargingElectronic(chargingElectronic); tSettlementConfirm.setLossElectronic(lossElectronic); @@ -2114,7 +3433,244 @@ tSettlementConfirm.setIncomePercentage(0+"%"); tSettlementConfirm.setIncomePercentage(0+"%"); }else{ - BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); + BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome,2,RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); + tSettlementConfirm.setIncomePercentage(subtract+"%"); + tSettlementConfirm.setIncomePercentage(subtract+"%"); + } + // 比较总利润 收入合计-成本合计 + BigDecimal subtract1 = income.subtract(cost); + BigDecimal subtract2 = beforeIncome.subtract(beforeCost); + if (subtract2.compareTo(new BigDecimal("0")) == 0){ + tSettlementConfirm.setTotalPercentage(0+"%"); + }else{ + tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2,2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%"); + } + tSettlementConfirm.setElectronicRefund(0); + // 查询上次汇报数据 进行比对涨幅跌幅 + total.add(tSettlementConfirm); + res.setList1(list1); + res.setList2(total); + return res; + } + @Override + public SettlementTotalVO settlementTotalR(String time,Long userId) { + //如果没传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); + } + List<Site> siteList = siteClient.getSiteAll().getData(); + List<TChargingGun> gunList = chargingGunClient.getAllGun().getData(); + List<TChargingPile> pileList = chargingGunClient.getAllPile().getData(); + List<TAppUser> userList = appUserClient.getAllUser().getData(); + List<TAppUserCar> carList = appUserCarClient.getAllCar().getData(); + List<TChargingOrder> totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class) + .eq(TChargingOrder::getRechargePaymentStatus, 2)); + SettlementTotalVO res = new SettlementTotalVO(); + List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time,siteIds); + LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time,siteIds); + // 合计 + List<TSettlementConfirm> total = new ArrayList<>(); + + TSettlementConfirm tSettlementConfirm1 = new TSettlementConfirm(); + BigDecimal meteringElectronic = new BigDecimal("0"); + BigDecimal chargingElectronic = new BigDecimal("0"); + BigDecimal lossElectronic = new BigDecimal("0"); + BigDecimal income = new BigDecimal("0"); + BigDecimal venue = new BigDecimal("0"); + BigDecimal metering = new BigDecimal("0"); + BigDecimal clean = new BigDecimal("0"); + BigDecimal maintain = new BigDecimal("0"); + BigDecimal cost = new BigDecimal("0"); + BigDecimal profitMoney = new BigDecimal("0"); + BigDecimal newMoney = new BigDecimal("0"); + BigDecimal newSettlement = new BigDecimal("0"); + BigDecimal supplyElectronic = new BigDecimal("0"); + BigDecimal proportionPartner = new BigDecimal("0"); + BigDecimal proportionMoney = new BigDecimal("0"); + BigDecimal totalElectronic = new BigDecimal("0"); + BigDecimal totalService = new BigDecimal("0"); + BigDecimal servicePartner = new BigDecimal("0"); + BigDecimal serviceMoney = new BigDecimal("0"); + BigDecimal sharingAmount = new BigDecimal("0"); + BigDecimal commissionAmount = new BigDecimal("0"); + BigDecimal electrovalence = new BigDecimal("0"); + BigDecimal serviceCharge = new BigDecimal("0"); + BigDecimal orderCommission = new BigDecimal("0"); + BigDecimal vipDiscount = new BigDecimal("0"); + BigDecimal couponDiscount = new BigDecimal("0"); +// tSettlementConfirm1.setIncomePercentage(); +// tSettlementConfirm1.setTotalPercentage(); + tSettlementConfirm1.setElectronicRefund(0); + // 上月成本合计 + BigDecimal beforeCost= new BigDecimal("0"); + // 上月利润合计 + BigDecimal beforeIncome= new BigDecimal("0"); + int i = 1; + for (TSettlementConfirm tSettlementConfirm : list1) { + tSettlementConfirm.setXuhao(i); + tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); + List<Site> data1 = siteList.stream().filter(e -> e.getId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList()); + if (!data1.isEmpty()){ + tSettlementConfirm.setSiteName(data1.get(0).getName()); + } + if (tSettlementConfirm.getMeteringElectronic()!=null){ + meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic()); + chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic()); + } + if (tSettlementConfirm.getLossElectronic()!=null){ + lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic()); + } + income = income.add(tSettlementConfirm.getIncome()); + venue = venue.add(tSettlementConfirm.getVenue()); + metering = metering.add(tSettlementConfirm.getMetering()); + clean = clean.add(tSettlementConfirm.getClean()); + maintain = maintain.add(tSettlementConfirm.getMaintain()); + cost = cost.add(tSettlementConfirm.getCost()); + profitMoney = profitMoney.add(tSettlementConfirm.getProfitMoney()); + newMoney = newMoney.add(tSettlementConfirm.getNewMoney()); + newSettlement = newSettlement.add(tSettlementConfirm.getNewSettlement()); + supplyElectronic = supplyElectronic.add(tSettlementConfirm.getSupplyElectronic()); + proportionPartner = proportionPartner.add(tSettlementConfirm.getProportionPartner()); + proportionMoney = proportionMoney.add(tSettlementConfirm.getProportionMoney()); + totalElectronic = totalElectronic.add(tSettlementConfirm.getTotalElectronic()); + totalService = totalService.add(tSettlementConfirm.getTotalService()); + servicePartner = servicePartner.add(tSettlementConfirm.getServicePartner()); + serviceMoney = serviceMoney.add(tSettlementConfirm.getServiceMoney()); + sharingAmount = sharingAmount.add(tSettlementConfirm.getSharingAmount()); + commissionAmount = commissionAmount.add(tSettlementConfirm.getCommissionAmount()); + electrovalence = electrovalence.add(tSettlementConfirm.getElectrovalence()); + serviceCharge = serviceCharge.add(tSettlementConfirm.getServiceCharge()); + orderCommission = orderCommission.add(tSettlementConfirm.getOrderCommission()); + vipDiscount = vipDiscount.add(tSettlementConfirm.getVipDiscount()); + couponDiscount = couponDiscount.add(tSettlementConfirm.getCouponDiscount()); + + // 查询结算确认单开始时间和结束时间的单子 + QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>() + .eq("site_id", tSettlementConfirm.getSiteId()) + .eq("recharge_payment_status",2); + switch (tSettlementConfirm.getType()){ + case 1: + eq.between("start_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime()); + break; + case 2: + eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime()); + break; + } + + List<TChargingOrder> tChargingOrders = totalOrder.stream().filter(e-> e.getPayTime() + .isBefore(tSettlementConfirm.getEndTime()) + && e.getPayTime().isAfter(tSettlementConfirm.getStartTime())&&e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList()); + // 充电总时长 + Long temp = 0L; + for (TChargingOrder tChargingOrder : tChargingOrders) { + LocalDateTime startTime = tChargingOrder.getStartTime(); + LocalDateTime endTime = tChargingOrder.getEndTime(); + // 计算时间差 单位秒 + long between = ChronoUnit.SECONDS.between(startTime, endTime); + temp+=between; + } + List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData(); + // 计算充电桩的功率平均值 + BigDecimal bigDecimal = new BigDecimal("0"); + for (TChargingPile datum : data) { + bigDecimal = bigDecimal.add(datum.getRatedPower()); + } + + + tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge())); + //利用率=充电量/(桩数量*功率*时间) + List<TChargingPile> data2 = chargingPileClient.getChargingPileBySiteId(tSettlementConfirm.getSiteId()).getData(); + BigDecimal bigDecimal2 = new BigDecimal("0"); + + if (data2!=null && (!data2.isEmpty())){ + for (TChargingPile tChargingPile : data2) { + bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower()); + } + BigDecimal bigDecimal1 = new BigDecimal(data2.size()+""); + // 平均功率 + BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN); + // 充电量 + BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic(); + // 桩数量 + BigDecimal bigDecimal3 = new BigDecimal(data2.size()); + BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24")); + BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp)); + tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1,2,RoundingMode.HALF_DOWN)+""); + }else{ + tSettlementConfirm.setRate(""); + } + + + for (TSettlementConfirm settlementConfirm : list2) { + int value = parse.getMonth().getValue(); + settlementConfirm.setMonth(value); + settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge())); + tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); + if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())){ + // 电站相同比较收入涨幅跌幅 + if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO)>0){ + BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome(),2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); + tSettlementConfirm.setIncomePercentage(subtract+"%"); + }else { + tSettlementConfirm.setIncomePercentage("100"+"%"); + + } + + // 比较总利润 收入合计-成本合计 + BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost()); + BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost()); + BigDecimal bigDecimal1 = subtract1.subtract(subtract2) + .divide(subtract2, 2, RoundingMode.HALF_DOWN) + .multiply(new BigDecimal("100")) + .setScale(2, RoundingMode.HALF_DOWN); + tSettlementConfirm.setTotalPercentage(bigDecimal1+"%"); } + beforeCost = beforeCost.add(settlementConfirm.getCost()); + beforeIncome = beforeIncome.add(settlementConfirm.getIncome()); + } + i++; + } + TSettlementConfirm tSettlementConfirm = new TSettlementConfirm(); + tSettlementConfirm.setMonth(parse.getMonthValue()); + tSettlementConfirm.setMeteringElectronic(meteringElectronic); + tSettlementConfirm.setChargingElectronic(chargingElectronic); + tSettlementConfirm.setLossElectronic(lossElectronic); + tSettlementConfirm.setIncome(income); + tSettlementConfirm.setVenue(venue); + tSettlementConfirm.setMetering(metering); + tSettlementConfirm.setClean(clean); + tSettlementConfirm.setMaintain(maintain); + tSettlementConfirm.setCost(cost); + tSettlementConfirm.setProfitMoney(profitMoney); + tSettlementConfirm.setNewMoney(newMoney); + tSettlementConfirm.setNewSettlement(newSettlement); + tSettlementConfirm.setSupplyElectronic(supplyElectronic); + tSettlementConfirm.setProportionPartner(proportionPartner); + tSettlementConfirm.setProportionMoney(proportionMoney); + tSettlementConfirm.setTotalElectronic(totalElectronic); + tSettlementConfirm.setTotalService(totalService); + tSettlementConfirm.setServicePartner(servicePartner); + tSettlementConfirm.setServiceMoney(serviceMoney); + tSettlementConfirm.setSharingAmount(sharingAmount); + tSettlementConfirm.setCommissionAmount(commissionAmount); + tSettlementConfirm.setElectrovalence(electrovalence); + tSettlementConfirm.setServiceCharge(serviceCharge); + tSettlementConfirm.setOrderCommission(orderCommission); + tSettlementConfirm.setVipDiscount(vipDiscount); + tSettlementConfirm.setCouponDiscount(couponDiscount); + // 本月 + if (beforeIncome.compareTo(new BigDecimal("0")) == 0){ + tSettlementConfirm.setIncomePercentage(0+"%"); + tSettlementConfirm.setIncomePercentage(0+"%"); + }else{ + BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome,2,RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); tSettlementConfirm.setIncomePercentage(subtract+"%"); tSettlementConfirm.setIncomePercentage(subtract+"%"); @@ -2125,7 +3681,7 @@ if (subtract2.compareTo(new BigDecimal("0")) == 0){ tSettlementConfirm.setTotalPercentage(0+"%"); }else{ - tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%"); + tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2,2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%"); } tSettlementConfirm.setElectronicRefund(0); // 查询上次汇报数据 进行比对涨幅跌幅 @@ -2136,8 +3692,8 @@ } @Override - public List<Map<String, Object>> countBySource(List<Integer> siteIds) { - return this.baseMapper.countBySource(siteIds); + public List<Map<String, Object>> countBySource(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { + return this.baseMapper.countBySource(siteIds,statisticsQueryDto); } @Override @@ -2200,11 +3756,312 @@ return this.baseMapper.countAllUserData(); } - public static void main(String[] args) { -// String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); -// String format1 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); -// System.err.println(format+"至"+format1); -// LocalDateTime parse = LocalDateTime.parse("2024-01-12 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); -// System.err.println(parse.format(DateTimeFormatter.ofPattern("yyyy-dd"))); + @Override + public List<Map<String, Object>> needElec1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { + return this.baseMapper.needElec1(siteIds,statisticsQueryDto); + } + + /** + * 获取充电结束页面详情 + * @param id + * @return + */ + @Override + public EndOfChargePageInfo getEndOfChargePageInfo(String id) { + EndOfChargePageInfo info = new EndOfChargePageInfo(); + TChargingOrder chargingOrder = this.getById(id); + Long userId = tokenService.getLoginUserApplet().getUserId(); + if(!chargingOrder.getAppUserId().equals(userId)){ + throw new RuntimeException("权限不足"); + } + info.setId(id); + info.setCode(chargingOrder.getCode()); + info.setPaymentAmount(chargingOrder.getPaymentAmount()); + info.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount()); + TAppUserIntegralChange integralChange = appUserIntegralChangeClient.getTAppUserIntegralChangeByOrderCode(chargingOrder.getCode()).getData(); + info.setIntegral(null == integralChange ? 0 : integralChange.getCurrentIntegral() - integralChange.getHistoricalIntegral()); + info.setRechargeAmount(chargingOrder.getRechargeAmount()); + info.setRefundAmount(chargingOrder.getRefundAmount()); + LocalDateTime startTime = chargingOrder.getStartTime(); + LocalDateTime endTime = chargingOrder.getEndTime(); + info.setStartDay(startTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + startTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE)); + info.setStartHour(startTime.format(DateTimeFormatter.ofPattern("HH:mm"))); + info.setEndDay(endTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + endTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE)); + info.setEndHour(endTime.format(DateTimeFormatter.ofPattern("HH:mm"))); + long time = (endTime.toEpochSecond(ZoneOffset.UTC) - startTime.toEpochSecond(ZoneOffset.UTC)) / 60; + long hour = time / 60; + long second = time % 60; + info.setDuration(0 == hour ? String.format("%s分钟", second) : String.format("%s小时%s分钟", hour, second)); + return info; + } + + @Override + public Long countNoTag() { + return this.baseMapper.countNoTag(); + } + + + @Override + public List<TChargingOrder> getChargingOrder(TChargingOrderVo order) { + LambdaQueryWrapper<TChargingOrder> queryWrapper = new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0); + if(null != order.getChargingPileId()){ + queryWrapper.eq(TChargingOrder::getChargingPileId, order.getChargingPileId()); + } + if(null != order.getChargingGunId()){ + queryWrapper.eq(TChargingOrder::getChargingGunId, order.getChargingGunId()); + } + if(null != order.getStatus()){ + queryWrapper.eq(TChargingOrder::getStatus, order.getStatus()); + } + if(null != order.getAppUserId()){ + queryWrapper.eq(TChargingOrder::getAppUserId, order.getAppUserId()); + } + if(null != order.getStatusList()){ + queryWrapper.in(TChargingOrder::getStatus, order.getStatusList()); + } + if(null != order.getEndMode()){ + queryWrapper.eq(TChargingOrder::getEndMode, order.getEndMode()); + } + return this.list(queryWrapper.orderByDesc(TChargingOrder::getCreateTime)); + } + + @Override + public Long countCar(List<String> brands) { + return this.baseMapper.countCar(brands); + } + + + /** + * 添加三方平台充电订单数据 + * @param query + */ + @Override + public R addTripartitePlatformOrder(AddTripartitePlatformOrder query) { + //检查当前枪是否是正在使用中 + TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, query.getChargingGunId()) + .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0)); + if(null != one){ + return R.fail("充电枪正在充电中,启动失败"); + } + + //构建订单数据 + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + TChargingOrder chargingOrder = new TChargingOrder(); + String code = "CD" + Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date()); + chargingOrder.setCode(code); + chargingOrder.setOrderType(1); + chargingOrder.setOrderClassification(1); + TChargingGun tChargingGun = chargingGunClient.getChargingGunById(query.getChargingGunId()).getData(); + TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData(); + chargingOrder.setSiteId(tChargingGun.getSiteId()); + chargingOrder.setChargingPileId(tChargingGun.getChargingPileId()); + chargingOrder.setChargingGunId(query.getChargingGunId()); + chargingOrder.setRechargePaymentType(query.getRechargePaymentType()); + chargingOrder.setRechargePaymentStatus(2); + chargingOrder.setRechargeAmount(query.getPaymentAmount()); + chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); + chargingOrder.setOrderSource(2); + Operator operator = operatorClient.getOperator(query.getOperatorId()).getData(); + chargingOrder.setOperatorId(operator.getId()); + chargingOrder.setAppUserId(operator.getId().longValue()); + chargingOrder.setTripartitePlatformName(operator.getName()); + chargingOrder.setStartChargeSeq(query.getStartChargeSeq()); + //车辆信息 + if(StringUtils.hasLength(query.getPlateNum())){ + TAppUserCar appUserCar = appUserCarClient.getAppUserCarByLicensePlate(query.getPlateNum()).getData(); + if(null != appUserCar){ + chargingOrder.setAppUserCarId(appUserCar.getId()); + } + chargingOrder.setPlateNum(query.getPlateNum()); + } + + + chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪"); + chargingOrder.setStatus(2); + chargingOrder.setPayTime(LocalDateTime.now()); + chargingOrder.setChargeAmount(chargingOrder.getRechargeAmount()); + this.save(chargingOrder); + + Integer accountingStrategyId = tChargingGun.getAccountingStrategyId(); + if(null == accountingStrategyId){ + Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0); + //查询站点上面的计费策略 + accountingStrategyId = site.getAccountingStrategyId(); + } + TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData(); + + //添加订单的计费策略 + List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData(); + AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder(); + BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder); + accountingStrategyOrder.setChargingOrderId(chargingOrder.getId()); + accountingStrategyOrderService.save(accountingStrategyOrder); + List<AccountingStrategyDetailOrder> list1 = new ArrayList<>(); + for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) { + AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder(); + BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder); + accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId()); + list1.add(accountingStrategyDetailOrder); + } + accountingStrategyDetailOrderService.saveBatch(list1); + + + //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据 + PreChargeCheck preChargeCheck = new PreChargeCheck(); + preChargeCheck.setElectronicLockLock(false); + preChargeCheck.setInsulationTesting(false); + preChargeCheck.setSecureConnectionDetection(false); + preChargeCheck.setStartupSuccess(1); + String key = "AQJC_" + chargingOrder.getChargingGunId(); + redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS); + + BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); + //调用远程启动充电消息 + PlatformStartCharging platformStartCharging = new PlatformStartCharging(); + platformStartCharging.setTransaction_serial_number(chargingOrder.getCode()); + platformStartCharging.setCharging_pile_code(chargingPile.getCode()); + platformStartCharging.setCharging_gun_code(tChargingGun.getCode()); + //使用订单id作为逻辑卡号 + platformStartCharging.setCard_number(chargingOrder.getId().toString()); + platformStartCharging.setAccount_balance(rechargeAmount); + log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString()); + sendMessageClient.platformStartCharging(platformStartCharging); +// //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 +// Long id = chargingOrder.getId(); +// //执行5分钟的定时任务检测 +// ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); +// scheduler.scheduleAtFixedRate(()->{ +// if(timingDetection(id)){ +// scheduler.shutdown(); +// } +// }, 5, 1, TimeUnit.SECONDS); + + //推送三方平台订单状态 + tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); + return R.ok(); + } + + + /** + * 三方平台停止充电操作 + * @param startChargeSeq + * @return + */ + @Override + public R tripartitePlatformStopCharge(String startChargeSeq) { + TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getStartChargeSeq, startChargeSeq)); + Integer status = order.getStatus(); + if(status != 3){ + return R.fail("还未开始充电"); + } + if(status == 4 || status == 5){ + return R.fail("不能重复操作"); + } + TChargingOrder chargingOrder = new TChargingOrder(); + chargingOrder.setId(order.getId()); + chargingOrder.setAppUserId(order.getOperatorId().longValue()); + chargingOrder.setEndTime(LocalDateTime.now()); + chargingOrder.setStatus(4); + chargingOrder.setEndMode(1); + this.updateById(chargingOrder); + + tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); + + String code1 = order.getCode(); + TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); + //异步线程处理停机 + ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1); + cachedThreadPool.execute(()->{ + //调用硬件停止充电,停止成功后开始计算费用退款 + TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData(); + PlatformStopCharging platformStopCharging = new PlatformStopCharging(); + platformStopCharging.setCharging_pile_code(chargingPile.getCode()); + platformStopCharging.setCharging_gun_code(chargingGun.getCode()); + sendMessageClient.platformStopCharging(platformStopCharging); + log.info(code1 + ":-------------------远程停止充电请求-------------------"); + log.info(platformStopCharging.toString()); + }); + return R.ok(); + } + + + /** + * 获取充电后没有扣除费用的数据 + * @return + */ + @Override + public R getNotPaymentChargingOrder() { + List<TChargingOrder> list = this.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getPaymentAmount, 0) + .ne(TChargingOrder::getElectricity, 0).in(TChargingOrder::getStatus, Arrays.asList(4, 5))); + List<Map<String, Object>> mapList = new ArrayList<>(); + for (TChargingOrder order : list) { + TransactionRecord transactionRecord = transactionRecordClient.findTransactionRecord(order.getCode()).getData(); + Map<String, Object> map = new HashMap<>(); + map.put("order", order); + map.put("transactionRecord", transactionRecord); + mapList.add(map); + } + return R.ok(mapList); + } + + + /** + * + * 手动推送订单给第三方平台 + * @param code + * @return + */ + @Override + public R pushOrderInfo(String code) { + TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); + tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); + tcecClient.notificationStopChargeResult(chargingOrder.getStartChargeSeq(), chargingOrder.getChargingGunId().toString(), + chargingOrder.getOperatorId()); + tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); + return R.ok(); + } + + + + + public R addChargingOrderSummaryData(){ + List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list(); + List<TChargingOrder> list1 = this.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0)); + for (TChargingOrder chargingOrderVO : list1) { + if(null == chargingOrderVO.getStatus() || 5 != chargingOrderVO.getStatus()){ + continue; + } + List<TChargingOrderAccountingStrategy> list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList()); + BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal serviceMoney = new BigDecimal("0"); + BigDecimal paymentMoney = new BigDecimal("0"); + if (!chargingOrderVO.getOrderSource().equals(2)) { + serviceMoney = serviceMoney.add(service_reduce); + paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce); + }else{ + serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8"))); + paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8"))); + } + Long time = 0L; + if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){ + LocalDateTime startTime = chargingOrderVO.getStartTime(); + LocalDateTime endTime = chargingOrderVO.getEndTime(); + // 计算时间差 单位秒 + long between = ChronoUnit.SECONDS.between(startTime, endTime); + time+=between; + } + + TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData(); + summaryData.setChargingOrderId(chargingOrderVO.getId()); + summaryData.setChargingCapacity(chargingCapacity); + summaryData.setChargingDuration(time); + summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN)); + chargingOrderSummaryDataService.save(summaryData); + } + return R.ok(); } } -- Gitblit v1.7.1