| | |
| | | import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; |
| | | import com.ruoyi.integration.api.feignClient.*; |
| | | import com.ruoyi.integration.api.model.*; |
| | | import com.ruoyi.integration.api.vo.ChargingOrderVo; |
| | | 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.service.TChargingOrderService; |
| | | import com.ruoyi.order.service.TOrderEvaluateService; |
| | | import com.ruoyi.order.service.*; |
| | | import com.ruoyi.order.util.RedisLock; |
| | | 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.system.api.domain.SysUser; |
| | | import com.ruoyi.system.api.feignClient.SysUserClient; |
| | | import io.seata.spring.annotation.GlobalTransactional; |
| | | import org.redisson.Redisson; |
| | | import org.redisson.api.RLock; |
| | | import org.redisson.api.RedissonClient; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | |
| | | private ITChargingOrderSummaryDataService chargingOrderSummaryDataService; |
| | | @Resource |
| | | private TOrderAppealService orderAppealService; |
| | | |
| | | @Autowired |
| | | private RedissonClient redissonClient; |
| | | |
| | | @Resource |
| | | private ChargingMessageClient chargingMessageClient; |
| | | |
| | | |
| | | |
| | |
| | | |
| | | //检查当前枪是否是正在使用中 |
| | | TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId()) |
| | | .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0)); |
| | | .in(TChargingOrder::getStatus, Arrays.asList(3)).eq(TChargingOrder::getDelFlag, 0)); |
| | | if(null != one){ |
| | | return AjaxResult.error("充电枪正在充电中,启动失败"); |
| | | } |
| | |
| | | |
| | | //清除计时器中的无效数据 |
| | | counter_map.remove(code); |
| | | TChargingOrder order = new TChargingOrder(); |
| | | order.setId(id); |
| | | order.setAppUserId(chargingOrder.getAppUserId()); |
| | | if(0 == startup_result){ |
| | | //启动失败 |
| | | preChargeCheck1.setStartupSuccess(3); |
| | | preChargeCheck1.setFailureCause(failure_cause); |
| | | //启动失败后取消订单,退款操作 |
| | | refund(code); |
| | | order.setStatus(-1); |
| | | order.setEndMode(0); |
| | | chargingOrder.setStatus(-1); |
| | | chargingOrder.setEndMode(0); |
| | | }else{ |
| | | //启动成功 |
| | | preChargeCheck1.setStartupSuccess(2); |
| | | order.setStatus(3); |
| | | order.setStartTime(LocalDateTime.now()); |
| | | chargingOrder.setStatus(3); |
| | | chargingOrder.setStartTime(LocalDateTime.now()); |
| | | } |
| | | this.updateById(order); |
| | | 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()){ |
| | |
| | | } |
| | | redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); |
| | | this.updateById(order); |
| | | |
| | | if(3 == order.getStatus()){ |
| | | //推送监管平台订单状态 |
| | | new Thread(()->{ |
| | | ChargingOrderVo chargingOrderVo = new ChargingOrderVo(); |
| | | BeanUtils.copyProperties(order, chargingOrderVo); |
| | | chargingMessageClient.pushOrderStatus(chargingOrderVo); |
| | | }).start(); |
| | | } |
| | | //推送三方平台启动充电结果 |
| | | if(2 == order.getOrderSource()){ |
| | | StartChargeResult result = new StartChargeResult(); |
| | |
| | | } |
| | | if(3 == rechargePaymentType){ |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(chargingOrder.getCode()); |
| | | dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber()); |
| | | dto.setOutRequestNo(chargingOrderRefund.getCode()); |
| | | dto.setRefundAmount(rechargeAmount.toString()); |
| | | dto.setRefundReason("充电失败,取消充电订单"); |
| | | RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | if(null != resp){ |
| | | if(null != resp && "10000".equals(resp.getCode())){ |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | //回退会员折扣次数 |
| | | if(chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0){ |
| | |
| | | } |
| | | if(3 == rechargePaymentType){ |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(chargingOrder.getCode()); |
| | | dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber()); |
| | | dto.setOutRequestNo(chargingOrderRefund.getCode()); |
| | | dto.setRefundAmount(money.toString()); |
| | | dto.setRefundReason("充电完成退款"); |
| | | RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | if(null != resp){ |
| | | if(null != resp && "10000".equals(resp.getCode())){ |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | try { |
| | | Thread.sleep(1000); |
| | |
| | | if(!order.getAppUserId().equals(userId)){ |
| | | return AjaxResult.error("权限不足"); |
| | | } |
| | | TChargingOrder chargingOrder = new TChargingOrder(); |
| | | chargingOrder.setId(Long.valueOf(id)); |
| | | chargingOrder.setAppUserId(order.getAppUserId()); |
| | | chargingOrder.setEndTime(LocalDateTime.now()); |
| | | chargingOrder.setStatus(4); |
| | | chargingOrder.setEndMode(1); |
| | | this.updateById(chargingOrder); |
| | | order.setEndTime(LocalDateTime.now()); |
| | | order.setStatus(4); |
| | | order.setEndMode(1); |
| | | this.updateById(order); |
| | | |
| | | String code1 = order.getCode(); |
| | | TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); |
| | | //异步线程处理停机 |
| | |
| | | sendMessageClient.platformStopCharging(platformStopCharging); |
| | | log.info(code1 + ":-------------------远程停止充电请求-------------------"); |
| | | log.info(platformStopCharging.toString()); |
| | | |
| | | //推送监管平台订单状态和订单详情 |
| | | ChargingOrderVo chargingOrderVo = new ChargingOrderVo(); |
| | | BeanUtils.copyProperties(order, chargingOrderVo); |
| | | chargingMessageClient.pushOrderInfo(chargingOrderVo); |
| | | chargingMessageClient.pushOrderStatus(chargingOrderVo); |
| | | }); |
| | | //推送三方平台 |
| | | if(2 == order.getOrderSource()){ |
| | |
| | | } |
| | | chargingOrder.setChargingCapacity(query.getCharging_degree()); |
| | | chargingOrder.setElectricity(query.getCharging_degree()); |
| | | chargingOrder.setTotalElectricity(new BigDecimal(100 - query.getSoc())); |
| | | chargingOrder.setTotalElectricity(new BigDecimal(query.getSoc())); |
| | | this.updateById(chargingOrder); |
| | | } |
| | | } |
| | |
| | | */ |
| | | @Override |
| | | public R endChargeBillingCharge(TransactionRecordMessageVO vo) { |
| | | Boolean hasKey = redisService.hasKey("endOrder:" + vo.getTransaction_serial_number()); |
| | | if(hasKey){ |
| | | RLock lock = redissonClient.getLock("endOrder:" + vo.getTransaction_serial_number()); |
| | | boolean tryLock = false; |
| | | try { |
| | | tryLock = lock.tryLock(100, TimeUnit.SECONDS); |
| | | } catch (InterruptedException e) { |
| | | e.printStackTrace(); |
| | | lock.unlock(); |
| | | return R.ok(); |
| | | } |
| | | //添加1分钟的缓存 |
| | | redisService.setCacheObject("endOrder:" + vo.getTransaction_serial_number(), vo.getTransaction_serial_number(), 1L, TimeUnit.MINUTES); |
| | | if(!tryLock){ |
| | | return R.ok(); |
| | | } |
| | | try { |
| | | TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number())); |
| | | if(null == chargingOrder){ |
| | |
| | | |
| | | //获取订单的计费策略 |
| | | List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); |
| | | if(accountingStrategyDetailOrderList.isEmpty()){ |
| | | return R.fail("计费策略为空,无法计算费用"); |
| | | } |
| | | accountingStrategyDetailOrderList.get(accountingStrategyDetailOrderList.size() - 1).setEndTime("23:59"); |
| | | //开始处理计费明细数据和优惠数据 |
| | | chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); |
| | |
| | | } |
| | | if(3 == rechargePaymentType){ |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(chargingOrder.getCode()); |
| | | dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber()); |
| | | dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); |
| | | dto.setRefundAmount(refundAmount.toString()); |
| | | dto.setRefundReason("充电完成退款"); |
| | | RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | if(null != resp){ |
| | | if(null != resp && "10000".equals(resp.getCode())){ |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); |
| | | } |
| | |
| | | }catch (Exception e) { |
| | | e.printStackTrace(); |
| | | }finally { |
| | | redisService.deleteObject("endOrder:" + vo.getTransaction_serial_number()); |
| | | lock.unlock(); |
| | | } |
| | | return R.ok(); |
| | | } |
| | |
| | | } |
| | | if(3 == tChargingOrder.getRechargePaymentType()){ |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(tChargingOrder.getCode()); |
| | | dto.setOutTradeNo(tChargingOrder.getRechargeSerialNumber()); |
| | | dto.setOutRequestNo(tChargingOrder.getCode()); |
| | | dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); |
| | | dto.setRefundReason("取消订单"); |
| | | RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | if(null != resp){ |
| | | if(null != resp && "10000".equals(resp.getCode())){ |
| | | chargingOrderRefund.setRefundStatus(2); |
| | | chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); |
| | | this.baseMapper.updateById(tChargingOrder); |
| | |
| | | shoppingOrderRefundService.save(chargingOrderRefund); |
| | | } |
| | | } |
| | | if(3 == tChargingOrder.getPaymentType()){ |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(tChargingOrder.getCode()); |
| | | dto.setOutRequestNo(tChargingOrder.getCode()); |
| | | dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); |
| | | dto.setRefundReason("取消订单"); |
| | | RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | if(null != resp){ |
| | | tChargingOrder.setRefundStatus(2); |
| | | tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); |
| | | shoppingOrderService.updateById(tChargingOrder); |
| | | shoppingOrderRefundService.save(chargingOrderRefund); |
| | | } |
| | | } |
| | | // if(3 == tChargingOrder.getPaymentType()){ |
| | | // RefundReq dto = new RefundReq(); |
| | | // dto.setOutTradeNo(tChargingOrder.getCode()); |
| | | // dto.setOutRequestNo(tChargingOrder.getCode()); |
| | | // dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); |
| | | // dto.setRefundReason("取消订单"); |
| | | // RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | // if(null != resp){ |
| | | // tChargingOrder.setRefundStatus(2); |
| | | // tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); |
| | | // shoppingOrderService.updateById(tChargingOrder); |
| | | // shoppingOrderRefundService.save(chargingOrderRefund); |
| | | // } |
| | | // } |
| | | |
| | | } |
| | | |
| | |
| | | vipOrderRefundService.save(chargingOrderRefund); |
| | | } |
| | | } |
| | | if(3 == tChargingOrder.getPaymentType()){ |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(tChargingOrder.getCode()); |
| | | dto.setOutRequestNo(tChargingOrder.getCode()); |
| | | dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); |
| | | dto.setRefundReason("取消订单"); |
| | | RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | if(null != resp){ |
| | | tChargingOrder.setRefundStatus(2); |
| | | tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); |
| | | vipOrderService.updateById(tChargingOrder); |
| | | vipOrderRefundService.save(chargingOrderRefund); |
| | | } |
| | | } |
| | | // if(3 == tChargingOrder.getPaymentType()){ |
| | | // RefundReq dto = new RefundReq(); |
| | | // dto.setOutTradeNo(tChargingOrder.getCode()); |
| | | // dto.setOutRequestNo(tChargingOrder.getCode()); |
| | | // dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); |
| | | // dto.setRefundReason("取消订单"); |
| | | // RefundResp resp = h5AliPaymentClient.refund(dto).getData(); |
| | | // if(null != resp){ |
| | | // tChargingOrder.setRefundStatus(2); |
| | | // tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); |
| | | // vipOrderService.updateById(tChargingOrder); |
| | | // vipOrderRefundService.save(chargingOrderRefund); |
| | | // } |
| | | // } |
| | | } |
| | | return R.ok(); |
| | | } |
| | |
| | | chargingOrder.setStatus(4); |
| | | chargingOrder.setEndMode(1); |
| | | this.updateById(chargingOrder); |
| | | |
| | | tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); |
| | | |
| | | String code1 = order.getCode(); |
| | |
| | | sendMessageClient.platformStopCharging(platformStopCharging); |
| | | log.info(code1 + ":-------------------远程停止充电请求-------------------"); |
| | | log.info(platformStopCharging.toString()); |
| | | |
| | | //推送监管平台订单状态和订单详情 |
| | | ChargingOrderVo chargingOrderVo = new ChargingOrderVo(); |
| | | BeanUtils.copyProperties(chargingOrder, chargingOrderVo); |
| | | chargingMessageClient.pushOrderInfo(chargingOrderVo); |
| | | chargingMessageClient.pushOrderStatus(chargingOrderVo); |
| | | }); |
| | | return R.ok(); |
| | | } |
| | |
| | | return this.baseMapper.getSumDegreeBySiteIds(siteIds); |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取启动失败且时间超过1小时的订单 |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<TChargingOrder> findFailedStartupOrder() { |
| | | return this.baseMapper.findFailedStartupOrder(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取停止中的数据 |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<TChargingOrder> findStoppedOrder() { |
| | | return this.baseMapper.findStoppedOrder(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取充电中的数据 |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<TChargingOrder> findChargingOrder() { |
| | | return this.baseMapper.findChargingOrder(); |
| | | } |
| | | } |