From 792cbb986fb8c32f6bbc1638c4ae264372e7a28f Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期四, 23 一月 2025 19:31:36 +0800 Subject: [PATCH] 新增引流接口及业务逻辑 --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 962 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 850 insertions(+), 112 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 c1898d6..d30ab60 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 @@ -60,6 +60,8 @@ import com.ruoyi.payment.api.model.RefundResp; import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.*; +import com.ruoyi.system.api.domain.SysUser; +import com.ruoyi.system.api.feignClient.SysUserClient; import io.seata.spring.annotation.GlobalTransactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,6 +80,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.*; @@ -100,7 +103,8 @@ private ChargingGunClient chargingGunClient; @Resource private TSettlementConfirmMapper tSettlementConfirmMapper; - + @Resource + private PartnerClient partnerClient; @Resource private SiteClient siteClient; @@ -198,6 +202,9 @@ //计数器 private Map<String, Integer> boot_failed_map = new HashMap<>(); + + @Resource + private OperatorClient operatorClient; @@ -461,7 +468,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); @@ -841,7 +848,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(); //构建退款明细 @@ -1144,7 +1151,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; } @@ -1212,6 +1219,9 @@ dto.setUserIds(data); } Long userId = tokenService.getLoginUser().getUserid(); + // 查询当前登陆人按钮权限 + SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); + Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List<Integer> siteIds = new ArrayList<>(); if (dto.getSiteId()==null){ @@ -1226,7 +1236,22 @@ } if (siteIds.isEmpty()){ siteIds.add(-1); + }else{ + if (roleType == 2){ + List<Integer> integers = new ArrayList<>(); + for (Integer siteId : siteIds) { + // 校验有没有这个站点的权限 + List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData(); + + Boolean b = t1.get(1); + if (b){ + integers.add(siteId); + } + } + siteIds = integers; + } } + if (siteIds.isEmpty())siteIds.add(-1); dto.setSiteIds(siteIds); List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); List<ChargingOrderVO> list1 = this.baseMapper.chargingOrder(pageInfo1,dto,startTime1,startTime2,endTime1,endTime2); @@ -1238,7 +1263,16 @@ BigDecimal commissionMoney = new BigDecimal("0"); BigDecimal refundMoney = new BigDecimal("0"); BigDecimal paymentMoney = new BigDecimal("0"); + List<String> collect2 = list.stream().map(TChargingOrder::getCode).collect(Collectors.toList()); for (ChargingOrderVO chargingOrderVO : list) { + if (roleType == 2){ + for (Integer siteId : siteIds) { + // 校验有没有这个站点的权限 + List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData(); + chargingOrderVO.setAuthRecord(t1.get(0)); + } + + } chargingOrderVO.setCommissionAmount(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0")); chargingOrderVO.setPlatFormMoney(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN):new BigDecimal("0")); chargingOrderVO.setUid(chargingOrderVO.getId()+""); @@ -1256,10 +1290,13 @@ // 充电订单 明细记录 List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>() .eq("charging_order_id", chargingOrderVO.getId())); - UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData(); - 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(); @@ -1280,27 +1317,31 @@ } } + + + 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")); commissionMoney = commissionMoney.add(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0")); if (chargingOrderVO.getChargingCapacity()!=null){ total = total.add(chargingOrderVO.getElectricity()!=null?chargingOrderVO.getElectricity():new BigDecimal("0")); } - // 充电订单 明细记录 - List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>() - .eq("charging_order_id", chargingOrderVO.getId())); - UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData(); - 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")); @@ -1359,8 +1400,8 @@ } @Override - public Map<String, Object> countAll(LocalDate sixBefore) { - return this.baseMapper.countAll(sixBefore); + public Map<String, Object> countAll(LocalDate sixBefore,List<Integer> siteIds) { + return this.baseMapper.countAll(sixBefore,siteIds); } @Override @@ -1388,7 +1429,8 @@ return this.baseMapper.getYearData(chargingOrderIds); } - + @Resource + private SysUserClient sysUserClient; @Override public ChargingOrderTimeVO chargingList(ChargingListQuery dto) { String startTime1 = null; @@ -1433,6 +1475,9 @@ } } Long userId = tokenService.getLoginUser().getUserid(); + // 查询当前登陆人按钮权限 + SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); + Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List<Integer> siteIds = new ArrayList<>(); if (dto.getSiteId()==null){ @@ -1447,11 +1492,34 @@ } if (siteIds.isEmpty()){ siteIds.add(-1); + }else{ + if (roleType == 2){ + List<Integer> integers = new ArrayList<>(); + for (Integer siteId : siteIds) { + // 校验有没有这个站点的权限 + List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData(); + + Boolean b = t1.get(1); + if (b){ + integers.add(siteId); + } + } + siteIds = integers; + } } dto.setSiteIds(siteIds); PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); + List<Integer> siteIdsList = list.stream().map(ChargingOrderListVO::getSiteId).collect(Collectors.toList()); + if (siteIdsList.isEmpty())siteIdsList.add(-1); + List<Site> sites = siteClient.getSiteByIds(siteIdsList).getData(); + for (ChargingOrderListVO chargingOrderListVO : list) { + if (roleType==2){ + List<Boolean> data = partnerClient.getChargingListMenu(sysUser.getObjectId(), chargingOrderListVO.getSiteId()).getData(); + chargingOrderListVO.setAuthInfo(data.get(0)); + chargingOrderListVO.setAuthCurve(data.get(1)); + } chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity()); BigDecimal bigDecimal = new BigDecimal("0.006"); if (chargingOrderListVO.getOrderAmount()!=null){ @@ -1461,9 +1529,9 @@ chargingOrderListVO.setUid(chargingOrderListVO.getId()+""); List<Integer> integers = new ArrayList<>(); integers.add(chargingOrderListVO.getSiteId()); - List<Site> data = siteClient.getSiteByIds(integers).getData(); - if (!data.isEmpty()) { - chargingOrderListVO.setSiteName(data.get(0).getName()); + Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null); + if (site!=null){ + chargingOrderListVO.setSiteName(site.getName()); } if (chargingOrderListVO.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){ TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData(); @@ -1514,7 +1582,6 @@ } } chargingOrderListVO.setPhone(data3.getPhone()); - } } List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery() @@ -1563,6 +1630,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()); // 计算充电总度数 @@ -1588,14 +1670,17 @@ 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(); 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 = chargingOrderAccountingStrategyService.lambdaQuery() - .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list(); + List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId())) + .collect(Collectors.toList()); for (TChargingOrderAccountingStrategy temp : list2) { switch (temp.getType()){ case 1: @@ -1874,83 +1959,134 @@ 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<>(); - for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { - Class<? extends TransactionRecordMessageVO> clazz = vo.getClass(); - try { - AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i); - //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) - Object invoke = null; - switch (strategyDetail.getType()){ - case 1: - //充电度数 - invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo); + try { + //跨天 + if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){ + //当天的 + //开始通过计费策略遍历解析每个时段的费用明细 + String start_time = vo.getStart_time(); + String end_time = vo.getEnd_time(); + long start = sdfs.parse(start_time).getTime(); + long end = sdfs.parse(end_time).getTime(); + Class<? extends TransactionRecordMessageVO> clazz = vo.getClass(); + /** + * "start_time": "2025-01-03 23:06:43.00", + * "end_time": "2025-01-04 00:39:39.00", + */ + for (int i = accountingStrategyDetailOrderList.size(); i > 0; i--) { + AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i - 1); + long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime(); + if(time < start){ break; - case 2: - //充电度数 - invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo); - break; - case 3: - //充电度数 - invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo); - break; - case 4: - //充电度数 - invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo); - break; + } + //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) + Object invoke = null; + switch (strategyDetail.getType()){ + case 1: + //充电度数 + invoke = clazz.getMethod("getSpike_charge" + (i)).invoke(vo); + break; + case 2: + //充电度数 + invoke = clazz.getMethod("getPeak_charge" + (i)).invoke(vo); + break; + case 3: + //充电度数 + invoke = clazz.getMethod("getFlat_charge" + (i)).invoke(vo); + break; + case 4: + //充电度数 + invoke = clazz.getMethod("getValley_charge" + (i)).invoke(vo); + break; + } + if(null == invoke || Double.valueOf(invoke.toString()) == 0){ + continue; + } + BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); + AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); + BeanUtils.copyProperties(strategyDetail, vo1); + vo1.setChargingCapacity(sharp_peak_charge); + lists.add(vo1); } - if(null == invoke || Double.valueOf(invoke.toString()) == 0){ - continue; + + //第二天的 + //开始通过计费策略遍历解析每个时段的费用明细 + for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { + AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i); + long time = sdfs.parse(end_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime(); + if(time > end){ + break; + } + //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) + Object invoke = null; + switch (strategyDetail.getType()){ + case 1: + //充电度数 + invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo); + break; + case 2: + //充电度数 + invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo); + break; + case 3: + //充电度数 + invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo); + break; + case 4: + //充电度数 + invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo); + break; + } + if(null == invoke || Double.valueOf(invoke.toString()) == 0){ + continue; + } + BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); + AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); + BeanUtils.copyProperties(strategyDetail, vo1); + vo1.setChargingCapacity(sharp_peak_charge); + lists.add(vo1); } - BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); - AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); - BeanUtils.copyProperties(strategyDetail, vo1); - vo1.setStart(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime()); - vo1.setEnd(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime()); - vo1.setChargingCapacity(sharp_peak_charge); - lists.add(vo1); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } catch (ParseException e) { - throw new RuntimeException(e); + }else{ + for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { + Class<? extends TransactionRecordMessageVO> clazz = vo.getClass(); + AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i); + //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) + Object invoke = null; + switch (strategyDetail.getType()){ + case 1: + //充电度数 + invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo); + break; + case 2: + //充电度数 + invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo); + break; + case 3: + //充电度数 + invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo); + break; + case 4: + //充电度数 + invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo); + break; + } + if(null == invoke || Double.valueOf(invoke.toString()) == 0){ + continue; + } + BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); + AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); + BeanUtils.copyProperties(strategyDetail, vo1); + vo1.setChargingCapacity(sharp_peak_charge); + lists.add(vo1); + } } - } - Collections.sort(lists, new Comparator<AccountingStrategyDetailOrderVo>() { - public int compare(AccountingStrategyDetailOrderVo s1, AccountingStrategyDetailOrderVo s2) { - return s1.getStart() < s2.getStart() ? -1 : s1.getStart() == s2.getStart() ? 0 : 1; - } - }); - if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){ - List<AccountingStrategyDetailOrderVo> list1 = new ArrayList<>(lists); - for (AccountingStrategyDetailOrderVo orderVo : list1) { - Calendar start = Calendar.getInstance(); - start.setTimeInMillis(orderVo.getStart()); - start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1); - orderVo.setStart(start.getTimeInMillis()); - Calendar end = Calendar.getInstance(); - end.setTimeInMillis(orderVo.getEnd()); - end.set(Calendar.DAY_OF_YEAR, end.get(Calendar.DAY_OF_YEAR) + 1); - orderVo.setEnd(end.getTimeInMillis()); - } - lists.addAll(list1); + }catch (Exception e){ + e.printStackTrace(); } //开始处理明细 - SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS"); - SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm"); - Date start = null; - Date end = null; - try { - start = sdf3.parse(vo.getStart_time()); - end = sdf3.parse(vo.getEnd_time()); - } catch (ParseException e) { - throw new RuntimeException(e); - } - - for (AccountingStrategyDetailOrderVo strategyDetail : lists) { + 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()); @@ -1959,16 +2095,17 @@ chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence()); chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge()); chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge()); - - if(start.getTime() >= strategyDetail.getStart()){ - chargingOrderAccountingStrategy.setStartTime(sdf2.format(start)); + if(i == 0){ + String time = vo.getStart_time().split(" ")[1]; + chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":"))); }else{ chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime()); } - if(end.getTime() >= strategyDetail.getEnd()){ - chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime()); + if(i == lists.size() - 1){ + String time = vo.getEnd_time().split(" ")[1]; + chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":"))); }else{ - chargingOrderAccountingStrategy.setEndTime(sdf2.format(end)); + chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime()); } //已充电总度数 @@ -1992,8 +2129,8 @@ periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc); periodServicePrice_total = periodServicePrice_total.add(originalServicePrice); total = total.add(electrovalenc.add(originalServicePrice)); + } - //原金额 @@ -2177,6 +2314,7 @@ referralReward(chargingOrder); //开始构建退款费用 + refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN); if(refundAmount.compareTo(BigDecimal.ZERO) > 0){ Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); //构建退款明细 @@ -2214,20 +2352,457 @@ 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); } } } } + + +// /** +// * 停止充电返回账单后计算费用 +// * @param vo +// */ +// @Override +// @GlobalTransactional(rollbackFor = Exception.class) +// public void endChargeBillingCharge1(TransactionRecordMessageVO vo) { +// TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number())); +// Integer status = chargingOrder.getStatus(); +//// if(status == 5){ +//// return; +//// } +// +// //如果使用优惠券需要判断优惠券是否满足使用条件 +// //根据实际的充电金额计算退款金额 退回费用=(原金额/总金额)*(总金额-实际充电金额) +// //退款金额=优惠券金额+剩余充电金额 +// 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<>(); +// try { +// //跨天 +// if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){ +// //当天的 +// //开始通过计费策略遍历解析每个时段的费用明细 +// String start_time = vo.getStart_time(); +// String end_time = vo.getEnd_time(); +// long start = sdfs.parse(start_time).getTime(); +// long end = sdfs.parse(end_time).getTime(); +// Class<? extends TransactionRecordMessageVO> clazz = vo.getClass(); +// /** +// * "start_time": "2025-01-03 23:06:43.00", +// * "end_time": "2025-01-04 00:39:39.00", +// */ +// for (int i = accountingStrategyDetailOrderList.size(); i > 0; i--) { +// AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i - 1); +// long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime(); +// if(time < start){ +// break; +// } +// //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) +// Object invoke = null; +// switch (strategyDetail.getType()){ +// case 1: +// //充电度数 +// invoke = clazz.getMethod("getSpike_charge" + (i)).invoke(vo); +// break; +// case 2: +// //充电度数 +// invoke = clazz.getMethod("getPeak_charge" + (i)).invoke(vo); +// break; +// case 3: +// //充电度数 +// invoke = clazz.getMethod("getFlat_charge" + (i)).invoke(vo); +// break; +// case 4: +// //充电度数 +// invoke = clazz.getMethod("getValley_charge" + (i)).invoke(vo); +// break; +// } +// if(null == invoke || Double.valueOf(invoke.toString()) == 0){ +// continue; +// } +// BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); +// AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); +// BeanUtils.copyProperties(strategyDetail, vo1); +// vo1.setChargingCapacity(sharp_peak_charge); +// lists.add(vo1); +// } +// +// //第二天的 +// //开始通过计费策略遍历解析每个时段的费用明细 +// for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { +// AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i); +// long time = sdfs.parse(end_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime(); +// if(time > end){ +// break; +// } +// //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) +// Object invoke = null; +// switch (strategyDetail.getType()){ +// case 1: +// //充电度数 +// invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo); +// break; +// case 2: +// //充电度数 +// invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo); +// break; +// case 3: +// //充电度数 +// invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo); +// break; +// case 4: +// //充电度数 +// invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo); +// break; +// } +// if(null == invoke || Double.valueOf(invoke.toString()) == 0){ +// continue; +// } +// BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); +// AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); +// BeanUtils.copyProperties(strategyDetail, vo1); +// vo1.setChargingCapacity(sharp_peak_charge); +// lists.add(vo1); +// } +// }else{ +// for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { +// Class<? extends TransactionRecordMessageVO> clazz = vo.getClass(); +// AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i); +// //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) +// Object invoke = null; +// switch (strategyDetail.getType()){ +// case 1: +// //充电度数 +// invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo); +// break; +// case 2: +// //充电度数 +// invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo); +// break; +// case 3: +// //充电度数 +// invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo); +// break; +// case 4: +// //充电度数 +// invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo); +// break; +// } +// if(null == invoke || Double.valueOf(invoke.toString()) == 0){ +// continue; +// } +// BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); +// AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); +// BeanUtils.copyProperties(strategyDetail, vo1); +// vo1.setChargingCapacity(sharp_peak_charge); +// lists.add(vo1); +// } +// } +// }catch (Exception e){ +// e.printStackTrace(); +// } +// +// //开始处理明细 +// 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()){ +// 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); +// System.err.println("----------"+JSON.toJSONString(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(); +// order.setEndMode(soc > 98 ? 2 : 3); +// }else{ +// order.setEndMode(1); +// } +// 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); +//// }else{ +//// order.setAppCouponId(null); +//// order.setCouponDiscountAmount(BigDecimal.ZERO); +////// appCouponClient.refund(chargingOrder.getAppCouponId().toString()); +//// } +//// } +//// if(2 == preferentialMode){ +//// //抵扣 +//// if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){ +//// //折扣金额 +//// BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10)); +//// divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide; +//// //如果优惠金额大于服务费金额,以服务费作为最大限制 +//// if(periodServicePrice_total.compareTo(divide) < 0){ +//// couponDiscount = periodServicePrice_total; +//// periodServicePrice_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(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); +// System.err.println("----------"+JSON.toJSONString(order)); +//// chargingOrder = this.getById(order.getId()); +//// +//// //开始将优惠券优惠的金额添加到明细中 +//// 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); +//// +//// //添加积分 +//// TIntegralRule integralRule = integralRuleClient.getSet().getData(); +//// if(null != integralRule){ +//// TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); +//// Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1"); +//// Integer integral = chargingOrder.getServiceCharge().intValue() * num1; +//// if(null != appUser.getVipId()){ +//// TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); +//// Integer doubleIntegration = vip.getDoubleIntegration(); +//// //双倍积分 +//// if(1 == doubleIntegration){ +//// integral *= 2; +//// } +//// } +//// +//// if(integral > 0){ +//// TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); +//// appUserIntegralChange.setAppUserId(appUser.getId()); +//// appUserIntegralChange.setChangeType(2); +//// appUserIntegralChange.setHistoricalIntegral(appUser.getPoints()); +//// appUser.setPoints(appUser.getPoints() + integral); +//// appUserIntegralChange.setCurrentIntegral(appUser.getPoints()); +//// appUserIntegralChange.setCreateTime(LocalDateTime.now()); +//// appUserIntegralChange.setOrderCode(chargingOrder.getCode()); +//// appUserIntegralChange.setExtension(chargingOrder.getId().toString()); +//// appUserClient.updateAppUser(appUser); +//// appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); +//// } +//// } +//// +//// //计算用户标签 +//// editUserTag(chargingOrder); +//// //用户推荐奖励 +//// referralReward(chargingOrder); +//// +//// //开始构建退款费用 +//// 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<String> orderR = wxPaymentClient.refundOrderR(model); +//// if(200 == orderR.getCode()){ +//// chargingOrderRefundService.save(chargingOrderRefund); +//// } +//// } +//// if(2 == rechargePaymentType){ +//// RefundReq dto = new RefundReq(); +//// dto.setOutTradeNo(chargingOrder.getCode()); +//// dto.setOutRequestNo(chargingOrderRefund.getCode()); +//// dto.setRefundAmount(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); +//// } +//// } +//// } +//// +//// } +// } + + @Override public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) { @@ -2581,7 +3156,7 @@ .eq("recharge_payment_status",2); switch (dto.getType()){ case 1: - eq.between("start_time", localDateTime, localDateTime1); + eq.between("pay_time", localDateTime, localDateTime1); break; case 2: eq.between("end_time", localDateTime, localDateTime1); @@ -2718,6 +3293,9 @@ dto.setStartTime(startTime); dto.setEndTime(endTime); Long userId = tokenService.getLoginUser().getUserid(); + // 查询当前登陆人按钮权限 + SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); + Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List<Integer> siteIds = new ArrayList<>(); if (dto.getSiteIds()==null){ @@ -2732,11 +3310,31 @@ } if (siteIds.isEmpty()){ siteIds.add(-1); + }else{ + if (roleType == 2){ + List<Integer> integers = new ArrayList<>(); + for (Integer siteId : siteIds) { + // 校验有没有这个站点的权限 + List<Boolean> t1= partnerClient.getSettlementListMenu(sysUser.getObjectId(),siteId).getData(); + + Boolean b = t1.get(2); + if (b){ + integers.add(siteId); + } + } + siteIds = integers; + } } dto.setSiteIdss(siteIds); PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo,dto); + for (TSettlementConfirm tSettlementConfirm : list) { + if (roleType==2){ + List<Boolean> data = partnerClient.getSettlementListMenu(sysUser.getObjectId(), tSettlementConfirm.getSiteId()).getData(); + tSettlementConfirm.setAuthDownLoad(data.get(0)); + tSettlementConfirm.setAuthDelete(data.get(1)); + } tSettlementConfirm.setUid(tSettlementConfirm.getId().toString()); List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData(); if (!data1.isEmpty()){ @@ -3379,4 +3977,144 @@ public Long countCar(List<String> brands) { return this.baseMapper.countCar(brands); } + + + /** + * 添加三方平台充电订单数据 + * @param chargingGunId + */ + @Override + public R addTripartitePlatformOrder(Integer chargingGunId, String operatorId, Integer rechargePaymentType, BigDecimal paymentAmount, String startChargeSeq) { + //检查当前枪是否是正在使用中 + TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGunId) + .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(chargingGunId).getData(); + TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData(); + chargingOrder.setSiteId(tChargingGun.getSiteId()); + chargingOrder.setChargingPileId(tChargingGun.getChargingPileId()); + chargingOrder.setChargingGunId(chargingGunId); + chargingOrder.setRechargePaymentType(rechargePaymentType); + chargingOrder.setRechargePaymentStatus(2); + chargingOrder.setRechargeAmount(paymentAmount); + chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); + chargingOrder.setOrderSource(2); + Operator operator = operatorClient.getOperator(operatorId).getData(); + chargingOrder.setOperatorId(operator.getId()); + chargingOrder.setAppUserId(operator.getId().longValue()); + chargingOrder.setTripartitePlatformName(operator.getName()); + chargingOrder.setStartChargeSeq(startChargeSeq); + 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); + 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); + + 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