From 2ee7fba277a78fd53ae2f52b129c9eb829816cb9 Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期二, 29 十月 2024 10:28:00 +0800 Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 437 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 362 insertions(+), 75 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 4b28f44..ff9c554 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 @@ -50,6 +50,7 @@ import com.ruoyi.order.vo.EndOfChargePageInfo; import com.ruoyi.other.api.domain.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; +import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.api.feignClient.*; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; @@ -65,10 +66,12 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; +import javax.crypto.MacSpi; import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; @@ -609,12 +612,16 @@ if(times > m){ //充电时间跨度两个计费策略,需要继续对下一个策略进行计算 serviceCharge = s_server_amount.multiply(new BigDecimal(m)); - discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount))); rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m))); + if(null != discount){ + discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount))); + } nowTimeMillis = null; }else{ serviceCharge = s_server_amount.multiply(new BigDecimal(times)); - discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount))); + if(null != discount){ + discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount))); + } break; } } @@ -652,10 +659,107 @@ log.error(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 AjaxResult.success(); } - + + /** + * 定时检测mongodb数据库数据 + * @param id + * @return + */ + public boolean timingDetection(Long id){ + TChargingOrder chargingOrder = this.getById(id); + if(chargingOrder.getStatus() != 2){ + return true; + } + String code = chargingOrder.getCode(); + String key = "AQJC_" + chargingOrder.getChargingGunId(); + List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData(); + if(null == data || data.size() == 0){ + return false; + } + log.error(code + ":-------------------开始检查调起充电结果-------------------" + data.toString()); + if(data.size() != 0){ + 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 < 300)){ + counter = (null == counter ? 0 : counter) + 1; + counter_map.put(code, counter); + //启动失败 + preChargeCheck1.setStartupSuccess(3); + preChargeCheck1.setFailureCause(failure_cause); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + return false; + } + + //清除计时器中的无效数据 + 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); + }else{ + //启动成功 + preChargeCheck1.setStartupSuccess(2); + order.setStatus(3); + order.setStartTime(LocalDateTime.now()); + } + this.updateById(order); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + return true; + }else{ + Integer counter = boot_failed_map.get(code); + log.error(code + ":-------------------未上传开启充电结果-------------------" + counter); + PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); + //5分钟内未启动成功,退回金额。 + if(null == counter || counter < 300){ + counter = (null == counter ? 0 : counter) + 1; + boot_failed_map.put(code, counter); + //启动失败 + preChargeCheck1.setStartupSuccess(3); + 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); + //启动失败后取消订单,退款操作 + refund(code); + order.setStatus(-1); + order.setEndMode(0); + this.updateById(order); + redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + return true; + } + } /** @@ -794,7 +898,10 @@ one.setRefundTime(LocalDateTime.now()); chargingOrderRefundService.updateById(one); - TChargingOrder chargingOrder = this.getById(one.getChargingOrderId()); + TChargingOrder order = this.getById(one.getChargingOrderId()); + TChargingOrder chargingOrder = new TChargingOrder(); + chargingOrder.setId(one.getChargingOrderId()); + chargingOrder.setAppUserId(order.getAppUserId()); chargingOrder.setRefundStatus(2); chargingOrder.setRefundSerialNumber(refund_id); chargingOrder.setRefundTime(LocalDateTime.now()); @@ -862,14 +969,17 @@ @Override @GlobalTransactional(rollbackFor = Exception.class) public AjaxResult stopCharging(String id) { - TChargingOrder chargingOrder = this.getById(id); - Integer status = chargingOrder.getStatus(); + TChargingOrder order = this.getById(id); + Integer status = order.getStatus(); if(status != 3){ return AjaxResult.error("还未开始充电"); } if(status == 4 || status == 5){ return AjaxResult.error("不能重复操作"); } + TChargingOrder chargingOrder = new TChargingOrder(); + chargingOrder.setId(Long.valueOf(id)); + chargingOrder.setAppUserId(order.getAppUserId()); chargingOrder.setEndTime(LocalDateTime.now()); chargingOrder.setEndMode(1); this.updateById(chargingOrder); @@ -987,20 +1097,22 @@ inviteUser.setAward(num1); inviteUserClient.updateInviteUser(inviteUser); } - TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); - String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); - appUserIntegralChange.setCode(code); - appUserIntegralChange.setAppUserId(appUser1.getId()); - appUserIntegralChange.setChangeType(5); - appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints()); - appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1); - appUserIntegralChange.setCreateTime(LocalDateTime.now()); - appUserIntegralChange.setOrderCode(chargingOrder.getCode()); - appUserIntegralChange.setExtension(chargingOrder.getId().toString()); - appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); - - appUser1.setPoints(appUser1.getPoints() + num1); - appUserClient.updateAppUser(appUser1); + if(num1 > 0){ + TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); + String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); + appUserIntegralChange.setCode(code); + appUserIntegralChange.setAppUserId(appUser1.getId()); + appUserIntegralChange.setChangeType(5); + appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints()); + appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1); + appUserIntegralChange.setCreateTime(LocalDateTime.now()); + appUserIntegralChange.setOrderCode(chargingOrder.getCode()); + appUserIntegralChange.setExtension(chargingOrder.getId().toString()); + appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); + + appUser1.setPoints(appUser1.getPoints() + num1); + appUserClient.updateAppUser(appUser1); + } } } @@ -1581,7 +1693,6 @@ chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount()); chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount()); chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount()); - chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getCommissionAmount()); // 查询费用明细列表 List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()) @@ -1677,6 +1788,8 @@ //开始处理计费明细数据和优惠数据 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 { @@ -1705,44 +1818,100 @@ continue; } BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); - TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy(); - chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId()); - chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId()); - chargingOrderAccountingStrategy.setType(strategyDetail.getType()); - chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm"))); - chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm"))); - chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence()); - chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge()); - chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge()); - //已充电总度数 - BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN); - BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN); - BigDecimal serviceCharge = originalServicePrice; - BigDecimal vipDiscountAmount = BigDecimal.ZERO; - //计算优惠金额 - if(null != chargingOrder.getVipDiscount()){ - vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount())).setScale(2, RoundingMode.DOWN); - serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount()).setScale(2, RoundingMode.DOWN); - } - chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge); - chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc); - chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge); - chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice); - chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount); - chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); - chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy); - - periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc); - periodServicePrice_total = periodServicePrice_total.add(originalServicePrice); - total = total.add(electrovalenc.add(originalServicePrice)); + 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); } } + 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); + } + + //开始处理明细 + 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); + } + System.err.println(start.getTime() + "\n" + end.getTime() + "\n" + lists.get(0).getStart() + "\n" + lists.get(0).getEnd()); + + + for (AccountingStrategyDetailOrderVo strategyDetail : lists) { + 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(start.getTime() >= strategyDetail.getStart()){ + chargingOrderAccountingStrategy.setStartTime(sdf2.format(start)); + }else{ + chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime()); + } + if(end.getTime() >= strategyDetail.getEnd()){ + chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime()); + }else{ + chargingOrderAccountingStrategy.setEndTime(sdf2.format(end)); + } + + //已充电总度数 + BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN); + BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN); + BigDecimal serviceCharge = originalServicePrice; + BigDecimal vipDiscountAmount = BigDecimal.ZERO; + //计算优惠金额 + if(null != chargingOrder.getVipDiscount()){ + vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount())).setScale(2, RoundingMode.DOWN); + serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount()).setScale(2, RoundingMode.DOWN); + } + chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge); + chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc); + chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge); + chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice); + chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount); + chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); + chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy); + + periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc); + periodServicePrice_total = periodServicePrice_total.add(originalServicePrice); + total = total.add(electrovalenc.add(originalServicePrice)); + } + //原金额 @@ -1872,9 +2041,10 @@ 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(periodServicePrice_total, new MathContext(4, RoundingMode.HALF_EVEN))); + BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN))); periodServicePrice = periodServicePrice.subtract(multiply); chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice); chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply); @@ -1904,17 +2074,19 @@ } } - TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); - appUserIntegralChange.setAppUserId(appUser.getId()); - appUserIntegralChange.setChangeType(2); - appUserIntegralChange.setHistoricalIntegral(appUser.getPoints()); - appUser.setPoints(appUser.getPoints() + integral); - appUserIntegralChange.setCurrentIntegral(appUser.getPoints()); - appUserIntegralChange.setCreateTime(LocalDateTime.now()); - appUserIntegralChange.setOrderCode(chargingOrder.getCode()); - appUserIntegralChange.setExtension(chargingOrder.getId().toString()); - appUserClient.updateAppUser(appUser); - appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); + if(integral > 0){ + TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); + appUserIntegralChange.setAppUserId(appUser.getId()); + appUserIntegralChange.setChangeType(2); + appUserIntegralChange.setHistoricalIntegral(appUser.getPoints()); + appUser.setPoints(appUser.getPoints() + integral); + appUserIntegralChange.setCurrentIntegral(appUser.getPoints()); + appUserIntegralChange.setCreateTime(LocalDateTime.now()); + appUserIntegralChange.setOrderCode(chargingOrder.getCode()); + appUserIntegralChange.setExtension(chargingOrder.getId().toString()); + appUserClient.updateAppUser(appUser); + appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); + } } //计算用户标签 @@ -2060,6 +2232,10 @@ private TShoppingOrderService shoppingOrderService; @Resource private TShoppingOrderRefundService shoppingOrderRefundService; + @Resource + private TVipOrderService vipOrderService; + @Resource + private TVipOrderRefundService vipOrderRefundService; @Override public R payRefund(PayOrderRefundDto payOrderQueryDto) { if (payOrderQueryDto.getType()==1){ @@ -2195,6 +2371,71 @@ } + if (payOrderQueryDto.getType()==3){ + TVipOrder tChargingOrder = vipOrderService.getById(payOrderQueryDto.getOrderId()); + if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){ + return R.fail("退款金额需小于支付金额"); + } + TVipOrderRefund chargingOrderRefund = new TVipOrderRefund(); + chargingOrderRefund.setVipOrderId(tChargingOrder.getId()); + chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); + chargingOrderRefund.setRefundStatus(1); + chargingOrderRefund.setPayType(tChargingOrder.getPaymentType()); + chargingOrderRefund.setRefundTime(LocalDateTime.now()); + chargingOrderRefund.setCode(tChargingOrder.getCode()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + chargingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); + chargingOrderRefund.setRefundTitle("后台退款"); + chargingOrderRefund.setRefundContent("后台退款"); + chargingOrderRefund.setRefundReason("后台退款"); + chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark()); + chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount())); + chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount()); + + if(1 == tChargingOrder.getPaymentType()){ + WxPaymentRefundModel model = new WxPaymentRefundModel(); + model.setOut_trade_no(tChargingOrder.getCode()); + model.setOut_refund_no(chargingOrderRefund.getRefundCode()); + model.setTransaction_id(tChargingOrder.getSerialNumber()); + model.setReason("取消订单"); + model.setNotify_url("/order/t-shopping-order/cancelShoppingOrderWxRefund"); + WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); + amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue()); + amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); + amount.setCurrency("CNY"); + model.setAmount(amount); + R<String> orderR = wxPaymentClient.refundOrderR(model); + if(200 == orderR.getCode()){ + tChargingOrder.setRefundStatus(2); + tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); + vipOrderService.updateById(tChargingOrder); + vipOrderRefundService.save(chargingOrderRefund); + } + } + + if(2 == tChargingOrder.getPaymentType()){ + RefundReq dto = new RefundReq(); + dto.setOutTradeNo(tChargingOrder.getCode()); + dto.setOutRequestNo(tChargingOrder.getCode()); + dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); + dto.setRefundReason("取消订单"); + RefundResp resp = aliPaymentClient.refund(dto).getData(); + if(null != resp){ + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); + + 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(); @@ -2248,6 +2489,7 @@ // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表 QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>() .eq("site_id", dto.getSiteId()) + .eq("status", 5) .eq("recharge_payment_status",2); switch (dto.getType()){ case 1: @@ -2315,21 +2557,17 @@ // 三方交易手续费 三方收费*0.6% commissionAmount = sharingAmount.multiply(new BigDecimal("0.006")); // 订单手续费 订单支付金额 - 退款金额*0.6% - orderCommission = paymentAmount.multiply(new BigDecimal("0.006")); + orderCommission = paymentAmount.multiply(new BigDecimal("0.006").setScale(2,RoundingMode.HALF_DOWN)); tSettlementConfirm.setSharingAmount(sharingAmount.setScale(2, RoundingMode.HALF_DOWN)); tSettlementConfirm.setCommissionAmount(commissionAmount.setScale(2, RoundingMode.HALF_DOWN)); - tSettlementConfirm.setElectrovalence(electrovalence); - // 服务费=总服务费-三费收费-交易手续费-交易手续费-服务费会员抵扣-服务费优惠券抵扣 - tSettlementConfirm.setServiceCharge(serviceCharge.subtract(commissionAmount).subtract(sharingAmount).subtract(orderCommission).subtract(vipDiscount).subtract(couponDiscount)); + tSettlementConfirm.setElectrovalence(electrovalence.setScale(2, RoundingMode.HALF_DOWN)); + tSettlementConfirm.setServiceCharge(serviceCharge.setScale(2, RoundingMode.HALF_DOWN)); tSettlementConfirm.setOrderCommission(orderCommission); tSettlementConfirm.setVipDiscount(vipDiscount); tSettlementConfirm.setCouponDiscount(couponDiscount); tSettlementConfirm.setSiteId(dto.getSiteId()); tSettlementConfirm.setChargingElectronic(chargingElectronic); tSettlementConfirm.setIncome(chargingElectronic.add(serviceCharge)); - tSettlementConfirm.setProfitMoney(new BigDecimal("0")); - tSettlementConfirm.setNewMoney(new BigDecimal("0")); - tSettlementConfirm.setNewSettlement(new BigDecimal("0")); tSettlementConfirm.setVipDiscount(vipDiscount); tSettlementConfirm.setCouponDiscount(couponDiscount); tSettlementConfirm.setType(dto.getType()); @@ -2350,11 +2588,23 @@ tSettlementConfirm.setRemark(dto.getRemark()); tSettlementConfirm.setServicePartner(dto.getServicePartner()); tSettlementConfirm.setServiceMoney(dto.getServiceMoney()); + BigDecimal subtract = new BigDecimal("1").subtract(dto.getProportionPartner()); + // 总电损费用 + BigDecimal divide = tSettlementConfirm.getProportionMoney().divide(subtract, 2, RoundingMode.HALF_DOWN); + // 平台承担电损 + BigDecimal subtract1 = divide.subtract(tSettlementConfirm.getProportionMoney()); + BigDecimal multiply = dto.getServiceMoney().multiply(subtract); + BigDecimal subtract2 = multiply.subtract(subtract1); + tSettlementConfirm.setNewMoney(subtract2); + tSettlementConfirm.setTotalService(dto.getTotalService()); tSettlementConfirm.setServiceRemark(dto.getServiceRemark()); tSettlementConfirm.setDistribution(dto.getDistribution()); tSettlementConfirm.setIncome(dto.getElectrovalence().add(dto.getServiceCharge())); - tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain())); + tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain()).add(dto.getMetering())); + tSettlementConfirm.setProfitMoney(chargingElectronic.add(serviceCharge).subtract(tSettlementConfirm.getCost())); + tSettlementConfirm.setNewSettlement(subtract2.subtract(tSettlementConfirm.getCost())); + tSettlementConfirmMapper.insert(tSettlementConfirm); } return tSettlementConfirm; @@ -2362,6 +2612,18 @@ @Override public PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto) { + if (StringUtils.hasLength(dto.getStartTime())){ + dto.setType(1); + String[] split = dto.getStartTime().split(" - "); + dto.setStartTime(split[0]); + dto.setEndTime(split[1]); + } + if (StringUtils.hasLength(dto.getEndTime())){ + dto.setType(2); + String[] split = dto.getStartTime().split(" - "); + dto.setStartTime(split[0]); + dto.setEndTime(split[1]); + } PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo,dto); for (TSettlementConfirm tSettlementConfirm : list) { @@ -2426,11 +2688,12 @@ // tSettlementConfirm1.setIncomePercentage(); // tSettlementConfirm1.setTotalPercentage(); tSettlementConfirm1.setElectronicRefund(0); -// 上月成本合计 + // 上月成本合计 BigDecimal beforeCost= new BigDecimal("0"); // 上月利润合计 BigDecimal beforeIncome= new BigDecimal("0"); for (TSettlementConfirm tSettlementConfirm : list1) { + tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData(); if (!data1.isEmpty()){ tSettlementConfirm.setSiteName(data1.get(0).getName()); @@ -2483,11 +2746,14 @@ StringBuilder stringBuilder = new StringBuilder(); for (TChargingOrder tChargingOrder : tChargingOrders) { stringBuilder.append(tChargingOrder.getCode()).append(","); + } + // 充电总时长 + Long temp = 0L; if (StringUtils.hasLength(stringBuilder.toString())){ List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getOrderInfoByCodes(stringBuilder.substring(0,stringBuilder.length()-1)).getData(); - temp+=data6.stream().mapToLong(UploadRealTimeMonitoringData::getCumulative_charging_time).sum(); + temp+=(data6.stream().mapToLong(UploadRealTimeMonitoringData::getCumulative_charging_time).sum()*60); } List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData(); // 计算充电桩的功率平均值 @@ -2498,11 +2764,32 @@ tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge())); - // todo 计算利用率 该电站充电桩本月利用率: //利用率=充电量/(桩数量*功率*时间) + List<TChargingPile> data2 = chargingPileClient.getChargingPileBySiteId(tSettlementConfirm.getSiteId()).getData(); + BigDecimal bigDecimal2 = new BigDecimal("0"); + + if (data2!=null && (!data2.isEmpty())){ + for (TChargingPile tChargingPile : data2) { + bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower()); + } + BigDecimal bigDecimal1 = new BigDecimal(data2.size()+""); + // 平均功率 + BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN); + // 充电量 + BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic(); + // 桩数量 + BigDecimal bigDecimal3 = new BigDecimal(data2.size()); + BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24")); + BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp)); + tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1,2,RoundingMode.HALF_DOWN)+""); + }else{ + tSettlementConfirm.setRate(""); + } + for (TSettlementConfirm settlementConfirm : list2) { settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge())); + tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())){ // 电站相同比较收入涨幅跌幅 if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO)>0){ @@ -2559,7 +2846,7 @@ tSettlementConfirm.setIncomePercentage(0+"%"); tSettlementConfirm.setIncomePercentage(0+"%"); }else{ - BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); + BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome,2,RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); tSettlementConfirm.setIncomePercentage(subtract+"%"); tSettlementConfirm.setIncomePercentage(subtract+"%"); -- Gitblit v1.7.1