|  |  |  | 
|---|
|  |  |  | import com.ruoyi.order.service.TChargingOrderService; | 
|---|
|  |  |  | import com.ruoyi.order.service.TOrderEvaluateService; | 
|---|
|  |  |  | import com.ruoyi.order.service.*; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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.feignClient.SysUserClient; | 
|---|
|  |  |  | import io.seata.spring.annotation.GlobalTransactional; | 
|---|
|  |  |  | import org.slf4j.Logger; | 
|---|
|  |  |  | import org.slf4j.LoggerFactory; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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.LocalDate; | 
|---|
|  |  |  | import java.time.LocalDateTime; | 
|---|
|  |  |  | import java.time.ZoneOffset; | 
|---|
|  |  |  | import java.time.*; | 
|---|
|  |  |  | import java.time.format.DateTimeFormatter; | 
|---|
|  |  |  | import java.time.format.TextStyle; | 
|---|
|  |  |  | import java.time.temporal.WeekFields; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | import java.util.concurrent.*; | 
|---|
|  |  |  | import java.util.stream.Collectors; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private SiteClient siteClient; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private AppUserCarClient appUserCarClient; | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private TOrderEvaluateService orderEvaluateService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private AccountingStrategyDetailClient accountingStrategyDetailClient; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private AccountingStrategyOrderClient accountingStrategyOrderClient; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private AccountingStrategyClient accountingStrategyClient; | 
|---|
|  |  |  | 
|---|
|  |  |  | Map<String, Object> map = new HashMap<>(); | 
|---|
|  |  |  | int size = this.baseMapper.getMyChargingOrderList(appUserId, 1, null, null).size(); | 
|---|
|  |  |  | map.put("number", size); | 
|---|
|  |  |  | query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize()); | 
|---|
|  |  |  | List<TChargingOrder> list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize()); | 
|---|
|  |  |  | List<MyChargingOrderList> orderLists = new ArrayList<>(); | 
|---|
|  |  |  | for (TChargingOrder tChargingOrder : list) { | 
|---|
|  |  |  | 
|---|
|  |  |  | myChargingOrderInfo.setChargeMode(chargingGun.getChargeMode()); | 
|---|
|  |  |  | String name = chargingGunClient.getAllName(chargingOrder.getChargingGunId()).getData(); | 
|---|
|  |  |  | myChargingOrderInfo.setName(name); | 
|---|
|  |  |  | if(null != chargingOrder.getAppUserCarId()){ | 
|---|
|  |  |  | TAppUserCar tAppUserCar = appUserCarClient.getCarByIds(Arrays.asList(chargingOrder.getAppUserCarId())).getData().get(0); | 
|---|
|  |  |  | myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate()); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | myChargingOrderInfo.setLicensePlate("无"); | 
|---|
|  |  |  | if(Objects.nonNull(chargingOrder.getAppUserCarId())){ | 
|---|
|  |  |  | TAppUserCar tAppUserCar = appUserCarClient.getCarById(chargingOrder.getAppUserCarId().toString()).getData(); | 
|---|
|  |  |  | if(null != tAppUserCar){ | 
|---|
|  |  |  | myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate()); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | myChargingOrderInfo.setLicensePlate("无"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()); | 
|---|
|  |  |  | myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()); | 
|---|
|  |  |  | myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); | 
|---|
|  |  |  | myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); | 
|---|
|  |  |  | myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount()); | 
|---|
|  |  |  | myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount()); | 
|---|
|  |  |  | myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount()); | 
|---|
|  |  |  | 
|---|
|  |  |  | myChargingOrderInfo.setCurrentAndVoltage(currentAndVoltage); | 
|---|
|  |  |  | //在MongoDB中获取数据 | 
|---|
|  |  |  | List<Integer> soc = dataList.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList()); | 
|---|
|  |  |  | List<BigDecimal> po = dataList.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000))).collect(Collectors.toList()); | 
|---|
|  |  |  | List<BigDecimal> po = dataList.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN)).collect(Collectors.toList()); | 
|---|
|  |  |  | List<Map<String, Object>> power = new ArrayList<>(); | 
|---|
|  |  |  | for (int i = 0; i < time.size(); i++) { | 
|---|
|  |  |  | Map<String, Object> map = new HashMap<>(); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | myChargingOrderInfo.setPower(power); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L > System.currentTimeMillis() ? 0 : 1); | 
|---|
|  |  |  | myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L < System.currentTimeMillis() ? 0 : 1); | 
|---|
|  |  |  | return myChargingOrderInfo; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<MyChargingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query) { | 
|---|
|  |  |  | Long appUserId = tokenService.getLoginUserApplet().getUserId(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize()); | 
|---|
|  |  |  | List<TChargingOrder> orderList = this.baseMapper.getNoInvoicedOrder(appUserId, query.getMonth(), query.getPageCurr(), query.getPageSize()); | 
|---|
|  |  |  | List<MyChargingOrderList> list = new ArrayList<>(); | 
|---|
|  |  |  | for (TChargingOrder tChargingOrder : orderList) { | 
|---|
|  |  |  | 
|---|
|  |  |  | TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId()) | 
|---|
|  |  |  | .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0)); | 
|---|
|  |  |  | if(null != one){ | 
|---|
|  |  |  | return AjaxResult.error("充电枪正在充电桩中,启动失败"); | 
|---|
|  |  |  | return AjaxResult.error("充电枪正在充电中,启动失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //查询当前充电枪是否有正在支付的订单 | 
|---|
|  |  |  | one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId()) | 
|---|
|  |  |  | 
|---|
|  |  |  | chargingOrder.setAppUserId(userId); | 
|---|
|  |  |  | chargingOrder.setAppUserCarId(addChargingOrder.getAppUserCarId()); | 
|---|
|  |  |  | TChargingGun tChargingGun = chargingGunClient.getChargingGunById(addChargingOrder.getId()).getData(); | 
|---|
|  |  |  | TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData(); | 
|---|
|  |  |  | chargingOrder.setSiteId(tChargingGun.getSiteId()); | 
|---|
|  |  |  | chargingOrder.setChargingPileId(tChargingGun.getChargingPileId()); | 
|---|
|  |  |  | chargingOrder.setChargingGunId(addChargingOrder.getId()); | 
|---|
|  |  |  | 
|---|
|  |  |  | chargingOrder.setRechargePaymentStatus(1); | 
|---|
|  |  |  | chargingOrder.setRechargeAmount(addChargingOrder.getPaymentAmount()); | 
|---|
|  |  |  | chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId()); | 
|---|
|  |  |  | chargingOrder.setVipDiscount(new BigDecimal(10)); | 
|---|
|  |  |  | chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); | 
|---|
|  |  |  | chargingOrder.setOrderSource(0); | 
|---|
|  |  |  | chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪"); | 
|---|
|  |  |  | chargingOrder.setStatus(1); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0); | 
|---|
|  |  |  | Integer accountingStrategyId = tChargingGun.getAccountingStrategyId(); | 
|---|
|  |  |  | 
|---|
|  |  |  | TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData(); | 
|---|
|  |  |  | if(null != vipDetail){ | 
|---|
|  |  |  | Integer chargeNum = vipDetail.getChargeNum(); | 
|---|
|  |  |  | if(0 > chargeNum){ | 
|---|
|  |  |  | if(0 < chargeNum){ | 
|---|
|  |  |  | chargingOrder.setVipDiscount(discount); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | chargingOrder.setRechargePaymentStatus(2); | 
|---|
|  |  |  | chargingOrder.setRechargeSerialNumber(transaction_id); | 
|---|
|  |  |  | chargingOrder.setStatus(2); | 
|---|
|  |  |  | chargingOrder.setPayTime(LocalDateTime.now()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据 | 
|---|
|  |  |  | PreChargeCheck preChargeCheck = new PreChargeCheck(); | 
|---|
|  |  |  | 
|---|
|  |  |  | //根据支付金额,获取出使用的计费策略明细 | 
|---|
|  |  |  | //计算电费金额和服务费 | 
|---|
|  |  |  | BigDecimal serviceCharge = BigDecimal.ZERO; | 
|---|
|  |  |  | BigDecimal electrovalence = BigDecimal.ZERO; | 
|---|
|  |  |  | BigDecimal discountAmount = BigDecimal.ZERO; | 
|---|
|  |  |  | BigDecimal discount = chargingOrder.getVipDiscount(); | 
|---|
|  |  |  | //先根据额定功率计算出每秒充电度数,然后计算出支付金额能充多少度电 | 
|---|
|  |  |  | TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); | 
|---|
|  |  |  | //1秒充电度数 | 
|---|
|  |  |  | BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600), 6, RoundingMode.HALF_EVEN); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); | 
|---|
|  |  |  | List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); | 
|---|
|  |  |  | for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) { | 
|---|
|  |  |  | Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", "")); | 
|---|
|  |  |  | Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", "")); | 
|---|
|  |  |  | String[] split = accountingStrategyDetailOrder.getEndTime().split(":"); | 
|---|
|  |  |  | if(now >= start && now < end){ | 
|---|
|  |  |  | Calendar calendar = Calendar.getInstance(); | 
|---|
|  |  |  | calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0])); | 
|---|
|  |  |  | calendar.set(Calendar.MINUTE, Integer.valueOf(split[1])); | 
|---|
|  |  |  | //到此策略结束的秒数 | 
|---|
|  |  |  | if(null == nowTimeMillis){ | 
|---|
|  |  |  | String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":"); | 
|---|
|  |  |  | Calendar calendar1 = Calendar.getInstance(); | 
|---|
|  |  |  | calendar1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0])); | 
|---|
|  |  |  | calendar1.set(Calendar.MINUTE, Integer.valueOf(split1[1])); | 
|---|
|  |  |  | nowTimeMillis = calendar.getTimeInMillis(); | 
|---|
|  |  |  | //判断会员是否还有充电优惠次数,计算会员优惠的折扣金额 | 
|---|
|  |  |  | if(null != appUser.getVipId()){ | 
|---|
|  |  |  | GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail(); | 
|---|
|  |  |  | getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | getAppUserVipDetail.setVipId(appUser.getVipId()); | 
|---|
|  |  |  | TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData(); | 
|---|
|  |  |  | if(null != data && data.getChargeNum() > 0){ | 
|---|
|  |  |  | //计算折扣 | 
|---|
|  |  |  | List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); | 
|---|
|  |  |  | //将数据叠加两份,处理跨天的情况 | 
|---|
|  |  |  | list.addAll(list); | 
|---|
|  |  |  | boolean sta = false; | 
|---|
|  |  |  | for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) { | 
|---|
|  |  |  | Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", "")); | 
|---|
|  |  |  | Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", "")); | 
|---|
|  |  |  | String[] split = accountingStrategyDetailOrder.getEndTime().split(":"); | 
|---|
|  |  |  | if(sta || (now >= start && now < end)){ | 
|---|
|  |  |  | sta = true; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Calendar end_calendar = Calendar.getInstance(); | 
|---|
|  |  |  | end_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0])); | 
|---|
|  |  |  | end_calendar.set(Calendar.MINUTE, Integer.valueOf(split[1])); | 
|---|
|  |  |  | //到此策略结束的秒数 | 
|---|
|  |  |  | if(null == nowTimeMillis){ | 
|---|
|  |  |  | String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":"); | 
|---|
|  |  |  | Calendar start_calendar = Calendar.getInstance(); | 
|---|
|  |  |  | start_calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0])); | 
|---|
|  |  |  | start_calendar.set(Calendar.MINUTE, Integer.valueOf(split1[1])); | 
|---|
|  |  |  | nowTimeMillis = start_calendar.getTimeInMillis(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //间隔秒数 | 
|---|
|  |  |  | long m = (end_calendar.getTimeInMillis() - nowTimeMillis) / 1000; | 
|---|
|  |  |  | //每秒需要支付的服务费金额 | 
|---|
|  |  |  | BigDecimal total_until = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge()); | 
|---|
|  |  |  | BigDecimal s_total_amount = s_degrees.multiply(total_until); | 
|---|
|  |  |  | //每秒需要支付的服务费金额 | 
|---|
|  |  |  | BigDecimal s_server_amount = s_degrees.multiply(accountingStrategyDetailOrder.getServiceCharge()); | 
|---|
|  |  |  | //计算剩余金额能充多长时间的电 | 
|---|
|  |  |  | long times = rechargeAmount1.divide(s_total_amount, 0, RoundingMode.DOWN).longValue(); | 
|---|
|  |  |  | if(times > m){ | 
|---|
|  |  |  | //充电时间跨度两个计费策略,需要继续对下一个策略进行计算 | 
|---|
|  |  |  | serviceCharge = s_server_amount.multiply(new BigDecimal(m)); | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | if(null != discount){ | 
|---|
|  |  |  | discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | long m = (calendar.getTimeInMillis() - nowTimeMillis) / 1000; | 
|---|
|  |  |  | //每度电的单价 | 
|---|
|  |  |  | BigDecimal total_unit = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge()); | 
|---|
|  |  |  | //每秒需要支付的金额 | 
|---|
|  |  |  | BigDecimal multiply = s_degrees.multiply(total_unit); | 
|---|
|  |  |  | //计算充值金额能充多长时间的电 | 
|---|
|  |  |  | long times = rechargeAmount1.divide(multiply, 0, RoundingMode.DOWN).longValue(); | 
|---|
|  |  |  | if(times > m){ | 
|---|
|  |  |  | //充电时间跨度两个计费策略,需要继续对下一个策略进行计算 | 
|---|
|  |  |  | electrovalence = accountingStrategyDetailOrder.getElectrovalence().multiply(s_degrees).multiply(new BigDecimal(m)); | 
|---|
|  |  |  | serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(m)); | 
|---|
|  |  |  | discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10)))); | 
|---|
|  |  |  | rechargeAmount1 = rechargeAmount1.subtract(multiply.multiply(new BigDecimal(m))); | 
|---|
|  |  |  | nowTimeMillis = null; | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | electrovalence = accountingStrategyDetailOrder.getElectrovalence().multiply(s_degrees).multiply(new BigDecimal(times)); | 
|---|
|  |  |  | serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(times)); | 
|---|
|  |  |  | discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10)))); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | if(discountAmount.compareTo(BigDecimal.ZERO) >= 0){ | 
|---|
|  |  |  | //计算会员最大优惠金额 | 
|---|
|  |  |  | TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); | 
|---|
|  |  |  | BigDecimal maximumDeduction = vip.getMaximumDeduction(); | 
|---|
|  |  |  | //普通会员有最高优惠限制 | 
|---|
|  |  |  | if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){ | 
|---|
|  |  |  | discountAmount = maximumDeduction; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(discountAmount.compareTo(BigDecimal.ZERO) >= 0){ | 
|---|
|  |  |  | //计算会员最大优惠金额 | 
|---|
|  |  |  | if(null != appUser.getVipId()){ | 
|---|
|  |  |  | TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); | 
|---|
|  |  |  | BigDecimal maximumDeduction = vip.getMaximumDeduction(); | 
|---|
|  |  |  | //普通会员有最高优惠限制 | 
|---|
|  |  |  | if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){ | 
|---|
|  |  |  | discountAmount = maximumDeduction; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //判断会员是否还有充电优惠次数 | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | //会员有充电优惠次数,直接将优惠金额加入到充电费用中增加充电时长 | 
|---|
|  |  |  | electrovalence = electrovalence.add(discountAmount); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | electrovalence = electrovalence.setScale(2, RoundingMode.HALF_EVEN); | 
|---|
|  |  |  | discountAmount = discountAmount.setScale(2, RoundingMode.HALF_EVEN); | 
|---|
|  |  |  | chargingOrder.setChargeAmount(electrovalence); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //机子上显示的金额为用户充值的金额+会员折扣金额 | 
|---|
|  |  |  | BigDecimal account_balance = chargingOrder.getRechargeAmount().add(discountAmount).setScale(4, RoundingMode.HALF_EVEN); | 
|---|
|  |  |  | chargingOrder.setChargeAmount(account_balance); | 
|---|
|  |  |  | chargingOrder.setVipDiscountAmount(discountAmount); | 
|---|
|  |  |  | this.updateById(chargingOrder); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | platformStartCharging.setCharging_gun_code(tChargingGun.getCode()); | 
|---|
|  |  |  | //使用订单id作为逻辑卡号 | 
|---|
|  |  |  | platformStartCharging.setCard_number(chargingOrder.getId().toString()); | 
|---|
|  |  |  | platformStartCharging.setAccount_balance(electrovalence); | 
|---|
|  |  |  | platformStartCharging.setAccount_balance(account_balance); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | log.error(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------"); | 
|---|
|  |  |  | log.error(platformStartCharging.toString()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | log.error(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString()); | 
|---|
|  |  |  | sendMessageClient.platformStartCharging(platformStartCharging); | 
|---|
|  |  |  | //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 | 
|---|
|  |  |  | Long id = chargingOrder.getId(); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String code = chargingOrder.getCode(); | 
|---|
|  |  |  | String key = "AQJC_" + chargingOrder.getChargingGunId(); | 
|---|
|  |  |  | //获取安全校验 | 
|---|
|  |  |  | com.ruoyi.integration.api.model.SecurityDetection securityDetection = securityDetectionClient.getSecurityDetection(chargingOrder.getCode()).getData(); | 
|---|
|  |  |  | if(null != securityDetection){ | 
|---|
|  |  |  | PreChargeCheck preChargeCheck1 =  redisService.getCacheObject("AQJC_" + chargingOrder.getChargingGunId()); | 
|---|
|  |  |  | if(null != preChargeCheck1){ | 
|---|
|  |  |  | preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock()); | 
|---|
|  |  |  | preChargeCheck1.setInsulationTesting(true); | 
|---|
|  |  |  | preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection()); | 
|---|
|  |  |  | preChargeCheck1.setStartupSuccess(1); | 
|---|
|  |  |  | redisService.setCacheObject("AQJC_" + chargingOrder.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData(); | 
|---|
|  |  |  | log.error(code + ":-------------------开始检查调起充电结果-------------------"); | 
|---|
|  |  |  | log.error(data.toString()); | 
|---|
|  |  |  | log.error(code + ":-------------------开始检查调起充电结果-------------------" + data.toString()); | 
|---|
|  |  |  | if(data.size() != 0){ | 
|---|
|  |  |  | PlatformStartChargingReply platformStartChargingReply = data.get(1); | 
|---|
|  |  |  | Integer startup_result = platformStartChargingReply.getStartup_result(); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //清除计时器中的无效数据 | 
|---|
|  |  |  | counter_map.remove(code); | 
|---|
|  |  |  | TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); | 
|---|
|  |  |  | TChargingOrder order = new TChargingOrder(); | 
|---|
|  |  |  | order.setId(id); | 
|---|
|  |  |  | order.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | if(0 == startup_result){ | 
|---|
|  |  |  | //启动失败 | 
|---|
|  |  |  | preChargeCheck1.setStartupSuccess(3); | 
|---|
|  |  |  | 
|---|
|  |  |  | redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | log.error(code + ":-------------------未上传开启充电结果-------------------"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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.setStartupSuccess(1); | 
|---|
|  |  |  | preChargeCheck1.setFailureCause(0); | 
|---|
|  |  |  | redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //清除计时器中的无效数据 | 
|---|
|  |  |  | boot_failed_map.remove(code); | 
|---|
|  |  |  | TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); | 
|---|
|  |  |  | TChargingOrder order = new TChargingOrder(); | 
|---|
|  |  |  | order.setId(id); | 
|---|
|  |  |  | order.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | //启动失败 | 
|---|
|  |  |  | preChargeCheck1.setStartupSuccess(3); | 
|---|
|  |  |  | preChargeCheck1.setFailureCause(0); | 
|---|
|  |  |  | 
|---|
|  |  |  | code.setCharging_pile_code(securityDetection.getCharging_pile_code()); | 
|---|
|  |  |  | code.setCharging_gun_code(securityDetection.getCharging_gun_code()); | 
|---|
|  |  |  | TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData(); | 
|---|
|  |  |  | PreChargeCheck preChargeCheck1 =  redisService.getCacheObject("AQJC_" + chargingGun.getId()); | 
|---|
|  |  |  | PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + chargingGun.getId()); | 
|---|
|  |  |  | if(null != preChargeCheck1){ | 
|---|
|  |  |  | preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock()); | 
|---|
|  |  |  | preChargeCheck1.setElectronicLockLock(true); | 
|---|
|  |  |  | preChargeCheck1.setInsulationTesting(true); | 
|---|
|  |  |  | preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection()); | 
|---|
|  |  |  | preChargeCheck1.setStartupSuccess(1); | 
|---|
|  |  |  | preChargeCheck1.setSecureConnectionDetection(securityDetection.getSecure_connection() == 1); | 
|---|
|  |  |  | redisService.setCacheObject("AQJC_" + chargingGun.getId(), preChargeCheck1, 24L, TimeUnit.HOURS); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 启动充电应发 | 
|---|
|  |  |  | * 启动充电应答 | 
|---|
|  |  |  | * @param message | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | 
|---|
|  |  |  | String code = order.getCode(); | 
|---|
|  |  |  | PreChargeCheck preChargeCheck1 =  redisService.getCacheObject("AQJC_" + order.getChargingGunId()); | 
|---|
|  |  |  | if(null != preChargeCheck1){ | 
|---|
|  |  |  | preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock()); | 
|---|
|  |  |  | preChargeCheck1.setElectronicLockLock(true); | 
|---|
|  |  |  | preChargeCheck1.setInsulationTesting(true); | 
|---|
|  |  |  | preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection()); | 
|---|
|  |  |  | preChargeCheck1.setStartupSuccess(1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(0 == startup_result){ | 
|---|
|  |  |  | 
|---|
|  |  |  | preChargeCheck1.setStartupSuccess(2); | 
|---|
|  |  |  | order.setStatus(3); | 
|---|
|  |  |  | order.setStartTime(LocalDateTime.now()); | 
|---|
|  |  |  | TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); | 
|---|
|  |  |  | chargingGun.setStatus(4); | 
|---|
|  |  |  | chargingGunClient.updateChargingGunById(chargingGun); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); | 
|---|
|  |  |  | this.updateById(order); | 
|---|
|  |  |  | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time){ | 
|---|
|  |  |  | if("SUCCESS".equals(tradeState)){ | 
|---|
|  |  |  | TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no)); | 
|---|
|  |  |  | one.setRefundSerialNumber(refund_id); | 
|---|
|  |  |  | one.setRefundStatus(2); | 
|---|
|  |  |  | one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE"))); | 
|---|
|  |  |  | chargingOrderRefundService.updateById(one); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no)); | 
|---|
|  |  |  | one.setRefundSerialNumber(refund_id); | 
|---|
|  |  |  | one.setRefundStatus(2); | 
|---|
|  |  |  | one.setRefundTime(LocalDateTime.now()); | 
|---|
|  |  |  | chargingOrderRefundService.updateById(one); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | this.updateById(chargingOrder); | 
|---|
|  |  |  | return AjaxResult.success(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | public ChargingDetails getChargingDetails(Integer id) { | 
|---|
|  |  |  | Long userId = tokenService.getLoginUserApplet().getUserId(); | 
|---|
|  |  |  | TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id) | 
|---|
|  |  |  | .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0)); | 
|---|
|  |  |  | .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0).orderByDesc(TChargingOrder::getStartTime).last(" limit 0, 1")); | 
|---|
|  |  |  | if(null == one){ | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | if(null != data){ | 
|---|
|  |  |  | chargingDetails.setChargeCurrent(data.getOutput_current()); | 
|---|
|  |  |  | chargingDetails.setChargeVoltage(data.getOutput_voltage()); | 
|---|
|  |  |  | BigDecimal power = data.getOutput_current().multiply(data.getOutput_voltage()).divide(new BigDecimal(1000)); | 
|---|
|  |  |  | BigDecimal power = data.getOutput_current().multiply(data.getOutput_voltage()).divide(new BigDecimal(1000), new MathContext(4, RoundingMode.HALF_EVEN)); | 
|---|
|  |  |  | chargingDetails.setChargePower(power); | 
|---|
|  |  |  | chargingDetails.setCompletionRatio(data.getSoc()); | 
|---|
|  |  |  | chargingDetails.setRemainingChargeTime(data.getTime_remaining()); | 
|---|
|  |  |  | chargingDetails.setChargedDegrees(data.getCharging_degree()); | 
|---|
|  |  |  | chargingDetails.setChargedTime(data.getCumulative_charging_time()); | 
|---|
|  |  |  | Integer h = Integer.valueOf(data.getCumulative_charging_time() / 60); | 
|---|
|  |  |  | Integer m = Integer.valueOf(data.getCumulative_charging_time() % 60); | 
|---|
|  |  |  | chargingDetails.setChargedTime(String.format("%02d", h) + ":" + String.format("%02d", m)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //转换成UTC时间 | 
|---|
|  |  |  | ChargingHandshake chargingHandshake = chargingHandshakeClient.getDataByOrderCode(one.getCode()).getData(); | 
|---|
|  |  |  | if(null != chargingHandshake && null != data && null != one.getAppUserCarId()){ | 
|---|
|  |  |  | BigDecimal bms_battery_capacity = chargingHandshake.getBms_battery_capacity(); | 
|---|
|  |  |  | 
|---|
|  |  |  | @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.setStatus(4); | 
|---|
|  |  |  | chargingOrder.setEndMode(1); | 
|---|
|  |  |  | this.updateById(chargingOrder); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //处理用户标签数据 | 
|---|
|  |  |  | List<TUserTag> data = userTagClient.getAllUserTag().getData(); | 
|---|
|  |  |  | //累计充电次数 | 
|---|
|  |  |  | long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) | 
|---|
|  |  |  | .eq(TChargingOrder::getRechargePaymentStatus, 2).isNotNull(TChargingOrder::getPaymentAmount).eq(TChargingOrder::getDelFlag, 0)); | 
|---|
|  |  |  | List<TUserTag> userTagList1 = data.stream().filter(s -> s.getStandardCondition() == 1).collect(Collectors.toList()); | 
|---|
|  |  |  | int old_times = 0; | 
|---|
|  |  |  | Integer userTagId = null; | 
|---|
|  |  |  | for (TUserTag tUserTag : userTagList1) { | 
|---|
|  |  |  | Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times"); | 
|---|
|  |  |  | //加上本次充电 | 
|---|
|  |  |  | //获取最大值标签 | 
|---|
|  |  |  | if((count1 + 1) >= times && old_times < times){ | 
|---|
|  |  |  | userTagId = tUserTag.getId(); | 
|---|
|  |  |  | old_times = times; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(null != userTagId){ | 
|---|
|  |  |  | TAppUserTag appUserTag = new TAppUserTag(); | 
|---|
|  |  |  | appUserTag.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | appUserTag.setUserTagId(userTagId); | 
|---|
|  |  |  | TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData(); | 
|---|
|  |  |  | if(null == data1){ | 
|---|
|  |  |  | data1 = new TAppUserTag(); | 
|---|
|  |  |  | data1.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | data1.setUserTagId(userTagId); | 
|---|
|  |  |  | data1.setCreateTime(LocalDateTime.now()); | 
|---|
|  |  |  | appUserTagClient.addUserTag(data1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //充电评率 | 
|---|
|  |  |  | List<TUserTag> userTagList2 = data.stream().filter(s -> s.getStandardCondition() == 2).collect(Collectors.toList()); | 
|---|
|  |  |  | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 
|---|
|  |  |  | for (TUserTag tUserTag : userTagList2) { | 
|---|
|  |  |  | TAppUserTag appUserTag = new TAppUserTag(); | 
|---|
|  |  |  | appUserTag.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | appUserTag.setUserTagId(tUserTag.getId()); | 
|---|
|  |  |  | TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData(); | 
|---|
|  |  |  | if(null == data1){ | 
|---|
|  |  |  | Integer day = JSON.parseObject(tUserTag.getConditions()).getInteger("day"); | 
|---|
|  |  |  | Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times"); | 
|---|
|  |  |  | Calendar start = Calendar.getInstance(); | 
|---|
|  |  |  | start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + day); | 
|---|
|  |  |  | count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) | 
|---|
|  |  |  | .eq(TChargingOrder::getRechargePaymentStatus, 2).isNotNull(TChargingOrder::getPaymentAmount) | 
|---|
|  |  |  | .between(TChargingOrder::getStartTime, sdf.format(start.getTime()), sdf.format(new Date())).eq(TChargingOrder::getDelFlag, 0)); | 
|---|
|  |  |  | //加上本次充电 | 
|---|
|  |  |  | if(count1 >= times){ | 
|---|
|  |  |  | data1 = new TAppUserTag(); | 
|---|
|  |  |  | data1.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | data1.setUserTagId(tUserTag.getId()); | 
|---|
|  |  |  | data1.setCreateTime(LocalDateTime.now()); | 
|---|
|  |  |  | appUserTagClient.addUserTag(data1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String code1 = chargingOrder.getCode(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String code1 = order.getCode(); | 
|---|
|  |  |  | TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); | 
|---|
|  |  |  | //异步线程处理停机 | 
|---|
|  |  |  | ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1); | 
|---|
|  |  |  | cachedThreadPool.execute(()->{ | 
|---|
|  |  |  | //调用硬件停止充电,停止成功后开始计算费用退款 | 
|---|
|  |  |  | TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingOrder.getChargingPileId()).getData(); | 
|---|
|  |  |  | TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); | 
|---|
|  |  |  | 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.error(code1 + ":-------------------远程停止充电请求-------------------"); | 
|---|
|  |  |  | log.error(platformStopCharging.toString()); | 
|---|
|  |  |  | //开始查询停机应答,成功后开始计费费用 | 
|---|
|  |  |  | for (int i = 0; i < 60; i++) { | 
|---|
|  |  |  | GetPlatformStopChargingReply query = new GetPlatformStopChargingReply(); | 
|---|
|  |  |  | query.setCharging_gun_code(chargingGun.getCode()); | 
|---|
|  |  |  | query.setCharging_pile_code(chargingPile.getCode()); | 
|---|
|  |  |  | query.setEnd_time(chargingOrder.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); | 
|---|
|  |  |  | PlatformStopChargingReply reply = platformStopChargingReplyClient.getPlatformStopChargingReply(query).getData(); | 
|---|
|  |  |  | log.error(code1 + ":-------------------查询远程停止充电应答-------------------"); | 
|---|
|  |  |  | log.error(reply.toString()); | 
|---|
|  |  |  | if(null == reply){ | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | Thread.sleep(1000); | 
|---|
|  |  |  | } catch (InterruptedException e) { | 
|---|
|  |  |  | throw new RuntimeException(e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TChargingOrder chargingOrder1 = this.getById(id); | 
|---|
|  |  |  | if(chargingOrder1.getStatus() != 3){ | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(0 == reply.getStop_result()){ | 
|---|
|  |  |  | String failure_cause = ""; | 
|---|
|  |  |  | switch (reply.getFailure_cause()){ | 
|---|
|  |  |  | case 0: | 
|---|
|  |  |  | failure_cause = "无"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 1: | 
|---|
|  |  |  | failure_cause = "设备编号不匹配"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 2: | 
|---|
|  |  |  | failure_cause = "枪未处于充电状态"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 3: | 
|---|
|  |  |  | failure_cause = "其他"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | log.error(code1 + ":停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | Thread.sleep(1000); | 
|---|
|  |  |  | } catch (InterruptedException e) { | 
|---|
|  |  |  | throw new RuntimeException(e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 将枪状态重置为空闲 | 
|---|
|  |  |  | chargingGun.setStatus(2); | 
|---|
|  |  |  | chargingGunClient.updateChargingGunById(chargingGun); | 
|---|
|  |  |  | //计算费用,处理退款 | 
|---|
|  |  |  | endCharge(chargingOrder); | 
|---|
|  |  |  | log.error(code1 + ":-------------------远程停止充电请求成功-------------------"); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return AjaxResult.success(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 结束充电后处理用户标签数据 | 
|---|
|  |  |  | * @param chargingOrder | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void editUserTag(TChargingOrder chargingOrder){ | 
|---|
|  |  |  | //处理用户标签数据 | 
|---|
|  |  |  | List<TUserTag> data = userTagClient.getAllUserTag().getData(); | 
|---|
|  |  |  | //累计充电次数 | 
|---|
|  |  |  | List<TUserTag> userTagList1 = data.stream().filter(s -> s.getStandardCondition() == 1).collect(Collectors.toList()); | 
|---|
|  |  |  | for (TUserTag tUserTag : userTagList1) { | 
|---|
|  |  |  | Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times"); | 
|---|
|  |  |  | TAppUserTag appUserTag = new TAppUserTag(); | 
|---|
|  |  |  | appUserTag.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | appUserTag.setUserTagId(tUserTag.getId()); | 
|---|
|  |  |  | TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String start = tUserTag.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); | 
|---|
|  |  |  | String end = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); | 
|---|
|  |  |  | long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) | 
|---|
|  |  |  | .eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0)); | 
|---|
|  |  |  | if(null == data1 && count1 >= times){ | 
|---|
|  |  |  | data1 = new TAppUserTag(); | 
|---|
|  |  |  | data1.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | data1.setUserTagId(tUserTag.getId()); | 
|---|
|  |  |  | data1.setCreateTime(LocalDateTime.now()); | 
|---|
|  |  |  | appUserTagClient.addUserTag(data1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //充电频率 | 
|---|
|  |  |  | List<TUserTag> userTagList2 = data.stream().filter(s -> s.getStandardCondition() == 2).collect(Collectors.toList()); | 
|---|
|  |  |  | for (TUserTag tUserTag : userTagList2) { | 
|---|
|  |  |  | TAppUserTag appUserTag = new TAppUserTag(); | 
|---|
|  |  |  | appUserTag.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | appUserTag.setUserTagId(tUserTag.getId()); | 
|---|
|  |  |  | TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer day = JSON.parseObject(tUserTag.getConditions()).getInteger("day"); | 
|---|
|  |  |  | Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times"); | 
|---|
|  |  |  | LocalDateTime endTime = LocalDateTime.now(); | 
|---|
|  |  |  | endTime.plusDays(day); | 
|---|
|  |  |  | String start = tUserTag.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); | 
|---|
|  |  |  | String end = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); | 
|---|
|  |  |  | long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) | 
|---|
|  |  |  | .eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0)); | 
|---|
|  |  |  | if(null == data1 && count1 >= times){ | 
|---|
|  |  |  | data1 = new TAppUserTag(); | 
|---|
|  |  |  | data1.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | data1.setUserTagId(tUserTag.getId()); | 
|---|
|  |  |  | data1.setCreateTime(LocalDateTime.now()); | 
|---|
|  |  |  | appUserTagClient.addUserTag(data1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 推荐奖励(被推荐首单奖励) | 
|---|
|  |  |  | * @param chargingOrder | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void referralReward(TChargingOrder chargingOrder){ | 
|---|
|  |  |  | //处理推荐奖励(被推荐首单奖励) | 
|---|
|  |  |  | TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); | 
|---|
|  |  |  | long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) | 
|---|
|  |  |  | .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0)); | 
|---|
|  |  |  | .in(TChargingOrder::getStatus, Arrays.asList(4, 5)).eq(TChargingOrder::getDelFlag, 0)); | 
|---|
|  |  |  | if(null != appUser.getInviteUserId() && 1 == count){ | 
|---|
|  |  |  | TIntegralRule integralRule = integralRuleClient.getSet().getData(); | 
|---|
|  |  |  | String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints(); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | 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(4); | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return AjaxResult.success(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | if(null != order && order.getStatus() != 3){ | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String code1 = order.getCode(); | 
|---|
|  |  |  | if(0 == platformStopChargingReply.getStop_result()){ | 
|---|
|  |  |  | String failure_cause = ""; | 
|---|
|  |  |  | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | log.error(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | TChargingOrder chargingOrder = new TChargingOrder(); | 
|---|
|  |  |  | chargingOrder.setId(order.getId()); | 
|---|
|  |  |  | chargingOrder.setAppUserId(order.getAppUserId()); | 
|---|
|  |  |  | chargingOrder.setEndMode(1); | 
|---|
|  |  |  | this.updateById(chargingOrder); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 将枪状态重置为空闲 | 
|---|
|  |  |  | chargingGun.setStatus(2); | 
|---|
|  |  |  | chargingGunClient.updateChargingGunById(chargingGun); | 
|---|
|  |  |  | //计算费用,处理退款 | 
|---|
|  |  |  | endCharge(order); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 手动结束后的费用计算和退款逻辑 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @GlobalTransactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void endCharge(TChargingOrder chargingOrder){ | 
|---|
|  |  |  | //如果使用优惠券需要判断优惠券是否满足使用条件 | 
|---|
|  |  |  | //根据实际的充电金额计算退款金额   退回费用=(原金额/总金额)*(总金额-实际充电金额) | 
|---|
|  |  |  | //退款金额=优惠券金额+剩余充电金额 | 
|---|
|  |  |  | List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); | 
|---|
|  |  |  | BigDecimal total = BigDecimal.ZERO; | 
|---|
|  |  |  | for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) { | 
|---|
|  |  |  | BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice(); | 
|---|
|  |  |  | BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice(); | 
|---|
|  |  |  | total = total.add(periodElectricPrice).add(periodServicePrice); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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 payAmount = BigDecimal.valueOf(total.doubleValue()); | 
|---|
|  |  |  | BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue()); | 
|---|
|  |  |  | if(null != chargingOrder.getVipDiscount()){ | 
|---|
|  |  |  | orderAmount = orderAmount.divide(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); | 
|---|
|  |  |  | chargingOrder.setOrderAmount(total); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(chargingOrder.getEndMode() == 2){ | 
|---|
|  |  |  | chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | chargingOrder.setStatus(5); | 
|---|
|  |  |  | chargingOrder.setPaymentAmount(payAmount); | 
|---|
|  |  |  | this.updateById(chargingOrder); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //添加积分 | 
|---|
|  |  |  | 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 = payAmount.multiply(new BigDecimal(num1)).intValue(); | 
|---|
|  |  |  | if(null != appUser.getVipId()){ | 
|---|
|  |  |  | TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); | 
|---|
|  |  |  | Integer doubleIntegration = vip.getDoubleIntegration(); | 
|---|
|  |  |  | //双倍积分 | 
|---|
|  |  |  | if(1 == doubleIntegration){ | 
|---|
|  |  |  | integral *= 2; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | appUserClient.updateAppUser(appUser); | 
|---|
|  |  |  | appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //计算优惠券 | 
|---|
|  |  |  | 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(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){ | 
|---|
|  |  |  | refundAmount = refundAmount.add(tCoupon.getDiscountAmount()); | 
|---|
|  |  |  | chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount()); | 
|---|
|  |  |  | payAmount = payAmount.subtract(tCoupon.getDiscountAmount()); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | chargingOrder.setAppCouponId(null); | 
|---|
|  |  |  | chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); | 
|---|
|  |  |  | appCouponClient.refund(chargingOrder.getAppCouponId().toString()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(2 == preferentialMode){ | 
|---|
|  |  |  | //抵扣 | 
|---|
|  |  |  | if(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){ | 
|---|
|  |  |  | //折扣金额 | 
|---|
|  |  |  | BigDecimal divide = total.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10)); | 
|---|
|  |  |  | divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide; | 
|---|
|  |  |  | refundAmount = refundAmount.add(divide); | 
|---|
|  |  |  | chargingOrder.setCouponDiscountAmount(divide); | 
|---|
|  |  |  | payAmount = payAmount.subtract(divide); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | chargingOrder.setAppCouponId(null); | 
|---|
|  |  |  | chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); | 
|---|
|  |  |  | appCouponClient.refund(chargingOrder.getAppCouponId().toString()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(null != chargingOrder.getVipDiscount()){ | 
|---|
|  |  |  | BigDecimal subtract = orderAmount.subtract(total); | 
|---|
|  |  |  | chargingOrder.setVipDiscountAmount(subtract); | 
|---|
|  |  |  | payAmount = payAmount.subtract(subtract); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //开始构建退款费用 | 
|---|
|  |  |  | 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("充电完成退款"); | 
|---|
|  |  |  | 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(rechargeAmount.toString()); | 
|---|
|  |  |  | dto.setRefundReason("充电完成退款"); | 
|---|
|  |  |  | RefundResp resp = aliPaymentClient.refund(dto).getData(); | 
|---|
|  |  |  | if(null != resp){ | 
|---|
|  |  |  | SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); | 
|---|
|  |  |  | AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date())); | 
|---|
|  |  |  | if(success.isSuccess()){ | 
|---|
|  |  |  | chargingOrderRefundService.save(chargingOrderRefund); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | endTime2 = split[1]; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | PageInfo<ChargingOrderVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); | 
|---|
|  |  |  | PageInfo<ChargingOrderVO> pageInfo1 = new PageInfo<>(1,9999999); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (StringUtils.hasLength(dto.getPhone())){ | 
|---|
|  |  |  | List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); | 
|---|
|  |  |  | 
|---|
|  |  |  | dto.setUserIds(data); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); | 
|---|
|  |  |  | List<ChargingOrderVO> list1 = this.baseMapper.chargingOrder(pageInfo1,dto,startTime1,startTime2,endTime1,endTime2); | 
|---|
|  |  |  | BigDecimal total = new BigDecimal("0"); | 
|---|
|  |  |  | long time = 0L; | 
|---|
|  |  |  | BigDecimal income = new BigDecimal("0"); | 
|---|
|  |  |  | BigDecimal electronicMoney = new BigDecimal("0"); | 
|---|
|  |  |  | BigDecimal serviceMoney = new BigDecimal("0"); | 
|---|
|  |  |  | for (ChargingOrderVO chargingOrderVO : list) { | 
|---|
|  |  |  | chargingOrderVO.setCommissionAmount(chargingOrderVO.getServiceCharge().multiply(new BigDecimal("0.006"))); | 
|---|
|  |  |  | chargingOrderVO.setPlatFormMoney(chargingOrderVO.getServiceCharge().multiply(new BigDecimal("0.006"))); | 
|---|
|  |  |  | chargingOrderVO.setUid(chargingOrderVO.getId()+""); | 
|---|
|  |  |  | TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData(); | 
|---|
|  |  |  | TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData(); | 
|---|
|  |  |  | if (chargingOrderVO.getSiteId()!=null){ | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (data2!=null && data3!=null){ | 
|---|
|  |  |  | chargingOrderVO.setTerminalName(data2.getName()+"-"+data3.getName()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (chargingOrderVO.getChargingCapacity()!=null){ | 
|---|
|  |  |  | total = total.add(chargingOrderVO.getChargingCapacity()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 充电订单 明细记录 | 
|---|
|  |  |  | List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>() | 
|---|
|  |  |  | .eq("charging_order_id", chargingOrderVO.getId())); | 
|---|
|  |  |  | // 单个订单累计电费 | 
|---|
|  |  |  | BigDecimal electronicMoney1 = new BigDecimal("0"); | 
|---|
|  |  |  | // 单个订单累计服务费 | 
|---|
|  |  |  | BigDecimal serviceMoney1 = new BigDecimal("0"); | 
|---|
|  |  |  | UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData(); | 
|---|
|  |  |  | if (data5!=null){ | 
|---|
|  |  |  | chargingOrderVO.setChargingSecond(data5.getTime_remaining()*60L); | 
|---|
|  |  |  | long l = data5.getCumulative_charging_time() * 60L; | 
|---|
|  |  |  | chargingOrderVO.setChargingSecond(l); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 总收入 | 
|---|
|  |  |  | if (chargingOrderVO.getRefundStatus() !=null && chargingOrderVO.getRefundStatus() == 2){ | 
|---|
|  |  |  | income = income.add(chargingOrderVO.getPaymentAmount().subtract(chargingOrderVO.getRefundAmount())); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | if (chargingOrderVO.getPaymentAmount()!=null){ | 
|---|
|  |  |  | income = income.add(chargingOrderVO.getPaymentAmount()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (TChargingOrderAccountingStrategy tChargingOrderAccountingStrategy : chargingOrderId) { | 
|---|
|  |  |  | // 累计电费 | 
|---|
|  |  |  | electronicMoney1 = electronicMoney1.add(tChargingOrderAccountingStrategy.getElectrovalence() | 
|---|
|  |  |  | .multiply(tChargingOrderAccountingStrategy.getChargingCapacity())); | 
|---|
|  |  |  | electronicMoney = electronicMoney.add(electronicMoney1); | 
|---|
|  |  |  | // 累计服务费 | 
|---|
|  |  |  | serviceMoney1 = serviceMoney1.add(tChargingOrderAccountingStrategy.getServiceCharge()); | 
|---|
|  |  |  | serviceMoney = serviceMoney.add(serviceMoney1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | chargingOrderVO.setServiceCharge(serviceMoney1); | 
|---|
|  |  |  | chargingOrderVO.setElectrovalence(electronicMoney1); | 
|---|
|  |  |  | // 充电时段数 | 
|---|
|  |  |  | int size = chargingOrderId.size(); | 
|---|
|  |  |  | chargingOrderVO.setCount(size); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (ChargingOrderVO chargingOrderVO : list1) { | 
|---|
|  |  |  | if (chargingOrderVO.getChargingCapacity()!=null){ | 
|---|
|  |  |  | total = total.add(chargingOrderVO.getElectricity()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 充电订单 明细记录 | 
|---|
|  |  |  | List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>() | 
|---|
|  |  |  | .eq("charging_order_id", chargingOrderVO.getId())); | 
|---|
|  |  |  | UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData(); | 
|---|
|  |  |  | if (data5!=null){ | 
|---|
|  |  |  | long l = data5.getCumulative_charging_time() * 60L; | 
|---|
|  |  |  | chargingOrderVO.setChargingSecond(l); | 
|---|
|  |  |  | time+=l; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | electronicMoney = electronicMoney.add(chargingOrderVO.getElectrovalence()); | 
|---|
|  |  |  | serviceMoney = serviceMoney.add(chargingOrderVO.getServiceCharge()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | income = income.add(chargingOrderVO.getOrderAmount()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | tCharingOrderVO.setTotal(total); | 
|---|
|  |  |  | tCharingOrderVO.setTime(time); | 
|---|
|  |  |  | tCharingOrderVO.setIncome(income); | 
|---|
|  |  |  | 
|---|
|  |  |  | public R<PageInfo<PayOrderDto>> payOrderQuery(PayOrderQueryDto payOrderQueryDto) { | 
|---|
|  |  |  | PageInfo<PayOrderDto> pageInfo = new PageInfo<>(payOrderQueryDto.getPageCurr(),payOrderQueryDto.getPageSize()); | 
|---|
|  |  |  | List<PayOrderDto> list = this.baseMapper.payOrderQuery(pageInfo,payOrderQueryDto); | 
|---|
|  |  |  | for (PayOrderDto payOrderDto : list) { | 
|---|
|  |  |  | if (payOrderDto.getType()==2||payOrderDto.getType()==3){ | 
|---|
|  |  |  | payOrderDto.setFinalAmount(payOrderDto.getOrderAmount()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (payOrderDto.getType()==1&&payOrderDto.getStatus()==3){ | 
|---|
|  |  |  | payOrderDto.setFinalAmount(payOrderDto.getRechargeAmount()); | 
|---|
|  |  |  | payOrderDto.setOrderAmount(payOrderDto.getRechargeAmount()); | 
|---|
|  |  |  | payOrderDto.setPaymentAmount(payOrderDto.getRechargeAmount()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | pageInfo.setRecords(list); | 
|---|
|  |  |  | return R.ok(pageInfo); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | public List<Map<String, Object>> getYearData(List<Long> chargingOrderIds) { | 
|---|
|  |  |  | return this.baseMapper.getYearData(chargingOrderIds); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private SysUserClient sysUserClient; | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private UserSiteClient userSiteClient; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private RoleSiteClient roleSiteClient; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ChargingOrderTimeVO chargingList(ChargingListQuery dto) { | 
|---|
|  |  |  | String startTime1 = null; | 
|---|
|  |  |  | 
|---|
|  |  |  | startTime2 = split[1]; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (StringUtils.hasLength(dto.getPhone())){ | 
|---|
|  |  |  | List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); | 
|---|
|  |  |  | if(data!=null){ | 
|---|
|  |  |  | if (!data.isEmpty()){ | 
|---|
|  |  |  | dto.setUserIds(data); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | dto.setUserIds(new ArrayList<Long>()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (dto.getUserIds().isEmpty()){ | 
|---|
|  |  |  | List<Long> carIds = dto.getUserIds(); | 
|---|
|  |  |  | carIds.add(-1L); | 
|---|
|  |  |  | dto.setUserIds(carIds); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (StringUtils.hasLength(dto.getLicensePlate())){ | 
|---|
|  |  |  | List<Long> data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData(); | 
|---|
|  |  |  | if(data!=null){ | 
|---|
|  |  |  | if (!data.isEmpty()){ | 
|---|
|  |  |  | dto.setCarIds(data); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | dto.setCarIds(new ArrayList<Long>()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (dto.getCarIds().isEmpty()){ | 
|---|
|  |  |  | List<Long> carIds = dto.getCarIds(); | 
|---|
|  |  |  | carIds.add(-1L); | 
|---|
|  |  |  | dto.setCarIds(carIds); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); | 
|---|
|  |  |  | List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); | 
|---|
|  |  |  | for (ChargingOrderListVO chargingOrderListVO : list) { | 
|---|
|  |  |  | chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity()); | 
|---|
|  |  |  | chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getPaymentAmount()); | 
|---|
|  |  |  | BigDecimal bigDecimal = new BigDecimal("0.006"); | 
|---|
|  |  |  | if (chargingOrderListVO.getOrderAmount()!=null){ | 
|---|
|  |  |  | chargingOrderListVO.setCommissionAmount(chargingOrderListVO.getOrderAmount().multiply(bigDecimal)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getResidualAmount()==null?chargingOrderListVO.getPaymentAmount():chargingOrderListVO.getPaymentAmount()); | 
|---|
|  |  |  | chargingOrderListVO.setUid(chargingOrderListVO.getId()+""); | 
|---|
|  |  |  | List<Integer> integers = new ArrayList<>(); | 
|---|
|  |  |  | integers.add(chargingOrderListVO.getSiteId()); | 
|---|
|  |  |  | 
|---|
|  |  |  | // 获取开始SOC 结束soc | 
|---|
|  |  |  | if (chargingOrderListVO.getCode()!=null){ | 
|---|
|  |  |  | List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrderListVO.getCode()).getData(); | 
|---|
|  |  |  | if (!data6.isEmpty()){ | 
|---|
|  |  |  | if (data6!=null && !data6.isEmpty()){ | 
|---|
|  |  |  | // 第一条数据soc为开始 最后一条数据soc为结束soc | 
|---|
|  |  |  | chargingOrderListVO.setStartSoc(data6.get(0).getSoc().toString()); | 
|---|
|  |  |  | chargingOrderListVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString()); | 
|---|
|  |  |  | 
|---|
|  |  |  | carId.add(chargingOrderListVO.getAppUserCarId()); | 
|---|
|  |  |  | if (!carId.isEmpty()){ | 
|---|
|  |  |  | List<TAppUserCar> data4 = appUserCarClient.getCarByIds(carId).getData(); | 
|---|
|  |  |  | if (data4!=null && !data4.isEmpty()) chargingOrderListVO.setLicensePlate(data4.get(0).getLicensePlate()); | 
|---|
|  |  |  | if (data4!=null && !data4.isEmpty()) { | 
|---|
|  |  |  | chargingOrderListVO.setLicensePlate(data4.get(0).getLicensePlate()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (data3 != null) chargingOrderListVO.setPhone(data3.getPhone()); | 
|---|
|  |  |  | chargingOrderListVO.setPhone(data3.getPhone()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | BigDecimal gu = new BigDecimal("0"); | 
|---|
|  |  |  | BigDecimal total = new BigDecimal("0"); | 
|---|
|  |  |  | for (TChargingOrderAccountingStrategy temp : list2) { | 
|---|
|  |  |  | if (temp.getChargingCapacity() == null){ | 
|---|
|  |  |  | temp.setChargingCapacity(BigDecimal.ZERO); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | switch (temp.getType()) { | 
|---|
|  |  |  | case 1: | 
|---|
|  |  |  | jian = jian.add(temp.getChargingCapacity()); | 
|---|
|  |  |  | 
|---|
|  |  |  | BigDecimal ping = new BigDecimal("0"); | 
|---|
|  |  |  | BigDecimal gu = new BigDecimal("0"); | 
|---|
|  |  |  | for (ChargingOrderListVO chargingOrderListVO : list1) { | 
|---|
|  |  |  | if (chargingOrderListVO.getChargingCapacity()!=null)electronic = electronic.add(chargingOrderListVO.getChargingCapacity()); | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | 
|---|
|  |  |  | return chargingOrderTimeVO; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //   @Override | 
|---|
|  |  |  | //   public R payRefund(PayOrderRefundDto payOrderQueryDto) { | 
|---|
|  |  |  | //      return null; | 
|---|
|  |  |  | //   } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ChargingOrderListInfoVO chargingInfo(String uid) { | 
|---|
|  |  |  | TChargingOrder chargingOrder= this.getById(uid); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ChargingOrderListInfoVO chargingOrderListInfoVO = new ChargingOrderListInfoVO(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | chargingOrderListInfoVO.setStatus(chargingOrder.getStatus()); | 
|---|
|  |  |  | BigDecimal bigDecimal = new BigDecimal("0.006"); | 
|---|
|  |  |  | if (chargingOrder.getOrderAmount()!=null){ | 
|---|
|  |  |  | chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getOrderAmount().multiply(bigDecimal)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | chargingOrderListInfoVO.setElectrovalence(chargingOrder.getElectrovalence()); | 
|---|
|  |  |  | chargingOrderListInfoVO.setServiceCharge(chargingOrder.getServiceCharge()); | 
|---|
|  |  |  | if (chargingOrder.getElectrovalence()!=null && chargingOrder.getServiceCharge()!=null){ | 
|---|
|  |  |  | 
|---|
|  |  |  | if (chargingOrder.getCode()!=null){ | 
|---|
|  |  |  | List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData(); | 
|---|
|  |  |  | if (data6!=null){ | 
|---|
|  |  |  | for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) { | 
|---|
|  |  |  | if (uploadRealTimeMonitoringData.getOutput_current()!=null&& | 
|---|
|  |  |  | uploadRealTimeMonitoringData.getOutput_voltage()!=null){ | 
|---|
|  |  |  | uploadRealTimeMonitoringData.setPower(uploadRealTimeMonitoringData.getOutput_voltage() | 
|---|
|  |  |  | .multiply(uploadRealTimeMonitoringData.getOutput_current())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!data6.isEmpty()){ | 
|---|
|  |  |  | // 第一条数据soc为开始 最后一条数据soc为结束soc | 
|---|
|  |  |  | chargingOrderListInfoVO.setStartSoc(data6.get(0).getSoc().toString()); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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()) | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param query | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | @GlobalTransactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) { | 
|---|
|  |  |  | if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getCharging_gun_code())){ | 
|---|
|  |  |  | if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())){ | 
|---|
|  |  |  | //获取当前的计费策略 | 
|---|
|  |  |  | TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getCharging_gun_code())); | 
|---|
|  |  |  | AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); | 
|---|
|  |  |  | TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = chargingOrderAccountingStrategyService.getOne(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>() | 
|---|
|  |  |  | .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()).orderByDesc(TChargingOrderAccountingStrategy::getCreateTime).last(" limit 0, 1")); | 
|---|
|  |  |  | SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); | 
|---|
|  |  |  | if(null == chargingOrderAccountingStrategy){ | 
|---|
|  |  |  | chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy(); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setType(strategyDetail.getType()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setStartTime(sdf.format(chargingOrder.getStartTime())); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date())); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge()); | 
|---|
|  |  |  | BigDecimal charging_degree = query.getCharging_degree(); | 
|---|
|  |  |  | BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree); | 
|---|
|  |  |  | BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree); | 
|---|
|  |  |  | BigDecimal serviceCharge = originalServicePrice; | 
|---|
|  |  |  | //计算优惠金额 | 
|---|
|  |  |  | if(null != chargingOrder.getVipDiscount()){ | 
|---|
|  |  |  | serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setChargingCapacity(charging_degree); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); | 
|---|
|  |  |  | chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | if(chargingOrderAccountingStrategy.getAccountingStrategyDetailId().equals(strategyDetail.getId())){ | 
|---|
|  |  |  | BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice(); | 
|---|
|  |  |  | BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice(); | 
|---|
|  |  |  | BigDecimal periodOriginalServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice(); | 
|---|
|  |  |  | BigDecimal charging_degree = query.getCharging_degree(); | 
|---|
|  |  |  | BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree); | 
|---|
|  |  |  | BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree); | 
|---|
|  |  |  | BigDecimal serviceCharge = originalServicePrice; | 
|---|
|  |  |  | //计算优惠金额 | 
|---|
|  |  |  | if(null != chargingOrder.getVipDiscount()){ | 
|---|
|  |  |  | serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | periodServicePrice = periodServicePrice.add(serviceCharge); | 
|---|
|  |  |  | periodOriginalServicePrice = periodOriginalServicePrice.add(originalServicePrice); | 
|---|
|  |  |  | periodElectricPrice = periodElectricPrice.add(electrovalenc); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(periodOriginalServicePrice); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setPeriodElectricPrice(periodElectricPrice); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date())); | 
|---|
|  |  |  | chargingOrderAccountingStrategyService.updateById(chargingOrderAccountingStrategy); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | TChargingOrderAccountingStrategy chargingOrderAccountingStrategy1 = new TChargingOrderAccountingStrategy(); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setChargingOrderId(chargingOrder.getId()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setAccountingStrategyDetailId(strategyDetail.getId()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setType(strategyDetail.getType()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setStartTime(sdf.format(chargingOrderAccountingStrategy.getEndTime())); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setEndTime(sdf.format(new Date())); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setElectrovalence(strategyDetail.getElectrovalence()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setServiceCharge(strategyDetail.getServiceCharge()); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setCostServiceCharge(strategyDetail.getCostServiceCharge()); | 
|---|
|  |  |  | BigDecimal charging_degree = query.getCharging_degree(); | 
|---|
|  |  |  | BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree); | 
|---|
|  |  |  | BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree); | 
|---|
|  |  |  | BigDecimal serviceCharge = originalServicePrice; | 
|---|
|  |  |  | //计算优惠金额 | 
|---|
|  |  |  | if(null != chargingOrder.getVipDiscount()){ | 
|---|
|  |  |  | serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setChargingCapacity(charging_degree); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setPeriodElectricPrice(electrovalenc); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setPeriodOriginalServicePrice(originalServicePrice); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setPeriodServicePrice(serviceCharge); | 
|---|
|  |  |  | chargingOrderAccountingStrategy1.setCreateTime(LocalDateTime.now()); | 
|---|
|  |  |  | chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>() | 
|---|
|  |  |  | .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); | 
|---|
|  |  |  | BigDecimal t = BigDecimal.ZERO; | 
|---|
|  |  |  | for (TChargingOrderAccountingStrategy coas : list) { | 
|---|
|  |  |  | t = t.add(coas.getPeriodServicePrice()).add(coas.getPeriodElectricPrice()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BigDecimal residualAmount = chargingOrder.getRechargeAmount().subtract(t).setScale(2, RoundingMode.HALF_EVEN); | 
|---|
|  |  |  | TChargingOrder chargingOrder1 = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getTransaction_serial_number())); | 
|---|
|  |  |  | BigDecimal residualAmount = chargingOrder1.getRechargeAmount().add(chargingOrder1.getVipDiscountAmount()).subtract(query.getPaid_amount()); | 
|---|
|  |  |  | TChargingOrder chargingOrder = new TChargingOrder(); | 
|---|
|  |  |  | chargingOrder.setId(chargingOrder1.getId()); | 
|---|
|  |  |  | chargingOrder.setAppUserId(chargingOrder1.getAppUserId()); | 
|---|
|  |  |  | chargingOrder.setResidualAmount(residualAmount); | 
|---|
|  |  |  | BigDecimal divide = query.getOutput_current().multiply(query.getOutput_voltage()).divide(new BigDecimal(1000)); | 
|---|
|  |  |  | chargingOrder.setChargingPower(divide); | 
|---|
|  |  |  | if(query.getOutput_current().compareTo(BigDecimal.ZERO) != 0){ | 
|---|
|  |  |  | BigDecimal divide = (query.getOutput_current().multiply(query.getOutput_voltage())).divide(new BigDecimal(1000)); | 
|---|
|  |  |  | chargingOrder.setChargingPower(divide); | 
|---|
|  |  |  | chargingOrder.setCurrent(query.getOutput_current()); | 
|---|
|  |  |  | chargingOrder.setVoltage(query.getOutput_voltage()); | 
|---|
|  |  |  | chargingOrder.setPower(divide); | 
|---|
|  |  |  | chargingOrder.setNeedElec(query.getOutput_current()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TChargingGun chargingGun = new TChargingGun(); | 
|---|
|  |  |  | chargingGun.setId(chargingOrder1.getChargingGunId()); | 
|---|
|  |  |  | chargingGun.setChargingPower(divide); | 
|---|
|  |  |  | chargingGunClient.updateChargingGunById(chargingGun); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | chargingOrder.setChargingCapacity(query.getCharging_degree()); | 
|---|
|  |  |  | chargingOrder.setElectricity(query.getCharging_degree()); | 
|---|
|  |  |  | chargingOrder.setTotalElectricity(new BigDecimal(100 - query.getSoc())); | 
|---|
|  |  |  | this.updateById(chargingOrder); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | @GlobalTransactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void endCharge(String orderCode, Integer endMode) { | 
|---|
|  |  |  | TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode)); | 
|---|
|  |  |  | Integer status = chargingOrder.getStatus(); | 
|---|
|  |  |  | if(status == 4 || status == 5){ | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | chargingOrder.setStatus(5); | 
|---|
|  |  |  | TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode)); | 
|---|
|  |  |  | TChargingOrder chargingOrder = new TChargingOrder(); | 
|---|
|  |  |  | chargingOrder.setId(order.getId()); | 
|---|
|  |  |  | chargingOrder.setAppUserId(order.getAppUserId()); | 
|---|
|  |  |  | chargingOrder.setEndMode(endMode); | 
|---|
|  |  |  | this.updateById(chargingOrder); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //计算费用,处理退款 | 
|---|
|  |  |  | endCharge(chargingOrder); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //处理推荐奖励(被推荐首单奖励) | 
|---|
|  |  |  | TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); | 
|---|
|  |  |  | long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) | 
|---|
|  |  |  | .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0)); | 
|---|
|  |  |  | if(null != appUser.getInviteUserId() && 1 == count){ | 
|---|
|  |  |  | TIntegralRule integralRule = integralRuleClient.getSet().getData(); | 
|---|
|  |  |  | String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints(); | 
|---|
|  |  |  | JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints); | 
|---|
|  |  |  | Integer num1 = jsonObject.getInteger("num1"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData(); | 
|---|
|  |  |  | if(null != appUser1.getVipId()){ | 
|---|
|  |  |  | TVip vip = vipClient.getInfo1(appUser1.getVipId()).getData(); | 
|---|
|  |  |  | Integer doubleIntegration = vip.getDoubleIntegration(); | 
|---|
|  |  |  | //双倍积分 | 
|---|
|  |  |  | if(1 == doubleIntegration){ | 
|---|
|  |  |  | num1 *= 2; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GetInviteUser query = new GetInviteUser(); | 
|---|
|  |  |  | query.setAppUserId(appUser1.getId()); | 
|---|
|  |  |  | query.setBeInvitedAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData(); | 
|---|
|  |  |  | if(null == inviteUser){ | 
|---|
|  |  |  | inviteUser = new TInviteUser(); | 
|---|
|  |  |  | inviteUser.setAppUserId(appUser1.getId()); | 
|---|
|  |  |  | inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | inviteUser.setAward(num1); | 
|---|
|  |  |  | inviteUser.setCreateTime(LocalDateTime.now()); | 
|---|
|  |  |  | inviteUserClient.saveInviteUser(inviteUser); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | appUser1.setPoints(appUser1.getPoints() + num1); | 
|---|
|  |  |  | appUserClient.updateAppUser(appUser1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | public void excelEndCharge(String orderCode) { | 
|---|
|  |  |  | endCharge(orderCode, 0); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 停止充电返回账单后计算费用 | 
|---|
|  |  |  | * @param vo | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | @GlobalTransactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void endChargeBillingCharge(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(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //开始处理计费明细数据和优惠数据 | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | 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.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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //原金额 | 
|---|
|  |  |  | 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()))); | 
|---|
|  |  |  | periodServicePrice_total = periodServicePrice_total.multiply(chargingOrder.getVipDiscount()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); | 
|---|
|  |  |  | BigDecimal maximumDeduction = vip.getMaximumDeduction(); | 
|---|
|  |  |  | //普通会员有最高优惠限制 | 
|---|
|  |  |  | if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){ | 
|---|
|  |  |  | discountAmount = maximumDeduction; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | payAmount = payAmount.subtract(discountAmount); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TChargingOrder order = new TChargingOrder(); | 
|---|
|  |  |  | order.setId(chargingOrder.getId()); | 
|---|
|  |  |  | order.setAppUserId(chargingOrder.getAppUserId()); | 
|---|
|  |  |  | if(null != chargingOrder.getEndMode() && chargingOrder.getEndMode() == 2){ | 
|---|
|  |  |  | order.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(null == chargingOrder.getEndMode()){ | 
|---|
|  |  |  | order.setEndMode(1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | order.setResidualAmount(rechargeAmount.subtract(total)); | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | order.setVipDiscountAmount(discountAmount); | 
|---|
|  |  |  | order.setElectrovalence(periodElectricPrice_total); | 
|---|
|  |  |  | order.setChargingCapacity(vo.getTotal_electricity()); | 
|---|
|  |  |  | order.setElectricity(vo.getTotal_electricity()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //计算优惠券 | 
|---|
|  |  |  | 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){ | 
|---|
|  |  |  | refundAmount = refundAmount.add(periodServicePrice_total); | 
|---|
|  |  |  | order.setCouponDiscountAmount(periodServicePrice_total); | 
|---|
|  |  |  | payAmount = payAmount.subtract(periodServicePrice_total); | 
|---|
|  |  |  | periodServicePrice_total = BigDecimal.ZERO; | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | refundAmount = refundAmount.add(couponDiscountAmount); | 
|---|
|  |  |  | order.setCouponDiscountAmount(couponDiscountAmount); | 
|---|
|  |  |  | payAmount = payAmount.subtract(couponDiscountAmount); | 
|---|
|  |  |  | periodServicePrice_total = periodServicePrice_total.subtract(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){ | 
|---|
|  |  |  | refundAmount = refundAmount.add(periodServicePrice_total); | 
|---|
|  |  |  | order.setCouponDiscountAmount(periodServicePrice_total); | 
|---|
|  |  |  | payAmount = payAmount.subtract(periodServicePrice_total); | 
|---|
|  |  |  | periodServicePrice_total = BigDecimal.ZERO; | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | refundAmount = refundAmount.add(divide); | 
|---|
|  |  |  | order.setCouponDiscountAmount(divide); | 
|---|
|  |  |  | payAmount = payAmount.subtract(divide); | 
|---|
|  |  |  | periodServicePrice_total = periodServicePrice_total.subtract(divide); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | appCoupon.setStatus(2); | 
|---|
|  |  |  | appCouponClient.updateAppCoupon(appCoupon); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | order.setAppCouponId(null); | 
|---|
|  |  |  | order.setCouponDiscountAmount(BigDecimal.ZERO); | 
|---|
|  |  |  | appCouponClient.refund(chargingOrder.getAppCouponId().toString()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | order.setServiceCharge(periodServicePrice_total.setScale(2, RoundingMode.DOWN)); | 
|---|
|  |  |  | order.setPaymentAmount(payAmount); | 
|---|
|  |  |  | order.setRefundAmount(refundAmount); | 
|---|
|  |  |  | order.setRefundStatus(1); | 
|---|
|  |  |  | this.updateById(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); | 
|---|
|  |  |  | chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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 = payAmount.multiply(new BigDecimal(num1)).intValue(); | 
|---|
|  |  |  | 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){ | 
|---|
|  |  |  | SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); | 
|---|
|  |  |  | AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date())); | 
|---|
|  |  |  | if(success.isSuccess()){ | 
|---|
|  |  |  | chargingOrderRefundService.save(chargingOrderRefund); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) { | 
|---|
|  |  |  | return this.baseMapper.getByDate(chargingOrderIds); | 
|---|
|  |  |  | 
|---|
|  |  |  | public List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto) { | 
|---|
|  |  |  | return this.baseMapper.usersByQuery(statisticsQueryDto); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<Map<String, Object>> usersByQuery1(ChargingStatisticsQueryDto statisticsQueryDto) { | 
|---|
|  |  |  | return this.baseMapper.usersByQuery1(statisticsQueryDto); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<Map<String, Object>> getUserTagCount() { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Long getAver(List<Integer> siteIds) { | 
|---|
|  |  |  | public Double getAver(List<Integer> siteIds) { | 
|---|
|  |  |  | return this.baseMapper.getAver(siteIds); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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){ | 
|---|
|  |  |  | TChargingOrder tChargingOrder = this.baseMapper.selectById(payOrderQueryDto.getOrderId()); | 
|---|
|  |  |  | if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){ | 
|---|
|  |  |  | return R.fail("退款金额需小于支付金额"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if ((tChargingOrder.getRechargeAmount().subtract(payOrderQueryDto.getRefundAmount()).compareTo(tChargingOrder.getPaymentAmount()))==0){ | 
|---|
|  |  |  | tChargingOrder.setStatus(5); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); | 
|---|
|  |  |  | chargingOrderRefund.setChargingOrderId(tChargingOrder.getId()); | 
|---|
|  |  |  | chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); | 
|---|
|  |  |  | 
|---|
|  |  |  | chargingOrderRefund.setRefundTitle("后台退款"); | 
|---|
|  |  |  | chargingOrderRefund.setRefundContent("后台退款"); | 
|---|
|  |  |  | chargingOrderRefund.setRefundReason("后台退款"); | 
|---|
|  |  |  | chargingOrderRefund.setRefundRemark("后台退款"); | 
|---|
|  |  |  | chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark()); | 
|---|
|  |  |  | chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount())); | 
|---|
|  |  |  | chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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.setTotal(tChargingOrder.getRechargeAmount().multiply(new BigDecimal(100)).intValue()); | 
|---|
|  |  |  | amount.setCurrency("CNY"); | 
|---|
|  |  |  | model.setAmount(amount); | 
|---|
|  |  |  | R<String> orderR = wxPaymentClient.refundOrderR(model); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | chargingOrderRefund.setRefundStatus(2); | 
|---|
|  |  |  | chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); | 
|---|
|  |  |  | this.baseMapper.updateById(tChargingOrder); | 
|---|
|  |  |  | chargingOrderRefundService.save(chargingOrderRefund); | 
|---|
|  |  |  | chargingOrderRefundService.save(chargingOrderRefund); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (payOrderQueryDto.getType()==2){ | 
|---|
|  |  |  | TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId()); | 
|---|
|  |  |  | if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){ | 
|---|
|  |  |  | return R.fail("退款金额需小于支付金额"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if ((tChargingOrder.getPaymentAmount().subtract(payOrderQueryDto.getRefundAmount()).compareTo(tChargingOrder.getPaymentAmount()))==0){ | 
|---|
|  |  |  | tChargingOrder.setStatus(5); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TShoppingOrderRefund chargingOrderRefund = new TShoppingOrderRefund(); | 
|---|
|  |  |  | chargingOrderRefund.setShoppingOrderId(tChargingOrder.getId()); | 
|---|
|  |  |  | chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); | 
|---|
|  |  |  | 
|---|
|  |  |  | chargingOrderRefund.setRefundTitle("后台退款"); | 
|---|
|  |  |  | chargingOrderRefund.setRefundContent("后台退款"); | 
|---|
|  |  |  | chargingOrderRefund.setRefundReason("后台退款"); | 
|---|
|  |  |  | chargingOrderRefund.setRefundRemark("后台退款"); | 
|---|
|  |  |  | chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark()); | 
|---|
|  |  |  | chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount())); | 
|---|
|  |  |  | chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | tChargingOrder.setRefundStatus(2); | 
|---|
|  |  |  | tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | shoppingOrderService.updateById(tChargingOrder); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | shoppingOrderRefundService.save(chargingOrderRefund); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserCarId, appUserCar.getId()) | 
|---|
|  |  |  | .eq(TChargingOrder::getDelFlag, 0).gt(TChargingOrder::getStartTime, query.getStartTime()) | 
|---|
|  |  |  | .eq(TChargingOrder::getRechargePaymentStatus, 2).ne(TChargingOrder::getStatus, -1)); | 
|---|
|  |  |  | .eq(TChargingOrder::getRechargePaymentStatus, 2).ne(TChargingOrder::getStatus, 5)); | 
|---|
|  |  |  | return one; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | // 根据站点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: | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (tChargingOrder.getRefundStatus()!=null &&tChargingOrder.getRefundStatus() == 2){ | 
|---|
|  |  |  | // 如果成功退款 那么减去退款金额 | 
|---|
|  |  |  | paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount().subtract(tChargingOrder.getRefundAmount())); | 
|---|
|  |  |  | paymentAmount = paymentAmount.add(tChargingOrder.getOrderAmount()); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | if (tChargingOrder.getPaymentAmount()!=null){ | 
|---|
|  |  |  | paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount()); | 
|---|
|  |  |  | paymentAmount = paymentAmount.add(tChargingOrder.getOrderAmount()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 三方交易手续费 三方收费*0.6% | 
|---|
|  |  |  | commissionAmount = sharingAmount.multiply(new BigDecimal("0.006")); | 
|---|
|  |  |  | // 订单手续费 订单支付金额 - 退款金额*0.6% | 
|---|
|  |  |  | orderCommission = paymentAmount.multiply(new BigDecimal("0.006")); | 
|---|
|  |  |  | tSettlementConfirm.setSharingAmount(sharingAmount); | 
|---|
|  |  |  | tSettlementConfirm.setCommissionAmount(commissionAmount); | 
|---|
|  |  |  | tSettlementConfirm.setElectrovalence(electrovalence); | 
|---|
|  |  |  | // 服务费=总服务费-三费收费-交易手续费-交易手续费-服务费会员抵扣-服务费优惠券抵扣 | 
|---|
|  |  |  | tSettlementConfirm.setServiceCharge(serviceCharge.subtract(commissionAmount).subtract(sharingAmount).subtract(orderCommission).subtract(vipDiscount).subtract(couponDiscount)); | 
|---|
|  |  |  | 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.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()); | 
|---|
|  |  |  | 
|---|
|  |  |  | tSettlementConfirm.setRemark(dto.getRemark()); | 
|---|
|  |  |  | tSettlementConfirm.setServicePartner(dto.getServicePartner()); | 
|---|
|  |  |  | tSettlementConfirm.setServiceMoney(dto.getServiceMoney()); | 
|---|
|  |  |  | BigDecimal subtract = new BigDecimal("1").subtract(dto.getProportionPartner().multiply(new BigDecimal("0.01"))); | 
|---|
|  |  |  | // 总电损费用 | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @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) { | 
|---|
|  |  |  | 
|---|
|  |  |  | //      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()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic()); | 
|---|
|  |  |  | chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic()); | 
|---|
|  |  |  | lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic()); | 
|---|
|  |  |  | if (tSettlementConfirm.getMeteringElectronic()!=null){ | 
|---|
|  |  |  | meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic()); | 
|---|
|  |  |  | chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (tSettlementConfirm.getLossElectronic()!=null){ | 
|---|
|  |  |  | lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | income = income.add(tSettlementConfirm.getIncome()); | 
|---|
|  |  |  | venue = venue.add(tSettlementConfirm.getVenue()); | 
|---|
|  |  |  | metering = metering.add(tSettlementConfirm.getMetering()); | 
|---|
|  |  |  | 
|---|
|  |  |  | StringBuilder stringBuilder = new StringBuilder(); | 
|---|
|  |  |  | for (TChargingOrder tChargingOrder : tChargingOrders) { | 
|---|
|  |  |  | stringBuilder.append(tChargingOrder.getCode()).append(","); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Long temp = 0L; | 
|---|
|  |  |  | // 充电总时长 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Long temp = 1L; | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | String substring = stringBuilder.substring(0, stringBuilder.length() - 1); | 
|---|
|  |  |  | for (String s : substring.split(",")) { | 
|---|
|  |  |  | UploadRealTimeMonitoringData data6 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(s).getData(); | 
|---|
|  |  |  | if (data6!=null){ | 
|---|
|  |  |  | temp+=(data6.getCumulative_charging_time()*60); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData(); | 
|---|
|  |  |  | // 计算充电桩的功率平均值 | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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())){ | 
|---|
|  |  |  | // 电站相同比较收入涨幅跌幅 | 
|---|
|  |  |  | BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome()).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); | 
|---|
|  |  |  | tSettlementConfirm.setIncomePercentage(subtract+"%"); | 
|---|
|  |  |  | if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO)>0){ | 
|---|
|  |  |  | BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome(),2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); | 
|---|
|  |  |  | tSettlementConfirm.setIncomePercentage(subtract+"%"); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | tSettlementConfirm.setIncomePercentage("100"+"%"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 比较总利润 收入合计-成本合计 | 
|---|
|  |  |  | BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost()); | 
|---|
|  |  |  | BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost()); | 
|---|
|  |  |  | tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BigDecimal bigDecimal1 = subtract1.subtract(subtract2) | 
|---|
|  |  |  | .divide(subtract2, 2, RoundingMode.HALF_DOWN) | 
|---|
|  |  |  | .multiply(new BigDecimal("100")) | 
|---|
|  |  |  | .setScale(2, RoundingMode.HALF_DOWN); | 
|---|
|  |  |  | tSettlementConfirm.setTotalPercentage(bigDecimal1+"%");            } | 
|---|
|  |  |  | beforeCost = beforeCost.add(settlementConfirm.getCost()); | 
|---|
|  |  |  | beforeIncome = beforeIncome.add(settlementConfirm.getIncome()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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+"%"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | if (subtract2.compareTo(new BigDecimal("0")) == 0){ | 
|---|
|  |  |  | tSettlementConfirm.setTotalPercentage(0+"%"); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%"); | 
|---|
|  |  |  | tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2,2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | tSettlementConfirm.setElectronicRefund(0); | 
|---|
|  |  |  | // 查询上次汇报数据 进行比对涨幅跌幅 | 
|---|
|  |  |  | 
|---|
|  |  |  | public List<Map<String, Object>> needElec1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { | 
|---|
|  |  |  | return this.baseMapper.needElec1(siteIds,statisticsQueryDto); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取充电结束页面详情 | 
|---|
|  |  |  | * @param id | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public EndOfChargePageInfo getEndOfChargePageInfo(String id) { | 
|---|
|  |  |  | EndOfChargePageInfo info = new EndOfChargePageInfo(); | 
|---|
|  |  |  | TChargingOrder chargingOrder = this.getById(id); | 
|---|
|  |  |  | info.setId(id); | 
|---|
|  |  |  | info.setCode(chargingOrder.getCode()); | 
|---|
|  |  |  | info.setPaymentAmount(chargingOrder.getPaymentAmount()); | 
|---|
|  |  |  | info.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount()); | 
|---|
|  |  |  | TAppUserIntegralChange integralChange = appUserIntegralChangeClient.getTAppUserIntegralChangeByOrderCode(chargingOrder.getCode()).getData(); | 
|---|
|  |  |  | info.setIntegral(null == integralChange ? 0 : integralChange.getCurrentIntegral() - integralChange.getHistoricalIntegral()); | 
|---|
|  |  |  | info.setRechargeAmount(chargingOrder.getRechargeAmount()); | 
|---|
|  |  |  | info.setRefundAmount(chargingOrder.getRefundAmount()); | 
|---|
|  |  |  | LocalDateTime startTime = chargingOrder.getStartTime(); | 
|---|
|  |  |  | LocalDateTime endTime = chargingOrder.getEndTime(); | 
|---|
|  |  |  | info.setStartDay(startTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + startTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE)); | 
|---|
|  |  |  | info.setStartHour(startTime.format(DateTimeFormatter.ofPattern("HH:mm"))); | 
|---|
|  |  |  | info.setEndDay(endTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " " + endTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE)); | 
|---|
|  |  |  | info.setEndHour(endTime.format(DateTimeFormatter.ofPattern("HH:mm"))); | 
|---|
|  |  |  | long time = (endTime.toEpochSecond(ZoneOffset.UTC) - startTime.toEpochSecond(ZoneOffset.UTC)) / 60; | 
|---|
|  |  |  | long hour = time / 60; | 
|---|
|  |  |  | long second = time % 60; | 
|---|
|  |  |  | info.setDuration(0 == hour ? String.format("%s分钟", second) : String.format("%s小时%s分钟", hour, second)); | 
|---|
|  |  |  | return info; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static void main(String[] args) { | 
|---|
|  |  |  | //      String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); | 
|---|
|  |  |  | //      String format1 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); | 
|---|
|  |  |  | //      System.err.println(format+"至"+format1); | 
|---|
|  |  |  | //      LocalDateTime parse = LocalDateTime.parse("2024-01-12 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); | 
|---|
|  |  |  | //      System.err.println(parse.format(DateTimeFormatter.ofPattern("yyyy-dd"))); | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Long countNoTag() { | 
|---|
|  |  |  | return this.baseMapper.countNoTag(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<TChargingOrder> getChargingOrder(TChargingOrderVo order) { | 
|---|
|  |  |  | LambdaQueryWrapper<TChargingOrder> queryWrapper = new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0); | 
|---|
|  |  |  | if(null != order.getChargingPileId()){ | 
|---|
|  |  |  | queryWrapper.eq(TChargingOrder::getChargingPileId, order.getChargingPileId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(null != order.getChargingGunId()){ | 
|---|
|  |  |  | queryWrapper.eq(TChargingOrder::getChargingGunId, order.getChargingGunId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(null != order.getStatus()){ | 
|---|
|  |  |  | queryWrapper.eq(TChargingOrder::getStatus, order.getStatus()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(null != order.getAppUserId()){ | 
|---|
|  |  |  | queryWrapper.eq(TChargingOrder::getAppUserId, order.getAppUserId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(null != order.getAppUserId()){ | 
|---|
|  |  |  | queryWrapper.eq(TChargingOrder::getAppUserId, order.getAppUserId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(null != order.getStatusList()){ | 
|---|
|  |  |  | queryWrapper.in(TChargingOrder::getAppUserId, order.getStatusList()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(null != order.getEndMode()){ | 
|---|
|  |  |  | queryWrapper.eq(TChargingOrder::getEndMode, order.getEndMode()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return this.list(queryWrapper.orderByDesc(TChargingOrder::getCreateTime)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Long countCar(List<String> brands) { | 
|---|
|  |  |  | return this.baseMapper.countCar(brands); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|