From 1266ed302b259f09a9370bc4315316b8a212b5d0 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期日, 26 一月 2025 11:42:35 +0800 Subject: [PATCH] 修改bug --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 286 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 241 insertions(+), 45 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 30f0176..461958a 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 @@ -32,6 +32,7 @@ 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.AccountingStrategyOrderClient; @@ -80,6 +81,7 @@ 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.*; @@ -140,7 +142,7 @@ private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; @Resource - private ChargingHandshakeClient chargingHandshakeClient; + private TCECClient tcecClient; @Resource private SendMessageClient sendMessageClient; @@ -201,6 +203,9 @@ //计数器 private Map<String, Integer> boot_failed_map = new HashMap<>(); + + @Resource + private OperatorClient operatorClient; @@ -464,7 +469,7 @@ chargingOrder.setRechargeAmount(addChargingOrder.getPaymentAmount()); chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId()); chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); - chargingOrder.setOrderSource(0); + chargingOrder.setOrderSource(1); chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪"); Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0); @@ -743,6 +748,10 @@ } 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); @@ -773,6 +782,10 @@ 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; } } @@ -832,9 +845,24 @@ TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); chargingGun.setStatus(4); chargingGunClient.updateChargingGunById(chargingGun); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(chargingGun.getId(), 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()); + } } /** @@ -844,7 +872,7 @@ 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(); //构建退款明细 @@ -999,7 +1027,6 @@ chargingOrder.setStatus(4); chargingOrder.setEndMode(1); this.updateById(chargingOrder); - String code1 = order.getCode(); TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); //异步线程处理停机 @@ -1014,6 +1041,11 @@ log.info(code1 + ":-------------------远程停止充电请求-------------------"); log.info(platformStopCharging.toString()); }); + //推送三方平台 + if(2 == order.getOrderSource()){ + tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); + } + return AjaxResult.success(); } @@ -1147,7 +1179,7 @@ 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() != 3){ + if(null != order && order.getStatus() != 4){ return; } @@ -1260,16 +1292,6 @@ BigDecimal refundMoney = new BigDecimal("0"); BigDecimal paymentMoney = new BigDecimal("0"); List<String> collect2 = list.stream().map(TChargingOrder::getCode).collect(Collectors.toList()); - StringBuilder stringBuilder2 = new StringBuilder(); - List<UploadRealTimeMonitoringData> uploadRealTimeMonitoringData2 = new ArrayList<>(); - for (String s : collect2) { - stringBuilder2.append(s).append(","); - } - if (stringBuilder2.length()>0){ - StringBuilder ids = stringBuilder2.deleteCharAt(stringBuilder2.length() - 1); - uploadRealTimeMonitoringData2 = uploadRealTimeMonitoringDataClient.getOrderInfoByCodes(ids.toString()).getData(); - - } for (ChargingOrderVO chargingOrderVO : list) { if (roleType == 2){ for (Integer siteId : siteIds) { @@ -1296,11 +1318,13 @@ // 充电订单 明细记录 List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>() .eq("charging_order_id", chargingOrderVO.getId())); - UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringData2.stream().filter(e -> e.getTransaction_serial_number().equals(chargingOrderVO.getCode())) - .findFirst().orElse(null); - if (data5!=null && data5.getCumulative_charging_time()!=null){ - long l = data5.getCumulative_charging_time() * 60L; - chargingOrderVO.setChargingSecond(l); + 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); + } // 充电时段数 int size = chargingOrderId.size(); @@ -1321,17 +1345,13 @@ } } - List<String> collect = list1.stream().map(TChargingOrder::getCode).collect(Collectors.toList()); - StringBuilder stringBuilder = new StringBuilder(); - List<UploadRealTimeMonitoringData> uploadRealTimeMonitoringData = new ArrayList<>(); - for (String s : collect) { - stringBuilder.append(s).append(","); - } - if (stringBuilder.length()>0){ - StringBuilder ids = stringBuilder.deleteCharAt(stringBuilder.length() - 1); - uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataClient.getOrderInfoByCodes(ids.toString()).getData(); - } + + 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")); @@ -1339,19 +1359,17 @@ if (chargingOrderVO.getChargingCapacity()!=null){ total = total.add(chargingOrderVO.getElectricity()!=null?chargingOrderVO.getElectricity():new BigDecimal("0")); } - UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringData.stream().filter(e -> e.getTransaction_serial_number().equals(chargingOrderVO.getCode())) - .findFirst().orElse(null); - if (data5!=null && data5.getCumulative_charging_time()!=null){ - long l = data5.getCumulative_charging_time() * 60L; - chargingOrderVO.setChargingSecond(l); - time+=l; + 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 = chargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getRefundStatus, 2) - .eq(TChargingOrderRefund::getChargingOrderId, chargingOrderVO.getId()).list(); + List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId())) + .collect(Collectors.toList()); for (TChargingOrderRefund tChargingOrderRefund : list2) { - if (tChargingOrderRefund.getRefundStatus()==2){ 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")); @@ -1640,6 +1658,21 @@ // 不分页 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.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){ + TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData(); + TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderListVO.getChargingPileId()).getData(); + if (data2 != null && data1 != null) { + chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName()); + } + } + } chargingOrderTimeVO.setExportList(list1); chargingOrderTimeVO.setOrderCount(list1.size()); // 计算充电总度数 @@ -2251,6 +2284,14 @@ 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){ @@ -2272,6 +2313,8 @@ chargingGun.setStatus(2); chargingGun.setChargingPower(BigDecimal.ZERO); chargingGunClient.updateChargingGunById(chargingGun); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(chargingGun.getId(), chargingGun.getStatus()); //添加积分 TIntegralRule integralRule = integralRuleClient.getSet().getData(); @@ -2309,6 +2352,7 @@ referralReward(chargingOrder); //开始构建退款费用 + refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN); if(refundAmount.compareTo(BigDecimal.ZERO) > 0){ Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); //构建退款明细 @@ -2346,15 +2390,13 @@ if(2 == rechargePaymentType){ RefundReq dto = new RefundReq(); dto.setOutTradeNo(chargingOrder.getCode()); - dto.setOutRequestNo(chargingOrderRefund.getCode()); + dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); dto.setRefundAmount(refundAmount.toString()); dto.setRefundReason("充电完成退款"); RefundResp resp = aliPaymentClient.refund(dto).getData(); if(null != resp){ - AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", null); - if(success.isSuccess()){ - chargingOrderRefundService.save(chargingOrderRefund); - } + chargingOrderRefundService.save(chargingOrderRefund); + this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); } } @@ -3973,4 +4015,158 @@ 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.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪"); + chargingOrder.setStatus(2); + chargingOrder.setPayTime(LocalDateTime.now()); + chargingOrder.setChargeAmount(chargingOrder.getRechargeAmount()); + chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); + 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(); + } } -- Gitblit v1.7.1