Pu Zhibing
2026-01-19 cf381adf7831c80feedd25cf9392e0f3dfbe46f6
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -785,15 +785,15 @@
      });
//      //异步线程检测远程启动的应答结果。如果失败,则需要全额退款
//      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();
      //执行10分钟的定时任务检测
      ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
      scheduler.scheduleAtFixedRate(()->{
         if(timingDetection(id)){
            scheduler.shutdown();
         }
      }, 10, 1, TimeUnit.SECONDS);
      return AjaxResult.success();
   }
   
@@ -814,14 +814,14 @@
      List<PlatformStartChargingReply> data = platformStartChargingReplyService.getPlatformStartChargingReply(code);
      log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString());
      Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
      if (data.size() != 0) {
      if (!data.isEmpty()) {
         PlatformStartChargingReply platformStartChargingReply = data.get(1);
         Integer startup_result = platformStartChargingReply.getStartup_result();
         Integer failure_cause = platformStartChargingReply.getFailure_cause();
         Integer counter = counter_map.get(code);
         PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
         //5分钟内还未插枪则取消充电,退回金额。
         if (failure_cause == 5 && (null == counter || counter < 1800)) {
         if (failure_cause == 5 && (null == counter || counter < 300)) {
            counter = (null == counter ? 0 : counter) + 1;
            counter_map.put(code, counter);
            //启动失败
@@ -837,27 +837,19 @@
            //启动失败
            preChargeCheck1.setStartupSuccess(3);
            preChargeCheck1.setFailureCause(failure_cause);
            chargingOrder.setStatus(2);
            chargingOrder.setEndMode(0);
            this.updateById(chargingOrder);
            //启动失败后取消订单,退款操作
            refund(code);
            chargingOrder.setStatus(-1);
            chargingOrder.setEndMode(0);
         } else {
            //启动成功
            preChargeCheck1.setStartupSuccess(2);
            chargingOrder.setStatus(3);
            chargingOrder.setStartTime(LocalDateTime.now());
            this.updateById(chargingOrder);
         }
         this.updateById(chargingOrder);
         if (chargingOrder.getStatus() == 3) {
            //推送监管平台订单状态
            new Thread(() -> {
               ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
               BeanUtils.copyProperties(chargingOrder, chargingOrderVo);
               chargingMessageClient.pushOrderStatus(chargingOrderVo);
            }).start();
         }
         redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
         //推送三方平台订单状态
         if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
@@ -865,6 +857,12 @@
         }
         ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
         threadPoolExecutor.execute(()->{
            if (chargingOrder.getStatus() == 3) {
               //推送监管平台订单状态
               ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
               BeanUtils.copyProperties(chargingOrder, chargingOrderVo);
               chargingMessageClient.pushOrderStatus(chargingOrderVo);
            }
            //推送成都监管
            NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
            vo.setOrderCode(chargingOrder.getCode());
@@ -873,47 +871,77 @@
         });
         return true;
      } else {
         Integer counter = boot_failed_map.get(code);
         log.info(code + ":-------------------未上传开启充电结果-------------------" + counter);
         PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
         //5分钟内未启动成功,退回金额。
         if (null == counter || counter < 1800) {
            counter = (null == counter ? 0 : counter) + 1;
            boot_failed_map.put(code, counter);
            //启动失败
            preChargeCheck1.setStartupSuccess(1);
            preChargeCheck1.setFailureCause(0);
         UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getDataByOrderCode(code, "desc");
         if(null != uploadRealTimeMonitoringData){
            //启动成功
            preChargeCheck1.setStartupSuccess(2);
            chargingOrder.setStatus(3);
            chargingOrder.setStartTime(LocalDateTime.now());
            this.updateById(chargingOrder);
            redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
            return false;
            //推送三方平台订单状态
            if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
               tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
            }
            ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
            threadPoolExecutor.execute(()->{
               if (chargingOrder.getStatus() == 3) {
                  //推送监管平台订单状态
                  ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
                  BeanUtils.copyProperties(chargingOrder, chargingOrderVo);
                  chargingMessageClient.pushOrderStatus(chargingOrderVo);
               }
               //推送成都监管
               NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
               vo.setOrderCode(chargingOrder.getCode());
               vo.setChargingGunId(chargingOrder.getChargingGunId());
               chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
            });
            return true;
         }else{
            Integer counter = boot_failed_map.get(code);
            log.info(code + ":-------------------未上传开启充电结果-------------------" + counter);
            //5分钟内未启动成功,退回金额。
            if (null == counter || counter < 300) {
               counter = (null == counter ? 0 : counter) + 1;
               boot_failed_map.put(code, counter);
               //启动失败
               preChargeCheck1.setStartupSuccess(1);
               preChargeCheck1.setFailureCause(0);
               redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
               return false;
            }
            //清除计时器中的无效数据
            boot_failed_map.remove(code);
            TChargingOrder order = new TChargingOrder();
            order.setId(id);
            order.setAppUserId(chargingOrder.getAppUserId());
            //启动失败
            preChargeCheck1.setStartupSuccess(3);
            preChargeCheck1.setFailureCause(0);
            order.setStatus(2);
            order.setEndMode(0);
            this.updateById(order);
            //启动失败后取消订单,退款操作
            refund(code);
            redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
            //推送三方平台订单状态
            if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
               tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
            }
            ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
            threadPoolExecutor.execute(()->{
               //推送成都监管
               NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
               vo.setOrderCode(chargingOrder.getCode());
               vo.setChargingGunId(chargingOrder.getChargingGunId());
               chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
            });
            return true;
         }
         //清除计时器中的无效数据
         boot_failed_map.remove(code);
         TChargingOrder order = new TChargingOrder();
         order.setId(id);
         order.setAppUserId(chargingOrder.getAppUserId());
         //启动失败
         preChargeCheck1.setStartupSuccess(3);
         preChargeCheck1.setFailureCause(0);
         //启动失败后取消订单,退款操作
         refund(code);
         order.setStatus(-1);
         order.setEndMode(0);
         this.updateById(order);
         redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
         //推送三方平台订单状态
         if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
            tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
         }
         ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
         threadPoolExecutor.execute(()->{
            //推送成都监管
            NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
            vo.setOrderCode(chargingOrder.getCode());
            vo.setChargingGunId(chargingOrder.getChargingGunId());
            chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
         });
         return true;
      }
   }
   
@@ -963,15 +991,17 @@
         //启动失败
         preChargeCheck1.setStartupSuccess(3);
         preChargeCheck1.setFailureCause(failure_cause);
         order.setStatus(2);
         order.setEndMode(0);
         this.updateById(order);
         //启动失败后取消订单,退款操作
         refund(code);
         order.setStatus(-1);
         order.setEndMode(0);
      } else {
         //启动成功
         preChargeCheck1.setStartupSuccess(2);
         order.setStatus(3);
         order.setStartTime(LocalDateTime.now());
         this.updateById(order);
         TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
         chargingGun.setStatus(4);
         chargingGunClient.updateChargingGunById(chargingGun);
@@ -981,7 +1011,6 @@
         }
      }
      redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS);
      this.updateById(order);
      
      if (3 == order.getStatus()) {
         //推送监管平台订单状态
@@ -1004,8 +1033,6 @@
            tcecClient.notificationStartChargeResult(result);
            tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
         }
      }
   }
   
@@ -1585,16 +1612,7 @@
      if (siteIds.isEmpty()) siteIds.add(-1);
      dto.setSiteIds(siteIds);
      List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
      BigDecimal total = new BigDecimal("0");
      long time = 0L;
      BigDecimal electronicMoney = new BigDecimal("0");
      BigDecimal serviceMoney = new BigDecimal("0");
      BigDecimal commissionMoney = new BigDecimal("0");
//       BigDecimal refundMoney = new BigDecimal("0");
      BigDecimal paymentMoney = new BigDecimal("0");
      List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
      for (ChargingOrderVO chargingOrderVO : list) {
         if (roleType == 2) {
            for (Integer siteId : siteIds) {
@@ -1662,9 +1680,9 @@
      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));
         tCharingOrderVO.setIncome(map.get("income") == null ? BigDecimal.ZERO : ((BigDecimal) map.get("income")).setScale(2, RoundingMode.HALF_EVEN));
         tCharingOrderVO.setElectronicMoney(map.get("electronicMoney") == null ? BigDecimal.ZERO : ((BigDecimal) map.get("electronicMoney")).setScale(2, RoundingMode.HALF_EVEN));
         tCharingOrderVO.setServiceMoney(map.get("serviceMoney") == null ? BigDecimal.ZERO : ((BigDecimal) map.get("serviceMoney")).setScale(2, RoundingMode.HALF_EVEN));
      } else {
         tCharingOrderVO.setTotal(BigDecimal.ZERO);
         tCharingOrderVO.setTime(0L);
@@ -1770,14 +1788,17 @@
      String startTime2 = null;
      String endTime1 = null;
      String endTime2 = null;
      List<TChargingGun> allGun = chargingGunClient.getAllGun().getData();
      List<TChargingPile> allPile = chargingGunClient.getAllPile().getData();
      if (StringUtils.hasLength(dto.getStartTime())) {
         String[] split = dto.getStartTime().split(" - ");
         startTime1 = split[0];
         startTime2 = split[1];
      }
      if (StringUtils.hasLength(dto.getEndTime())) {
         String[] split = dto.getEndTime().split(" - ");
         endTime1 = split[0];
         endTime2 = split[1];
      }
      ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO();
      if (StringUtils.hasLength(dto.getPhone())) {
@@ -1967,12 +1988,16 @@
      List<ChargingOrderListVO> list = new ArrayList<>();
      List<Map<String, Object>> maps = this.baseMapper.chargingList1(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
      for (Map<String, Object> map : maps) {
         if(null == map){
            continue;
         }
         ChargingOrderListVO chargingOrderListVO = new ChargingOrderListVO();
         if (roleType == 2) {
            List<Boolean> data = partnerClient.getChargingListMenu(sysUser.getObjectId(), chargingOrderListVO.getSiteId()).getData();
            List<Boolean> data = partnerClient.getChargingListMenu(sysUser.getObjectId(), Integer.valueOf(map.get("siteId").toString())).getData();
            chargingOrderListVO.setAuthInfo(data.get(0));
            chargingOrderListVO.setAuthCurve(data.get(1));
         }
         chargingOrderListVO.setUid(map.get("id").toString());
         chargingOrderListVO.setCode(map.get("code").toString());
         chargingOrderListVO.setSiteName(map.get("siteName").toString());
         chargingOrderListVO.setOrderType(map.get("orderType").toString());
@@ -2082,6 +2107,9 @@
      List<Map<String, Object>> list1 = this.baseMapper.chargingListSum(dto, startTime1, startTime2, endTime1, endTime2);
      chargingOrderTimeVO.setOrderCount(list1.size());
      for (Map<String, Object> map : list1) {
         if(null == map){
            continue;
         }
         electronic = electronic.add(new BigDecimal(null == map.get("electronic") ? "0" : map.get("electronic").toString()));
         paymentAmount = paymentAmount.add(new BigDecimal(null == map.get("paymentAmount") ? "0" : map.get("paymentAmount").toString()));
         electrovalence = electrovalence.add(new BigDecimal(null == map.get("electrovalence") ? "0" : map.get("electrovalence").toString()));
@@ -2156,13 +2184,16 @@
      String endTime1 = null;
      String endTime2 = null;
      List<TChargingGun> allGun = chargingGunClient.getAllGun().getData();
      List<TChargingPile> allPile = chargingGunClient.getAllPile().getData();
      if (StringUtils.hasLength(dto.getStartTime())) {
         String[] split = dto.getStartTime().split(" - ");
         startTime1 = split[0];
         startTime2 = split[1];
      }
      if (StringUtils.hasLength(dto.getEndTime())) {
         String[] split = dto.getEndTime().split(" - ");
         endTime1 = split[0];
         endTime2 = split[1];
      }
      if (StringUtils.hasLength(dto.getPhone())) {
         List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
@@ -2228,32 +2259,7 @@
         }
      }
      dto.setSiteIds(siteIds);
      List<Site> sites = siteClient.getSiteAll().getData();
      // 不分页
      PageInfo<ChargingOrderListVO> pageInfo1 = new PageInfo<>(1, 999999999);
      List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(pageInfo1, dto, startTime1, startTime2, endTime1, endTime2);
      for (ChargingOrderListVO chargingOrderListVO : list1) {
         List<Integer> integers = new ArrayList<>();
         integers.add(chargingOrderListVO.getSiteId());
         Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null);
         if (site != null) {
            chargingOrderListVO.setSiteName(site.getName());
         }
         if (chargingOrderListVO.getStartTime() != null && chargingOrderListVO.getEndTime() != null) {
            LocalDateTime startTime = chargingOrderListVO.getStartTime();
            LocalDateTime endTime = chargingOrderListVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            chargingOrderListVO.setChargingSecond(between);
         }
         if (chargingOrderListVO.getChargingGunId() != null && chargingOrderListVO.getChargingPileId() != null) {
            TChargingGun data1 = allGun.stream().filter(e -> e.getId().equals(chargingOrderListVO.getChargingGunId())).findFirst().orElse(null);
            TChargingPile data2 = allPile.stream().filter(e -> e.getId().equals(chargingOrderListVO.getChargingPileId())).findFirst().orElse(null);
            if (data2 != null && data1 != null) {
               chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
            }
         }
      }
      List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(dto, startTime1, startTime2, endTime1, endTime2);
      return list1;
   }
   
@@ -2308,7 +2314,7 @@
      
      // 获取开始SOC 结束soc
      if (chargingOrder.getCode() != null) {
         List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
         List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCodeAsc(chargingOrder.getCode());
         if (data6 != null) {
            for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
               if (uploadRealTimeMonitoringData.getOutput_current() != null &&
@@ -2490,6 +2496,12 @@
         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<>();
         List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
         if(!dataList.isEmpty()){
            vo.setStart_time(sdfs.format(dataList.get(dataList.size() - 1).getCreate_time()) + ".00");
            vo.setEnd_time(sdfs.format(dataList.get(0).getCreate_time()) + ".00");
         }
         //跨天
         if (!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])) {
            //当天的
@@ -2686,13 +2698,7 @@
         }
         chargingOrder.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
         List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         if(dataList.isEmpty()){
            chargingOrder.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
         }else{
            chargingOrder.setStartTime(LocalDateTime.parse(sdf.format(dataList.get(dataList.size() - 1).getCreate_time()), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         }
         chargingOrder.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
         chargingOrder.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
         chargingOrder.setStatus(5);
         chargingOrder.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
@@ -3281,6 +3287,8 @@
         vipOrderRefund.setVipOrderId(vipOrder.getId());
         vipOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
         vipOrderRefund.setRefundStatus(1);
         vipOrderRefund.setPayTime(vipOrder.getPayTime());
         vipOrderRefund.setPayCode(vipOrder.getCode());
         vipOrderRefund.setPayType(vipOrder.getPaymentType());
         vipOrderRefund.setRefundTime(LocalDateTime.now());
         vipOrderRefund.setCode(vipOrder.getCode());
@@ -4594,4 +4602,35 @@
   public List<TChargingOrder> findEndChargingOrder() {
      return this.baseMapper.findEndChargingOrder();
   }
   /**
    * 获取需要手动修改订单状态的数据
    * @return
    */
   @Override
   public List<TChargingOrder> findUpStatusChargingOrder() {
      return this.baseMapper.findUpStatusChargingOrder();
   }
   /**
    * 查询充电算账单数据
    * @param startTime
    * @param endTime
    */
   @Override
    public List<Map<String, Object>> getChargingSettlementBill(String startTime, String endTime, Integer dateType) {
      return this.baseMapper.getChargingSettlementBill(startTime, endTime, dateType);
    }
   /**
    * 查询账户结算账单数据
    * @param startTime
    * @param endTime
    * @return
    */
   @Override
   public List<Map<String, Object>> getAccountSettlementStatement(String startTime, String endTime, Integer rechargePaymentType) {
      return this.baseMapper.getAccountSettlementStatement(startTime, endTime, rechargePaymentType);
   }
}