package com.ruoyi.order.service.impl; import cn.hutool.core.util.NumberUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.*; import com.ruoyi.account.api.model.*; import com.ruoyi.account.api.vo.GetAppUserVipDetail; import com.ruoyi.account.api.vo.GetInviteUser; import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.feignClient.*; import com.ruoyi.chargingPile.api.model.*; import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.ChargingOrderGroup; import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.domain.BasePojo; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient; import com.ruoyi.integration.api.feignClient.SendMessageClient; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; import com.ruoyi.integration.api.model.ChargingHandshake; import com.ruoyi.integration.api.model.PlatformStartCharging; import com.ruoyi.integration.api.model.PlatformStartChargingReply; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.integration.api.feignClient.*; import com.ruoyi.integration.api.model.*; import com.ruoyi.integration.api.vo.ChargingOrderVo; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; import com.ruoyi.integration.api.vo.NotificationConnectorChargeStatusVo; import com.ruoyi.integration.api.vo.StartChargeResult; import com.ruoyi.order.api.dto.SettlementConfirmAdd; import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient; import com.ruoyi.order.api.feignClient.AccountingStrategyOrderClient; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.SettlementListQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.*; import com.ruoyi.order.api.vo.PlatformStopChargingReplyVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.mapper.TSettlementConfirmMapper; import com.ruoyi.order.service.TChargingOrderAccountingStrategyService; import com.ruoyi.order.service.TChargingOrderRefundService; import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TOrderEvaluateService; import com.ruoyi.order.service.*; import com.ruoyi.order.util.mongodb.service.PlatformStartChargingReplyService; import com.ruoyi.order.util.mongodb.service.TransactionRecordService; import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService; import com.ruoyi.order.vo.EndOfChargePageInfo; import com.ruoyi.order.vo.OrderCountByDate; import com.ruoyi.order.vo.StatisticsOfBatteryVO; 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.H5AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; import com.ruoyi.payment.api.model.RefundReq; import com.ruoyi.payment.api.model.RefundResp; import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.*; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.seata.spring.annotation.GlobalTransactional; import org.redisson.Redisson; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.crypto.MacSpi; import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.format.TextStyle; import java.time.temporal.ChronoUnit; import java.time.temporal.WeekFields; import java.util.*; import java.util.concurrent.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author xiaochen * @since 2024-08-07 */ @Service public class TChargingOrderServiceImpl extends ServiceImpl implements TChargingOrderService { private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class); @Resource private ChargingGunClient chargingGunClient; @Resource private TSettlementConfirmMapper tSettlementConfirmMapper; @Resource private PartnerClient partnerClient; @Resource private SiteClient siteClient; @Resource private AppUserCarClient appUserCarClient; @Resource private AppUserClient appUserClient; @Resource private ChargingPileClient chargingPileClient; @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @Resource private TokenService tokenService; @Resource private WxPaymentClient wxPaymentClient; @Resource private AliPaymentClient aliPaymentClient; @Resource private H5AliPaymentClient h5AliPaymentClient; @Resource private AppCouponClient appCouponClient; @Resource private AppUserVipDetailClient appUserVipDetailClient; @Resource private RedisService redisService; @Resource private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService; @Resource private TCECClient tcecClient; @Resource private SendMessageClient sendMessageClient; @Resource private TOrderEvaluateService orderEvaluateService; @Resource private AccountingStrategyDetailClient accountingStrategyDetailClient; @Resource private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient; @Resource private AccountingStrategyClient accountingStrategyClient; @Resource private PlatformStartChargingReplyService platformStartChargingReplyService; @Resource private TChargingOrderRefundService chargingOrderRefundService; @Resource private PlatformStopChargingReplyClient platformStopChargingReplyClient; @Resource private AccountingStrategyOrderService accountingStrategyOrderService; @Resource private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService; @Resource private InviteUserClient inviteUserClient; @Resource private AppUserIntegralChangeClient appUserIntegralChangeClient; @Resource private IntegralRuleClient integralRuleClient; @Resource private VipClient vipClient; @Resource private UserTagClient userTagClient; @Resource private AppUserTagClient appUserTagClient; @Resource private SecurityDetectionClient securityDetectionClient; //计数器 private Map counter_map = new HashMap<>(); //计数器 private Map boot_failed_map = new HashMap<>(); @Resource private OperatorClient operatorClient; @Resource private TransactionRecordService transactionRecordService; @Resource private ITChargingOrderSummaryDataService chargingOrderSummaryDataService; @Resource private TOrderAppealService orderAppealService; @Autowired private RedissonClient redissonClient; @Resource private ChargingMessageClient chargingMessageClient; @Resource private ChengDuJianGuanClient chengDuJianGuanClient; /** * 获取小程序充电记录列表数据 * * @param query * @return */ @Override public Map getMyChargingOrderList(GetMyChargingOrderList query) { Long appUserId = tokenService.getLoginUserApplet().getUserId(); Map 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 list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize()); List orderLists = new ArrayList<>(); for (TChargingOrder tChargingOrder : list) { MyChargingOrderList myChargingOrderList = new MyChargingOrderList(); myChargingOrderList.setId(tChargingOrder.getId().toString()); myChargingOrderList.setStatus(tChargingOrder.getStatus()); Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0); myChargingOrderList.setTitle(site.getName()); myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity()); String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData(); myChargingOrderList.setChargingGunId(tChargingOrder.getChargingGunId()); myChargingOrderList.setName(name); myChargingOrderList.setEndMode(tChargingOrder.getEndMode()); BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount(); myChargingOrderList.setPayMoney(payMoney); myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); long count = orderEvaluateService.count(new LambdaQueryWrapper().eq(TOrderEvaluate::getOrderType, 1) .eq(TOrderEvaluate::getOrderId, tChargingOrder.getId()).eq(TOrderEvaluate::getDelFlag, 0)); myChargingOrderList.setEvaluate(count + 1L); orderLists.add(myChargingOrderList); } list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), null, null); map.put("list", orderLists); map.put("totle", list.size()); return map; } /** * 获取充电订单明细 * * @param id 订单id * @return */ @Override public MyChargingOrderInfo getMyChargingOrderInfo(String id) { TChargingOrder chargingOrder = this.getById(id); MyChargingOrderInfo myChargingOrderInfo = new MyChargingOrderInfo(); myChargingOrderInfo.setId(id); myChargingOrderInfo.setChargingGunId(chargingOrder.getChargingGunId()); myChargingOrderInfo.setCode(chargingOrder.getCode()); myChargingOrderInfo.setCreateTime(chargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); myChargingOrderInfo.setStatus(chargingOrder.getStatus()); Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0); myChargingOrderInfo.setTitle(site.getName()); TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); myChargingOrderInfo.setChargeMode(chargingGun.getChargeMode()); String name = chargingGunClient.getAllName(chargingOrder.getChargingGunId()).getData(); myChargingOrderInfo.setName(name); if (Objects.nonNull(chargingOrder.getAppUserCarId())) { TAppUserCar tAppUserCar = appUserCarClient.getCarById(chargingOrder.getAppUserCarId().toString()).getData(); if (null != tAppUserCar) { myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate()); } else { myChargingOrderInfo.setLicensePlate("无"); } } else { myChargingOrderInfo.setLicensePlate(chargingOrder.getPlateNum()); } if (null != chargingOrder.getStartTime()) { myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); } if (null != chargingOrder.getEndTime()) { myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000); } myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount()); myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount()); myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount()); myChargingOrderInfo.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount()); myChargingOrderInfo.setVipDiscountAmount(chargingOrder.getVipDiscountAmount()); myChargingOrderInfo.setRefundAmount(chargingOrder.getRefundAmount()); List stageCost = chargingOrderAccountingStrategyService.list( new LambdaQueryWrapper().eq(TChargingOrderAccountingStrategy::getChargingOrderId, id) .orderByAsc(TChargingOrderAccountingStrategy::getStartTime) ); myChargingOrderInfo.setStageCost(stageCost); List dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode()); if (null != dataList) { //在MongoDB中获取数据 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); List dataLists = new ArrayList<>(); String t = ""; for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : dataList) { if (!sdf.format(uploadRealTimeMonitoringData.getCreate_time()).equals(t)) { dataLists.add(uploadRealTimeMonitoringData); t = sdf.format(uploadRealTimeMonitoringData.getCreate_time()); } } List time = dataLists.stream().map(s -> sdf.format(s.getCreate_time())).collect(Collectors.toList()); List outputVoltage = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_voltage).collect(Collectors.toList()); List outputCurrent = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_current).collect(Collectors.toList()); List> currentAndVoltage = new ArrayList<>(); for (int i = 0; i < time.size(); i++) { Map map = new HashMap<>(); map.put("time", time.get(i)); //电流 map.put("electricity", outputCurrent.get(i)); //电压 map.put("voltage", outputVoltage.get(i)); currentAndVoltage.add(map); } myChargingOrderInfo.setCurrentAndVoltage(currentAndVoltage); //在MongoDB中获取数据 List soc = dataLists.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList()); List po = dataLists.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000), 2, RoundingMode.HALF_DOWN)).collect(Collectors.toList()); List> power = new ArrayList<>(); for (int i = 0; i < time.size(); i++) { Map map = new HashMap<>(); map.put("time", time.get(i)); //soc map.put("soc", soc.get(i)); //功率 map.put("power", po.get(i)); power.add(map); } myChargingOrderInfo.setPower(power); } myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L < System.currentTimeMillis() ? 0 : 1); long count = orderAppealService.count(Wrappers.lambdaQuery(TOrderAppeal.class) .eq(TOrderAppeal::getOrderId, id)); myChargingOrderInfo.setIsAppeal(count > 0 ? 0 : 1); return myChargingOrderInfo; } /** * 获取待开票订单列表 * * @param query * @return */ @Override public List getNoInvoicedOrder(GetNoInvoicedOrder query) { Long appUserId = tokenService.getLoginUserApplet().getUserId(); query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize()); List orderList = this.baseMapper.getNoInvoicedOrder(appUserId, query.getMonth(), query.getPageCurr(), query.getPageSize()); List list = new ArrayList<>(); for (TChargingOrder tChargingOrder : orderList) { MyChargingOrderList myChargingOrderList = new MyChargingOrderList(); myChargingOrderList.setId(tChargingOrder.getId().toString()); myChargingOrderList.setStatus(tChargingOrder.getStatus()); Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0); myChargingOrderList.setTitle(site.getName()); myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity()); String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData(); myChargingOrderList.setName(name); myChargingOrderList.setEndMode(tChargingOrder.getEndMode()); BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount(); myChargingOrderList.setPayMoney(payMoney); myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); myChargingOrderList.setElectricCharge(tChargingOrder.getElectrovalence()); myChargingOrderList.setServiceCharge(tChargingOrder.getServiceCharge()); list.add(myChargingOrderList); } return list; } /** * 充电支付 * * @param addChargingOrder * @return */ @Override public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) { Long userId = tokenService.getLoginUserApplet().getUserId(); TAppUser appUser = appUserClient.getUserById(userId).getData(); //查询待支付状态的订单,没有支付则删除订单 List list = this.list(new LambdaQueryWrapper().eq(TChargingOrder::getAppUserId, userId) .eq(TChargingOrder::getRechargePaymentStatus, 1).eq(TChargingOrder::getDelFlag, 0)); for (TChargingOrder tChargingOrder : list) { Integer rechargePaymentType = tChargingOrder.getRechargePaymentType(); if (1 == rechargePaymentType) { NotifyV3PayDecodeRespBody data = wxPaymentClient.queryOrderInfo(tChargingOrder.getCode()).getData(); if (null != data) { String trade_state = data.getTrade_state(); //支付失败,删除无效的订单 if (trade_state.equals("REFUND") || trade_state.equals("NOTPAY") || trade_state.equals("REVOKED") || trade_state.equals("PAYERROR")) { this.removeById(tChargingOrder.getId()); } } } if (2 == rechargePaymentType) { AliQueryOrder data = aliPaymentClient.query(tChargingOrder.getCode()).getData(); if (null != data) { //支付失败,删除无效的订单 String tradeStatus = data.getTradeStatus(); if (null != tradeStatus && tradeStatus.equals("TRADE_CLOSED")) { this.removeById(tChargingOrder.getId()); } } } if (3 == rechargePaymentType) { AliQueryOrder data = h5AliPaymentClient.query(tChargingOrder.getCode()).getData(); if (null != data) { //支付失败,删除无效的订单 String tradeStatus = data.getTradeStatus(); if (null != tradeStatus && tradeStatus.equals("TRADE_CLOSED")) { this.removeById(tChargingOrder.getId()); } } } } //检查当前枪是否是正在使用中 TChargingOrder one = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId()) .in(TChargingOrder::getStatus, Arrays.asList(3)).eq(TChargingOrder::getDelFlag, 0)); if (null != one) { return AjaxResult.error("充电枪正在充电中,启动失败"); } //查询当前充电枪是否有正在支付的订单 one = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId()) .eq(TChargingOrder::getAppUserCarId, userId).eq(TChargingOrder::getRechargePaymentStatus, 1).eq(TChargingOrder::getDelFlag, 0)); if (null != one) { //查询三方支付数据,支付中直接结束三方订单 if (1 == one.getRechargePaymentType()) { NotifyV3PayDecodeRespBody data = wxPaymentClient.queryOrderInfo(one.getCode()).getData(); if (null != data) { String trade_state = data.getTrade_state(); //支付失败,删除无效的订单 if (trade_state.equals("REFUND") || trade_state.equals("NOTPAY") || trade_state.equals("REVOKED") || trade_state.equals("PAYERROR")) { this.removeById(one.getId()); } else { //结束第三方支付,删除订单 wxPaymentClient.close(one.getCode()); this.removeById(one.getId()); } } } if (2 == one.getRechargePaymentType()) { AliQueryOrder data = aliPaymentClient.query(one.getCode()).getData(); if (null != data) { String trade_state = data.getTradeStatus(); //支付失败,删除无效的订单 if (trade_state.equals("TRADE_CLOSED")) { this.removeById(one.getId()); } if (trade_state.equals("WAIT_BUYER_PAY")) { //结束第三方支付,删除订单 aliPaymentClient.close(one.getCode()); this.removeById(one.getId()); } } } if (3 == one.getRechargePaymentType()) { AliQueryOrder data = h5AliPaymentClient.query(one.getCode()).getData(); if (null != data) { String trade_state = data.getTradeStatus(); //支付失败,删除无效的订单 if (trade_state.equals("TRADE_CLOSED")) { this.removeById(one.getId()); } if (trade_state.equals("WAIT_BUYER_PAY")) { //结束第三方支付,删除订单 h5AliPaymentClient.close(one.getCode()); this.removeById(one.getId()); } } } } //构建新的待支付订单 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); TChargingOrder chargingOrder = new TChargingOrder(); String code = "CD" + Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date()); chargingOrder.setCode(code); chargingOrder.setOrderType(1); chargingOrder.setOrderClassification(1); chargingOrder.setAppUserId(userId); chargingOrder.setAppUserCarId(addChargingOrder.getAppUserCarId()); if (null != addChargingOrder.getAppUserCarId()) { TAppUserCar userCar = appUserCarClient.getCarById(addChargingOrder.getAppUserCarId().toString()).getData(); if (null != userCar) { chargingOrder.setPlateNum(userCar.getLicensePlate()); } } 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.setRechargePaymentType(addChargingOrder.getPaymentType()); chargingOrder.setRechargePaymentStatus(1); chargingOrder.setRechargeAmount(addChargingOrder.getPaymentAmount()); chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId()); chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); chargingOrder.setOrderSource(1); chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪"); Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0); Integer accountingStrategyId = tChargingGun.getAccountingStrategyId(); if (null == accountingStrategyId) { //查询站点上面的计费策略 accountingStrategyId = site.getAccountingStrategyId(); } TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData(); //直营站点才可以享受会员折扣 if (null != appUser.getVipId() && 1 == site.getBusinessCategory()) { TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); BigDecimal discount = null; if (1 == vip.getType()) { //普通会员折扣使用积分策略上的折扣,且有最高优惠金额 discount = accountingStrategy.getDiscount(); } else { //内部会员使用会员信息设置的折扣,没有最高优惠金额 discount = vip.getDiscount(); } GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail(); getAppUserVipDetail.setAppUserId(appUser.getId()); getAppUserVipDetail.setVipId(appUser.getVipId()); TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData(); if (null != vipDetail) { Integer chargeNum = vipDetail.getChargeNum(); if (0 < chargeNum) { chargingOrder.setVipDiscount(discount); } } } this.save(chargingOrder); //添加订单的计费策略 List strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData(); AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder(); BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder); accountingStrategyOrder.setChargingOrderId(chargingOrder.getId()); accountingStrategyOrderService.save(accountingStrategyOrder); List list1 = new ArrayList<>(); for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) { AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder(); BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder); accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId()); accountingStrategyDetailOrder.setCreateTime(LocalDateTime.now()); accountingStrategyDetailOrder.setDelFlag(false); list1.add(accountingStrategyDetailOrder); } accountingStrategyDetailOrderService.saveBatch(list1); //会员优惠折扣将其计入增加充电时长(增加总充电金额) //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额) if (1 == addChargingOrder.getPaymentType()) { PaymentOrder paymentOrder = new PaymentOrder(); paymentOrder.setCode(chargingOrder.getCode()); paymentOrder.setAmount(addChargingOrder.getPaymentAmount()); paymentOrder.setOpenId(appUser.getWxOpenid()); paymentOrder.setDescription("充电充值"); paymentOrder.setNotifyUrl("/payment/wx/pay/notify"); Map data = wxPaymentClient.orderPay(paymentOrder).getData(); return AjaxResult.success(data); } if (2 == addChargingOrder.getPaymentType()) { AliPaymentReq req = new AliPaymentReq(); req.setOutTradeNo(chargingOrder.getCode()); req.setTotalAmount(addChargingOrder.getPaymentAmount().toString()); req.setSubject("充电充值"); req.setBuyerOpenId(appUser.getAliOpenid()); req.setBody("充电充值"); req.setNotifyUrl("/payment/ali/callBack"); AliPaymentResp data = aliPaymentClient.payment(req).getData(); if (null != data) { return AjaxResult.success(data); } } if (3 == addChargingOrder.getPaymentType()) { AliPaymentReq req = new AliPaymentReq(); req.setOutTradeNo(chargingOrder.getCode()); req.setTotalAmount(addChargingOrder.getPaymentAmount().toString()); req.setSubject("充电充值"); req.setBuyerOpenId(appUser.getAliOpenid()); req.setBody("充电充值"); req.setNotifyUrl("/payment/aliH5/callBack"); req.setReturnUrl(addChargingOrder.getReturnUrl()); String data = h5AliPaymentClient.payment(req).getData(); if (StringUtils.hasLength(data)) { return AjaxResult.success("操作成功", data); } } throw new RuntimeException("无效的支付方式"); } /** * 支付成功后的回调处理逻辑 * * @param paymentType 支付方式:1=微信,2=支付宝 * @param out_trade_no 业务流水号 * @param transaction_id 三方支付流水号 * @param attach 附加数据 * @return */ @Transactional @Override public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) { TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getCode, out_trade_no)); if (chargingOrder.getRechargePaymentStatus() == 2) { return AjaxResult.success(); } chargingOrder.setRechargePaymentStatus(2); chargingOrder.setRechargeSerialNumber(transaction_id); chargingOrder.setStatus(2); chargingOrder.setPayTime(LocalDateTime.now()); //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据 PreChargeCheck preChargeCheck = new PreChargeCheck(); preChargeCheck.setElectronicLockLock(false); preChargeCheck.setInsulationTesting(false); preChargeCheck.setSecureConnectionDetection(false); preChargeCheck.setStartupSuccess(1); String key = "AQJC_" + chargingOrder.getChargingGunId(); redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS); //根据当前充值的金额和计费模板算出充电的金额 BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); BigDecimal rechargeAmount1 = new BigDecimal(rechargeAmount.toString()); SimpleDateFormat sdf = new SimpleDateFormat("HHmm"); Long now = Long.valueOf(sdf.format(new Date())); Long nowTimeMillis = System.currentTimeMillis(); //根据支付金额,获取出使用的计费策略明细 //计算电费金额和服务费 BigDecimal serviceCharge = 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(); //判断会员是否还有充电优惠次数,计算会员优惠的折扣金额 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 list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); list.get(list.size() - 1).setEndTime("23:59"); //将数据叠加两份,处理跨天的情况 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 = serviceCharge.add(s_server_amount.multiply(new BigDecimal(m))); rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m))); nowTimeMillis = null; } else { serviceCharge = serviceCharge.add(s_server_amount.multiply(new BigDecimal(times))); break; } } } if (null != discount) { discountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(discount)); } 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; } } discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN); if (discountAmount.compareTo(BigDecimal.ZERO) >= 0) { data.setChargeNum(data.getChargeNum() - 1); appUserVipDetailClient.updateAppUserVipDetail(data); } } } //机子上显示的金额为用户充值的金额+会员折扣金额 BigDecimal account_balance = chargingOrder.getRechargeAmount().add(discountAmount).setScale(4, RoundingMode.HALF_EVEN); chargingOrder.setChargeAmount(account_balance); chargingOrder.setVipDiscountAmount(discountAmount); this.updateById(chargingOrder); TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData(); //调用远程启动充电消息 PlatformStartCharging platformStartCharging = new PlatformStartCharging(); platformStartCharging.setTransaction_serial_number(chargingOrder.getCode()); platformStartCharging.setCharging_pile_code(chargingPile.getCode()); platformStartCharging.setCharging_gun_code(tChargingGun.getCode()); //使用订单id作为逻辑卡号 platformStartCharging.setCard_number(chargingOrder.getId().toString()); platformStartCharging.setAccount_balance(account_balance); log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString()); sendMessageClient.platformStartCharging(platformStartCharging); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); threadPoolExecutor.execute(()->{ //推送成都监管 NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo(); vo.setOrderCode(chargingOrder.getCode()); vo.setChargingGunId(chargingOrder.getChargingGunId()); chengDuJianGuanClient.notificationConnectorChargeStatus(vo); }); //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 Long id = chargingOrder.getId(); //执行10分钟的定时任务检测 ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(()->{ if(timingDetection(id)){ scheduler.shutdown(); } }, 10, 1, TimeUnit.SECONDS); return AjaxResult.success(); } /** * 定时检测mongodb数据库数据 * * @param id * @return */ public boolean timingDetection(Long id) { TChargingOrder chargingOrder = this.getById(id); if (chargingOrder.getStatus() != 2) { return true; } String code = chargingOrder.getCode(); String key = "AQJC_" + chargingOrder.getChargingGunId(); List data = platformStartChargingReplyService.getPlatformStartChargingReply(code); log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString()); Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0); if (!data.isEmpty()) { PlatformStartChargingReply platformStartChargingReply = data.get(1); Integer startup_result = platformStartChargingReply.getStartup_result(); Integer failure_cause = platformStartChargingReply.getFailure_cause(); Integer counter = counter_map.get(code); PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); //15分钟内还未插枪则取消充电,退回金额。 if (failure_cause == 5 && (null == counter || counter < 60 * 15)) { counter = (null == counter ? 0 : counter) + 1; counter_map.put(code, counter); //启动失败 preChargeCheck1.setStartupSuccess(3); preChargeCheck1.setFailureCause(failure_cause); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); return false; } //清除计时器中的无效数据 counter_map.remove(code); if (0 == startup_result) { //启动失败 preChargeCheck1.setStartupSuccess(3); preChargeCheck1.setFailureCause(failure_cause); chargingOrder.setStatus(2); chargingOrder.setEndMode(0); this.updateById(chargingOrder); //启动失败后取消订单,退款操作 refund(code); } else { //启动成功 preChargeCheck1.setStartupSuccess(2); chargingOrder.setStatus(3); chargingOrder.setStartTime(LocalDateTime.now()); this.updateById(chargingOrder); } redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); //推送三方平台订单状态 if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) { tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); } ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); threadPoolExecutor.execute(()->{ if (chargingOrder.getStatus() == 3) { //推送监管平台订单状态 ChargingOrderVo chargingOrderVo = new ChargingOrderVo(); BeanUtils.copyProperties(chargingOrder, chargingOrderVo); chargingMessageClient.pushOrderStatus(chargingOrderVo); } //推送成都监管 NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo(); vo.setOrderCode(chargingOrder.getCode()); vo.setChargingGunId(chargingOrder.getChargingGunId()); chengDuJianGuanClient.notificationConnectorChargeStatus(vo); }); return true; } else { PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getDataByOrderCode(code, "desc"); if(null != uploadRealTimeMonitoringData){ //启动成功 preChargeCheck1.setStartupSuccess(2); chargingOrder.setStatus(3); chargingOrder.setStartTime(LocalDateTime.now()); this.updateById(chargingOrder); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); //推送三方平台订单状态 if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) { tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); } ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); threadPoolExecutor.execute(()->{ if (chargingOrder.getStatus() == 3) { //推送监管平台订单状态 ChargingOrderVo chargingOrderVo = new ChargingOrderVo(); BeanUtils.copyProperties(chargingOrder, chargingOrderVo); chargingMessageClient.pushOrderStatus(chargingOrderVo); } //推送成都监管 NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo(); vo.setOrderCode(chargingOrder.getCode()); vo.setChargingGunId(chargingOrder.getChargingGunId()); chengDuJianGuanClient.notificationConnectorChargeStatus(vo); }); return true; }else{ Integer counter = boot_failed_map.get(code); log.info(code + ":-------------------未上传开启充电结果-------------------" + counter); //15分钟内未启动成功,退回金额。 if (null == counter || counter < 60 * 15) { counter = (null == counter ? 0 : counter) + 1; boot_failed_map.put(code, counter); //启动失败 preChargeCheck1.setStartupSuccess(1); preChargeCheck1.setFailureCause(0); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); return false; } //清除计时器中的无效数据 boot_failed_map.remove(code); TChargingOrder order = new TChargingOrder(); order.setId(id); order.setAppUserId(chargingOrder.getAppUserId()); //启动失败 preChargeCheck1.setStartupSuccess(3); preChargeCheck1.setFailureCause(0); order.setStatus(2); order.setEndMode(0); this.updateById(order); //启动失败后取消订单,退款操作 refund(code); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); //推送三方平台订单状态 if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) { tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); } ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); threadPoolExecutor.execute(()->{ //推送成都监管 NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo(); vo.setOrderCode(chargingOrder.getCode()); vo.setChargingGunId(chargingOrder.getChargingGunId()); chengDuJianGuanClient.notificationConnectorChargeStatus(vo); }); return true; } } } /** * 修改安全检测数据 * * @param securityDetection */ @Override public void securityDetection(SecurityDetectionVO securityDetection) { GetChargingGunByCode code = new GetChargingGunByCode(); 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()); if (null != preChargeCheck1) { preChargeCheck1.setElectronicLockLock(true); preChargeCheck1.setInsulationTesting(true); preChargeCheck1.setSecureConnectionDetection(securityDetection.getSecure_connection() == 1); redisService.setCacheObject("AQJC_" + chargingGun.getId(), preChargeCheck1, 24L, TimeUnit.HOURS); } } /** * 启动充电应答 * * @param message */ @Override public void startChargeSuccessfully(PlatformStartChargingReplyMessageVO message) { Integer startup_result = message.getStartup_result(); Integer failure_cause = message.getFailure_cause(); TChargingOrder order = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getCode, message.getTransaction_serial_number())); if (order.getStatus() != 2) { return; } Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0); String code = order.getCode(); PreChargeCheck preChargeCheck1 = redisService.getCacheObject("AQJC_" + order.getChargingGunId()); if (null != preChargeCheck1) { preChargeCheck1.setElectronicLockLock(true); preChargeCheck1.setInsulationTesting(true); preChargeCheck1.setStartupSuccess(1); } if (0 == startup_result) { //启动失败 preChargeCheck1.setStartupSuccess(3); preChargeCheck1.setFailureCause(failure_cause); order.setStatus(2); order.setEndMode(0); this.updateById(order); //启动失败后取消订单,退款操作 refund(code); } else { //启动成功 preChargeCheck1.setStartupSuccess(2); order.setStatus(3); order.setStartTime(LocalDateTime.now()); this.updateById(order); TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); chargingGun.setStatus(4); chargingGunClient.updateChargingGunById(chargingGun); if(1 == site.getIsOpenSynchronization()){ //推送状态给三方平台 tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 4); } } redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); if (3 == order.getStatus()) { //推送监管平台订单状态 new Thread(() -> { ChargingOrderVo chargingOrderVo = new ChargingOrderVo(); BeanUtils.copyProperties(order, chargingOrderVo); chargingMessageClient.pushOrderStatus(chargingOrderVo); }).start(); } //推送三方平台启动充电结果 if (2 == order.getOrderSource()) { StartChargeResult result = new StartChargeResult(); result.setStartChargeSeq(order.getStartChargeSeq()); result.setStartChargeSeqStat(3 == order.getStatus() ? 2 : 4); result.setConnectorID(order.getChargingGunId().toString()); result.setStartTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); Operator operator = operatorClient.getOperatorById(order.getOperatorId()).getData(); result.setOperatorID(operator.getOperatorId()); if(1 == site.getIsOpenSynchronization()){ tcecClient.notificationStartChargeResult(result); tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); } } } /** * 启动失败后的退款,取消订单 * * @param code */ @Transactional public void refund(String code) { RLock lock = redissonClient.getLock("REFUND_ORDER_LOCK:" + code); try { boolean tryLock = lock.tryLock(30, 30, TimeUnit.SECONDS); if(tryLock){ log.info(code + ":-------------------充电启动失败,执行退款-------------------"); TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getCode, code)); if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2) { Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); //构建退款明细 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(rechargeAmount); chargingOrderRefund.setRefundStatus(1); chargingOrderRefund.setPayType(rechargePaymentType); chargingOrderRefund.setRefundStatus(1); chargingOrderRefund.setCode(code); chargingOrderRefund.setRefundTitle("充电失败"); chargingOrderRefund.setRefundContent("充电失败"); chargingOrderRefund.setRefundReason("充电失败"); chargingOrderRefund.setRefundRemark("全额退款"); chargingOrderRefund.setRefundTotalAmount(rechargeAmount); 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(rechargeAmount.multiply(new BigDecimal(100)).intValue()); amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); R> orderR = wxPaymentClient.refundOrderR(model); if (200 == orderR.getCode()) { chargingOrderRefundService.save(chargingOrderRefund); //手续费 Map amount1 = (Map) orderR.getData().get("amount"); Object refund_fee1 = amount1.get("refund_fee"); BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); chargingOrderRefund.setRefundFee(refund_fee); chargingOrderRefundService.updateById(chargingOrderRefund); //回退会员折扣次数 if (chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0) { 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.setChargeNum(data.getChargeNum() + 1); appUserVipDetailClient.updateAppUserVipDetail(data); } } } } 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) { chargingOrderRefundService.save(chargingOrderRefund); //回退会员折扣次数 if (chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0) { 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.setChargeNum(data.getChargeNum() + 1); appUserVipDetailClient.updateAppUserVipDetail(data); } } try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); } } if (3 == rechargePaymentType) { RefundReq dto = new RefundReq(); dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber()); dto.setOutRequestNo(chargingOrderRefund.getCode()); dto.setRefundAmount(rechargeAmount.toString()); dto.setRefundReason("充电失败,取消充电订单"); RefundResp resp = h5AliPaymentClient.refund(dto).getData(); if (null != resp && "10000".equals(resp.getCode())) { chargingOrderRefundService.save(chargingOrderRefund); //回退会员折扣次数 if (chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0) { 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.setChargeNum(data.getChargeNum() + 1); appUserVipDetailClient.updateAppUserVipDetail(data); } } try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); } } } } } catch (InterruptedException e) { throw new RuntimeException(e); }finally { lock.unlock(); } } @Transactional public void refund1(String code, BigDecimal money) { log.info(code + ":-------------------充电成功,执行手动退款-------------------"); TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getCode, code)); if (chargingOrder.getOrderSource() == 1) { BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); 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(money); chargingOrderRefund.setRefundStatus(1); chargingOrderRefund.setPayType(rechargePaymentType); chargingOrderRefund.setRefundStatus(1); chargingOrderRefund.setCode(code); chargingOrderRefund.setRefundTitle("充电完成退款"); chargingOrderRefund.setRefundContent("充电完成退款"); chargingOrderRefund.setRefundReason("充电完成退款"); chargingOrderRefund.setRefundRemark("充电完成退款,手动退款"); chargingOrderRefund.setRefundTotalAmount(money); chargingOrderRefund.setPayAmount(money); 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(money.multiply(new BigDecimal(100)).intValue()); amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); R> orderR = wxPaymentClient.refundOrderR(model); if (200 == orderR.getCode()) { chargingOrderRefundService.save(chargingOrderRefund); //手续费 Map amount1 = (Map) orderR.getData().get("amount"); Object refund_fee1 = amount1.get("refund_fee"); BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); chargingOrderRefund.setRefundFee(refund_fee); chargingOrderRefundService.updateById(chargingOrderRefund); } } if (2 == rechargePaymentType) { RefundReq dto = new RefundReq(); dto.setOutTradeNo(chargingOrder.getCode()); dto.setOutRequestNo(chargingOrderRefund.getCode()); dto.setRefundAmount(money.toString()); dto.setRefundReason("充电完成退款"); RefundResp resp = aliPaymentClient.refund(dto).getData(); if (null != resp) { chargingOrderRefundService.save(chargingOrderRefund); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); } } if (3 == rechargePaymentType) { RefundReq dto = new RefundReq(); dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber()); dto.setOutRequestNo(chargingOrderRefund.getCode()); dto.setRefundAmount(money.toString()); dto.setRefundReason("充电完成退款"); RefundResp resp = h5AliPaymentClient.refund(dto).getData(); if (null != resp && "10000".equals(resp.getCode())) { chargingOrderRefundService.save(chargingOrderRefund); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); } } } } /** * 启动失败后微信退款的回调处理 * * @param out_refund_no * @param refund_id * @param tradeState * @param success_time * @return */ @Transactional public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time) { RLock lock = redissonClient.getLock("chargingOrderStartupFailureWxRefund:" + out_refund_no); try { boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS); if(tryLock){ TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper().eq(TChargingOrderRefund::getRefundCode, out_refund_no)); if(null != one && one.getRefundStatus() == 1){ 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); } } } catch (InterruptedException e) { throw new RuntimeException(e); }finally { lock.unlock(); } return AjaxResult.success(); } /** * 获取充电中的详情 * * @param id * @return */ @Override public ChargingDetails getChargingDetails(Integer id) { Long userId = tokenService.getLoginUserApplet().getUserId(); TChargingOrder one = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id) .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0).orderByDesc(TChargingOrder::getStartTime).last(" limit 0, 1")); if (null == one || !one.getAppUserId().equals(userId)) { return null; } ChargingDetails chargingDetails = new ChargingDetails(); chargingDetails.setId(one.getId().toString()); TChargingGun chargingGun = chargingGunClient.getChargingGunById(id).getData(); TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData(); Site site = siteClient.getSiteByIds(Arrays.asList(chargingPile.getSiteId())).getData().get(0); chargingDetails.setName(site.getName() + "-" + chargingPile.getName()); chargingDetails.setCode(one.getCode()); chargingDetails.setStatus(one.getStatus()); chargingDetails.setChargingCost(one.getResidualAmount()); UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(one.getCode()); 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), new MathContext(4, RoundingMode.HALF_EVEN)); chargingDetails.setChargePower(power); chargingDetails.setCompletionRatio(data.getSoc()); chargingDetails.setRemainingChargeTime(data.getTime_remaining()); chargingDetails.setChargedDegrees(data.getCharging_degree()); 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)); if (null != one.getAppUserCarId()) { TAppUserCar appUserCar = appUserCarClient.getCarById(one.getAppUserCarId().toString()).getData(); // 续航 = 续航里程 * soc BigDecimal multiply = BigDecimal.ZERO; if(NumberUtil.isNumber(appUserCar.getEndurance())){ new BigDecimal(data.getSoc()).divide(new BigDecimal(100)).multiply(new BigDecimal(appUserCar.getEndurance())); } chargingDetails.setEndurance(multiply.setScale(2, RoundingMode.HALF_EVEN)); } } return chargingDetails; } /** * 停止充电操作 * * @param id 订单id * @return */ @Override public AjaxResult stopCharging(String id) { TChargingOrder order = this.getById(id); Integer status = order.getStatus(); if (status != 3) { return AjaxResult.error("还未开始充电"); } if (status == 4 || status == 5) { return AjaxResult.error("不能重复操作"); } Long userId = tokenService.getLoginUserApplet().getUserId(); if (!order.getAppUserId().equals(userId)) { log.info("【" + order.getCode() + "】主动停止充电失败,用户权限不足。当前登录用户id:{},订单用户id:{}", userId, order.getAppUserId()); return AjaxResult.error("权限不足"); } order.setEndTime(LocalDateTime.now()); order.setStatus(4); order.setEndMode(1); this.updateById(order); log.info("【" + order.getCode() + "】主动停止充电成功,订单状态已被修改。"); String code1 = order.getCode(); TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); //异步线程处理停机 ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1); cachedThreadPool.execute(() -> { //调用硬件停止充电,停止成功后开始计算费用退款 TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData(); PlatformStopCharging platformStopCharging = new PlatformStopCharging(); platformStopCharging.setCharging_pile_code(chargingPile.getCode()); platformStopCharging.setCharging_gun_code(chargingGun.getCode()); sendMessageClient.platformStopCharging(platformStopCharging); log.info(code1 + ":-------------------远程停止充电请求-------------------"); log.info(platformStopCharging.toString()); }); Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0); //推送三方平台 if (2 == order.getOrderSource() && 1 == site.getIsOpenSynchronization()) { tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); } ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); threadPoolExecutor.execute(()->{ //推送成都监管 NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo(); vo.setOrderCode(order.getCode()); vo.setChargingGunId(order.getChargingGunId()); chengDuJianGuanClient.notificationConnectorChargeStatus(vo); }); return AjaxResult.success(); } /** * 结束充电后处理用户标签数据 * * @param chargingOrder */ public void editUserTag(TChargingOrder chargingOrder) { //处理用户标签数据 List data = userTagClient.getAllUserTag().getData(); //累计充电次数 List 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().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 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().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().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) .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(); 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); } 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(appUser.getId().toString()); appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); appUser1.setPoints(appUser1.getPoints() + num1); appUserClient.updateAppUser(appUser1); } } } /** * 停止充电应答结果处理 * * @param platformStopChargingReply */ @Override public void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply) { GetChargingGunByCode code = new GetChargingGunByCode(); code.setCharging_gun_code(platformStopChargingReply.getCharging_gun_code()); code.setCharging_pile_code(platformStopChargingReply.getCharging_pile_code()); TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData(); TChargingOrder order = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getChargingGunId, chargingGun.getId()) .orderByDesc(TChargingOrder::getEndTime).eq(TChargingOrder::getRechargePaymentStatus, 2).last(" limit 0, 1")); if (null != order && order.getStatus() != 4) { return; } String code1 = order.getCode(); if (0 == platformStopChargingReply.getStop_result()) { String failure_cause = ""; switch (platformStopChargingReply.getFailure_cause()) { case 0: failure_cause = "无"; break; case 1: failure_cause = "设备编号不匹配"; break; case 2: failure_cause = "枪未处于充电状态"; break; case 3: failure_cause = "其他"; break; } log.info(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause); } else { TChargingOrder chargingOrder = new TChargingOrder(); chargingOrder.setId(order.getId()); chargingOrder.setAppUserId(order.getAppUserId()); chargingOrder.setEndMode(1); this.updateById(chargingOrder); } } @Override public TCharingOrderVO chargingOrder(ChargingOrderQuery dto) { TCharingOrderVO tCharingOrderVO = new TCharingOrderVO(); List allGun = chargingGunClient.getAllGun().getData(); List allPile = chargingGunClient.getAllPile().getData(); List data9 = siteClient.getSiteAll().getData(); List data6 = appUserClient.getAllUser().getData(); List data4 = appUserCarClient.getAllCar().getData(); String startTime1 = null; String startTime2 = null; String endTime1 = null; String endTime2 = null; if (StringUtils.hasLength(dto.getStartTime())) { String[] split = dto.getStartTime().split(" - "); startTime1 = split[0]; startTime2 = split[1]; } if (StringUtils.hasLength(dto.getEndTime())) { String[] split = dto.getEndTime().split(" - "); endTime1 = split[0]; endTime2 = split[1]; } PageInfo pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize()); if (StringUtils.hasLength(dto.getPhone())) { List data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); if (data.isEmpty()) { tCharingOrderVO.setList(pageInfo); return tCharingOrderVO; } dto.setUserIds(data); } Long userId = tokenService.getLoginUser().getUserid(); // 查询当前登陆人按钮权限 SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); if (dto.getSiteId() == null) { if (userId != null) { List data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { siteIds.add(datum.getId()); } } } else { siteIds.add(dto.getSiteId()); } if (siteIds.isEmpty()) { siteIds.add(-1); } else { if (roleType == 2) { List integers = new ArrayList<>(); for (Integer siteId : siteIds) { // 校验有没有这个站点的权限 List t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData(); Boolean b = t1.get(1); if (b) { integers.add(siteId); } } siteIds = integers; } } if (siteIds.isEmpty()) siteIds.add(-1); dto.setSiteIds(siteIds); List list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2); List list3 = chargingOrderAccountingStrategyService.list(); for (ChargingOrderVO chargingOrderVO : list) { if (roleType == 2) { for (Integer siteId : siteIds) { // 校验有没有这个站点的权限 List t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData(); chargingOrderVO.setAuthRecord(t1.get(0)); } } chargingOrderVO.setCommissionAmount(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")) : new BigDecimal("0")); chargingOrderVO.setPlatFormMoney(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2, BigDecimal.ROUND_DOWN) : new BigDecimal("0")); chargingOrderVO.setUid(chargingOrderVO.getId() + ""); TChargingGun data3 = allGun.stream().filter(e -> e.getId().equals(chargingOrderVO.getChargingGunId())).findFirst().orElse(null); TChargingPile data2 = allPile.stream().filter(e -> e.getId().equals(chargingOrderVO.getChargingPileId())).findFirst().orElse(null); if (chargingOrderVO.getSiteId() != null) { List integers = new ArrayList<>(); integers.add(chargingOrderVO.getSiteId()); Site site = data9.stream().filter(e -> e.getId().equals(chargingOrderVO.getSiteId())).findFirst().orElse(null); if (site != null) chargingOrderVO.setSiteName(site.getName()); } if (data2 != null && data3 != null) { chargingOrderVO.setTerminalName(data2.getName() + "-" + data3.getName()); } // 充电订单 明细记录 List chargingOrderId = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList()); if (chargingOrderVO.getStartTime() != null && chargingOrderVO.getEndTime() != null) { LocalDateTime startTime = chargingOrderVO.getStartTime(); LocalDateTime endTime = chargingOrderVO.getEndTime(); // 计算时间差 单位秒 long between = ChronoUnit.SECONDS.between(startTime, endTime); chargingOrderVO.setChargingSecond(between); BigDecimal electronic_reduce = chargingOrderId.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); chargingOrderVO.setElectrovalence(electronic_reduce); BigDecimal service_reduce = chargingOrderId.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); if (!chargingOrderVO.getOrderSource().equals(2)) { chargingOrderVO.setServiceCharge(service_reduce); chargingOrderVO.setSharingAmount(BigDecimal.ZERO); } else { chargingOrderVO.setServiceCharge(service_reduce.multiply(new BigDecimal("0.8"))); chargingOrderVO.setSharingAmount(service_reduce.multiply(new BigDecimal("0.2"))); } } // 充电时段数 int size = chargingOrderId.size(); chargingOrderVO.setCount(size); // 用户手机号 TAppUser data = data6.stream().filter(e -> e.getId().equals(chargingOrderVO.getAppUserId())).findFirst().orElse(null); if (data != null) { // 车牌号 chargingOrderVO.setPhone(data.getPhone()); List longs = new ArrayList<>(); if (chargingOrderVO.getAppUserCarId() != null) { longs.add(chargingOrderVO.getAppUserCarId()); TAppUserCar tAppUserCar = data4.stream().filter(e -> e.getId().equals(chargingOrderVO.getAppUserCarId())).findFirst().orElse(null); if (tAppUserCar != null) { chargingOrderVO.setLicensePlate(tAppUserCar.getLicensePlate()); } } else { chargingOrderVO.setLicensePlate(chargingOrderVO.getPlateNum()); } } } Map map = this.baseMapper.chargingOrderNolimit(dto, startTime1, startTime2, endTime1, endTime2); if (null != map) { tCharingOrderVO.setTotal(map.get("total") == null ? BigDecimal.ZERO : (BigDecimal) map.get("total")); tCharingOrderVO.setTime(map.get("time") == null ? 0L : (Long) map.get("time")); tCharingOrderVO.setIncome(map.get("income") == null ? BigDecimal.ZERO : ((BigDecimal) map.get("income")).setScale(2, RoundingMode.HALF_EVEN)); tCharingOrderVO.setElectronicMoney(map.get("electronicMoney") == null ? BigDecimal.ZERO : ((BigDecimal) map.get("electronicMoney")).setScale(2, RoundingMode.HALF_EVEN)); tCharingOrderVO.setServiceMoney(map.get("serviceMoney") == null ? BigDecimal.ZERO : ((BigDecimal) map.get("serviceMoney")).setScale(2, RoundingMode.HALF_EVEN)); } else { tCharingOrderVO.setTotal(BigDecimal.ZERO); tCharingOrderVO.setTime(0L); tCharingOrderVO.setIncome(BigDecimal.ZERO); tCharingOrderVO.setElectronicMoney(BigDecimal.ZERO); tCharingOrderVO.setServiceMoney(BigDecimal.ZERO); } pageInfo.setRecords(list); tCharingOrderVO.setList(pageInfo); return tCharingOrderVO; } @Override public R> payOrderQuery(PayOrderQueryDto payOrderQueryDto) { PageInfo pageInfo = new PageInfo<>(payOrderQueryDto.getPageCurr(), payOrderQueryDto.getPageSize()); List 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.getOrderAmount()); payOrderDto.setOrderAmount(payOrderDto.getOrderAmount()); payOrderDto.setPaymentAmount(payOrderDto.getOrderAmount()); } } pageInfo.setRecords(list); return R.ok(pageInfo); } @Override public R> getRefundList(ChargingRefundDto chargingRefundDto) { PageInfo pageInfo = new PageInfo<>(chargingRefundDto.getPageCurr(), chargingRefundDto.getPageSize()); List list = this.baseMapper.getRefundList(pageInfo, chargingRefundDto); pageInfo.setRecords(list); return R.ok(pageInfo); } @Override public List chargingOrderGroup(ChargingPercentProvinceDto chargingPercentProvinceDto) { return this.baseMapper.chargingOrderGroup(chargingPercentProvinceDto); } @Override public List charge(LocalDate sixBefore, List siteIds) { return this.baseMapper.charge(sixBefore, siteIds); } @Override public List circle(List siteIds, LocalDate sixBefore) { return this.baseMapper.circle(siteIds, sixBefore); } @Override public Map countAll(List siteIds) { return this.baseMapper.countAll(siteIds); } @Override public List> getSumByType(LocalDate start, LocalDate end, List siteIds) { LocalDateTime start1 = start.atStartOfDay(); LocalDateTime end1 = end.atTime(LocalTime.MAX); return this.baseMapper.getSumByType(start1, end1, siteIds); } @Override public List> getDateData(LocalDate start, LocalDate end, List siteIds) { LocalDateTime start1 = start.atStartOfDay(); LocalDateTime end1 = end.atTime(LocalTime.MAX); return this.baseMapper.getDateData(start1, end1, siteIds); } @Override public List> getWeekData(LocalDate start, LocalDate end, List siteIds) { LocalDateTime start1 = start.atStartOfDay(); LocalDateTime end1 = end.atTime(LocalTime.MAX); return this.baseMapper.getWeekData(start1, end1, siteIds); } @Override public List> getMonthData(LocalDate start, LocalDate end, List siteIds) { LocalDateTime start1 = start.atStartOfDay(); LocalDateTime end1 = end.atTime(LocalTime.MAX); return this.baseMapper.getMonthData(start1, end1, siteIds); } @Override public List> getYearData(LocalDate start, LocalDate end, List siteIds) { LocalDateTime start1 = start.atStartOfDay(); LocalDateTime end1 = end.atTime(LocalTime.MAX); return this.baseMapper.getYearData(start1, end1, siteIds); } @Resource private SysUserClient sysUserClient; @Override public ChargingOrderTimeVO chargingList(ChargingListQuery dto) { String startTime1 = null; String startTime2 = null; String endTime1 = null; String endTime2 = null; if (StringUtils.hasLength(dto.getStartTime())) { String[] split = dto.getStartTime().split(" - "); startTime1 = split[0]; startTime2 = split[1]; } if (StringUtils.hasLength(dto.getEndTime())) { String[] split = dto.getEndTime().split(" - "); endTime1 = split[0]; endTime2 = split[1]; } ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO(); if (StringUtils.hasLength(dto.getPhone())) { List data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); if (data != null) { if (!data.isEmpty()) { dto.setUserIds(data); } } else { dto.setUserIds(new ArrayList()); } if (dto.getUserIds().isEmpty()) { List carIds = dto.getUserIds(); carIds.add(-1L); dto.setUserIds(carIds); } } if (StringUtils.hasLength(dto.getLicensePlate())) { List data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData(); if (data != null) { if (!data.isEmpty()) { dto.setCarIds(data); } } else { dto.setCarIds(new ArrayList()); } if (dto.getCarIds().isEmpty()) { List carIds = dto.getCarIds(); carIds.add(-1L); dto.setCarIds(carIds); } } Long userId = tokenService.getLoginUser().getUserid(); // 查询当前登陆人按钮权限 SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); if (dto.getSiteId() == null) { if (userId != null) { List data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { siteIds.add(datum.getId()); } } } else { siteIds.add(dto.getSiteId()); } if (siteIds.isEmpty()) { siteIds.add(-1); } else { if (roleType == 2) { List integers = new ArrayList<>(); for (Integer siteId : siteIds) { // 校验有没有这个站点的权限 List t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData(); Boolean b = t1.get(1); if (b) { integers.add(siteId); } } siteIds = integers; } } dto.setSiteIds(siteIds); PageInfo pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize()); List list = new ArrayList<>(); List> maps = this.baseMapper.chargingList1(pageInfo, dto, startTime1, startTime2, endTime1, endTime2); for (Map map : maps) { if(null == map){ continue; } ChargingOrderListVO chargingOrderListVO = new ChargingOrderListVO(); if (roleType == 2) { List data = partnerClient.getChargingListMenu(sysUser.getObjectId(), Integer.valueOf(map.get("siteId").toString())).getData(); chargingOrderListVO.setAuthInfo(data.get(0)); chargingOrderListVO.setAuthCurve(data.get(1)); } chargingOrderListVO.setUid(map.get("id").toString()); chargingOrderListVO.setCode(map.get("code").toString()); chargingOrderListVO.setSiteName(map.get("siteName").toString()); chargingOrderListVO.setOrderType(map.get("orderType").toString()); chargingOrderListVO.setTerminalName(map.get("terminalName").toString()); chargingOrderListVO.setElectricity(null == map.get("electricity") ? BigDecimal.ZERO : new BigDecimal(map.get("electricity").toString())); chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity()); Object periodElectricPrice = map.get("periodElectricPrice"); Object periodServicePrice = map.get("periodServicePrice"); if(null != periodServicePrice){ Integer orderSource = Integer.valueOf(map.get("orderSource").toString()); if(2 == orderSource){ BigDecimal bigDecimal = new BigDecimal(periodServicePrice.toString()).multiply(new BigDecimal(0.8)).setScale(2, RoundingMode.HALF_EVEN); chargingOrderListVO.setPaymentAmount(new BigDecimal(periodElectricPrice.toString()).add(bigDecimal)); BigDecimal sharingAmount = new BigDecimal(periodServicePrice.toString()).multiply(new BigDecimal(0.2)).setScale(2, RoundingMode.HALF_EVEN); chargingOrderListVO.setSharingAmount(sharingAmount); }else{ chargingOrderListVO.setPaymentAmount(new BigDecimal(periodElectricPrice.toString()).add(new BigDecimal(periodServicePrice.toString())).setScale(2, RoundingMode.HALF_EVEN)); chargingOrderListVO.setSharingAmount(BigDecimal.ZERO); } }else{ chargingOrderListVO.setPaymentAmount(BigDecimal.ZERO); chargingOrderListVO.setSharingAmount(BigDecimal.ZERO); } chargingOrderListVO.setElectrovalence(null == map.get("electrovalence") ? BigDecimal.ZERO : new BigDecimal(map.get("electrovalence").toString())); chargingOrderListVO.setServiceCharge(null == map.get("serviceCharge") ? BigDecimal.ZERO : new BigDecimal(map.get("serviceCharge").toString())); BigDecimal bigDecimal = new BigDecimal("0.006"); if (!"0".equals(map.get("rechargePaymentType").toString())) { chargingOrderListVO.setCommissionAmount(new BigDecimal(map.get("rechargeAmount").toString()).multiply(bigDecimal)); } if(null != map.get("tripartitePlatformName")){ chargingOrderListVO.setTripartitePlatformName(map.get("tripartitePlatformName").toString()); } if(null != map.get("startTime")){ chargingOrderListVO.setStartTime(LocalDateTime.parse(map.get("startTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } if(null != map.get("endTime")){ chargingOrderListVO.setEndTime(LocalDateTime.parse(map.get("endTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } if(null != map.get("chargingSecond")){ chargingOrderListVO.setChargingSecond(Long.valueOf(map.get("chargingSecond").toString())); }else{ chargingOrderListVO.setChargingSecond(0L); } if(null != map.get("startSoc")){ chargingOrderListVO.setEndSoc(map.get("startSoc").toString()); } if(null != map.get("endSoc")){ chargingOrderListVO.setEndSoc(map.get("endSoc").toString()); } if(null != map.get("status")){ chargingOrderListVO.setStatus(Integer.valueOf(map.get("status").toString())); } if(null != map.get("endMode")){ chargingOrderListVO.setEndMode(Integer.valueOf(map.get("endMode").toString())); } if(null != map.get("phone")){ chargingOrderListVO.setPhone(map.get("phone").toString()); } if(null != map.get("licensePlate")){ chargingOrderListVO.setLicensePlate(map.get("licensePlate").toString()); } BigDecimal jian = null == map.get("jian") ? BigDecimal.ZERO : new BigDecimal(map.get("jian").toString()); BigDecimal feng = null == map.get("feng") ? BigDecimal.ZERO : new BigDecimal(map.get("feng").toString()); BigDecimal ping = null == map.get("ping") ? BigDecimal.ZERO : new BigDecimal(map.get("ping").toString()); BigDecimal gu = null == map.get("gu") ? BigDecimal.ZERO : new BigDecimal(map.get("gu").toString()); BigDecimal total = jian.add(feng).add(ping).add(gu); if (total.compareTo(new BigDecimal("0")) != 0) { chargingOrderListVO.setElectronicProportion( jian.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(尖)/" + feng.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(峰)/" + ping.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(平)/" + gu.divide(total, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%(谷)"); } else { chargingOrderListVO.setElectronicProportion( "0" + "%(尖)/" + "0" + "%(峰)/" + "0" + "%(平)/" + "0" + "%(谷)"); } list.add(chargingOrderListVO); } // 尖峰平谷充电到账 BigDecimal jianElectronic = new BigDecimal("0"); BigDecimal fengElectronic = new BigDecimal("0"); BigDecimal pingElectronic = new BigDecimal("0"); BigDecimal guElectronic = new BigDecimal("0"); // 尖峰平谷服务费 BigDecimal jianService = new BigDecimal("0"); BigDecimal fengService = new BigDecimal("0"); BigDecimal pingService = new BigDecimal("0"); BigDecimal guService = new BigDecimal("0"); // 尖峰平谷充电量 度数 BigDecimal jian = new BigDecimal("0"); BigDecimal feng = new BigDecimal("0"); BigDecimal ping = new BigDecimal("0"); BigDecimal gu = new BigDecimal("0"); List> list1 = this.baseMapper.chargingListSum(dto, startTime1, startTime2, endTime1, endTime2); for (Map map : list1) { if(null == map){ continue; } jianElectronic = jianElectronic.add(new BigDecimal(null == map.get("jianElectronic") ? "0" : map.get("jianElectronic").toString())); fengElectronic = fengElectronic.add(new BigDecimal(null == map.get("fengElectronic") ? "0" : map.get("fengElectronic").toString())); pingElectronic = pingElectronic.add(new BigDecimal(null == map.get("pingElectronic") ? "0" : map.get("pingElectronic").toString())); guElectronic = guElectronic.add(new BigDecimal(null == map.get("guElectronic") ? "0" : map.get("guElectronic").toString())); jianService = jianService.add(new BigDecimal(null == map.get("jianService") ? "0" : map.get("jianService").toString())); fengService = fengService.add(new BigDecimal(null == map.get("fengService") ? "0" : map.get("fengService").toString())); pingService = pingService.add(new BigDecimal(null == map.get("pingService") ? "0" : map.get("pingService").toString())); guService = guService.add(new BigDecimal(null == map.get("guService") ? "0" : map.get("guService").toString())); jian = jian.add(new BigDecimal(null == map.get("jian") ? "0" : map.get("jian").toString())); feng = feng.add(new BigDecimal(null == map.get("feng") ? "0" : map.get("feng").toString())); ping = ping.add(new BigDecimal(null == map.get("ping") ? "0" : map.get("ping").toString())); gu = gu.add(new BigDecimal(null == map.get("gu") ? "0" : map.get("gu").toString())); } Map map = this.baseMapper.chargingListSum1(dto, startTime1, startTime2, endTime1, endTime2); System.err.println("充电时段统计-查询参数:" + JSON.toJSONString(dto)); System.err.println("充电时段统计-汇总数据:" + JSON.toJSONString(map)); //订单数量 int orderCount = Integer.parseInt(map.get("orderCount").toString()); // 计算充电总度数 BigDecimal electronic = new BigDecimal(map.get("electronic").toString()); // 支付金额 BigDecimal paymentAmount = new BigDecimal(map.get("paymentAmount").toString()); // 电费 BigDecimal electrovalence = new BigDecimal(map.get("electrovalence").toString()); // 服务费 BigDecimal serviceCharge = new BigDecimal(map.get("serviceCharge").toString()); chargingOrderTimeVO.setOrderCount(orderCount); chargingOrderTimeVO.setChargingCapacity(electronic.setScale(2, BigDecimal.ROUND_HALF_EVEN)); chargingOrderTimeVO.setPaymentAmount(paymentAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN)); chargingOrderTimeVO.setElectrovalence(electrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN)); chargingOrderTimeVO.setServiceCharge(serviceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN)); // 计算尖峰平谷充电到账占比 BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic); // 计算尖峰平谷服务费占比 BigDecimal add1 = jianService.add(fengService).add(pingService).add(guService); // 计算尖峰平谷充电量占比 BigDecimal add2 = jian.add(feng).add(ping).add(gu); if (add.compareTo(new BigDecimal("0")) != 0) { chargingOrderTimeVO.setCapacityProportion(jian + "度/" + feng + "度/" + ping + "度/" + gu + "度-" + jian.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/" + feng.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/" + ping.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/" + gu.divide(add2, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%"); chargingOrderTimeVO.setServiceProportion(jianService + "元/" + fengService + "元/" + pingService + "元/" + guService + "元-" + jianService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/" + fengService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/" + pingService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/" + guService.divide(add1, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%"); chargingOrderTimeVO.setElectronicProportion(jianElectronic + "元/" + fengElectronic + "元/" + pingElectronic + "元/" + guElectronic + "元-" + jianElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/" + fengElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/" + pingElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%/" + guElectronic.divide(add, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")) + "%"); } else { chargingOrderTimeVO.setCapacityProportion(jianElectronic + "度/" + fengElectronic + "度/" + pingElectronic + "度/" + guElectronic + "度-" + "0" + "%/" + "0" + "%/" + "0" + "%/" + "0" + "%"); chargingOrderTimeVO.setServiceProportion(jianService + "元/" + fengService + "元/" + pingService + "元/" + guService + "元-" + "0" + "%/" + "0" + "%/" + "0" + "%/" + "0" + "%"); chargingOrderTimeVO.setElectronicProportion(jian + "元/" + feng + "元/" + ping + "元/" + gu + "元-" + "0" + "%/" + "0" + "%/" + "0" + "%/" + "0" + "%"); } pageInfo.setRecords(list); chargingOrderTimeVO.setList(pageInfo); return chargingOrderTimeVO; } @Override public List export(ChargingListQuery dto) { String startTime1 = null; String startTime2 = null; String endTime1 = null; String endTime2 = null; if (StringUtils.hasLength(dto.getStartTime())) { String[] split = dto.getStartTime().split(" - "); startTime1 = split[0]; startTime2 = split[1]; } if (StringUtils.hasLength(dto.getEndTime())) { String[] split = dto.getEndTime().split(" - "); endTime1 = split[0]; endTime2 = split[1]; } if (StringUtils.hasLength(dto.getPhone())) { List data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); if (data != null) { if (!data.isEmpty()) { dto.setUserIds(data); } } else { dto.setUserIds(new ArrayList()); } if (dto.getUserIds().isEmpty()) { List carIds = dto.getUserIds(); carIds.add(-1L); dto.setUserIds(carIds); } } if (StringUtils.hasLength(dto.getLicensePlate())) { List data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData(); if (data != null) { if (!data.isEmpty()) { dto.setCarIds(data); } } else { dto.setCarIds(new ArrayList()); } if (dto.getCarIds().isEmpty()) { List carIds = dto.getCarIds(); carIds.add(-1L); dto.setCarIds(carIds); } } Long userId = tokenService.getLoginUser().getUserid(); // 查询当前登陆人按钮权限 SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); if (dto.getSiteId() == null) { if (userId != null) { List data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { siteIds.add(datum.getId()); } } } else { siteIds.add(dto.getSiteId()); } if (siteIds.isEmpty()) { siteIds.add(-1); } else { if (roleType == 2) { List integers = new ArrayList<>(); for (Integer siteId : siteIds) { // 校验有没有这个站点的权限 List t1 = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData(); Boolean b = t1.get(1); if (b) { integers.add(siteId); } } siteIds = integers; } } dto.setSiteIds(siteIds); List list1 = this.baseMapper.chargingList(dto, startTime1, startTime2, endTime1, endTime2); return list1; } @Override public ChargingOrderListInfoVO chargingInfo(String uid) { TChargingOrder chargingOrder = this.getById(uid); ChargingOrderListInfoVO chargingOrderListInfoVO = new ChargingOrderListInfoVO(); chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime()); chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime()); chargingOrderListInfoVO.setStatus(chargingOrder.getStatus()); BigDecimal bigDecimal = new BigDecimal("0.006"); if (chargingOrder.getOrderAmount() != null) { BigDecimal multiply = chargingOrder.getPaymentAmount().multiply(bigDecimal); chargingOrderListInfoVO.setCommissionAmount(multiply.setScale(2, BigDecimal.ROUND_HALF_UP)); } chargingOrderListInfoVO.setElectrovalence(chargingOrder.getElectrovalence()); chargingOrderListInfoVO.setServiceCharge(chargingOrder.getServiceCharge()); if (chargingOrder.getElectrovalence() != null && chargingOrder.getServiceCharge() != null) { chargingOrderListInfoVO.setTotal(chargingOrder.getElectrovalence().add(chargingOrder.getServiceCharge())); } else { chargingOrderListInfoVO.setTotal(new BigDecimal("0")); } if (chargingOrderListInfoVO.getTotal().compareTo(new BigDecimal("0")) > 0) { if (chargingOrder.getCouponDiscountAmount() != null && chargingOrder.getVipDiscountAmount() != null && chargingOrder.getSharingAmount() != null && chargingOrder.getCommissionAmount() != null) { chargingOrderListInfoVO.setRealTotal(chargingOrderListInfoVO.getTotal().subtract(chargingOrder.getCouponDiscountAmount()).subtract(chargingOrder.getVipDiscountAmount()).subtract(chargingOrder.getSharingAmount()).subtract(chargingOrder.getCommissionAmount())); } else { chargingOrderListInfoVO.setRealTotal(chargingOrderListInfoVO.getTotal()); } } else { chargingOrderListInfoVO.setRealTotal(new BigDecimal("0")); } chargingOrderListInfoVO.setCode(chargingOrder.getCode()); List data = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData(); if (!data.isEmpty()) { chargingOrderListInfoVO.setSiteName(data.get(0).getName()); chargingOrderListInfoVO.setSiteAddress(data.get(0).getAddress()); } if (chargingOrder.getChargingGunId() != null) { TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); if (data1 != null) { TChargingPile data2 = chargingPileClient.getChargingPileById(data1.getChargingPileId()).getData(); if (data2 != null) { chargingOrderListInfoVO.setGunCode(data1.getCode()); chargingOrderListInfoVO.setTerminalName(data2.getName() + data1.getName()); } } } chargingOrderListInfoVO.setChargingCapacity(chargingOrder.getChargingCapacity()); chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode()); // 获取开始SOC 结束soc if (chargingOrder.getCode() != null) { List data6 = uploadRealTimeMonitoringDataService.getDataByOrderCodeAsc(chargingOrder.getCode()); 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()).divide(new BigDecimal(1000), 2, BigDecimal.ROUND_HALF_UP)); } } if (!data6.isEmpty()) { int min = 100; int max = 0; for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) { if (uploadRealTimeMonitoringData.getSoc() > max) { max = uploadRealTimeMonitoringData.getSoc(); } if (uploadRealTimeMonitoringData.getSoc() != 0 && uploadRealTimeMonitoringData.getSoc() < min) { min = uploadRealTimeMonitoringData.getSoc(); } } chargingOrderListInfoVO.setEndSoc(max + ""); chargingOrderListInfoVO.setStartSoc(min + ""); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) { uploadRealTimeMonitoringData.setCreateTime(simpleDateFormat.format(uploadRealTimeMonitoringData.getCreate_time())); } } } chargingOrderListInfoVO.setList(data6); } if (chargingOrderListInfoVO.getStartTime() != null && chargingOrderListInfoVO.getEndTime() != null) { LocalDateTime startTime = chargingOrderListInfoVO.getStartTime(); LocalDateTime endTime = chargingOrderListInfoVO.getEndTime(); // 计算时间差 单位秒 long between = ChronoUnit.SECONDS.between(startTime, endTime); chargingOrderListInfoVO.setChargingSecond(between + ""); } if (chargingOrder.getAppUserCarId() != null) { List data3 = appUserCarClient.getCarByIds(Collections.singletonList(chargingOrder.getAppUserCarId())).getData(); if (data3 != null && !data3.isEmpty()) { chargingOrderListInfoVO.setLicensePlate(data3.get(0).getLicensePlate()); } } else { chargingOrderListInfoVO.setLicensePlate(chargingOrder.getPlateNum()); } chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime()); chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime()); chargingOrderListInfoVO.setId(chargingOrder.getId()); chargingOrderListInfoVO.setUid(chargingOrder.getId().toString()); chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount()); chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount()); if (chargingOrder.getOrderSource().equals(2)) { chargingOrderListInfoVO.setSharingAmount(chargingOrder.getServiceCharge().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)); } else { chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount()); } // 查询费用明细列表 List list = chargingOrderAccountingStrategyService.lambdaQuery() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()) .list(); chargingOrderListInfoVO.setList1(list); return chargingOrderListInfoVO; } /** * 处理充电订单实时监控数据相关的业务逻辑 * * @param query */ @Override public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) { if (com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())) { //获取当前的计费策略 TChargingOrder chargingOrder1 = this.getOne(new LambdaQueryWrapper().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); 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(query.getSoc())); this.updateById(chargingOrder); } } /** * 自动结束充电后的处理逻辑 * * @param orderCode */ @Override public void endCharge(String orderCode, Integer endMode) { TChargingOrder order = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getCode, orderCode)); TChargingOrder chargingOrder = new TChargingOrder(); chargingOrder.setId(order.getId()); chargingOrder.setAppUserId(order.getAppUserId()); chargingOrder.setEndMode(endMode); this.updateById(chargingOrder); } /** * 异常结束充电处理逻辑 * * @param orderCode */ @Override public void excelEndCharge(String orderCode) { endCharge(orderCode, 0); } /** * 停止充电返回账单后计算费用 * * @param vo */ @Override @Transactional public R endChargeBillingCharge(TransactionRecordMessageVO vo) { RLock lock = redissonClient.getLock("endOrder:" + vo.getTransaction_serial_number()); try { boolean tryLock = lock.tryLock(60, 60, TimeUnit.SECONDS); if(tryLock){ TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getCode, vo.getTransaction_serial_number())); if (null == chargingOrder) { log.error("订单不存在,订单号:{}", vo.getTransaction_serial_number()); return R.fail("订单不存在,订单号:" + vo.getTransaction_serial_number()); } Integer status = chargingOrder.getStatus(); if (status == 5) { log.info("订单已结算,订单号:{}", vo.getTransaction_serial_number()); return R.fail("订单已结算,订单号:" + vo.getTransaction_serial_number()); } //如果使用优惠券需要判断优惠券是否满足使用条件 //退款金额=优惠券金额+剩余充电金额 BigDecimal periodElectricPrice_total = BigDecimal.ZERO; BigDecimal periodServicePrice_total = BigDecimal.ZERO; BigDecimal vipDiscountAmount_total = BigDecimal.ZERO; BigDecimal serviceCharge_total = BigDecimal.ZERO; BigDecimal total = BigDecimal.ZERO; //获取订单的计费策略 List accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); if (accountingStrategyDetailOrderList.isEmpty()) { return R.fail("计费策略为空,无法计算费用"); } accountingStrategyDetailOrderList.get(accountingStrategyDetailOrderList.size() - 1).setEndTime("23:59"); //开始处理计费明细数据和优惠数据 chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List lists = new ArrayList<>(); List dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode()); if(!dataList.isEmpty()){ vo.setStart_time(sdfs.format(dataList.get(dataList.size() - 1).getCreate_time()) + ".00"); vo.setEnd_time(sdfs.format(dataList.get(0).getCreate_time()) + ".00"); } //跨天 if (!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])) { //当天的 //开始通过计费策略遍历解析每个时段的费用明细 String start_time = vo.getStart_time(); String end_time = vo.getEnd_time(); long start = sdfs.parse(start_time).getTime(); long end = sdfs.parse(end_time).getTime(); Class clazz = vo.getClass(); /** * "start_time": "2025-01-03 23:06:43.00", * "end_time": "2025-01-04 00:39:39.00", */ for (int i = accountingStrategyDetailOrderList.size(); i > 0; i--) { AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i - 1); long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime(); if (time < start) { break; } //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) Object invoke = null; switch (strategyDetail.getType()) { case 1: //充电度数 invoke = clazz.getMethod("getSpike_charge" + (i)).invoke(vo); break; case 2: //充电度数 invoke = clazz.getMethod("getPeak_charge" + (i)).invoke(vo); break; case 3: //充电度数 invoke = clazz.getMethod("getFlat_charge" + (i)).invoke(vo); break; case 4: //充电度数 invoke = clazz.getMethod("getValley_charge" + (i)).invoke(vo); break; } if (null == invoke || Double.valueOf(invoke.toString()) == 0) { continue; } BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); BeanUtils.copyProperties(strategyDetail, vo1); vo1.setChargingCapacity(sharp_peak_charge); lists.add(0, vo1); } //第二天的 //开始通过计费策略遍历解析每个时段的费用明细 for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i); long time = sdfs.parse(end_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime(); if (time > end) { break; } //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) Object invoke = null; switch (strategyDetail.getType()) { case 1: //充电度数 invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo); break; case 2: //充电度数 invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo); break; case 3: //充电度数 invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo); break; case 4: //充电度数 invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo); break; } if (null == invoke || Double.valueOf(invoke.toString()) == 0) { continue; } BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); BeanUtils.copyProperties(strategyDetail, vo1); vo1.setChargingCapacity(sharp_peak_charge); lists.add(vo1); } } else { for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { Class clazz = vo.getClass(); AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i); //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段) Object invoke = null; switch (strategyDetail.getType()) { case 1: //充电度数 invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo); break; case 2: //充电度数 invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo); break; case 3: //充电度数 invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo); break; case 4: //充电度数 invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo); break; } if (null == invoke || Double.valueOf(invoke.toString()) == 0) { continue; } BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); BeanUtils.copyProperties(strategyDetail, vo1); vo1.setChargingCapacity(sharp_peak_charge); lists.add(vo1); } } //开始处理明细 for (int i = 0; i < lists.size(); i++) { AccountingStrategyDetailOrderVo strategyDetail = lists.get(i); BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity(); TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy(); chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId()); chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId()); chargingOrderAccountingStrategy.setType(strategyDetail.getType()); chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence()); chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge()); chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge()); if (i == 0) { String time = vo.getStart_time().split(" ")[1]; chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":"))); } else { chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime()); } if (i == lists.size() - 1) { String time = vo.getEnd_time().split(" ")[1]; chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":"))); } else { chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime()); } //已充电总度数 BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge); BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge); BigDecimal serviceCharge = originalServicePrice; BigDecimal vipDiscountAmount = BigDecimal.ZERO; //计算优惠金额 if (null != chargingOrder.getVipDiscount()) { //0.58折 vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount())); serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount()); } chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge); chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN)); chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN)); chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN)); chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN)); chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy); //电费 periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc); //服务费(含折扣) serviceCharge_total = serviceCharge_total.add(serviceCharge); //服务费(不含折扣) periodServicePrice_total = periodServicePrice_total.add(originalServicePrice); //会员折扣优惠金额 vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount); //原始总金额(不含折扣) total = total.add(electrovalenc.add(originalServicePrice)); } BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue()); //原金额 BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); //支付金额 BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total); //退款金额=充值金额-实际支付金额 BigDecimal refundAmount = rechargeAmount.subtract(payAmount); UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode()); if (null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()) { Integer soc = uploadRealTimeMonitoringData.getSoc(); if (soc >= 98) { chargingOrder.setEndMode(2); } else if (null != chargingOrder.getResidualAmount() && chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0) { chargingOrder.setEndMode(3); } else { chargingOrder.setEndMode(1); } } chargingOrder.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN)); chargingOrder.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))); chargingOrder.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS"))); chargingOrder.setStatus(5); chargingOrder.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN)); chargingOrder.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN)); chargingOrder.setChargingCapacity(vo.getTotal_electricity()); chargingOrder.setElectricity(vo.getTotal_electricity()); chargingOrder.setVipDiscountAmount(vipDiscountAmount_total); if (vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0) { chargingOrder.setVipDiscount(BigDecimal.valueOf(1)); } //计算优惠券 BigDecimal couponDiscount = BigDecimal.ZERO; if (null != chargingOrder.getAppCouponId()) { //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。 TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData(); String couponJson = appCoupon.getCouponJson(); TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class); Integer preferentialMode = tCoupon.getPreferentialMode(); if (1 == preferentialMode) { //满减 if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) { BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount(); //如果优惠金额大于服务费金额,以服务费作为最大限制 if (serviceCharge_total.compareTo(couponDiscountAmount) < 0) { couponDiscount = serviceCharge_total; serviceCharge_total = BigDecimal.ZERO; } else { couponDiscount = couponDiscountAmount; } appCoupon.setStatus(2); appCouponClient.updateAppCoupon(appCoupon); } else { appCouponClient.refund(chargingOrder.getAppCouponId().toString()); chargingOrder.setAppCouponId(null); chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); } } 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 (serviceCharge_total.compareTo(divide) < 0) { couponDiscount = serviceCharge_total; serviceCharge_total = BigDecimal.ZERO; } else { couponDiscount = divide; } appCoupon.setStatus(2); appCouponClient.updateAppCoupon(appCoupon); } else { chargingOrder.setAppCouponId(null); chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); appCouponClient.refund(chargingOrder.getAppCouponId().toString()); } } } //优惠券优惠金额 couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN); //退款金额+优惠券 refundAmount = refundAmount.add(couponDiscount); //实际支付金额-优惠券 payAmount = payAmount.subtract(couponDiscount); if (serviceCharge_total.compareTo(BigDecimal.ZERO) > 0) { serviceCharge_total = serviceCharge_total.subtract(couponDiscount); } chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN)); chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN)); chargingOrder.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN)); chargingOrder.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN)); chargingOrder.setRefundStatus(1); UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "asc"); UploadRealTimeMonitoringData desc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "desc"); if(null != asc){ chargingOrder.setStartSoc(new BigDecimal(asc.getSoc())); } if(null != desc){ chargingOrder.setEndSoc(new BigDecimal(desc.getSoc())); } this.updateById(chargingOrder); chargingOrder = this.getById(chargingOrder.getId()); Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0); //推送三方平台 if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) { TChargingOrder finalChargingOrder = chargingOrder; new Thread(new Runnable() { @Override public void run() { tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId()); tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(), finalChargingOrder.getOperatorId()); tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId()); } }).start(); } ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); TChargingOrder finalChargingOrder1 = chargingOrder; threadPoolExecutor.execute(()->{ //推送成都监管 NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo(); statusVo.setOrderCode(finalChargingOrder1.getCode()); statusVo.setChargingGunId(finalChargingOrder1.getChargingGunId()); chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo); chengDuJianGuanClient.notificationOrderInfo(statusVo); }); //开始将优惠券优惠的金额添加到明细中 BigDecimal couponDiscountAmount = chargingOrder.getCouponDiscountAmount(); if (null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0) { List list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); BigDecimal reduce = list.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) { BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice(); BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN))); periodServicePrice = periodServicePrice.subtract(multiply); chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN)); chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN)); } chargingOrderAccountingStrategyService.updateBatchById(list); } // 将枪状态重置为空闲 TChargingGun chargingGun = new TChargingGun(); chargingGun.setId(chargingOrder.getChargingGunId()); chargingGun.setStatus(2); chargingGun.setChargingPower(BigDecimal.ZERO); chargingGunClient.updateChargingGunById(chargingGun); chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); //推送状态给三方平台 if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) { tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 2); } //添加积分 if (1 == chargingOrder.getOrderSource()) { TIntegralRule integralRule = integralRuleClient.getSet().getData(); if (null != integralRule) { TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1"); Integer integral = chargingOrder.getServiceCharge().intValue() * num1; if (null != appUser.getVipId()) { TVip vip = vipClient.getInfo1(appUser.getVipId()).getData(); Integer doubleIntegration = vip.getDoubleIntegration(); //双倍积分 if (1 == doubleIntegration) { integral *= 2; } } if (integral > 0) { TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); appUserIntegralChange.setAppUserId(appUser.getId()); appUserIntegralChange.setChangeType(2); appUserIntegralChange.setHistoricalIntegral(appUser.getPoints()); appUser.setPoints(appUser.getPoints() + integral); appUserIntegralChange.setCurrentIntegral(appUser.getPoints()); appUserIntegralChange.setCreateTime(LocalDateTime.now()); appUserIntegralChange.setOrderCode(chargingOrder.getCode()); appUserIntegralChange.setExtension(chargingOrder.getId().toString()); appUserClient.updateAppUser(appUser); appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); } } //计算用户标签 editUserTag(chargingOrder); //用户推荐奖励 referralReward(chargingOrder); //开始构建退款费用 refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN); Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); if (refundAmount.compareTo(BigDecimal.ZERO) > 0) { //构建退款明细 TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); chargingOrderRefund.setChargingOrderId(chargingOrder.getId()); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS"); chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); chargingOrderRefund.setRefundAmount(refundAmount); 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> result = wxPaymentClient.refundOrderR(model); if (200 == result.getCode()) { //手续费 Map amount1 = (Map) result.getData().get("amount"); Object refund_fee1 = amount1.get("refund_fee"); BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); chargingOrderRefund.setRefundFee(refund_fee); chargingOrderRefundService.save(chargingOrderRefund); } } if (2 == rechargePaymentType) { RefundReq dto = new RefundReq(); dto.setOutTradeNo(chargingOrder.getCode()); dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); dto.setRefundAmount(refundAmount.toString()); dto.setRefundReason("充电完成退款"); RefundResp resp = aliPaymentClient.refund(dto).getData(); if (null != resp) { chargingOrderRefundService.save(chargingOrderRefund); this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); } } if (3 == rechargePaymentType) { RefundReq dto = new RefundReq(); dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber()); dto.setOutRequestNo(chargingOrderRefund.getRefundCode()); dto.setRefundAmount(refundAmount.toString()); dto.setRefundReason("充电完成退款"); RefundResp resp = h5AliPaymentClient.refund(dto).getData(); if (null != resp && "10000".equals(resp.getCode())) { chargingOrderRefundService.save(chargingOrderRefund); this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null); } } }else{ //构建退款明细 TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); chargingOrderRefund.setChargingOrderId(chargingOrder.getId()); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS"); chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); chargingOrderRefund.setRefundAmount(refundAmount); chargingOrderRefund.setRefundStatus(2); chargingOrderRefund.setPayType(rechargePaymentType); chargingOrderRefund.setCode(chargingOrder.getCode()); chargingOrderRefund.setRefundTitle("充电完成退款"); chargingOrderRefund.setRefundContent("充电完成退款"); chargingOrderRefund.setRefundReason("充电完成退款"); chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount()); chargingOrderRefund.setRefundTotalAmount(refundAmount); chargingOrderRefund.setPayAmount(rechargeAmount); chargingOrderRefund.setRefundTime(LocalDateTime.now()); chargingOrderRefundService.save(chargingOrderRefund); chargingOrder.setRefundStatus(2); chargingOrder.setRefundTime(LocalDateTime.now()); this.updateById(chargingOrder); } } //添加汇总统计数据 List list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper().eq("charging_order_id", chargingOrder.getId())); BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal serviceMoney = BigDecimal.ZERO; BigDecimal paymentMoney = BigDecimal.ZERO; long time = 0; if (!chargingOrder.getOrderSource().equals(2)) { serviceMoney = serviceMoney.add(service_reduce); paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce); } else { serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8"))); paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8"))); } if (chargingOrder.getStartTime() != null && chargingOrder.getEndTime() != null) { LocalDateTime startTime = chargingOrder.getStartTime(); LocalDateTime endTime = chargingOrder.getEndTime(); // 计算时间差 单位秒 time = ChronoUnit.SECONDS.between(startTime, endTime); } TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData(); summaryData.setChargingOrderId(chargingOrder.getId()); summaryData.setChargingCapacity(chargingCapacity.setScale(6, RoundingMode.HALF_EVEN)); summaryData.setChargingDuration(time); summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN)); summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN)); summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN)); chargingOrderSummaryDataService.save(summaryData); //推送监管平台订单状态和订单详情 ChargingOrderVo chargingOrderVo = new ChargingOrderVo(); BeanUtils.copyProperties(chargingOrder, chargingOrderVo); chargingMessageClient.pushOrderInfo(chargingOrderVo); chargingMessageClient.pushOrderStatus(chargingOrderVo); } } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } return R.ok(); } @Override public List> getByDate(LocalDate start, LocalDate end, List siteIds) { LocalDateTime start1 = start.atStartOfDay(); LocalDateTime end1 = end.atTime(LocalTime.MAX); return this.baseMapper.getByDate(start1, end1, siteIds); } @Override public List> queryPower(List siteIds) { return this.baseMapper.queryPower(siteIds); } @Override public Map qureryPowerLevel(List siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.queryPowerLevel(siteIds, statisticsQueryDto); } @Override public List> usersDay(ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.usersDay(statisticsQueryDto); } @Override public List> usersDay1() { return this.baseMapper.usersDay1(); } @Override public List> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.usersByQuery(statisticsQueryDto); } @Override public List> usersByQuery1(ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.usersByQuery1(statisticsQueryDto); } @Override public List> getUserTagCount() { return this.baseMapper.getUserTagCount(); } @Override public List> getVipCount() { return this.baseMapper.getVipCount(); } @Override public List> unitConsumption(ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.unitConsumption(statisticsQueryDto); } @Override public List> carUserMethod() { return this.baseMapper.carUserMethod(); } @Override public List> carUserBrand() { return this.baseMapper.carUserBrand(); } @Override public Map countLocalCar() { return this.baseMapper.countLocalCar(); } @Override public Double getAver(List siteIds) { return this.baseMapper.getAver(siteIds); } @Override public List> getLevelEvaluate(List siteIds) { return this.baseMapper.getLevelEvaluate(siteIds); } @Resource 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(tChargingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount())) == 0) { tChargingOrder.setStatus(5); } TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund(); chargingOrderRefund.setChargingOrderId(tChargingOrder.getId()); chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); chargingOrderRefund.setRefundStatus(1); chargingOrderRefund.setPayType(tChargingOrder.getRechargePaymentType()); chargingOrderRefund.setRefundTime(LocalDateTime.now()); chargingOrderRefund.setCode(tChargingOrder.getCode()); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); chargingOrderRefund.setRefundCode("CDF" + 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.getRechargePaymentType()) { WxPaymentRefundModel model = new WxPaymentRefundModel(); model.setOut_trade_no(tChargingOrder.getCode()); model.setOut_refund_no(chargingOrderRefund.getRefundCode()); model.setTransaction_id(tChargingOrder.getRechargeSerialNumber()); model.setReason("取消订单"); model.setNotify_url("/payment/wx/refund/notify"); WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue()); amount.setTotal(tChargingOrder.getRechargeAmount().multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); R> orderR = wxPaymentClient.refundOrderR(model); if (200 == orderR.getCode()) { tChargingOrder.setRefundStatus(2); tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); this.baseMapper.updateById(tChargingOrder); chargingOrderRefundService.save(chargingOrderRefund); //手续费 Map amount1 = (Map) orderR.getData().get("amount"); Object refund_fee1 = amount1.get("refund_fee"); BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); chargingOrderRefund.setRefundFee(refund_fee); chargingOrderRefundService.updateById(chargingOrderRefund); } } if (2 == tChargingOrder.getRechargePaymentType()) { 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) { chargingOrderRefund.setRefundStatus(2); chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); this.baseMapper.updateById(tChargingOrder); chargingOrderRefundService.save(chargingOrderRefund); } } if (3 == tChargingOrder.getRechargePaymentType()) { RefundReq dto = new RefundReq(); dto.setOutTradeNo(tChargingOrder.getRechargeSerialNumber()); dto.setOutRequestNo(tChargingOrder.getCode()); dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); dto.setRefundReason("取消订单"); RefundResp resp = h5AliPaymentClient.refund(dto).getData(); if (null != resp && "10000".equals(resp.getCode())) { chargingOrderRefund.setRefundStatus(2); chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); this.baseMapper.updateById(tChargingOrder); chargingOrderRefundService.save(chargingOrderRefund); } } if(5 == tChargingOrder.getStatus()){ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); threadPoolExecutor.execute(()->{ //推送成都监管 NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo(); statusVo.setOrderCode(tChargingOrder.getCode()); statusVo.setChargingGunId(tChargingOrder.getChargingGunId()); chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo); chengDuJianGuanClient.notificationOrderInfo(statusVo); }); } } if (payOrderQueryDto.getType() == 2) { TShoppingOrder shoppingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId()); if (shoppingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount()) == -1) { return R.fail("退款金额需小于支付金额"); } if ((shoppingOrder.getPaymentAmount().subtract(shoppingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount())) == 0) { shoppingOrder.setStatus(5); } TShoppingOrderRefund shoppingOrderRefund = new TShoppingOrderRefund(); shoppingOrderRefund.setShoppingOrderId(shoppingOrder.getId()); shoppingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); shoppingOrderRefund.setRefundStatus(1); shoppingOrderRefund.setPayType(shoppingOrder.getPaymentType()); shoppingOrderRefund.setRefundTime(LocalDateTime.now()); shoppingOrderRefund.setCode(shoppingOrder.getCode()); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); shoppingOrderRefund.setRefundCode("GWF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); shoppingOrderRefund.setRefundTitle("后台退款"); shoppingOrderRefund.setRefundContent("后台退款"); shoppingOrderRefund.setRefundReason("后台退款"); shoppingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark()); shoppingOrderRefund.setRefundTotalAmount(shoppingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount())); shoppingOrderRefund.setPayAmount(shoppingOrder.getPaymentAmount()); if (1 == shoppingOrder.getPaymentType()) { WxPaymentRefundModel model = new WxPaymentRefundModel(); model.setOut_trade_no(shoppingOrder.getCode()); model.setOut_refund_no(shoppingOrderRefund.getRefundCode()); model.setTransaction_id(shoppingOrder.getSerialNumber()); model.setReason("取消订单"); model.setNotify_url("/payment/wx/refund/notify"); WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue()); amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); R> orderR = wxPaymentClient.refundOrderR(model); if (200 == orderR.getCode()) { shoppingOrder.setRefundStatus(2); shoppingOrder.setRefundAmount((shoppingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); shoppingOrderService.updateById(shoppingOrder); shoppingOrderRefundService.save(shoppingOrderRefund); //手续费 Map amount1 = (Map) orderR.getData().get("amount"); Object refund_fee1 = amount1.get("refund_fee"); BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); shoppingOrderRefund.setRefundFee(refund_fee); shoppingOrderRefundService.updateById(shoppingOrderRefund); } } if (2 == shoppingOrder.getPaymentType()) { RefundReq dto = new RefundReq(); dto.setOutTradeNo(shoppingOrder.getCode()); dto.setOutRequestNo(shoppingOrder.getCode()); dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); dto.setRefundReason("取消订单"); RefundResp resp = aliPaymentClient.refund(dto).getData(); if (null != resp) { shoppingOrder.setRefundStatus(2); shoppingOrder.setRefundAmount((shoppingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); shoppingOrderService.updateById(shoppingOrder); shoppingOrderRefundService.save(shoppingOrderRefund); } } // if(3 == tChargingOrder.getPaymentType()){ // RefundReq dto = new RefundReq(); // dto.setOutTradeNo(tChargingOrder.getCode()); // dto.setOutRequestNo(tChargingOrder.getCode()); // dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); // dto.setRefundReason("取消订单"); // RefundResp resp = h5AliPaymentClient.refund(dto).getData(); // if(null != resp){ // tChargingOrder.setRefundStatus(2); // tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); // shoppingOrderService.updateById(tChargingOrder); // shoppingOrderRefundService.save(chargingOrderRefund); // } // } } if (payOrderQueryDto.getType() == 3) { TVipOrder vipOrder = vipOrderService.getById(payOrderQueryDto.getOrderId()); if (vipOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount()) == -1) { return R.fail("退款金额需小于支付金额"); } TVipOrderRefund vipOrderRefund = new TVipOrderRefund(); vipOrderRefund.setVipOrderId(vipOrder.getId()); vipOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount()); vipOrderRefund.setRefundStatus(1); vipOrderRefund.setPayTime(vipOrder.getPayTime()); vipOrderRefund.setPayCode(vipOrder.getCode()); vipOrderRefund.setPayType(vipOrder.getPaymentType()); vipOrderRefund.setRefundTime(LocalDateTime.now()); vipOrderRefund.setCode(vipOrder.getCode()); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); vipOrderRefund.setRefundCode("HYF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue())); vipOrderRefund.setRefundTitle("后台退款"); vipOrderRefund.setRefundContent("后台退款"); vipOrderRefund.setRefundReason("后台退款"); vipOrderRefund.setRefundRemark(payOrderQueryDto.getRemark()); vipOrderRefund.setRefundTotalAmount(vipOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount())); vipOrderRefund.setPayAmount(vipOrder.getPaymentAmount()); if (1 == vipOrder.getPaymentType()) { WxPaymentRefundModel model = new WxPaymentRefundModel(); model.setOut_trade_no(vipOrder.getCode()); model.setOut_refund_no(vipOrderRefund.getRefundCode()); model.setTransaction_id(vipOrder.getSerialNumber()); model.setReason("取消订单"); model.setNotify_url("/payment/wx/refund/notify"); WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue()); amount.setTotal(vipOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); R> orderR = wxPaymentClient.refundOrderR(model); if (200 == orderR.getCode()) { vipOrder.setRefundStatus(2); vipOrder.setRefundAmount((vipOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); vipOrderService.updateById(vipOrder); vipOrderRefundService.save(vipOrderRefund); //手续费 Map amount1 = (Map) orderR.getData().get("amount"); Object refund_fee1 = amount1.get("refund_fee"); BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100)); vipOrderRefund.setRefundFee(refund_fee); vipOrderRefundService.updateById(vipOrderRefund); } } if (2 == vipOrder.getPaymentType()) { RefundReq dto = new RefundReq(); dto.setOutTradeNo(vipOrder.getCode()); dto.setOutRequestNo(vipOrder.getCode()); dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); dto.setRefundReason("取消订单"); RefundResp resp = aliPaymentClient.refund(dto).getData(); if (null != resp) { vipOrder.setRefundStatus(2); vipOrder.setRefundAmount((vipOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); vipOrderService.updateById(vipOrder); vipOrderRefundService.save(vipOrderRefund); } } // if(3 == tChargingOrder.getPaymentType()){ // RefundReq dto = new RefundReq(); // dto.setOutTradeNo(tChargingOrder.getCode()); // dto.setOutRequestNo(tChargingOrder.getCode()); // dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString()); // dto.setRefundReason("取消订单"); // RefundResp resp = h5AliPaymentClient.refund(dto).getData(); // if(null != resp){ // tChargingOrder.setRefundStatus(2); // tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount())); // vipOrderService.updateById(tChargingOrder); // vipOrderRefundService.save(chargingOrderRefund); // } // } } return R.ok(); } /** * 根据车牌号和开始时间查询充电数据 * * @param query * @return */ @Override public TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) { TChargingOrder one = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getPlateNum, query.getLicensePlate()) .eq(TChargingOrder::getDelFlag, 0).between(TChargingOrder::getStartTime, query.getStartTime(), LocalDateTime.now()) .eq(TChargingOrder::getRechargePaymentStatus, 2).in(TChargingOrder::getStatus, Arrays.asList(3, 4, 5)) .last(" order by start_time desc limit 0, 1")); return one; } @Override public TSettlementConfirm settlementAdd(SettlementConfirmAdd dto) { List data = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData(); List list3 = chargingOrderAccountingStrategyService.list(); TSettlementConfirm tSettlementConfirm = new TSettlementConfirm(); if (!data.isEmpty()) { tSettlementConfirm.setSiteName(data.get(0).getName()); tSettlementConfirm.setPartnerId(data.get(0).getPartnerId()); if (data.get(0).getPartnerId() != null) { Partner data1 = siteClient.getPartnerR(data.get(0).getPartnerId()).getData(); if (data1 != null) { tSettlementConfirm.setPartnerName(data1.getName()); tSettlementConfirm.setPartnerId(data1.getId()); } } } String startTime = dto.getStartTime(); String endTime = dto.getEndTime(); // 将这两个时间转化为localDateTime // 创建 DateTimeFormatter 对象,指定格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); // 将字符串解析为 LocalDateTime 对象 LocalDateTime localDateTime = LocalDateTime.parse(startTime, formatter); LocalDateTime localDateTime1 = LocalDateTime.parse(endTime, formatter); tSettlementConfirm.setEndTime(localDateTime1); tSettlementConfirm.setStartTime(localDateTime); // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表 QueryWrapper eq = new QueryWrapper() .eq("site_id", dto.getSiteId()); switch (dto.getType()) { case 1: eq.between("pay_time", localDateTime, localDateTime1); break; case 2: eq.between("end_time", localDateTime, localDateTime1); break; } List tChargingOrders = this.baseMapper.selectList(eq); // 充电电量 度 BigDecimal chargingElectronic = new BigDecimal("0"); // 三方收费 分佣 BigDecimal sharingAmount = new BigDecimal("0"); // 三方交易手续费 三方收费*0.6% BigDecimal commissionAmount = new BigDecimal("0"); // 累计电费 BigDecimal electrovalence = new BigDecimal("0"); // 累计服务费 BigDecimal serviceCharge = new BigDecimal("0"); // 订单手续费 订单支付金额*0.6% BigDecimal orderCommission = new BigDecimal("0"); // 会员抵扣 BigDecimal vipDiscount = new BigDecimal("0"); // 优惠券抵扣 BigDecimal couponDiscount = new BigDecimal("0"); // 支付订单金额 需要减去退款金额 BigDecimal paymentAmount = new BigDecimal("0"); for (TChargingOrder tChargingOrder : tChargingOrders) { if (null == tChargingOrder.getStatus() || 5 != tChargingOrder.getStatus()) { continue; } List list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); // 累加充电总度数 chargingElectronic = chargingElectronic.add(chargingCapacity); // 累加分佣 if (tChargingOrder.getOrderSource() == 2) { sharingAmount = sharingAmount.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_DOWN)); } // 累加电费 electrovalence = electrovalence.add(electronic_reduce); if (tChargingOrder.getPaymentAmount() != null && tChargingOrder.getOrderSource() != 2) { paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount()); } if (tChargingOrder.getRechargeAmount() != null) { orderCommission = orderCommission.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006")) .setScale(2, BigDecimal.ROUND_DOWN)); } // 累加服务费 if (tChargingOrder.getServiceCharge() != null) { if (tChargingOrder.getOrderSource() == 2) { serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2, BigDecimal.ROUND_DOWN)); paymentAmount = paymentAmount.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8"))); } else { serviceCharge = serviceCharge.add(service_reduce); } } // 累加会员折扣 if (tChargingOrder.getVipDiscountAmount() != null) { vipDiscount = vipDiscount.add(tChargingOrder.getVipDiscountAmount()); } // 累加优惠券折扣 if (tChargingOrder.getCouponDiscountAmount() != null) { couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount()); } } // 三方交易手续费 三方收费*0.6% commissionAmount = sharingAmount.multiply(new BigDecimal("0.006")); 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.subtract(orderCommission).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.setVipDiscount(vipDiscount); tSettlementConfirm.setCouponDiscount(couponDiscount); tSettlementConfirm.setType(dto.getType()); if (dto.getState() == 2) { tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean()) .subtract(dto.getMaintain()).multiply(dto.getServicePartner())); tSettlementConfirm.setSupplyElectronic(dto.getSupplyElectronic()); tSettlementConfirm.setVenue(dto.getVenue()); tSettlementConfirm.setMetering(dto.getMetering()); tSettlementConfirm.setClean(dto.getClean()); tSettlementConfirm.setLossElectronic(dto.getMeteringElectronic().subtract(dto.getChargingElectronic())); tSettlementConfirm.setMaintain(dto.getMaintain()); tSettlementConfirm.setMeteringElectronic(dto.getMeteringElectronic()); tSettlementConfirm.setProportionPartner(dto.getProportionPartner()); tSettlementConfirm.setProportionMoney(dto.getProportionMoney()); tSettlementConfirm.setTotalElectronic(dto.getTotalElectronic()); tSettlementConfirm.setTotalService(dto.getTotalService()); tSettlementConfirm.setRemark(dto.getRemark()); tSettlementConfirm.setServicePartner(dto.getServicePartner()); BigDecimal subtract = new BigDecimal("1").subtract(dto.getProportionPartner()); BigDecimal subtract9 = new BigDecimal("1").subtract(dto.getServicePartner()); // 总电损费用 BigDecimal divide = tSettlementConfirm.getProportionMoney().divide(subtract, 2, BigDecimal.ROUND_DOWN); // 平台承担电损 BigDecimal subtract1 = divide.subtract(tSettlementConfirm.getProportionMoney()); BigDecimal multiply = dto.getServiceMoney().multiply(subtract); BigDecimal subtract2 = multiply.subtract(subtract1); tSettlementConfirm.setNewMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean()) .subtract(dto.getMaintain()).multiply(subtract9).subtract(subtract1)); 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()).add(dto.getSupplyElectronic())); tSettlementConfirm.setProfitMoney(tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost())); tSettlementConfirm.setNewSettlement(tSettlementConfirm.getProfitMoney().add(tSettlementConfirm.getCost())); tSettlementConfirm.setServiceMoney(dto.getServiceCharge().subtract(dto.getVenue()).subtract(dto.getClean()) .subtract(dto.getMaintain()).multiply(dto.getServicePartner())); tSettlementConfirmMapper.insert(tSettlementConfirm); } return tSettlementConfirm; } @Override public PageInfo settlementList(SettlementListQuery dto) { String startTime = null; String endTime = null; if (StringUtils.hasLength(dto.getStartTime())) { dto.setType(1); String[] split = dto.getStartTime().split(" - "); startTime = split[0]; endTime = split[1]; } if (StringUtils.hasLength(dto.getEndTime())) { dto.setType(2); String[] split = dto.getEndTime().split(" - "); startTime = split[0]; endTime = split[1]; } dto.setStartTime(startTime); dto.setEndTime(endTime); Long userId = tokenService.getLoginUser().getUserid(); // 查询当前登陆人按钮权限 SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); if (dto.getSiteIds() == null) { if (userId != null) { List data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { siteIds.add(datum.getId()); } } } else { siteIds.add(dto.getSiteIds()); } if (siteIds.isEmpty()) { siteIds.add(-1); } else { if (roleType == 2) { List integers = new ArrayList<>(); for (Integer siteId : siteIds) { // 校验有没有这个站点的权限 List t1 = partnerClient.getSettlementListMenu(sysUser.getObjectId(), siteId).getData(); Boolean b = t1.get(2); if (b) { integers.add(siteId); } } siteIds = integers; } } dto.setSiteIdss(siteIds); PageInfo pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize()); List list = tSettlementConfirmMapper.settlementList(pageInfo, dto); for (TSettlementConfirm tSettlementConfirm : list) { if (roleType == 2) { List data = partnerClient.getSettlementListMenu(sysUser.getObjectId(), tSettlementConfirm.getSiteId()).getData(); tSettlementConfirm.setAuthDownLoad(data.get(0)); tSettlementConfirm.setAuthDelete(data.get(1)); } tSettlementConfirm.setUid(tSettlementConfirm.getId().toString()); List data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData(); if (!data1.isEmpty()) { tSettlementConfirm.setSiteName(data1.get(0).getName()); Partner data = siteClient.getPartnerR(data1.get(0).getPartnerId()).getData(); if (data != null) { tSettlementConfirm.setPartnerName(data.getName()); } } String format = tSettlementConfirm.getStartTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); String format1 = tSettlementConfirm.getEndTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); tSettlementConfirm.setTime(format + "至" + format1); } pageInfo.setRecords(list); return pageInfo; } @Autowired private TChargingOrderService chargingOrderService; @Override public SettlementTotalVO settlementTotal(String time) { Long userId = tokenService.getLoginUser().getUserid(); //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); if (userId != null) { List data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { siteIds.add(datum.getId()); } } if (siteIds.isEmpty()) { siteIds.add(-1); } List siteList = siteClient.getSiteAll().getData(); List pileList = chargingGunClient.getAllPile().getData(); List totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class) .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getStatus, 5)); SettlementTotalVO res = new SettlementTotalVO(); List list1 = tSettlementConfirmMapper.settlementTotal(time, siteIds); LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); // 减少一个月 LocalDateTime minus = parse.minusMonths(1); List list2 = tSettlementConfirmMapper.settlementTotal(time, siteIds); // 合计 List total = new ArrayList<>(); TSettlementConfirm tSettlementConfirm1 = new TSettlementConfirm(); BigDecimal meteringElectronic = new BigDecimal("0"); BigDecimal chargingElectronic = new BigDecimal("0"); BigDecimal lossElectronic = new BigDecimal("0"); BigDecimal income = new BigDecimal("0"); BigDecimal venue = new BigDecimal("0"); BigDecimal metering = new BigDecimal("0"); BigDecimal clean = new BigDecimal("0"); BigDecimal maintain = new BigDecimal("0"); BigDecimal cost = new BigDecimal("0"); BigDecimal profitMoney = new BigDecimal("0"); BigDecimal newMoney = new BigDecimal("0"); BigDecimal newSettlement = new BigDecimal("0"); BigDecimal supplyElectronic = new BigDecimal("0"); BigDecimal proportionPartner = new BigDecimal("0"); BigDecimal proportionMoney = new BigDecimal("0"); BigDecimal totalElectronic = new BigDecimal("0"); BigDecimal totalService = new BigDecimal("0"); BigDecimal servicePartner = new BigDecimal("0"); BigDecimal serviceMoney = new BigDecimal("0"); BigDecimal sharingAmount = new BigDecimal("0"); BigDecimal commissionAmount = new BigDecimal("0"); BigDecimal electrovalence = new BigDecimal("0"); BigDecimal serviceCharge = new BigDecimal("0"); BigDecimal orderCommission = new BigDecimal("0"); BigDecimal vipDiscount = new BigDecimal("0"); BigDecimal couponDiscount = new BigDecimal("0"); tSettlementConfirm1.setElectronicRefund(0); // 上月成本合计 BigDecimal beforeCost = new BigDecimal("0"); // 上月利润合计 BigDecimal beforeIncome = new BigDecimal("0"); int i = 1; for (TSettlementConfirm tSettlementConfirm : list1) { tSettlementConfirm.setXuhao(i); tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); Site site = siteList.stream().filter(e -> e.getId().equals(tSettlementConfirm.getSiteId())).findFirst().orElse(null); if (site != null) { tSettlementConfirm.setSiteName(site.getName()); } 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()); clean = clean.add(tSettlementConfirm.getClean()); maintain = maintain.add(tSettlementConfirm.getMaintain()); cost = cost.add(tSettlementConfirm.getCost()); profitMoney = profitMoney.add(tSettlementConfirm.getProfitMoney()); newMoney = newMoney.add(tSettlementConfirm.getNewMoney()); newSettlement = newSettlement.add(tSettlementConfirm.getNewSettlement()); supplyElectronic = supplyElectronic.add(tSettlementConfirm.getSupplyElectronic()); proportionPartner = proportionPartner.add(tSettlementConfirm.getProportionPartner()); proportionMoney = proportionMoney.add(tSettlementConfirm.getProportionMoney()); totalElectronic = totalElectronic.add(tSettlementConfirm.getTotalElectronic()); totalService = totalService.add(tSettlementConfirm.getTotalService()); servicePartner = servicePartner.add(tSettlementConfirm.getServicePartner()); serviceMoney = serviceMoney.add(tSettlementConfirm.getServiceMoney()); sharingAmount = sharingAmount.add(tSettlementConfirm.getSharingAmount()); commissionAmount = commissionAmount.add(tSettlementConfirm.getCommissionAmount()); electrovalence = electrovalence.add(tSettlementConfirm.getElectrovalence()); serviceCharge = serviceCharge.add(tSettlementConfirm.getServiceCharge()); orderCommission = orderCommission.add(tSettlementConfirm.getOrderCommission()); vipDiscount = vipDiscount.add(tSettlementConfirm.getVipDiscount()); couponDiscount = couponDiscount.add(tSettlementConfirm.getCouponDiscount()); // 查询结算确认单开始时间和结束时间的单子 QueryWrapper eq = new QueryWrapper() .eq("site_id", tSettlementConfirm.getSiteId()) .eq("recharge_payment_status", 2); switch (tSettlementConfirm.getType()) { case 1: eq.between("start_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime()); break; case 2: eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime()); break; } List tChargingOrders = totalOrder.stream().filter(e -> e.getPayTime() .isBefore(tSettlementConfirm.getEndTime()) && e.getPayTime().isAfter(tSettlementConfirm.getStartTime()) && e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList()); // 充电总时长 Long temp = 0L; for (TChargingOrder tChargingOrder : tChargingOrders) { LocalDateTime startTime = tChargingOrder.getStartTime(); LocalDateTime endTime = tChargingOrder.getEndTime(); // 计算时间差 单位秒 long between = ChronoUnit.SECONDS.between(startTime, endTime); temp += between; } List data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData(); // 计算充电桩的功率平均值 BigDecimal bigDecimal = new BigDecimal("0"); for (TChargingPile datum : data) { bigDecimal = bigDecimal.add(datum.getRatedPower()); } tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge())); //利用率=充电量/(桩数量*功率*时间) List data2 = pileList.stream().filter(e -> e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList()); 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) { int value = parse.getMonth().getValue(); settlementConfirm.setMonth(value); settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge())); tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())) { // 电站相同比较收入涨幅跌幅 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()); 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()); } i++; } TSettlementConfirm tSettlementConfirm = new TSettlementConfirm(); tSettlementConfirm.setMonth(parse.getMonthValue()); tSettlementConfirm.setMeteringElectronic(meteringElectronic); tSettlementConfirm.setChargingElectronic(chargingElectronic); tSettlementConfirm.setLossElectronic(lossElectronic); tSettlementConfirm.setIncome(income); tSettlementConfirm.setVenue(venue); tSettlementConfirm.setMetering(metering); tSettlementConfirm.setClean(clean); tSettlementConfirm.setMaintain(maintain); tSettlementConfirm.setCost(cost); tSettlementConfirm.setProfitMoney(profitMoney); tSettlementConfirm.setNewMoney(newMoney); tSettlementConfirm.setNewSettlement(newSettlement); tSettlementConfirm.setSupplyElectronic(supplyElectronic); tSettlementConfirm.setProportionPartner(proportionPartner); tSettlementConfirm.setProportionMoney(proportionMoney); tSettlementConfirm.setTotalElectronic(totalElectronic); tSettlementConfirm.setTotalService(totalService); tSettlementConfirm.setServicePartner(servicePartner); tSettlementConfirm.setServiceMoney(serviceMoney); tSettlementConfirm.setSharingAmount(sharingAmount); tSettlementConfirm.setCommissionAmount(commissionAmount); tSettlementConfirm.setElectrovalence(electrovalence); tSettlementConfirm.setServiceCharge(serviceCharge); tSettlementConfirm.setOrderCommission(orderCommission); tSettlementConfirm.setVipDiscount(vipDiscount); tSettlementConfirm.setCouponDiscount(couponDiscount); // 本月 if (beforeIncome.compareTo(new BigDecimal("0")) == 0) { tSettlementConfirm.setIncomePercentage(0 + "%"); tSettlementConfirm.setIncomePercentage(0 + "%"); } else { BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome, 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); tSettlementConfirm.setIncomePercentage(subtract + "%"); tSettlementConfirm.setIncomePercentage(subtract + "%"); } // 比较总利润 收入合计-成本合计 BigDecimal subtract1 = income.subtract(cost); BigDecimal subtract2 = beforeIncome.subtract(beforeCost); if (subtract2.compareTo(new BigDecimal("0")) == 0) { tSettlementConfirm.setTotalPercentage(0 + "%"); } else { tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2, 2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")) + "%"); } tSettlementConfirm.setElectronicRefund(0); // 查询上次汇报数据 进行比对涨幅跌幅 total.add(tSettlementConfirm); res.setList1(list1); res.setList2(total); return res; } @Override public SettlementTotalVO settlementTotalR(String time, Long userId) { //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); if (userId != null) { List data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { siteIds.add(datum.getId()); } } if (siteIds.isEmpty()) { siteIds.add(-1); } List siteList = siteClient.getSiteAll().getData(); List gunList = chargingGunClient.getAllGun().getData(); List pileList = chargingGunClient.getAllPile().getData(); List userList = appUserClient.getAllUser().getData(); List carList = appUserCarClient.getAllCar().getData(); List totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class) .eq(TChargingOrder::getRechargePaymentStatus, 2)); SettlementTotalVO res = new SettlementTotalVO(); List list1 = tSettlementConfirmMapper.settlementTotal(time, siteIds); LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); List list2 = tSettlementConfirmMapper.settlementTotal(time, siteIds); // 合计 List total = new ArrayList<>(); TSettlementConfirm tSettlementConfirm1 = new TSettlementConfirm(); BigDecimal meteringElectronic = new BigDecimal("0"); BigDecimal chargingElectronic = new BigDecimal("0"); BigDecimal lossElectronic = new BigDecimal("0"); BigDecimal income = new BigDecimal("0"); BigDecimal venue = new BigDecimal("0"); BigDecimal metering = new BigDecimal("0"); BigDecimal clean = new BigDecimal("0"); BigDecimal maintain = new BigDecimal("0"); BigDecimal cost = new BigDecimal("0"); BigDecimal profitMoney = new BigDecimal("0"); BigDecimal newMoney = new BigDecimal("0"); BigDecimal newSettlement = new BigDecimal("0"); BigDecimal supplyElectronic = new BigDecimal("0"); BigDecimal proportionPartner = new BigDecimal("0"); BigDecimal proportionMoney = new BigDecimal("0"); BigDecimal totalElectronic = new BigDecimal("0"); BigDecimal totalService = new BigDecimal("0"); BigDecimal servicePartner = new BigDecimal("0"); BigDecimal serviceMoney = new BigDecimal("0"); BigDecimal sharingAmount = new BigDecimal("0"); BigDecimal commissionAmount = new BigDecimal("0"); BigDecimal electrovalence = new BigDecimal("0"); BigDecimal serviceCharge = new BigDecimal("0"); BigDecimal orderCommission = new BigDecimal("0"); BigDecimal vipDiscount = new BigDecimal("0"); BigDecimal couponDiscount = new BigDecimal("0"); // tSettlementConfirm1.setIncomePercentage(); // tSettlementConfirm1.setTotalPercentage(); tSettlementConfirm1.setElectronicRefund(0); // 上月成本合计 BigDecimal beforeCost = new BigDecimal("0"); // 上月利润合计 BigDecimal beforeIncome = new BigDecimal("0"); int i = 1; for (TSettlementConfirm tSettlementConfirm : list1) { tSettlementConfirm.setXuhao(i); tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); List data1 = siteList.stream().filter(e -> e.getId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList()); if (!data1.isEmpty()) { tSettlementConfirm.setSiteName(data1.get(0).getName()); } 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()); clean = clean.add(tSettlementConfirm.getClean()); maintain = maintain.add(tSettlementConfirm.getMaintain()); cost = cost.add(tSettlementConfirm.getCost()); profitMoney = profitMoney.add(tSettlementConfirm.getProfitMoney()); newMoney = newMoney.add(tSettlementConfirm.getNewMoney()); newSettlement = newSettlement.add(tSettlementConfirm.getNewSettlement()); supplyElectronic = supplyElectronic.add(tSettlementConfirm.getSupplyElectronic()); proportionPartner = proportionPartner.add(tSettlementConfirm.getProportionPartner()); proportionMoney = proportionMoney.add(tSettlementConfirm.getProportionMoney()); totalElectronic = totalElectronic.add(tSettlementConfirm.getTotalElectronic()); totalService = totalService.add(tSettlementConfirm.getTotalService()); servicePartner = servicePartner.add(tSettlementConfirm.getServicePartner()); serviceMoney = serviceMoney.add(tSettlementConfirm.getServiceMoney()); sharingAmount = sharingAmount.add(tSettlementConfirm.getSharingAmount()); commissionAmount = commissionAmount.add(tSettlementConfirm.getCommissionAmount()); electrovalence = electrovalence.add(tSettlementConfirm.getElectrovalence()); serviceCharge = serviceCharge.add(tSettlementConfirm.getServiceCharge()); orderCommission = orderCommission.add(tSettlementConfirm.getOrderCommission()); vipDiscount = vipDiscount.add(tSettlementConfirm.getVipDiscount()); couponDiscount = couponDiscount.add(tSettlementConfirm.getCouponDiscount()); // 查询结算确认单开始时间和结束时间的单子 QueryWrapper eq = new QueryWrapper() .eq("site_id", tSettlementConfirm.getSiteId()) .eq("recharge_payment_status", 2); switch (tSettlementConfirm.getType()) { case 1: eq.between("start_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime()); break; case 2: eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime()); break; } List tChargingOrders = totalOrder.stream().filter(e -> e.getPayTime() .isBefore(tSettlementConfirm.getEndTime()) && e.getPayTime().isAfter(tSettlementConfirm.getStartTime()) && e.getSiteId().equals(tSettlementConfirm.getSiteId())).collect(Collectors.toList()); // 充电总时长 Long temp = 0L; for (TChargingOrder tChargingOrder : tChargingOrders) { LocalDateTime startTime = tChargingOrder.getStartTime(); LocalDateTime endTime = tChargingOrder.getEndTime(); // 计算时间差 单位秒 long between = ChronoUnit.SECONDS.between(startTime, endTime); temp += between; } List data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData(); // 计算充电桩的功率平均值 BigDecimal bigDecimal = new BigDecimal("0"); for (TChargingPile datum : data) { bigDecimal = bigDecimal.add(datum.getRatedPower()); } tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge())); //利用率=充电量/(桩数量*功率*时间) List 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) { int value = parse.getMonth().getValue(); settlementConfirm.setMonth(value); settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge())); tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic()); if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())) { // 电站相同比较收入涨幅跌幅 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()); 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()); } i++; } TSettlementConfirm tSettlementConfirm = new TSettlementConfirm(); tSettlementConfirm.setMonth(parse.getMonthValue()); tSettlementConfirm.setMeteringElectronic(meteringElectronic); tSettlementConfirm.setChargingElectronic(chargingElectronic); tSettlementConfirm.setLossElectronic(lossElectronic); tSettlementConfirm.setIncome(income); tSettlementConfirm.setVenue(venue); tSettlementConfirm.setMetering(metering); tSettlementConfirm.setClean(clean); tSettlementConfirm.setMaintain(maintain); tSettlementConfirm.setCost(cost); tSettlementConfirm.setProfitMoney(profitMoney); tSettlementConfirm.setNewMoney(newMoney); tSettlementConfirm.setNewSettlement(newSettlement); tSettlementConfirm.setSupplyElectronic(supplyElectronic); tSettlementConfirm.setProportionPartner(proportionPartner); tSettlementConfirm.setProportionMoney(proportionMoney); tSettlementConfirm.setTotalElectronic(totalElectronic); tSettlementConfirm.setTotalService(totalService); tSettlementConfirm.setServicePartner(servicePartner); tSettlementConfirm.setServiceMoney(serviceMoney); tSettlementConfirm.setSharingAmount(sharingAmount); tSettlementConfirm.setCommissionAmount(commissionAmount); tSettlementConfirm.setElectrovalence(electrovalence); tSettlementConfirm.setServiceCharge(serviceCharge); tSettlementConfirm.setOrderCommission(orderCommission); tSettlementConfirm.setVipDiscount(vipDiscount); tSettlementConfirm.setCouponDiscount(couponDiscount); // 本月 if (beforeIncome.compareTo(new BigDecimal("0")) == 0) { tSettlementConfirm.setIncomePercentage(0 + "%"); tSettlementConfirm.setIncomePercentage(0 + "%"); } else { BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome, 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); tSettlementConfirm.setIncomePercentage(subtract + "%"); tSettlementConfirm.setIncomePercentage(subtract + "%"); } // 比较总利润 收入合计-成本合计 BigDecimal subtract1 = income.subtract(cost); BigDecimal subtract2 = beforeIncome.subtract(beforeCost); if (subtract2.compareTo(new BigDecimal("0")) == 0) { tSettlementConfirm.setTotalPercentage(0 + "%"); } else { tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2, 2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")) + "%"); } tSettlementConfirm.setElectronicRefund(0); // 查询上次汇报数据 进行比对涨幅跌幅 total.add(tSettlementConfirm); res.setList1(list1); res.setList2(total); return res; } @Override public List> countBySource(List siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.countBySource(siteIds, statisticsQueryDto); } @Override public List> equipmentUserType1(List siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.equipmentUserType1(siteIds, statisticsQueryDto); } @Override public List> equipmentUserType2(List siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.equipmentUserType2(siteIds, statisticsQueryDto); } @Override public List> equipmentMapbroke1(List siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.equipmentMapbroke1(siteIds, statisticsQueryDto); } @Override public List> equipmentMapbroke2(List siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.equipmentMapbroke2(siteIds, statisticsQueryDto); } @Override public List> equipmentMapOut1(List siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.equipmentMapOut1(siteIds, statisticsQueryDto); } @Override public List> equipmentMapOut2(List siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.equipmentMapOut2(siteIds, statisticsQueryDto); } @Override public List> needElec(List siteIds, ChargingStatisticsQueryDto statisticsQueryDto) { return this.baseMapper.needElec(siteIds, statisticsQueryDto); } @Override public Map getChargingOrderCount(List siteIds, String time) { time = time.split(" ")[0]; return this.baseMapper.getChargingOrderCount(siteIds, time); } @Override public List> getHourType(List siteIds, ChargingDetailQueryDto statisticsQueryDto) { return this.baseMapper.getHourType(siteIds, statisticsQueryDto); } @Override public List> getDateType(List siteIds, ChargingDetailQueryDto statisticsQueryDto) { return this.baseMapper.getDateType(siteIds, statisticsQueryDto); } @Override public List> getMonthType(List siteIds, ChargingDetailQueryDto statisticsQueryDto) { return this.baseMapper.getMonthType(siteIds, statisticsQueryDto); } @Override public List> getchargingCapacity(List siteIds, ChargingDetailQueryDto statisticsQueryDto) { return this.baseMapper.getchargingCapacity(siteIds, statisticsQueryDto); } @Override public List> countAllUserData() { return this.baseMapper.countAllUserData(); } @Override public List> needElec1(List 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); Long userId = tokenService.getLoginUserApplet().getUserId(); if (!chargingOrder.getAppUserId().equals(userId)) { throw new RuntimeException("权限不足"); } 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; } @Override public Long countNoTag() { return this.baseMapper.countNoTag(); } @Override public List getChargingOrder(TChargingOrderVo order) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().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.getStatusList()) { queryWrapper.in(TChargingOrder::getStatus, order.getStatusList()); } if (null != order.getEndMode()) { queryWrapper.eq(TChargingOrder::getEndMode, order.getEndMode()); } return this.list(queryWrapper.orderByDesc(TChargingOrder::getCreateTime)); } @Override public Long countCar(List brands) { return this.baseMapper.countCar(brands); } /** * 添加三方平台充电订单数据 * * @param query */ @Override public R addTripartitePlatformOrder(AddTripartitePlatformOrder query) { //检查当前枪是否是正在使用中 TChargingOrder one = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getChargingGunId, query.getChargingGunId()) .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0)); if (null != one) { return R.fail("充电枪正在充电中,启动失败"); } //构建订单数据 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); TChargingOrder chargingOrder = new TChargingOrder(); String code = "CD" + Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date()); chargingOrder.setCode(code); chargingOrder.setOrderType(1); chargingOrder.setOrderClassification(1); TChargingGun tChargingGun = chargingGunClient.getChargingGunById(query.getChargingGunId()).getData(); TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData(); chargingOrder.setSiteId(tChargingGun.getSiteId()); chargingOrder.setChargingPileId(tChargingGun.getChargingPileId()); chargingOrder.setChargingGunId(query.getChargingGunId()); chargingOrder.setRechargePaymentType(query.getRechargePaymentType()); chargingOrder.setRechargePaymentStatus(2); chargingOrder.setRechargeAmount(query.getPaymentAmount()); chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); chargingOrder.setOrderSource(2); Operator operator = operatorClient.getOperator(query.getOperatorId()).getData(); chargingOrder.setOperatorId(operator.getId()); chargingOrder.setAppUserId(operator.getId().longValue()); chargingOrder.setTripartitePlatformName(operator.getName()); chargingOrder.setStartChargeSeq(query.getStartChargeSeq()); //车辆信息 if (StringUtils.hasLength(query.getPlateNum())) { TAppUserCar appUserCar = appUserCarClient.getAppUserCarByLicensePlate(query.getPlateNum()).getData(); if (null != appUserCar) { chargingOrder.setAppUserCarId(appUserCar.getId()); } chargingOrder.setPlateNum(query.getPlateNum()); } chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪"); chargingOrder.setStatus(2); chargingOrder.setPayTime(LocalDateTime.now()); chargingOrder.setChargeAmount(chargingOrder.getRechargeAmount()); this.save(chargingOrder); Integer accountingStrategyId = tChargingGun.getAccountingStrategyId(); if (null == accountingStrategyId) { Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0); //查询站点上面的计费策略 accountingStrategyId = site.getAccountingStrategyId(); } TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData(); //添加订单的计费策略 List strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData(); AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder(); BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder); accountingStrategyOrder.setChargingOrderId(chargingOrder.getId()); accountingStrategyOrderService.save(accountingStrategyOrder); List list1 = new ArrayList<>(); for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) { AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder(); BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder); accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId()); accountingStrategyDetailOrder.setCreateTime(LocalDateTime.now()); accountingStrategyDetailOrder.setDelFlag(false); list1.add(accountingStrategyDetailOrder); } accountingStrategyDetailOrderService.saveBatch(list1); //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据 PreChargeCheck preChargeCheck = new PreChargeCheck(); preChargeCheck.setElectronicLockLock(false); preChargeCheck.setInsulationTesting(false); preChargeCheck.setSecureConnectionDetection(false); preChargeCheck.setStartupSuccess(1); String key = "AQJC_" + chargingOrder.getChargingGunId(); redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS); BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); //调用远程启动充电消息 PlatformStartCharging platformStartCharging = new PlatformStartCharging(); platformStartCharging.setTransaction_serial_number(chargingOrder.getCode()); platformStartCharging.setCharging_pile_code(chargingPile.getCode()); platformStartCharging.setCharging_gun_code(tChargingGun.getCode()); //使用订单id作为逻辑卡号 platformStartCharging.setCard_number(chargingOrder.getId().toString()); platformStartCharging.setAccount_balance(rechargeAmount); log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString()); sendMessageClient.platformStartCharging(platformStartCharging); // //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 // Long id = chargingOrder.getId(); // //执行5分钟的定时任务检测 // ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // scheduler.scheduleAtFixedRate(()->{ // if(timingDetection(id)){ // scheduler.shutdown(); // } // }, 5, 1, TimeUnit.SECONDS); Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0); if(1 == site.getIsOpenSynchronization()){ //推送三方平台订单状态 tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); } ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); threadPoolExecutor.execute(()->{ //推送成都监管 NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo(); statusVo.setOrderCode(chargingOrder.getCode()); statusVo.setChargingGunId(chargingOrder.getChargingGunId()); chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo); }); return R.ok(); } /** * 三方平台停止充电操作 * * @param startChargeSeq * @return */ @Override public R tripartitePlatformStopCharge(String startChargeSeq) { log.info("三方平台请求停止充电:" + startChargeSeq); TChargingOrder order = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getStartChargeSeq, startChargeSeq)); Integer status = order.getStatus(); String code1 = order.getCode(); if (status != 3) { log.info("【" + code1 + "】三方平台请求停止充电失败:还未开始充电"); return R.fail("还未开始充电"); } if (status == 4 || status == 5) { log.info("【" + code1 + "】三方平台请求停止充电:不能重复操作"); return R.fail("不能重复操作"); } TChargingOrder chargingOrder = new TChargingOrder(); chargingOrder.setId(order.getId()); chargingOrder.setAppUserId(order.getOperatorId().longValue()); chargingOrder.setEndTime(LocalDateTime.now()); chargingOrder.setStatus(4); chargingOrder.setEndMode(1); this.updateById(chargingOrder); Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0); if(1 == site.getIsOpenSynchronization()){ tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); } TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); //异步线程处理停机 ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1); cachedThreadPool.execute(() -> { //调用硬件停止充电,停止成功后开始计算费用退款 TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData(); PlatformStopCharging platformStopCharging = new PlatformStopCharging(); platformStopCharging.setCharging_pile_code(chargingPile.getCode()); platformStopCharging.setCharging_gun_code(chargingGun.getCode()); log.info("【" + code1 + "】三方平台请求停止充电发起消息:" + JSON.toJSONString(platformStopCharging)); sendMessageClient.platformStopCharging(platformStopCharging); log.info("【" + code1 + "】三方平台请求停止充电发起消息结束"); log.info(platformStopCharging.toString()); }); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); threadPoolExecutor.execute(()->{ //推送成都监管 NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo(); statusVo.setOrderCode(chargingOrder.getCode()); statusVo.setChargingGunId(chargingOrder.getChargingGunId()); chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo); }); return R.ok(); } /** * 获取充电后没有扣除费用的数据 * * @return */ @Override public R getNotPaymentChargingOrder() { List list = this.list(new LambdaQueryWrapper().eq(TChargingOrder::getPaymentAmount, 0) .ne(TChargingOrder::getElectricity, 0).in(TChargingOrder::getStatus, Arrays.asList(4, 5))); List> mapList = new ArrayList<>(); for (TChargingOrder order : list) { TransactionRecord transactionRecord = transactionRecordService.findOne(order.getCode()); Map map = new HashMap<>(); map.put("order", order); map.put("transactionRecord", transactionRecord); mapList.add(map); } return R.ok(mapList); } /** * 手动推送订单给第三方平台 * * @param code * @return */ @Override public R pushOrderInfo(String code) { TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getCode, code)); // tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); // tcecClient.notificationStopChargeResult(chargingOrder.getStartChargeSeq(), chargingOrder.getChargingGunId().toString(), // chargingOrder.getOperatorId()); return tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); } public R addChargingOrderSummaryData() { List list3 = chargingOrderAccountingStrategyService.list(); List list1 = this.list(new LambdaQueryWrapper().eq(TChargingOrder::getDelFlag, 0)); for (TChargingOrder chargingOrderVO : list1) { if (null == chargingOrderVO.getStatus() || 5 != chargingOrderVO.getStatus()) { continue; } List list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList()); BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal serviceMoney = new BigDecimal("0"); BigDecimal paymentMoney = new BigDecimal("0"); if (!chargingOrderVO.getOrderSource().equals(2)) { serviceMoney = serviceMoney.add(service_reduce); paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce); } else { serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8"))); paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8"))); } Long time = 0L; if (chargingOrderVO.getStartTime() != null && chargingOrderVO.getEndTime() != null) { LocalDateTime startTime = chargingOrderVO.getStartTime(); LocalDateTime endTime = chargingOrderVO.getEndTime(); // 计算时间差 单位秒 long between = ChronoUnit.SECONDS.between(startTime, endTime); time += between; } TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData(); summaryData.setChargingOrderId(chargingOrderVO.getId()); summaryData.setChargingCapacity(chargingCapacity.setScale(6, RoundingMode.HALF_EVEN)); summaryData.setChargingDuration(time); summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN)); summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN)); summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN)); chargingOrderSummaryDataService.save(summaryData); } return R.ok(); } /** * 大屏-新能源汽车电池安全检测次数统计 */ @Override public R getStatisticsOfBattery() { StatisticsOfBatteryVO vo = new StatisticsOfBatteryVO(); //1.计算累计次数 //查询该俩站点的快充和超充的充电枪id集合 site_id 25 26 charge_model 1 2 R> r = chargingGunClient.getGunIdsBySiteIdsAndChargeModels(Arrays.asList(25, 26), Arrays.asList(1, 2)); if (r.getCode() != 200) { return R.ok(vo); } List gunIds = r.getData(); //统计 Long total = 0L; if (gunIds != null && !gunIds.isEmpty()) { total = this.baseMapper.selectCount(new LambdaQueryWrapper() .eq(TChargingOrder::getDelFlag, 0)//未删除 .in(TChargingOrder::getStatus, Arrays.asList(3, 5))//充电中、已结束 .in(TChargingOrder::getChargingGunId, gunIds));//符合条件的充电枪 } vo.setTotal(total.intValue()); //2.折线图 /* // 计算日期范围:前七天(不含今日)直接查找数据量太大,内存报错 LocalDate today = LocalDate.now(); LocalDateTime startDate = today.minusDays(7).atStartOfDay(); LocalDateTime endDate = today.minusDays(1).atTime(LocalTime.MAX); // 查询数据库 List orderCounts = this.baseMapper.countOrdersByDate(startDate, endDate, gunIds);*/ List dates = new ArrayList<>(); List counts = new ArrayList<>(); LocalDate today = LocalDate.now(); // 直接查找数据量太大,内存报错,分每天查找 for (int i = 7; i >= 1; i--) {//升序 LocalDate day = today.minusDays(i); LocalDateTime startOfDay = day.atStartOfDay(); LocalDateTime endOfDay = day.atTime(LocalTime.MAX); //统计 Long count = 0L; if (gunIds != null && !gunIds.isEmpty()) { count = this.baseMapper.selectCount(new LambdaQueryWrapper() .eq(TChargingOrder::getDelFlag, 0)//未删除 .in(TChargingOrder::getStatus, Arrays.asList(3, 5))//充电中、已结束 .in(TChargingOrder::getChargingGunId, gunIds)//符合条件的充电枪 站点 超充快充 .between(TChargingOrder::getCreateTime, startOfDay, endOfDay));//每天 } dates.add(day); counts.add(count.intValue()); } vo.setDates(dates); vo.setCounts(counts); return R.ok(vo); } @Override public Double getSumDegreeBySiteIds(List siteIds) { Double sumDegreeBySiteIds = this.baseMapper.getSumDegreeBySiteIds(siteIds); return sumDegreeBySiteIds; } /** * 获取启动失败且时间超过1小时的订单 * * @return */ @Override public List findFailedStartupOrder() { return this.baseMapper.findFailedStartupOrder(); } /** * 获取停止中的数据 * * @return */ @Override public List findStoppedOrder() { return this.baseMapper.findStoppedOrder(); } /** * 获取充电中的数据 * * @return */ @Override public List findChargingOrder() { return this.baseMapper.findChargingOrder(); } /** * 获取已结束的数据 * @return */ @Override public List findEndChargingOrder() { return this.baseMapper.findEndChargingOrder(); } /** * 获取需要手动修改订单状态的数据 * @return */ @Override public List findUpStatusChargingOrder() { return this.baseMapper.findUpStatusChargingOrder(); } /** * 查询充电算账单数据 * @param startTime * @param endTime */ @Override public List> getChargingSettlementBill(String startTime, String endTime, Integer dateType) { return this.baseMapper.getChargingSettlementBill(startTime, endTime, dateType); } /** * 查询账户结算账单数据 * @param startTime * @param endTime * @return */ @Override public List> getAccountSettlementStatement(String startTime, String endTime, Integer rechargePaymentType) { return this.baseMapper.getAccountSettlementStatement(startTime, endTime, rechargePaymentType); } }