From 4c77ac6367145e4740141e872e1cda1c16efa9b1 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期一, 09 六月 2025 15:17:16 +0800 Subject: [PATCH] 优化功能及重复退款问题 --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 1283 +++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 770 insertions(+), 513 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 ba79837..654db7e 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 @@ -21,7 +21,6 @@ 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; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; @@ -50,6 +49,9 @@ import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TOrderEvaluateService; import com.ruoyi.order.service.*; +import com.ruoyi.order.util.mongodb.service.PlatformStartChargingReplyService; +import com.ruoyi.order.util.mongodb.service.TransactionRecordService; +import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService; import com.ruoyi.order.vo.EndOfChargePageInfo; import com.ruoyi.other.api.domain.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; @@ -140,7 +142,7 @@ private RedisService redisService; @Resource - private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; + private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService; @Resource private TCECClient tcecClient; @@ -161,7 +163,7 @@ private AccountingStrategyClient accountingStrategyClient; @Resource - private PlatformStartChargingReplyClient platformStartChargingReplyClient; + private PlatformStartChargingReplyService platformStartChargingReplyService; @Resource private TChargingOrderRefundService chargingOrderRefundService; @@ -196,9 +198,6 @@ @Resource private SecurityDetectionClient securityDetectionClient; - @Resource - private BmsDemandAndChargerExportationClient bmsDemandAndChargerExportationClient; - //计数器 private Map<String, Integer> counter_map = new HashMap<>(); @@ -209,7 +208,10 @@ private OperatorClient operatorClient; @Resource - private TransactionRecordClient transactionRecordClient; + private TransactionRecordService transactionRecordService; + + @Resource + private ITChargingOrderSummaryDataService chargingOrderSummaryDataService; @@ -283,8 +285,12 @@ }else{ myChargingOrderInfo.setLicensePlate(chargingOrder.getPlateNum()); } - myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); - myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); + if(null != chargingOrder.getStartTime()){ + myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); + } + if(null != chargingOrder.getEndTime()){ + myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); + } myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount()); myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount()); myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount()); @@ -296,7 +302,7 @@ .orderByAsc(TChargingOrderAccountingStrategy::getStartTime) ); myChargingOrderInfo.setStageCost(stageCost); - List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData(); + List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode()); if(null != dataList){ //在MongoDB中获取数据 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); @@ -382,7 +388,6 @@ * @return */ @Override - @GlobalTransactional(rollbackFor = Exception.class) public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) { Long userId = tokenService.getLoginUserApplet().getUserId(); TAppUser appUser = appUserClient.getUserById(userId).getData(); @@ -569,7 +574,6 @@ * @return */ @Override - @GlobalTransactional(rollbackFor = Exception.class) public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) { TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no)); if(chargingOrder.getRechargePaymentStatus() == 2){ @@ -648,21 +652,19 @@ long times = rechargeAmount1.divide(s_total_amount, 0, RoundingMode.DOWN).longValue(); if(times > m){ //充电时间跨度两个计费策略,需要继续对下一个策略进行计算 - serviceCharge = s_server_amount.multiply(new BigDecimal(m)); + serviceCharge = serviceCharge.add(s_server_amount.multiply(new BigDecimal(m))); rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m))); - if(null != discount){ - discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount))); - } nowTimeMillis = null; }else{ - serviceCharge = s_server_amount.multiply(new BigDecimal(times)); - if(null != discount){ - discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount))); - } + 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(); @@ -673,9 +675,12 @@ } } discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN); + if(discountAmount.compareTo(BigDecimal.ZERO) >= 0){ + data.setChargeNum(data.getChargeNum() - 1); + appUserVipDetailClient.updateAppUserVipDetail(data); + } } } - //机子上显示的金额为用户充值的金额+会员折扣金额 BigDecimal account_balance = chargingOrder.getRechargeAmount().add(discountAmount).setScale(4, RoundingMode.HALF_EVEN); @@ -696,15 +701,15 @@ 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); +// //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 +// Long id = chargingOrder.getId(); +// //执行5分钟的定时任务检测 +// ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); +// scheduler.scheduleAtFixedRate(()->{ +// if(timingDetection(id)){ +// scheduler.shutdown(); +// } +// }, 5, 1, TimeUnit.SECONDS); return AjaxResult.success(); } @@ -721,7 +726,7 @@ } String code = chargingOrder.getCode(); String key = "AQJC_" + chargingOrder.getChargingGunId(); - List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData(); + List<PlatformStartChargingReply> data = platformStartChargingReplyService.getPlatformStartChargingReply(code); log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString()); if(data.size() != 0){ PlatformStartChargingReply platformStartChargingReply = data.get(1); @@ -730,7 +735,7 @@ Integer counter = counter_map.get(code); PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); //5分钟内还未插枪则取消充电,退回金额。 - if(failure_cause == 5 && (null == counter || counter < 300)){ + if(failure_cause == 5 && (null == counter || counter < 1800)){ counter = (null == counter ? 0 : counter) + 1; counter_map.put(code, counter); //启动失败 @@ -771,7 +776,7 @@ log.info(code + ":-------------------未上传开启充电结果-------------------" + counter); PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); //5分钟内未启动成功,退回金额。 - if(null == counter || counter < 300){ + if(null == counter || counter < 1800){ counter = (null == counter ? 0 : counter) + 1; boot_failed_map.put(code, counter); //启动失败 @@ -920,9 +925,22 @@ chargingOrderRefundService.save(chargingOrderRefund); //手续费 Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount"); - BigDecimal refund_fee = new BigDecimal(amount1.get("refund_fee").toString()).divide(new BigDecimal(100)); + 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){ @@ -934,6 +952,19 @@ RefundResp resp = aliPaymentClient.refund(dto).getData(); if(null != resp){ 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) { @@ -943,6 +974,73 @@ } } + } + } + + + + 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); + } + } + } } @@ -998,7 +1096,7 @@ chargingDetails.setCode(one.getCode()); chargingDetails.setStatus(one.getStatus()); chargingDetails.setChargingCost(one.getResidualAmount()); - UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(one.getCode()).getData(); + UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(one.getCode()); if(null != data){ chargingDetails.setChargeCurrent(data.getOutput_current()); chargingDetails.setChargeVoltage(data.getOutput_voltage()); @@ -1027,7 +1125,6 @@ * @return */ @Override - @GlobalTransactional(rollbackFor = Exception.class) public AjaxResult stopCharging(String id) { TChargingOrder order = this.getById(id); Integer status = order.getStatus(); @@ -1243,7 +1340,6 @@ List<TChargingPile> allPile = chargingGunClient.getAllPile().getData(); List<Site> data9 = siteClient.getSiteAll().getData(); List<TAppUser> data6 = appUserClient.getAllUser().getData(); - List<Partner> data7 = siteClient.getAllPartner().getData(); List<TAppUserCar> data4 = appUserCarClient.getAllCar().getData(); String startTime1 = null; String startTime2 = null; @@ -1261,7 +1357,6 @@ endTime2 = split[1]; } PageInfo<ChargingOrderVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); - PageInfo<ChargingOrderVO> pageInfo1 = new PageInfo<>(1,999999999); if (StringUtils.hasLength(dto.getPhone())){ List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); @@ -1307,17 +1402,14 @@ if (siteIds.isEmpty())siteIds.add(-1); dto.setSiteIds(siteIds); List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); - List<ChargingOrderVO> list1 = this.baseMapper.chargingOrder(pageInfo1,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"); BigDecimal commissionMoney = new BigDecimal("0"); - BigDecimal refundMoney = new BigDecimal("0"); +// BigDecimal refundMoney = new BigDecimal("0"); BigDecimal paymentMoney = new BigDecimal("0"); - List<String> collect2 = list.stream().map(TChargingOrder::getCode).collect(Collectors.toList()); - List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>()); + List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list(); for (ChargingOrderVO chargingOrderVO : list) { if (roleType == 2){ @@ -1326,7 +1418,6 @@ List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData(); chargingOrderVO.setAuthRecord(t1.get(0)); } - } 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")); @@ -1350,7 +1441,17 @@ // 计算时间差 单位秒 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(); @@ -1374,42 +1475,54 @@ } } - - List<Long> orderIds = list1.stream().map(TChargingOrder::getId).collect(Collectors.toList()); - if(orderIds.isEmpty())orderIds.add(-1L); - List<TChargingOrderRefund> chargingOrderRefunds = chargingOrderRefundService.lambdaQuery() - .in(TChargingOrderRefund::getChargingOrderId, orderIds) - .eq(TChargingOrderRefund::getRefundStatus,2).list(); - - for (ChargingOrderVO chargingOrderVO : list1) { - paymentMoney= paymentMoney.add(chargingOrderVO.getPaymentAmount()!=null?chargingOrderVO.getPaymentAmount():new BigDecimal("0")); - if (chargingOrderVO.getRechargeAmount()!=null){ - commissionMoney = commissionMoney.add(chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN)); - } - if (chargingOrderVO.getChargingCapacity()!=null){ - total = total.add(chargingOrderVO.getElectricity()!=null?chargingOrderVO.getElectricity():new BigDecimal("0")); - } - 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()); - } - electronicMoney = electronicMoney.add(chargingOrderVO.getElectrovalence()!=null?chargingOrderVO.getElectrovalence():new BigDecimal("0")); - serviceMoney = serviceMoney.add(chargingOrderVO.getServiceCharge()!=null?chargingOrderVO.getServiceCharge():new BigDecimal("0")); +// 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); } - tCharingOrderVO.setTotal(total); - tCharingOrderVO.setTime(time); -// tCharingOrderVO.setIncome(paymentMoney.subtract(commissionMoney)); - tCharingOrderVO.setIncome(paymentMoney); - tCharingOrderVO.setElectronicMoney(electronicMoney); - tCharingOrderVO.setServiceMoney(serviceMoney); pageInfo.setRecords(list); tCharingOrderVO.setList(pageInfo); return tCharingOrderVO; @@ -1459,37 +1572,49 @@ } @Override - public Map<String, Object> countAll(LocalDate sixBefore,List<Integer> siteIds) { - return this.baseMapper.countAll(sixBefore,siteIds); + 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; + + @Override public ChargingOrderTimeVO chargingList(ChargingListQuery dto) { String startTime1 = null; @@ -1611,7 +1736,7 @@ } // 获取开始SOC 结束soc if (chargingOrderListVO.getCode()!=null){ - List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrderListVO.getCode()).getData(); + List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrderListVO.getCode()); if (data6!=null && !data6.isEmpty()){ int min = 100; @@ -1688,7 +1813,13 @@ "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); @@ -1740,69 +1871,105 @@ BigDecimal feng = new BigDecimal("0"); BigDecimal ping = new BigDecimal("0"); BigDecimal gu = new BigDecimal("0"); - List<Long> collect = list1.stream().map(ChargingOrderListVO::getId).collect(Collectors.toList()); - List<TChargingOrderAccountingStrategy> chargingOrderAccountingStrategies = chargingOrderAccountingStrategyService.lambdaQuery() - .in(TChargingOrderAccountingStrategy::getChargingOrderId,collect).list(); + List<TChargingOrderAccountingStrategy> chargingOrderAccountingStrategies = chargingOrderAccountingStrategyService.list(); for (ChargingOrderListVO chargingOrderListVO : list1) { - if (chargingOrderListVO.getChargingCapacity()!=null)electronic = electronic.add(chargingOrderListVO.getElectricity()); - - 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 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId())) - .collect(Collectors.toList()); - 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"+"%/" @@ -1878,7 +2045,7 @@ // 获取开始SOC 结束soc if (chargingOrder.getCode()!=null){ - List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData(); + List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode()); if (data6!=null){ for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) { if (uploadRealTimeMonitoringData.getOutput_current()!=null&& @@ -1932,7 +2099,12 @@ chargingOrderListInfoVO.setUid(chargingOrder.getId().toString()); chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount()); chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount()); - chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount()); + 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()) @@ -1947,7 +2119,6 @@ * @param query */ @Override - @GlobalTransactional(rollbackFor = Exception.class) public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) { if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())){ //获取当前的计费策略 @@ -1973,10 +2144,6 @@ 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); } } @@ -1987,7 +2154,6 @@ * @param orderCode */ @Override - @GlobalTransactional(rollbackFor = Exception.class) public void endCharge(String orderCode, Integer endMode) { TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode)); TChargingOrder chargingOrder = new TChargingOrder(); @@ -2012,32 +2178,38 @@ * @param vo */ @Override - @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){ + Boolean hasKey = redisService.hasKey("endOrder:" + vo.getTransaction_serial_number()); + if(hasKey){ return R.ok(); } - Integer status = chargingOrder.getStatus(); - if(status == 5){ - return R.ok(); - } - - //如果使用优惠券需要判断优惠券是否满足使用条件 - //根据实际的充电金额计算退款金额 退回费用=(原金额/总金额)*(总金额-实际充电金额) - //退款金额=优惠券金额+剩余充电金额 - BigDecimal periodElectricPrice_total = BigDecimal.ZERO; - BigDecimal periodServicePrice_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<>(); + //添加1分钟的缓存 + redisService.setCacheObject("endOrder:" + vo.getTransaction_serial_number(), vo.getTransaction_serial_number(), 1L, TimeUnit.MINUTES); try { + 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<>(); //跨天 if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){ //当天的 @@ -2084,7 +2256,7 @@ AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); BeanUtils.copyProperties(strategyDetail, vo1); vo1.setChargingCapacity(sharp_peak_charge); - lists.add(vo1); + lists.add(0, vo1); } //第二天的 @@ -2158,311 +2330,330 @@ 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); - periodServicePrice_total = periodServicePrice_total.add(originalServicePrice); - total = total.add(electrovalenc.add(originalServicePrice)); - } - - //原金额 - 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 orderAmount = BigDecimal.valueOf(total.doubleValue()); - BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue()); - //折扣金额 - BigDecimal discountAmount = BigDecimal.ZERO; - if(null != chargingOrder.getVipDiscount()){ - 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.getChargeNum() > 0){ - data.setChargeNum(data.getChargeNum() - 1); - appUserVipDetailClient.updateAppUserVipDetail(data); - - //服务费折扣 - discountAmount = periodServicePrice_total.multiply((new BigDecimal(1).subtract(chargingOrder.getVipDiscount()))); - 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); - payAmount = payAmount.subtract(discountAmount); - periodServicePrice_total = periodServicePrice_total.subtract(discountAmount); - - 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.setVipDiscountAmount(discountAmount.setScale(2, RoundingMode.HALF_EVEN)); - order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN)); - order.setChargingCapacity(vo.getTotal_electricity()); - order.setElectricity(vo.getTotal_electricity()); - - //计算优惠券 - 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(periodServicePrice_total.compareTo(couponDiscountAmount) < 0){ - couponDiscount = periodServicePrice_total; - periodServicePrice_total = BigDecimal.ZERO; - }else{ - couponDiscount = couponDiscountAmount; - } - appCoupon.setStatus(2); - appCouponClient.updateAppCoupon(appCoupon); + //开始处理明细 + 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{ - order.setAppCouponId(null); - order.setCouponDiscountAmount(BigDecimal.ZERO); - appCouponClient.refund(chargingOrder.getAppCouponId().toString()); + 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 = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode()); + 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); } } - 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(periodServicePrice_total.compareTo(divide) < 0){ - couponDiscount = periodServicePrice_total; - periodServicePrice_total = BigDecimal.ZERO; + 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{ - couponDiscount = divide; + 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; + } } - 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(periodServicePrice_total.compareTo(BigDecimal.ZERO) > 0){ - periodServicePrice_total = periodServicePrice_total.subtract(couponDiscount); - } - order.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN)); - order.setServiceCharge(periodServicePrice_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()){ - tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); - tcecClient.notificationStopChargeResult(chargingOrder.getStartChargeSeq(), chargingOrder.getChargingGunId().toString(), - chargingOrder.getOperatorId()); - tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); - } - - //开始将优惠券优惠的金额添加到明细中 - 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); } } - 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"); - BigDecimal refund_fee = new BigDecimal(amount1.get("refund_fee").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); - } - } + //计算用户标签 + 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); + }catch (Exception e) { + e.printStackTrace(); + }finally { + redisService.deleteObject("endOrder:" + vo.getTransaction_serial_number()); } return R.ok(); } @@ -2471,8 +2662,11 @@ @Override - public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) { - return this.baseMapper.getByDate(chargingOrderIds); + 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 @@ -2485,10 +2679,7 @@ return this.baseMapper.queryPowerLevel(siteIds,statisticsQueryDto); } - @Override - public List<Map<String, Object>> queryOrderCountAndMoneyBySiteIdDate(List<Integer> siteIds) { - return this.baseMapper.queryOrderCountAndMoneyBySiteIdDate(siteIds); - } + @Override public List<Map<String, Object>> usersDay(ChargingStatisticsQueryDto statisticsQueryDto) { @@ -2610,7 +2801,8 @@ chargingOrderRefundService.save(chargingOrderRefund); //手续费 Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount"); - BigDecimal refund_fee = new BigDecimal(amount1.get("refund_fee").toString()).divide(new BigDecimal(100)); + 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); } @@ -2677,7 +2869,8 @@ shoppingOrderRefundService.save(chargingOrderRefund); //手续费 Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount"); - BigDecimal refund_fee = new BigDecimal(amount1.get("refund_fee").toString()).divide(new BigDecimal(100)); + 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); } @@ -2741,7 +2934,8 @@ vipOrderRefundService.save(chargingOrderRefund); //手续费 Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount"); - BigDecimal refund_fee = new BigDecimal(amount1.get("refund_fee").toString()).divide(new BigDecimal(100)); + 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); } @@ -2782,6 +2976,8 @@ @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()); @@ -2808,9 +3004,7 @@ // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表 QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>() - .eq("site_id", dto.getSiteId()) - .eq("status", 5) - .eq("recharge_payment_status",2); + .eq("site_id", dto.getSiteId()); switch (dto.getType()){ case 1: eq.between("pay_time", localDateTime, localDateTime1); @@ -2839,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){ @@ -2865,11 +3074,7 @@ if (tChargingOrder.getCouponDiscountAmount()!=null){ couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount()); } - if (tChargingOrder.getPaymentAmount()!=null){ - paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount()); - orderCommission = orderCommission.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006")) - .setScale(2,BigDecimal.ROUND_DOWN)); - } + } @@ -3029,13 +3234,9 @@ 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)); - List<TChargingOrderRefund> totalRefund = chargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getRefundStatus, 2).list(); + .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getStatus, 5)); SettlementTotalVO res = new SettlementTotalVO(); List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time,siteIds); LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); @@ -3072,8 +3273,6 @@ 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"); @@ -3148,7 +3347,6 @@ for (TChargingPile datum : data) { bigDecimal = bigDecimal.add(datum.getRatedPower()); } - tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge())); //利用率=充电量/(桩数量*功率*时间) @@ -3238,7 +3436,6 @@ 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); @@ -3683,7 +3880,6 @@ chargingOrder.setStatus(2); chargingOrder.setPayTime(LocalDateTime.now()); chargingOrder.setChargeAmount(chargingOrder.getRechargeAmount()); - chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); this.save(chargingOrder); Integer accountingStrategyId = tChargingGun.getAccountingStrategyId(); @@ -3730,15 +3926,15 @@ 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); +// //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 +// 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()); @@ -3799,7 +3995,7 @@ .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(); + TransactionRecord transactionRecord = transactionRecordService.findOne(order.getCode()); Map<String, Object> map = new HashMap<>(); map.put("order", order); map.put("transactionRecord", transactionRecord); @@ -3807,4 +4003,65 @@ } 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