package com.ruoyi.order.service.impl;
|
|
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.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.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.ChargingHandshakeClient;
|
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.GetPlatformStopChargingReply;
|
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.vo.EndOfChargePageInfo;
|
import com.ruoyi.other.api.domain.*;
|
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
|
import com.ruoyi.other.api.domain.TVip;
|
import com.ruoyi.other.api.feignClient.*;
|
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
|
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
|
import com.ruoyi.payment.api.model.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.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
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;
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author xiaochen
|
* @since 2024-08-07
|
*/
|
@Service
|
public class TChargingOrderServiceImpl extends ServiceImpl<TChargingOrderMapper, TChargingOrder> 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 AppCouponClient appCouponClient;
|
|
@Resource
|
private AppUserVipDetailClient appUserVipDetailClient;
|
|
@Resource
|
private RedisService redisService;
|
|
@Resource
|
private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
|
|
@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 PlatformStartChargingReplyClient platformStartChargingReplyClient;
|
|
@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;
|
|
@Resource
|
private BmsDemandAndChargerExportationClient bmsDemandAndChargerExportationClient;
|
|
//计数器
|
private Map<String, Integer> counter_map = new HashMap<>();
|
|
//计数器
|
private Map<String, Integer> boot_failed_map = new HashMap<>();
|
|
@Resource
|
private OperatorClient operatorClient;
|
|
@Resource
|
private TransactionRecordClient transactionRecordClient;
|
|
|
|
|
/**
|
* 获取小程序充电记录列表数据
|
* @param query
|
* @return
|
*/
|
@Override
|
public Map<String, Object> getMyChargingOrderList(GetMyChargingOrderList query) {
|
Long appUserId = tokenService.getLoginUserApplet().getUserId();
|
Map<String, Object> map = new HashMap<>();
|
int size = this.baseMapper.getMyChargingOrderList(appUserId, 1, null, null).size();
|
map.put("number", size);
|
query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize());
|
List<TChargingOrder> list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize());
|
List<MyChargingOrderList> orderLists = new ArrayList<>();
|
for (TChargingOrder tChargingOrder : list) {
|
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<TOrderEvaluate>().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.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());
|
}
|
myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
|
myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
|
myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount());
|
myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
|
myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount());
|
myChargingOrderInfo.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
|
myChargingOrderInfo.setVipDiscountAmount(chargingOrder.getVipDiscountAmount());
|
myChargingOrderInfo.setRefundAmount(chargingOrder.getRefundAmount());
|
List<TChargingOrderAccountingStrategy> stageCost = chargingOrderAccountingStrategyService.list(
|
new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, id)
|
.orderByAsc(TChargingOrderAccountingStrategy::getStartTime)
|
);
|
myChargingOrderInfo.setStageCost(stageCost);
|
List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
|
if(null != dataList){
|
//在MongoDB中获取数据
|
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
|
List<UploadRealTimeMonitoringData> 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<String> time = dataLists.stream().map(s -> sdf.format(s.getCreate_time())).collect(Collectors.toList());
|
List<BigDecimal> outputVoltage = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_voltage).collect(Collectors.toList());
|
List<BigDecimal> outputCurrent = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_current).collect(Collectors.toList());
|
List<Map<String, Object>> currentAndVoltage = new ArrayList<>();
|
for (int i = 0; i < time.size(); i++) {
|
Map<String, Object> 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<Integer> soc = dataLists.stream().map(UploadRealTimeMonitoringData::getSoc).collect(Collectors.toList());
|
List<BigDecimal> po = dataLists.stream().map(s -> s.getOutput_current().multiply(s.getOutput_voltage()).divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN)).collect(Collectors.toList());
|
List<Map<String, Object>> power = new ArrayList<>();
|
for (int i = 0; i < time.size(); i++) {
|
Map<String, Object> map = new HashMap<>();
|
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);
|
return myChargingOrderInfo;
|
}
|
|
|
/**
|
* 获取待开票订单列表
|
* @param query
|
* @return
|
*/
|
@Override
|
public List<MyChargingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query) {
|
Long appUserId = tokenService.getLoginUserApplet().getUserId();
|
|
query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize());
|
List<TChargingOrder> orderList = this.baseMapper.getNoInvoicedOrder(appUserId, query.getMonth(), query.getPageCurr(), query.getPageSize());
|
List<MyChargingOrderList> list = new ArrayList<>();
|
for (TChargingOrder tChargingOrder : orderList) {
|
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
|
@GlobalTransactional(rollbackFor = Exception.class)
|
public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) {
|
Long userId = tokenService.getLoginUserApplet().getUserId();
|
TAppUser appUser = appUserClient.getUserById(userId).getData();
|
//查询待支付状态的订单,没有支付则删除订单
|
List<TChargingOrder> list = this.list(new LambdaQueryWrapper<TChargingOrder>().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());
|
}
|
}
|
}
|
}
|
|
//检查当前枪是否是正在使用中
|
TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, addChargingOrder.getId())
|
.in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0));
|
if(null != one){
|
return AjaxResult.error("充电枪正在充电中,启动失败");
|
}
|
//查询当前充电枪是否有正在支付的订单
|
one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().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());
|
}
|
}
|
}
|
}
|
|
|
//构建新的待支付订单
|
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<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
|
AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
|
BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
|
accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
|
accountingStrategyOrderService.save(accountingStrategyOrder);
|
List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
|
for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
|
AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
|
BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
|
accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
|
list1.add(accountingStrategyDetailOrder);
|
}
|
accountingStrategyDetailOrderService.saveBatch(list1);
|
|
//会员优惠折扣将其计入增加充电时长(增加总充电金额)
|
//如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
|
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<String, Object> 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);
|
}
|
}
|
throw new RuntimeException("无效的支付方式");
|
}
|
|
|
/**
|
* 支付成功后的回调处理逻辑
|
* @param paymentType 支付方式:1=微信,2=支付宝
|
* @param out_trade_no 业务流水号
|
* @param transaction_id 三方支付流水号
|
* @param attach 附加数据
|
* @return
|
*/
|
@Override
|
@GlobalTransactional(rollbackFor = Exception.class)
|
public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) {
|
TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().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<AccountingStrategyDetailOrder> 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 = s_server_amount.multiply(new BigDecimal(m));
|
rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m)));
|
if(null != discount){
|
discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount)));
|
}
|
nowTimeMillis = null;
|
}else{
|
serviceCharge = s_server_amount.multiply(new BigDecimal(times));
|
if(null != discount){
|
discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount)));
|
}
|
break;
|
}
|
}
|
}
|
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);
|
}
|
}
|
|
|
//机子上显示的金额为用户充值的金额+会员折扣金额
|
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);
|
//异步线程检测远程启动的应答结果。如果失败,则需要全额退款
|
Long id = chargingOrder.getId();
|
//执行5分钟的定时任务检测
|
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
scheduler.scheduleAtFixedRate(()->{
|
if(timingDetection(id)){
|
scheduler.shutdown();
|
}
|
}, 5, 1, TimeUnit.SECONDS);
|
return AjaxResult.success();
|
}
|
|
|
/**
|
* 定时检测mongodb数据库数据
|
* @param id
|
* @return
|
*/
|
public boolean timingDetection(Long id){
|
TChargingOrder chargingOrder = this.getById(id);
|
if(chargingOrder.getStatus() != 2){
|
return true;
|
}
|
String code = chargingOrder.getCode();
|
String key = "AQJC_" + chargingOrder.getChargingGunId();
|
List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData();
|
log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString());
|
if(data.size() != 0){
|
PlatformStartChargingReply platformStartChargingReply = data.get(1);
|
Integer startup_result = platformStartChargingReply.getStartup_result();
|
Integer failure_cause = platformStartChargingReply.getFailure_cause();
|
Integer counter = counter_map.get(code);
|
PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
|
//5分钟内还未插枪则取消充电,退回金额。
|
if(failure_cause == 5 && (null == counter || counter < 300)){
|
counter = (null == counter ? 0 : counter) + 1;
|
counter_map.put(code, counter);
|
//启动失败
|
preChargeCheck1.setStartupSuccess(3);
|
preChargeCheck1.setFailureCause(failure_cause);
|
redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
|
return false;
|
}
|
|
//清除计时器中的无效数据
|
counter_map.remove(code);
|
TChargingOrder order = new TChargingOrder();
|
order.setId(id);
|
order.setAppUserId(chargingOrder.getAppUserId());
|
if(0 == startup_result){
|
//启动失败
|
preChargeCheck1.setStartupSuccess(3);
|
preChargeCheck1.setFailureCause(failure_cause);
|
//启动失败后取消订单,退款操作
|
refund(code);
|
order.setStatus(-1);
|
order.setEndMode(0);
|
}else{
|
//启动成功
|
preChargeCheck1.setStartupSuccess(2);
|
order.setStatus(3);
|
order.setStartTime(LocalDateTime.now());
|
}
|
this.updateById(order);
|
redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
|
//推送三方平台订单状态
|
if(2 == chargingOrder.getOrderSource()){
|
tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
|
}
|
return true;
|
}else{
|
Integer counter = boot_failed_map.get(code);
|
log.info(code + ":-------------------未上传开启充电结果-------------------" + counter);
|
PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
|
//5分钟内未启动成功,退回金额。
|
if(null == counter || counter < 300){
|
counter = (null == counter ? 0 : counter) + 1;
|
boot_failed_map.put(code, counter);
|
//启动失败
|
preChargeCheck1.setStartupSuccess(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);
|
//启动失败后取消订单,退款操作
|
refund(code);
|
order.setStatus(-1);
|
order.setEndMode(0);
|
this.updateById(order);
|
redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
|
//推送三方平台订单状态
|
if(2 == chargingOrder.getOrderSource()){
|
tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
|
}
|
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<TChargingOrder>().eq(TChargingOrder::getCode, message.getTransaction_serial_number()));
|
if(order.getStatus() != 2){
|
return;
|
}
|
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);
|
//启动失败后取消订单,退款操作
|
refund(code);
|
order.setStatus(-1);
|
order.setEndMode(0);
|
}else{
|
//启动成功
|
preChargeCheck1.setStartupSuccess(2);
|
order.setStatus(3);
|
order.setStartTime(LocalDateTime.now());
|
TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
|
chargingGun.setStatus(4);
|
chargingGunClient.updateChargingGunById(chargingGun);
|
//推送状态给三方平台
|
tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus());
|
}
|
redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS);
|
this.updateById(order);
|
//推送三方平台启动充电结果
|
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());
|
tcecClient.notificationStartChargeResult(result);
|
|
tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
|
}
|
}
|
|
/**
|
* 启动失败后的退款,取消订单
|
* @param code
|
*/
|
public void refund(String code){
|
log.info(code + ":-------------------充电启动失败,执行退款-------------------");
|
TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().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<String> orderR = wxPaymentClient.refundOrderR(model);
|
if(200 == orderR.getCode()){
|
chargingOrderRefundService.save(chargingOrderRefund);
|
}
|
}
|
if(2 == rechargePaymentType){
|
RefundReq dto = new RefundReq();
|
dto.setOutTradeNo(chargingOrder.getCode());
|
dto.setOutRequestNo(chargingOrderRefund.getCode());
|
dto.setRefundAmount(rechargeAmount.toString());
|
dto.setRefundReason("充电失败,取消充电订单");
|
RefundResp resp = aliPaymentClient.refund(dto).getData();
|
if(null != resp){
|
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
|
*/
|
public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time){
|
TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
|
one.setRefundSerialNumber(refund_id);
|
one.setRefundStatus(2);
|
one.setRefundTime(LocalDateTime.now());
|
chargingOrderRefundService.updateById(one);
|
|
TChargingOrder order = this.getById(one.getChargingOrderId());
|
TChargingOrder chargingOrder = new TChargingOrder();
|
chargingOrder.setId(one.getChargingOrderId());
|
chargingOrder.setAppUserId(order.getAppUserId());
|
chargingOrder.setRefundStatus(2);
|
chargingOrder.setRefundSerialNumber(refund_id);
|
chargingOrder.setRefundTime(LocalDateTime.now());
|
this.updateById(chargingOrder);
|
return AjaxResult.success();
|
}
|
|
|
|
|
/**
|
* 获取充电中的详情
|
* @param id
|
* @return
|
*/
|
@Override
|
public ChargingDetails getChargingDetails(Integer id) {
|
Long userId = tokenService.getLoginUserApplet().getUserId();
|
TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id)
|
.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 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(one.getCode()).getData();
|
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 = 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
|
@GlobalTransactional(rollbackFor = Exception.class)
|
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)){
|
return AjaxResult.error("权限不足");
|
}
|
TChargingOrder chargingOrder = new TChargingOrder();
|
chargingOrder.setId(Long.valueOf(id));
|
chargingOrder.setAppUserId(order.getAppUserId());
|
chargingOrder.setEndTime(LocalDateTime.now());
|
chargingOrder.setStatus(4);
|
chargingOrder.setEndMode(1);
|
this.updateById(chargingOrder);
|
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());
|
});
|
//推送三方平台
|
if(2 == order.getOrderSource()){
|
tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
|
}
|
|
return AjaxResult.success();
|
}
|
|
|
/**
|
* 结束充电后处理用户标签数据
|
* @param chargingOrder
|
*/
|
public void editUserTag(TChargingOrder chargingOrder){
|
//处理用户标签数据
|
List<TUserTag> data = userTagClient.getAllUserTag().getData();
|
//累计充电次数
|
List<TUserTag> userTagList1 = data.stream().filter(s -> s.getStandardCondition() == 1).collect(Collectors.toList());
|
for (TUserTag tUserTag : userTagList1) {
|
Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times");
|
TAppUserTag appUserTag = new TAppUserTag();
|
appUserTag.setAppUserId(chargingOrder.getAppUserId());
|
appUserTag.setUserTagId(tUserTag.getId());
|
TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData();
|
|
String start = tUserTag.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
String end = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
|
.eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0));
|
if(null == data1 && count1 >= times){
|
data1 = new TAppUserTag();
|
data1.setAppUserId(chargingOrder.getAppUserId());
|
data1.setUserTagId(tUserTag.getId());
|
data1.setCreateTime(LocalDateTime.now());
|
appUserTagClient.addUserTag(data1);
|
}
|
}
|
//充电频率
|
List<TUserTag> userTagList2 = data.stream().filter(s -> s.getStandardCondition() == 2).collect(Collectors.toList());
|
for (TUserTag tUserTag : userTagList2) {
|
TAppUserTag appUserTag = new TAppUserTag();
|
appUserTag.setAppUserId(chargingOrder.getAppUserId());
|
appUserTag.setUserTagId(tUserTag.getId());
|
TAppUserTag data1 = appUserTagClient.getUserTag(appUserTag).getData();
|
|
Integer day = JSON.parseObject(tUserTag.getConditions()).getInteger("day");
|
Integer times = JSON.parseObject(tUserTag.getConditions()).getInteger("times");
|
LocalDateTime endTime = LocalDateTime.now();
|
endTime.plusDays(day);
|
String start = tUserTag.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
String end = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
long count1 = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
|
.eq(TChargingOrder::getRechargePaymentStatus, 2).between(TChargingOrder::getStartTime, start, end).eq(TChargingOrder::getDelFlag, 0));
|
if(null == data1 && count1 >= times){
|
data1 = new TAppUserTag();
|
data1.setAppUserId(chargingOrder.getAppUserId());
|
data1.setUserTagId(tUserTag.getId());
|
data1.setCreateTime(LocalDateTime.now());
|
appUserTagClient.addUserTag(data1);
|
}
|
}
|
}
|
|
|
/**
|
* 推荐奖励(被推荐首单奖励)
|
* @param chargingOrder
|
*/
|
public void referralReward(TChargingOrder chargingOrder){
|
//处理推荐奖励(被推荐首单奖励)
|
TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
|
long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
|
.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<TChargingOrder>().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<TChargingGun> allGun = chargingGunClient.getAllGun().getData();
|
List<TChargingPile> allPile = chargingGunClient.getAllPile().getData();
|
List<Site> data9 = siteClient.getSiteAll().getData();
|
List<TAppUser> data6 = appUserClient.getAllUser().getData();
|
List<Partner> data7 = siteClient.getAllPartner().getData();
|
List<TAppUserCar> 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<ChargingOrderVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
|
PageInfo<ChargingOrderVO> pageInfo1 = new PageInfo<>(1,999999999);
|
|
if (StringUtils.hasLength(dto.getPhone())){
|
List<Long> 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<Integer> siteIds = new ArrayList<>();
|
if (dto.getSiteId()==null){
|
if (userId != null){
|
List<GetSiteListDTO> 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<Integer> integers = new ArrayList<>();
|
for (Integer siteId : siteIds) {
|
// 校验有没有这个站点的权限
|
List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData();
|
|
Boolean b = t1.get(1);
|
if (b){
|
integers.add(siteId);
|
}
|
}
|
siteIds = integers;
|
}
|
}
|
if (siteIds.isEmpty())siteIds.add(-1);
|
dto.setSiteIds(siteIds);
|
List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
|
List<ChargingOrderVO> list1 = this.baseMapper.chargingOrder(pageInfo1,dto,startTime1,startTime2,endTime1,endTime2);
|
BigDecimal total = new BigDecimal("0");
|
long time = 0L;
|
BigDecimal income = new BigDecimal("0");
|
BigDecimal electronicMoney = new BigDecimal("0");
|
BigDecimal serviceMoney = new BigDecimal("0");
|
BigDecimal commissionMoney = new BigDecimal("0");
|
BigDecimal refundMoney = new BigDecimal("0");
|
BigDecimal paymentMoney = new BigDecimal("0");
|
List<String> collect2 = list.stream().map(TChargingOrder::getCode).collect(Collectors.toList());
|
List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>());
|
|
for (ChargingOrderVO chargingOrderVO : list) {
|
if (roleType == 2){
|
for (Integer siteId : siteIds) {
|
// 校验有没有这个站点的权限
|
List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData();
|
chargingOrderVO.setAuthRecord(t1.get(0));
|
}
|
|
}
|
chargingOrderVO.setCommissionAmount(chargingOrderVO.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<Integer> 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<TChargingOrderAccountingStrategy> 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);
|
|
}
|
// 充电时段数
|
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<Long> 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());
|
}
|
|
}
|
}
|
|
|
List<Long> orderIds = list1.stream().map(TChargingOrder::getId).collect(Collectors.toList());
|
if(orderIds.isEmpty())orderIds.add(-1L);
|
List<TChargingOrderRefund> chargingOrderRefunds = chargingOrderRefundService.lambdaQuery()
|
.in(TChargingOrderRefund::getChargingOrderId, orderIds)
|
.eq(TChargingOrderRefund::getRefundStatus,2).list();
|
|
for (ChargingOrderVO chargingOrderVO : list1) {
|
paymentMoney= paymentMoney.add(chargingOrderVO.getPaymentAmount()!=null?chargingOrderVO.getPaymentAmount():new BigDecimal("0"));
|
commissionMoney = commissionMoney.add(chargingOrderVO.getRechargeAmount()!=null?chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN):new BigDecimal("0"));
|
if (chargingOrderVO.getChargingCapacity()!=null){
|
total = total.add(chargingOrderVO.getElectricity()!=null?chargingOrderVO.getElectricity():new BigDecimal("0"));
|
}
|
if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){
|
LocalDateTime startTime = chargingOrderVO.getStartTime();
|
LocalDateTime endTime = chargingOrderVO.getEndTime();
|
// 计算时间差 单位秒
|
long between = ChronoUnit.SECONDS.between(startTime, endTime);
|
time+=between;
|
}
|
List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId()))
|
.collect(Collectors.toList());
|
for (TChargingOrderRefund tChargingOrderRefund : list2) {
|
refundMoney = refundMoney.add(tChargingOrderRefund.getRefundTotalAmount());
|
}
|
electronicMoney = electronicMoney.add(chargingOrderVO.getElectrovalence()!=null?chargingOrderVO.getElectrovalence():new BigDecimal("0"));
|
serviceMoney = serviceMoney.add(chargingOrderVO.getServiceCharge()!=null?chargingOrderVO.getServiceCharge():new BigDecimal("0"));
|
}
|
tCharingOrderVO.setTotal(total);
|
tCharingOrderVO.setTime(time);
|
// todo 临时只累加
|
// tCharingOrderVO.setIncome(paymentMoney.subtract(commissionMoney));
|
tCharingOrderVO.setIncome(paymentMoney);
|
tCharingOrderVO.setElectronicMoney(electronicMoney);
|
tCharingOrderVO.setServiceMoney(serviceMoney);
|
pageInfo.setRecords(list);
|
tCharingOrderVO.setList(pageInfo);
|
return tCharingOrderVO;
|
}
|
|
@Override
|
public R<PageInfo<PayOrderDto>> payOrderQuery(PayOrderQueryDto payOrderQueryDto) {
|
PageInfo<PayOrderDto> pageInfo = new PageInfo<>(payOrderQueryDto.getPageCurr(),payOrderQueryDto.getPageSize());
|
List<PayOrderDto> list = this.baseMapper.payOrderQuery(pageInfo,payOrderQueryDto);
|
for (PayOrderDto payOrderDto : list) {
|
if (payOrderDto.getType()==2||payOrderDto.getType()==3){
|
payOrderDto.setFinalAmount(payOrderDto.getOrderAmount());
|
}
|
if (payOrderDto.getType()==1&&payOrderDto.getStatus()==3){
|
payOrderDto.setFinalAmount(payOrderDto.getOrderAmount());
|
payOrderDto.setOrderAmount(payOrderDto.getOrderAmount());
|
payOrderDto.setPaymentAmount(payOrderDto.getOrderAmount());
|
}
|
}
|
pageInfo.setRecords(list);
|
return R.ok(pageInfo);
|
}
|
|
@Override
|
public R<PageInfo<TChargingOrderRefund>> getRefundList(ChargingRefundDto chargingRefundDto) {
|
PageInfo<TChargingOrderRefund> pageInfo = new PageInfo<>(chargingRefundDto.getPageCurr(),chargingRefundDto.getPageSize());
|
List<TChargingOrderRefund> list = this.baseMapper.getRefundList(pageInfo,chargingRefundDto);
|
pageInfo.setRecords(list);
|
|
return R.ok(pageInfo);
|
}
|
|
@Override
|
public List<ChargingOrderGroup> chargingOrderGroup(ChargingPercentProvinceDto chargingPercentProvinceDto) {
|
|
return this.baseMapper.chargingOrderGroup(chargingPercentProvinceDto);
|
}
|
|
@Override
|
public List<SixChargingDto> charge(LocalDate sixBefore, List<Integer> siteIds) {
|
return this.baseMapper.charge(sixBefore,siteIds);
|
}
|
|
@Override
|
public List<SixCircleDto> circle(List<Integer> siteIds,LocalDate sixBefore) {
|
return this.baseMapper.circle(siteIds,sixBefore);
|
}
|
|
@Override
|
public Map<String, Object> countAll(LocalDate sixBefore,List<Integer> siteIds) {
|
return this.baseMapper.countAll(sixBefore,siteIds);
|
}
|
|
@Override
|
public List<Map<String, Object>> getSumByType(List<Long> chargingOrderIds) {
|
return this.baseMapper.getSumByType(chargingOrderIds);
|
}
|
|
@Override
|
public List<Map<String, Object>> getDateData(List<Long> chargingOrderIds) {
|
return this.baseMapper.getDateData(chargingOrderIds);
|
}
|
|
@Override
|
public List<Map<String, Object>> getWeekData(List<Long> chargingOrderIds) {
|
return this.baseMapper.getWeekData(chargingOrderIds);
|
}
|
|
@Override
|
public List<Map<String, Object>> getMonthData(List<Long> chargingOrderIds) {
|
return this.baseMapper.getMonthData(chargingOrderIds);
|
}
|
|
@Override
|
public List<Map<String, Object>> getYearData(List<Long> chargingOrderIds) {
|
return this.baseMapper.getYearData(chargingOrderIds);
|
}
|
|
@Resource
|
private SysUserClient sysUserClient;
|
@Override
|
public ChargingOrderTimeVO chargingList(ChargingListQuery dto) {
|
String startTime1 = null;
|
String startTime2 = null;
|
String endTime1 = null;
|
String endTime2 = null;
|
|
List<TChargingGun> allGun = chargingGunClient.getAllGun().getData();
|
List<TChargingPile> allPile = chargingGunClient.getAllPile().getData();
|
|
if (StringUtils.hasLength(dto.getStartTime())){
|
String[] split = dto.getStartTime().split(" - ");
|
startTime1 = split[0];
|
startTime2 = split[1];
|
}
|
ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO();
|
if (StringUtils.hasLength(dto.getPhone())){
|
List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
|
if(data!=null){
|
if (!data.isEmpty()){
|
dto.setUserIds(data);
|
}
|
}else{
|
dto.setUserIds(new ArrayList<Long>());
|
}
|
if (dto.getUserIds().isEmpty()){
|
List<Long> carIds = dto.getUserIds();
|
carIds.add(-1L);
|
dto.setUserIds(carIds);
|
}
|
}
|
if (StringUtils.hasLength(dto.getLicensePlate())){
|
List<Long> data = appUserCarClient.getAppUserCarByLicensePlates(dto.getLicensePlate()).getData();
|
if(data!=null){
|
if (!data.isEmpty()){
|
dto.setCarIds(data);
|
}
|
}else{
|
dto.setCarIds(new ArrayList<Long>());
|
}
|
if (dto.getCarIds().isEmpty()){
|
List<Long> carIds = dto.getCarIds();
|
carIds.add(-1L);
|
dto.setCarIds(carIds);
|
}
|
}
|
Long userId = tokenService.getLoginUser().getUserid();
|
// 查询当前登陆人按钮权限
|
SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
|
Integer roleType = sysUser.getRoleType();
|
//如果没传siteId,获取当前登陆人所有的siteIds
|
List<Integer> siteIds = new ArrayList<>();
|
if (dto.getSiteId()==null){
|
if (userId != null){
|
List<GetSiteListDTO> 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<Integer> integers = new ArrayList<>();
|
for (Integer siteId : siteIds) {
|
// 校验有没有这个站点的权限
|
List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData();
|
|
Boolean b = t1.get(1);
|
if (b){
|
integers.add(siteId);
|
}
|
}
|
siteIds = integers;
|
}
|
}
|
dto.setSiteIds(siteIds);
|
PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
|
List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
|
List<Integer> siteIdsList = list.stream().map(ChargingOrderListVO::getSiteId).collect(Collectors.toList());
|
if (siteIdsList.isEmpty())siteIdsList.add(-1);
|
List<Site> sites = siteClient.getSiteByIds(siteIdsList).getData();
|
|
for (ChargingOrderListVO chargingOrderListVO : list) {
|
if (roleType==2){
|
List<Boolean> data = partnerClient.getChargingListMenu(sysUser.getObjectId(), chargingOrderListVO.getSiteId()).getData();
|
chargingOrderListVO.setAuthInfo(data.get(0));
|
chargingOrderListVO.setAuthCurve(data.get(1));
|
}
|
chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity());
|
BigDecimal bigDecimal = new BigDecimal("0.006");
|
if (chargingOrderListVO.getOrderAmount()!=null){
|
chargingOrderListVO.setCommissionAmount(chargingOrderListVO.getRechargeAmount().multiply(bigDecimal));
|
}
|
chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getPaymentAmount());
|
chargingOrderListVO.setUid(chargingOrderListVO.getId()+"");
|
List<Integer> integers = new ArrayList<>();
|
integers.add(chargingOrderListVO.getSiteId());
|
Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null);
|
if (site!=null){
|
chargingOrderListVO.setSiteName(site.getName());
|
}
|
if (chargingOrderListVO.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){
|
TChargingGun data1 = allGun.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingGunId())).findFirst().orElse(null);
|
TChargingPile data2 = allPile.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingPileId())).findFirst().orElse(null);
|
if (data2 != null && data1 != null) {
|
chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
|
}
|
}
|
if (chargingOrderListVO.getStartTime()!=null && chargingOrderListVO.getEndTime()!=null){
|
LocalDateTime startTime = chargingOrderListVO.getStartTime();
|
LocalDateTime endTime = chargingOrderListVO.getEndTime();
|
// 计算时间差 单位秒
|
long between = ChronoUnit.SECONDS.between(startTime, endTime);
|
chargingOrderListVO.setChargingSecond(between);
|
}
|
// 获取开始SOC 结束soc
|
if (chargingOrderListVO.getCode()!=null){
|
List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrderListVO.getCode()).getData();
|
|
if (data6!=null && !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();
|
}
|
}
|
chargingOrderListVO.setEndSoc(max+"");
|
chargingOrderListVO.setStartSoc(min+"");
|
}
|
}
|
|
if (chargingOrderListVO.getAppUserId()!=null){
|
TAppUser data3 = appUserClient.getUserById(chargingOrderListVO.getAppUserId()).getData();
|
List<Long> carId = new ArrayList<>();
|
if (data3!=null){
|
if (chargingOrderListVO.getAppUserCarId() != null) {
|
carId.add(chargingOrderListVO.getAppUserCarId());
|
if (!carId.isEmpty()){
|
List<TAppUserCar> data4 = appUserCarClient.getCarByIds(carId).getData();
|
if (data4!=null && !data4.isEmpty()) {
|
chargingOrderListVO.setLicensePlate(data4.get(0).getLicensePlate());
|
}
|
}
|
}else{
|
chargingOrderListVO.setLicensePlate(chargingOrderListVO.getPlateNum());
|
}
|
chargingOrderListVO.setPhone(data3.getPhone());
|
}
|
}
|
List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery()
|
.eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list();
|
// 尖峰平谷充电量 度数
|
BigDecimal jian = new BigDecimal("0");
|
BigDecimal feng = new BigDecimal("0");
|
BigDecimal ping = new BigDecimal("0");
|
BigDecimal gu = new BigDecimal("0");
|
BigDecimal total = new BigDecimal("0");
|
for (TChargingOrderAccountingStrategy temp : list2) {
|
if (temp.getChargingCapacity() == null){
|
temp.setChargingCapacity(BigDecimal.ZERO);
|
}
|
switch (temp.getType()) {
|
case 1:
|
jian = jian.add(temp.getChargingCapacity());
|
break;
|
case 2:
|
feng = feng.add(temp.getChargingCapacity());
|
break;
|
case 3:
|
ping = ping.add(temp.getChargingCapacity());
|
break;
|
case 4:
|
gu = gu.add(temp.getChargingCapacity());
|
break;
|
}
|
}
|
total = total.add(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"+"%(谷)");
|
}
|
|
}
|
// 不分页
|
PageInfo<ChargingOrderListVO> pageInfo1 = new PageInfo<>(1,999999999);
|
List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(pageInfo1,dto,startTime1,startTime2,endTime1,endTime2);
|
for (ChargingOrderListVO chargingOrderListVO : list1) {
|
List<Integer> integers = new ArrayList<>();
|
integers.add(chargingOrderListVO.getSiteId());
|
Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null);
|
if (site!=null){
|
chargingOrderListVO.setSiteName(site.getName());
|
}
|
if (chargingOrderListVO.getStartTime()!=null && chargingOrderListVO.getEndTime()!=null){
|
LocalDateTime startTime = chargingOrderListVO.getStartTime();
|
LocalDateTime endTime = chargingOrderListVO.getEndTime();
|
// 计算时间差 单位秒
|
long between = ChronoUnit.SECONDS.between(startTime, endTime);
|
chargingOrderListVO.setChargingSecond(between);
|
}
|
if (chargingOrderListVO.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){
|
TChargingGun data1 = allGun.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingGunId())).findFirst().orElse(null);
|
TChargingPile data2 = allPile.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingPileId())).findFirst().orElse(null);
|
if (data2 != null && data1 != null) {
|
chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
|
}
|
}
|
}
|
chargingOrderTimeVO.setExportList(list1);
|
chargingOrderTimeVO.setOrderCount(list1.size());
|
// 计算充电总度数
|
BigDecimal electronic = new BigDecimal("0");
|
// 支付金额
|
BigDecimal paymentAmount = new BigDecimal("0");
|
// 电费
|
BigDecimal electrovalence = new BigDecimal("0");
|
// 服务费
|
BigDecimal serviceCharge = new BigDecimal("0");
|
// 尖峰平谷充电到账
|
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<Long> collect = list1.stream().map(ChargingOrderListVO::getId).collect(Collectors.toList());
|
List<TChargingOrderAccountingStrategy> chargingOrderAccountingStrategies = chargingOrderAccountingStrategyService.lambdaQuery()
|
.in(TChargingOrderAccountingStrategy::getChargingOrderId,collect).list();
|
for (ChargingOrderListVO chargingOrderListVO : list1) {
|
if (chargingOrderListVO.getChargingCapacity()!=null)electronic = electronic.add(chargingOrderListVO.getElectricity());
|
|
if (chargingOrderListVO.getPaymentAmount()!=null)paymentAmount = paymentAmount.add(chargingOrderListVO.getPaymentAmount());
|
if (chargingOrderListVO.getElectrovalence()!=null)electrovalence = electrovalence.add(chargingOrderListVO.getElectrovalence());
|
if (chargingOrderListVO.getServiceCharge()!=null)serviceCharge = serviceCharge.add(chargingOrderListVO.getServiceCharge());
|
List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId()))
|
.collect(Collectors.toList());
|
for (TChargingOrderAccountingStrategy temp : list2) {
|
switch (temp.getType()){
|
case 1:
|
if (temp.getChargingCapacity()!=null)jian = jian.add(temp.getChargingCapacity());
|
if (temp.getChargingCapacity()!=null)jianElectronic = jianElectronic.add(temp.getElectrovalence());
|
if (temp.getChargingCapacity()!=null)jianService = jianService.add(temp.getServiceCharge());
|
break;
|
case 2:
|
if (temp.getChargingCapacity()!=null)feng = feng.add(temp.getChargingCapacity());
|
if (temp.getChargingCapacity()!=null)fengElectronic = fengElectronic.add(temp.getElectrovalence());
|
if (temp.getChargingCapacity()!=null)fengService = fengService.add(temp.getServiceCharge());
|
break;
|
case 3:
|
if (temp.getChargingCapacity()!=null)ping = ping.add(temp.getChargingCapacity());
|
if (temp.getChargingCapacity()!=null)pingElectronic = pingElectronic.add(temp.getElectrovalence());
|
if (temp.getChargingCapacity()!=null)pingService = pingService.add(temp.getServiceCharge());
|
break;
|
case 4:
|
if (temp.getChargingCapacity()!=null)gu = gu.add(temp.getChargingCapacity());
|
if (temp.getChargingCapacity()!=null)guElectronic = guElectronic.add(temp.getElectrovalence());
|
if (temp.getChargingCapacity()!=null)guService = guService.add(temp.getServiceCharge());
|
break;
|
}
|
}
|
}
|
|
chargingOrderTimeVO.setChargingCapacity(electronic);
|
chargingOrderTimeVO.setPaymentAmount(paymentAmount);
|
chargingOrderTimeVO.setElectrovalence(electrovalence);
|
chargingOrderTimeVO.setServiceCharge(serviceCharge);
|
// 计算尖峰平谷充电量占比
|
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(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"))+"%");
|
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(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"))+"%");
|
}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 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<Site> 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<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
|
if (data6!=null){
|
for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
|
if (uploadRealTimeMonitoringData.getOutput_current()!=null&&
|
uploadRealTimeMonitoringData.getOutput_voltage()!=null){
|
uploadRealTimeMonitoringData.setPower(uploadRealTimeMonitoringData.getOutput_voltage()
|
.multiply(uploadRealTimeMonitoringData.getOutput_current()).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<TAppUserCar> 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());
|
chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount());
|
// 查询费用明细列表
|
List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery()
|
.eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())
|
.list();
|
chargingOrderListInfoVO.setList1(list);
|
return chargingOrderListInfoVO;
|
}
|
|
|
/**
|
* 处理充电订单实时监控数据相关的业务逻辑
|
* @param query
|
*/
|
@Override
|
@GlobalTransactional(rollbackFor = Exception.class)
|
public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
|
if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())){
|
//获取当前的计费策略
|
TChargingOrder chargingOrder1 = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getTransaction_serial_number()));
|
BigDecimal residualAmount = chargingOrder1.getRechargeAmount().add(chargingOrder1.getVipDiscountAmount()).subtract(query.getPaid_amount());
|
TChargingOrder chargingOrder = new TChargingOrder();
|
chargingOrder.setId(chargingOrder1.getId());
|
chargingOrder.setAppUserId(chargingOrder1.getAppUserId());
|
chargingOrder.setResidualAmount(residualAmount);
|
if(query.getOutput_current().compareTo(BigDecimal.ZERO) != 0){
|
BigDecimal divide = (query.getOutput_current().multiply(query.getOutput_voltage())).divide(new BigDecimal(1000));
|
chargingOrder.setChargingPower(divide);
|
chargingOrder.setCurrent(query.getOutput_current());
|
chargingOrder.setVoltage(query.getOutput_voltage());
|
chargingOrder.setPower(divide);
|
chargingOrder.setNeedElec(query.getOutput_current());
|
|
TChargingGun chargingGun = new TChargingGun();
|
chargingGun.setId(chargingOrder1.getChargingGunId());
|
chargingGun.setChargingPower(divide);
|
chargingGunClient.updateChargingGunById(chargingGun);
|
}
|
chargingOrder.setChargingCapacity(query.getCharging_degree());
|
chargingOrder.setElectricity(query.getCharging_degree());
|
chargingOrder.setTotalElectricity(new BigDecimal(100 - query.getSoc()));
|
BmsDemandAndChargerExportation data = bmsDemandAndChargerExportationClient.getBmsDemandAndChargerExportation(chargingOrder1.getCode()).getData();
|
if(null != data){
|
chargingOrder.setNeedElec(data.getBms_current_requirements());
|
}
|
this.updateById(chargingOrder);
|
}
|
}
|
|
|
/**
|
* 自动结束充电后的处理逻辑
|
* @param orderCode
|
*/
|
@Override
|
@GlobalTransactional(rollbackFor = Exception.class)
|
public void endCharge(String orderCode, Integer endMode) {
|
TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
|
TChargingOrder chargingOrder = new TChargingOrder();
|
chargingOrder.setId(order.getId());
|
chargingOrder.setAppUserId(order.getAppUserId());
|
chargingOrder.setEndMode(endMode);
|
this.updateById(chargingOrder);
|
}
|
|
/**
|
* 异常结束充电处理逻辑
|
* @param orderCode
|
*/
|
@Override
|
public void excelEndCharge(String orderCode) {
|
endCharge(orderCode, 0);
|
}
|
|
|
/**
|
* 停止充电返回账单后计算费用
|
* @param vo
|
*/
|
@Override
|
@GlobalTransactional(rollbackFor = Exception.class)
|
public R endChargeBillingCharge(TransactionRecordMessageVO vo) {
|
TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
|
if(null == chargingOrder){
|
return R.ok();
|
}
|
Integer status = chargingOrder.getStatus();
|
if(status == 5){
|
return R.ok();
|
}
|
|
//如果使用优惠券需要判断优惠券是否满足使用条件
|
//根据实际的充电金额计算退款金额 退回费用=(原金额/总金额)*(总金额-实际充电金额)
|
//退款金额=优惠券金额+剩余充电金额
|
BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
|
BigDecimal periodServicePrice_total = BigDecimal.ZERO;
|
BigDecimal total = BigDecimal.ZERO;
|
|
//获取订单的计费策略
|
List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
|
accountingStrategyDetailOrderList.get(accountingStrategyDetailOrderList.size() - 1).setEndTime("23:59");
|
//开始处理计费明细数据和优惠数据
|
chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
|
SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>();
|
try {
|
//跨天
|
if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){
|
//当天的
|
//开始通过计费策略遍历解析每个时段的费用明细
|
String start_time = vo.getStart_time();
|
String end_time = vo.getEnd_time();
|
long start = sdfs.parse(start_time).getTime();
|
long end = sdfs.parse(end_time).getTime();
|
Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
|
/**
|
* "start_time": "2025-01-03 23:06:43.00",
|
* "end_time": "2025-01-04 00:39:39.00",
|
*/
|
for (int i = accountingStrategyDetailOrderList.size(); i > 0; i--) {
|
AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i - 1);
|
long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime();
|
if(time < start){
|
break;
|
}
|
//阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
|
Object invoke = null;
|
switch (strategyDetail.getType()){
|
case 1:
|
//充电度数
|
invoke = clazz.getMethod("getSpike_charge" + (i)).invoke(vo);
|
break;
|
case 2:
|
//充电度数
|
invoke = clazz.getMethod("getPeak_charge" + (i)).invoke(vo);
|
break;
|
case 3:
|
//充电度数
|
invoke = clazz.getMethod("getFlat_charge" + (i)).invoke(vo);
|
break;
|
case 4:
|
//充电度数
|
invoke = clazz.getMethod("getValley_charge" + (i)).invoke(vo);
|
break;
|
}
|
if(null == invoke || Double.valueOf(invoke.toString()) == 0){
|
continue;
|
}
|
BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
|
AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
|
BeanUtils.copyProperties(strategyDetail, vo1);
|
vo1.setChargingCapacity(sharp_peak_charge);
|
lists.add(vo1);
|
}
|
|
//第二天的
|
//开始通过计费策略遍历解析每个时段的费用明细
|
for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
|
AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
|
long time = sdfs.parse(end_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime();
|
if(time > end){
|
break;
|
}
|
//阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
|
Object invoke = null;
|
switch (strategyDetail.getType()){
|
case 1:
|
//充电度数
|
invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
|
break;
|
case 2:
|
//充电度数
|
invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
|
break;
|
case 3:
|
//充电度数
|
invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
|
break;
|
case 4:
|
//充电度数
|
invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
|
break;
|
}
|
if(null == invoke || Double.valueOf(invoke.toString()) == 0){
|
continue;
|
}
|
BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
|
AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
|
BeanUtils.copyProperties(strategyDetail, vo1);
|
vo1.setChargingCapacity(sharp_peak_charge);
|
lists.add(vo1);
|
}
|
}else{
|
for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
|
Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
|
AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
|
//阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
|
Object invoke = null;
|
switch (strategyDetail.getType()){
|
case 1:
|
//充电度数
|
invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
|
break;
|
case 2:
|
//充电度数
|
invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
|
break;
|
case 3:
|
//充电度数
|
invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
|
break;
|
case 4:
|
//充电度数
|
invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
|
break;
|
}
|
if(null == invoke || Double.valueOf(invoke.toString()) == 0){
|
continue;
|
}
|
BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
|
AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
|
BeanUtils.copyProperties(strategyDetail, vo1);
|
vo1.setChargingCapacity(sharp_peak_charge);
|
lists.add(vo1);
|
}
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
R.fail("处理失败");
|
}
|
|
//开始处理明细
|
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);
|
periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
|
total = total.add(electrovalenc.add(originalServicePrice));
|
}
|
|
//原金额
|
BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
|
BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount();
|
//总金额(充值金额+会员折扣金额)
|
BigDecimal decimal = rechargeAmount.add(vipDiscountAmount);
|
//退款金额(已经计算了折扣优惠部分)
|
//如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
|
BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total));
|
BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
|
BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue());
|
//折扣金额
|
BigDecimal discountAmount = BigDecimal.ZERO;
|
if(null != chargingOrder.getVipDiscount()){
|
TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
|
//判断会员是否还有充电优惠次数
|
GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
|
getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
|
getAppUserVipDetail.setVipId(appUser.getVipId());
|
TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
|
if(null != data && data.getChargeNum() > 0){
|
data.setChargeNum(data.getChargeNum() - 1);
|
appUserVipDetailClient.updateAppUserVipDetail(data);
|
|
//服务费折扣
|
discountAmount = periodServicePrice_total.multiply((new BigDecimal(1).subtract(chargingOrder.getVipDiscount())));
|
TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
|
BigDecimal maximumDeduction = vip.getMaximumDeduction();
|
//普通会员有最高优惠限制
|
if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){
|
discountAmount = maximumDeduction;
|
}
|
}
|
}
|
//会员折扣金额
|
discountAmount = discountAmount.setScale(4, RoundingMode.HALF_EVEN);
|
payAmount = payAmount.subtract(discountAmount);
|
periodServicePrice_total = periodServicePrice_total.subtract(discountAmount);
|
|
TChargingOrder order = new TChargingOrder();
|
order.setId(chargingOrder.getId());
|
order.setAppUserId(chargingOrder.getAppUserId());
|
UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
|
if(null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()){
|
Integer soc = uploadRealTimeMonitoringData.getSoc();
|
if(soc >= 98){
|
order.setEndMode(2);
|
}else if(chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0){
|
order.setEndMode(3);
|
}else{
|
order.setEndMode(0);
|
}
|
}
|
order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
|
order.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
|
order.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
|
order.setStatus(5);
|
order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
|
order.setVipDiscountAmount(discountAmount.setScale(2, RoundingMode.HALF_EVEN));
|
order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
|
order.setChargingCapacity(vo.getTotal_electricity());
|
order.setElectricity(vo.getTotal_electricity());
|
|
//计算优惠券
|
BigDecimal couponDiscount = BigDecimal.ZERO;
|
if(null != chargingOrder.getAppCouponId()){
|
//判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
|
TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
|
String couponJson = appCoupon.getCouponJson();
|
TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
|
Integer preferentialMode = tCoupon.getPreferentialMode();
|
if(1 == preferentialMode){
|
//满减
|
if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
|
BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
|
//如果优惠金额大于服务费金额,以服务费作为最大限制
|
if(periodServicePrice_total.compareTo(couponDiscountAmount) < 0){
|
couponDiscount = periodServicePrice_total;
|
periodServicePrice_total = BigDecimal.ZERO;
|
}else{
|
couponDiscount = couponDiscountAmount;
|
}
|
appCoupon.setStatus(2);
|
appCouponClient.updateAppCoupon(appCoupon);
|
}else{
|
order.setAppCouponId(null);
|
order.setCouponDiscountAmount(BigDecimal.ZERO);
|
appCouponClient.refund(chargingOrder.getAppCouponId().toString());
|
}
|
}
|
if(2 == preferentialMode){
|
//抵扣
|
if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
|
//折扣金额
|
BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
|
divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
|
//如果优惠金额大于服务费金额,以服务费作为最大限制
|
if(periodServicePrice_total.compareTo(divide) < 0){
|
couponDiscount = periodServicePrice_total;
|
periodServicePrice_total = BigDecimal.ZERO;
|
}else{
|
couponDiscount = divide;
|
}
|
|
appCoupon.setStatus(2);
|
appCouponClient.updateAppCoupon(appCoupon);
|
}else{
|
order.setAppCouponId(null);
|
order.setCouponDiscountAmount(BigDecimal.ZERO);
|
appCouponClient.refund(chargingOrder.getAppCouponId().toString());
|
}
|
}
|
}
|
//优惠券优惠金额
|
couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN);
|
refundAmount = refundAmount.add(couponDiscount);
|
payAmount = payAmount.subtract(couponDiscount);
|
if(periodServicePrice_total.compareTo(BigDecimal.ZERO) > 0){
|
periodServicePrice_total = periodServicePrice_total.subtract(couponDiscount);
|
}
|
order.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
|
order.setServiceCharge(periodServicePrice_total.setScale(2, RoundingMode.HALF_EVEN));
|
order.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN));
|
order.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN));
|
order.setRefundStatus(1);
|
this.updateById(order);
|
chargingOrder = this.getById(order.getId());
|
|
//推送三方平台
|
if(2 == chargingOrder.getOrderSource()){
|
tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
|
tcecClient.notificationStopChargeResult(chargingOrder.getStartChargeSeq(), chargingOrder.getChargingGunId().toString(),
|
chargingOrder.getOperatorId());
|
tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
|
}
|
|
//开始将优惠券优惠的金额添加到明细中
|
BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
|
if(null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){
|
List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId()));
|
BigDecimal reduce = list.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
|
for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
|
BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
|
BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
|
periodServicePrice = periodServicePrice.subtract(multiply);
|
chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
|
chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
|
}
|
chargingOrderAccountingStrategyService.updateBatchById(list);
|
}
|
|
// 将枪状态重置为空闲
|
TChargingGun chargingGun = new TChargingGun();
|
chargingGun.setId(chargingOrder.getChargingGunId());
|
chargingGun.setStatus(2);
|
chargingGun.setChargingPower(BigDecimal.ZERO);
|
chargingGunClient.updateChargingGunById(chargingGun);
|
//推送状态给三方平台
|
if(2 == chargingOrder.getOrderSource()){
|
tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus());
|
}
|
|
//添加积分
|
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);
|
if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
|
Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
|
//构建退款明细
|
TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
|
chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
|
chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
|
chargingOrderRefund.setRefundAmount(refundAmount);
|
chargingOrderRefund.setRefundStatus(1);
|
chargingOrderRefund.setPayType(rechargePaymentType);
|
chargingOrderRefund.setRefundStatus(1);
|
chargingOrderRefund.setCode(chargingOrder.getCode());
|
chargingOrderRefund.setRefundTitle("充电完成退款");
|
chargingOrderRefund.setRefundContent("充电完成退款");
|
chargingOrderRefund.setRefundReason("充电完成退款");
|
chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
|
chargingOrderRefund.setRefundTotalAmount(refundAmount);
|
chargingOrderRefund.setPayAmount(rechargeAmount);
|
if(1 == rechargePaymentType){
|
WxPaymentRefundModel model = new WxPaymentRefundModel();
|
model.setOut_trade_no(chargingOrder.getCode());
|
model.setOut_refund_no(chargingOrderRefund.getRefundCode());
|
model.setReason("充电完成退款");
|
model.setNotify_url("/payment/wx/refund/notify");
|
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
|
amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
|
amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
|
amount.setCurrency("CNY");
|
model.setAmount(amount);
|
R<String> orderR = wxPaymentClient.refundOrderR(model);
|
if(200 == orderR.getCode()){
|
chargingOrderRefundService.save(chargingOrderRefund);
|
}
|
}
|
if(2 == rechargePaymentType){
|
RefundReq dto = new RefundReq();
|
dto.setOutTradeNo(chargingOrder.getCode());
|
dto.setOutRequestNo(chargingOrderRefund.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);
|
}
|
}
|
|
}
|
}
|
return R.ok();
|
}
|
|
|
|
|
@Override
|
public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) {
|
return this.baseMapper.getByDate(chargingOrderIds);
|
}
|
|
@Override
|
public List<Map<String, Object>> queryPower(List<Integer> siteIds) {
|
return this.baseMapper.queryPower(siteIds);
|
}
|
|
@Override
|
public Map<String, Object> qureryPowerLevel(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.queryPowerLevel(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> queryOrderCountAndMoneyBySiteIdDate(List<Integer> siteIds) {
|
return this.baseMapper.queryOrderCountAndMoneyBySiteIdDate(siteIds);
|
}
|
|
@Override
|
public List<Map<String, Object>> usersDay(ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.usersDay(statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> usersDay1() {
|
return this.baseMapper.usersDay1();
|
}
|
|
@Override
|
public List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.usersByQuery(statisticsQueryDto);
|
}
|
@Override
|
public List<Map<String, Object>> usersByQuery1(ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.usersByQuery1(statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> getUserTagCount() {
|
return this.baseMapper.getUserTagCount();
|
}
|
|
@Override
|
public List<Map<String, Object>> getVipCount() {
|
return this.baseMapper.getVipCount();
|
}
|
|
@Override
|
public List<Map<String, Object>> unitConsumption(ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.unitConsumption(statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> carUserMethod() {
|
return this.baseMapper.carUserMethod();
|
}
|
|
@Override
|
public List<Map<String, Object>> carUserBrand() {
|
return this.baseMapper.carUserBrand();
|
}
|
|
@Override
|
public Map<String, Object> countLocalCar() {
|
return this.baseMapper.countLocalCar();
|
}
|
|
@Override
|
public Double getAver(List<Integer> siteIds) {
|
return this.baseMapper.getAver(siteIds);
|
}
|
|
@Override
|
public List<Map<String, Object>> getLevelEvaluate(List<Integer> 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("GDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
|
chargingOrderRefund.setRefundTitle("后台退款");
|
chargingOrderRefund.setRefundContent("后台退款");
|
chargingOrderRefund.setRefundReason("后台退款");
|
chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
|
chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount()));
|
chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount());
|
|
if(1 == tChargingOrder.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("/order/t-shopping-order/cancelShoppingOrderWxRefund");
|
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<String> orderR = wxPaymentClient.refundOrderR(model);
|
if(200 == orderR.getCode()){
|
tChargingOrder.setRefundStatus(2);
|
tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
|
this.baseMapper.updateById(tChargingOrder);
|
chargingOrderRefundService.save(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 (payOrderQueryDto.getType()==2){
|
TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());
|
if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
|
return R.fail("退款金额需小于支付金额");
|
}
|
if ((tChargingOrder.getPaymentAmount().subtract(tChargingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount()))==0){
|
tChargingOrder.setStatus(5);
|
}
|
|
TShoppingOrderRefund chargingOrderRefund = new TShoppingOrderRefund();
|
chargingOrderRefund.setShoppingOrderId(tChargingOrder.getId());
|
chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
|
chargingOrderRefund.setRefundStatus(1);
|
chargingOrderRefund.setPayType(tChargingOrder.getPaymentType());
|
chargingOrderRefund.setRefundTime(LocalDateTime.now());
|
chargingOrderRefund.setCode(tChargingOrder.getCode());
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
|
chargingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
|
chargingOrderRefund.setRefundTitle("后台退款");
|
chargingOrderRefund.setRefundContent("后台退款");
|
chargingOrderRefund.setRefundReason("后台退款");
|
chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
|
chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount()));
|
chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount());
|
|
if(1 == tChargingOrder.getPaymentType()){
|
WxPaymentRefundModel model = new WxPaymentRefundModel();
|
model.setOut_trade_no(tChargingOrder.getCode());
|
model.setOut_refund_no(chargingOrderRefund.getRefundCode());
|
model.setTransaction_id(tChargingOrder.getSerialNumber());
|
model.setReason("取消订单");
|
model.setNotify_url("/order/t-shopping-order/cancelShoppingOrderWxRefund");
|
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
|
amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
|
amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
|
amount.setCurrency("CNY");
|
model.setAmount(amount);
|
R<String> orderR = wxPaymentClient.refundOrderR(model);
|
if(200 == orderR.getCode()){
|
tChargingOrder.setRefundStatus(2);
|
tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
|
shoppingOrderService.updateById(tChargingOrder);
|
shoppingOrderRefundService.save(chargingOrderRefund);
|
}
|
}
|
|
if(2 == tChargingOrder.getPaymentType()){
|
RefundReq dto = new RefundReq();
|
dto.setOutTradeNo(tChargingOrder.getCode());
|
dto.setOutRequestNo(tChargingOrder.getCode());
|
dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
|
dto.setRefundReason("取消订单");
|
RefundResp resp = aliPaymentClient.refund(dto).getData();
|
if(null != resp){
|
tChargingOrder.setRefundStatus(2);
|
tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
|
shoppingOrderService.updateById(tChargingOrder);
|
shoppingOrderRefundService.save(chargingOrderRefund);
|
}
|
}
|
|
}
|
|
if (payOrderQueryDto.getType()==3){
|
TVipOrder tChargingOrder = vipOrderService.getById(payOrderQueryDto.getOrderId());
|
if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
|
return R.fail("退款金额需小于支付金额");
|
}
|
TVipOrderRefund chargingOrderRefund = new TVipOrderRefund();
|
chargingOrderRefund.setVipOrderId(tChargingOrder.getId());
|
chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
|
chargingOrderRefund.setRefundStatus(1);
|
chargingOrderRefund.setPayType(tChargingOrder.getPaymentType());
|
chargingOrderRefund.setRefundTime(LocalDateTime.now());
|
chargingOrderRefund.setCode(tChargingOrder.getCode());
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
|
chargingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
|
chargingOrderRefund.setRefundTitle("后台退款");
|
chargingOrderRefund.setRefundContent("后台退款");
|
chargingOrderRefund.setRefundReason("后台退款");
|
chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
|
chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount()));
|
chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount());
|
|
if(1 == tChargingOrder.getPaymentType()){
|
WxPaymentRefundModel model = new WxPaymentRefundModel();
|
model.setOut_trade_no(tChargingOrder.getCode());
|
model.setOut_refund_no(chargingOrderRefund.getRefundCode());
|
model.setTransaction_id(tChargingOrder.getSerialNumber());
|
model.setReason("取消订单");
|
model.setNotify_url("/order/t-shopping-order/cancelShoppingOrderWxRefund");
|
WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
|
amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
|
amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
|
amount.setCurrency("CNY");
|
model.setAmount(amount);
|
R<String> orderR = wxPaymentClient.refundOrderR(model);
|
if(200 == orderR.getCode()){
|
tChargingOrder.setRefundStatus(2);
|
tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
|
vipOrderService.updateById(tChargingOrder);
|
vipOrderRefundService.save(chargingOrderRefund);
|
}
|
}
|
|
if(2 == tChargingOrder.getPaymentType()){
|
RefundReq dto = new RefundReq();
|
dto.setOutTradeNo(tChargingOrder.getCode());
|
dto.setOutRequestNo(tChargingOrder.getCode());
|
dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
|
dto.setRefundReason("取消订单");
|
RefundResp resp = aliPaymentClient.refund(dto).getData();
|
if(null != resp){
|
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<TChargingOrder>().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(4, 5)));
|
return one;
|
}
|
|
@Override
|
public TSettlementConfirm settlementAdd(SettlementConfirmAdd dto) {
|
List<Site> data = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData();
|
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<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
|
.eq("site_id", dto.getSiteId())
|
.eq("status", 5)
|
.eq("recharge_payment_status",2);
|
switch (dto.getType()){
|
case 1:
|
eq.between("pay_time", localDateTime, localDateTime1);
|
break;
|
case 2:
|
eq.between("end_time", localDateTime, localDateTime1);
|
break;
|
}
|
List<TChargingOrder> 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 (tChargingOrder.getChargingCapacity()!=null){
|
chargingElectronic = chargingElectronic.add(tChargingOrder.getChargingCapacity());
|
|
}
|
// 累加分佣
|
if (tChargingOrder.getSharingAmount()!=null) {
|
sharingAmount = sharingAmount.add(tChargingOrder.getSharingAmount());
|
}
|
// 累加电费
|
if (tChargingOrder.getElectrovalence()!=null) {
|
electrovalence = electrovalence.add(tChargingOrder.getElectrovalence());
|
}
|
// 累加服务费
|
if (tChargingOrder.getServiceCharge()!=null){
|
serviceCharge = serviceCharge.add(tChargingOrder.getServiceCharge());
|
|
}
|
// 累加会员折扣
|
if (tChargingOrder.getVipDiscountAmount()!=null){
|
vipDiscount = vipDiscount.add(tChargingOrder.getVipDiscountAmount());
|
}
|
// 累加优惠券折扣
|
if (tChargingOrder.getCouponDiscountAmount()!=null){
|
couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount());
|
}
|
if (tChargingOrder.getPaymentAmount()!=null){
|
paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount());
|
orderCommission = orderCommission.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006"))
|
.setScale(2,BigDecimal.ROUND_DOWN));
|
}
|
|
}
|
|
// 三方交易手续费 三方收费*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<TSettlementConfirm> 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<Integer> siteIds = new ArrayList<>();
|
if (dto.getSiteIds()==null){
|
if (userId != null){
|
List<GetSiteListDTO> 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<Integer> integers = new ArrayList<>();
|
for (Integer siteId : siteIds) {
|
// 校验有没有这个站点的权限
|
List<Boolean> t1= partnerClient.getSettlementListMenu(sysUser.getObjectId(),siteId).getData();
|
|
Boolean b = t1.get(2);
|
if (b){
|
integers.add(siteId);
|
}
|
}
|
siteIds = integers;
|
}
|
}
|
dto.setSiteIdss(siteIds);
|
PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
|
List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo,dto);
|
|
for (TSettlementConfirm tSettlementConfirm : list) {
|
if (roleType==2){
|
List<Boolean> data = partnerClient.getSettlementListMenu(sysUser.getObjectId(), tSettlementConfirm.getSiteId()).getData();
|
tSettlementConfirm.setAuthDownLoad(data.get(0));
|
tSettlementConfirm.setAuthDelete(data.get(1));
|
}
|
tSettlementConfirm.setUid(tSettlementConfirm.getId().toString());
|
List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData();
|
if (!data1.isEmpty()){
|
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<Integer> siteIds = new ArrayList<>();
|
if (userId != null){
|
List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
|
for (GetSiteListDTO datum : data) {
|
siteIds.add(datum.getId());
|
}
|
}
|
if (siteIds.isEmpty()){
|
siteIds.add(-1);
|
}
|
List<Site> siteList = siteClient.getSiteAll().getData();
|
List<TChargingGun> gunList = chargingGunClient.getAllGun().getData();
|
List<TChargingPile> pileList = chargingGunClient.getAllPile().getData();
|
List<TAppUser> userList = appUserClient.getAllUser().getData();
|
List<TAppUserCar> carList = appUserCarClient.getAllCar().getData();
|
List<TChargingOrder> totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class)
|
.eq(TChargingOrder::getRechargePaymentStatus, 2));
|
List<TChargingOrderRefund> totalRefund = chargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getRefundStatus, 2).list();
|
SettlementTotalVO res = new SettlementTotalVO();
|
List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time,siteIds);
|
LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
// 减少一个月
|
LocalDateTime minus = parse.minusMonths(1);
|
List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time,siteIds);
|
// 合计
|
List<TSettlementConfirm> 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());
|
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<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
|
.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<TChargingOrder> 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<TChargingPile> 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<TChargingPile> 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<Integer> siteIds = new ArrayList<>();
|
if (userId != null){
|
List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
|
for (GetSiteListDTO datum : data) {
|
siteIds.add(datum.getId());
|
}
|
}
|
if (siteIds.isEmpty()){
|
siteIds.add(-1);
|
}
|
List<Site> siteList = siteClient.getSiteAll().getData();
|
List<TChargingGun> gunList = chargingGunClient.getAllGun().getData();
|
List<TChargingPile> pileList = chargingGunClient.getAllPile().getData();
|
List<TAppUser> userList = appUserClient.getAllUser().getData();
|
List<TAppUserCar> carList = appUserCarClient.getAllCar().getData();
|
List<TChargingOrder> totalOrder = chargingOrderService.list(new LambdaQueryWrapper<>(TChargingOrder.class)
|
.eq(TChargingOrder::getRechargePaymentStatus, 2));
|
SettlementTotalVO res = new SettlementTotalVO();
|
List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time,siteIds);
|
LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time,siteIds);
|
// 合计
|
List<TSettlementConfirm> 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<Site> 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<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
|
.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<TChargingOrder> 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<TChargingPile> 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<TChargingPile> data2 = chargingPileClient.getChargingPileBySiteId(tSettlementConfirm.getSiteId()).getData();
|
BigDecimal bigDecimal2 = new BigDecimal("0");
|
|
if (data2!=null && (!data2.isEmpty())){
|
for (TChargingPile tChargingPile : data2) {
|
bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower());
|
}
|
BigDecimal bigDecimal1 = new BigDecimal(data2.size()+"");
|
// 平均功率
|
BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN);
|
// 充电量
|
BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic();
|
// 桩数量
|
BigDecimal bigDecimal3 = new BigDecimal(data2.size());
|
BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24"));
|
BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp));
|
tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1,2,RoundingMode.HALF_DOWN)+"");
|
}else{
|
tSettlementConfirm.setRate("");
|
}
|
|
|
for (TSettlementConfirm settlementConfirm : list2) {
|
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<Map<String, Object>> countBySource(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.countBySource(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> equipmentUserType1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.equipmentUserType1(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> equipmentUserType2(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.equipmentUserType2(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> equipmentMapbroke1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.equipmentMapbroke1(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> equipmentMapbroke2(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.equipmentMapbroke2(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> equipmentMapOut1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.equipmentMapOut1(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> equipmentMapOut2(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.equipmentMapOut2(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> needElec(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.needElec(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> getHourType(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
|
return this.baseMapper.getHourType(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> getDateType(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
|
return this.baseMapper.getDateType(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> getMonthType(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
|
return this.baseMapper.getMonthType(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> getchargingCapacity(List<Integer> siteIds, ChargingDetailQueryDto statisticsQueryDto) {
|
return this.baseMapper.getchargingCapacity(siteIds,statisticsQueryDto);
|
}
|
|
@Override
|
public List<Map<String, Object>> countAllUserData() {
|
return this.baseMapper.countAllUserData();
|
}
|
|
@Override
|
public List<Map<String, Object>> needElec1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
|
return this.baseMapper.needElec1(siteIds,statisticsQueryDto);
|
}
|
|
/**
|
* 获取充电结束页面详情
|
* @param id
|
* @return
|
*/
|
@Override
|
public EndOfChargePageInfo getEndOfChargePageInfo(String id) {
|
EndOfChargePageInfo info = new EndOfChargePageInfo();
|
TChargingOrder chargingOrder = this.getById(id);
|
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<TChargingOrder> getChargingOrder(TChargingOrderVo order) {
|
LambdaQueryWrapper<TChargingOrder> queryWrapper = new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getDelFlag, 0);
|
if(null != order.getChargingPileId()){
|
queryWrapper.eq(TChargingOrder::getChargingPileId, order.getChargingPileId());
|
}
|
if(null != order.getChargingGunId()){
|
queryWrapper.eq(TChargingOrder::getChargingGunId, order.getChargingGunId());
|
}
|
if(null != order.getStatus()){
|
queryWrapper.eq(TChargingOrder::getStatus, order.getStatus());
|
}
|
if(null != order.getAppUserId()){
|
queryWrapper.eq(TChargingOrder::getAppUserId, order.getAppUserId());
|
}
|
if(null != order.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<String> brands) {
|
return this.baseMapper.countCar(brands);
|
}
|
|
|
/**
|
* 添加三方平台充电订单数据
|
* @param query
|
*/
|
@Override
|
public R addTripartitePlatformOrder(AddTripartitePlatformOrder query) {
|
//检查当前枪是否是正在使用中
|
TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().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());
|
chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
|
this.save(chargingOrder);
|
|
Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
|
if(null == accountingStrategyId){
|
Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
|
//查询站点上面的计费策略
|
accountingStrategyId = site.getAccountingStrategyId();
|
}
|
TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData();
|
|
//添加订单的计费策略
|
List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
|
AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
|
BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
|
accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
|
accountingStrategyOrderService.save(accountingStrategyOrder);
|
List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
|
for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
|
AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
|
BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
|
accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
|
list1.add(accountingStrategyDetailOrder);
|
}
|
accountingStrategyDetailOrderService.saveBatch(list1);
|
|
|
//添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
|
PreChargeCheck preChargeCheck = new PreChargeCheck();
|
preChargeCheck.setElectronicLockLock(false);
|
preChargeCheck.setInsulationTesting(false);
|
preChargeCheck.setSecureConnectionDetection(false);
|
preChargeCheck.setStartupSuccess(1);
|
String key = "AQJC_" + chargingOrder.getChargingGunId();
|
redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS);
|
|
BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
|
//调用远程启动充电消息
|
PlatformStartCharging platformStartCharging = new PlatformStartCharging();
|
platformStartCharging.setTransaction_serial_number(chargingOrder.getCode());
|
platformStartCharging.setCharging_pile_code(chargingPile.getCode());
|
platformStartCharging.setCharging_gun_code(tChargingGun.getCode());
|
//使用订单id作为逻辑卡号
|
platformStartCharging.setCard_number(chargingOrder.getId().toString());
|
platformStartCharging.setAccount_balance(rechargeAmount);
|
log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString());
|
sendMessageClient.platformStartCharging(platformStartCharging);
|
//异步线程检测远程启动的应答结果。如果失败,则需要全额退款
|
Long id = chargingOrder.getId();
|
//执行5分钟的定时任务检测
|
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
scheduler.scheduleAtFixedRate(()->{
|
if(timingDetection(id)){
|
scheduler.shutdown();
|
}
|
}, 5, 1, TimeUnit.SECONDS);
|
|
//推送三方平台订单状态
|
tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
|
return R.ok();
|
}
|
|
|
/**
|
* 三方平台停止充电操作
|
* @param startChargeSeq
|
* @return
|
*/
|
@Override
|
public R tripartitePlatformStopCharge(String startChargeSeq) {
|
TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getStartChargeSeq, startChargeSeq));
|
Integer status = order.getStatus();
|
if(status != 3){
|
return R.fail("还未开始充电");
|
}
|
if(status == 4 || status == 5){
|
return R.fail("不能重复操作");
|
}
|
TChargingOrder chargingOrder = new TChargingOrder();
|
chargingOrder.setId(order.getId());
|
chargingOrder.setAppUserId(order.getOperatorId().longValue());
|
chargingOrder.setEndTime(LocalDateTime.now());
|
chargingOrder.setStatus(4);
|
chargingOrder.setEndMode(1);
|
this.updateById(chargingOrder);
|
|
tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
|
|
String code1 = order.getCode();
|
TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
|
//异步线程处理停机
|
ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
|
cachedThreadPool.execute(()->{
|
//调用硬件停止充电,停止成功后开始计算费用退款
|
TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
|
PlatformStopCharging platformStopCharging = new PlatformStopCharging();
|
platformStopCharging.setCharging_pile_code(chargingPile.getCode());
|
platformStopCharging.setCharging_gun_code(chargingGun.getCode());
|
sendMessageClient.platformStopCharging(platformStopCharging);
|
log.info(code1 + ":-------------------远程停止充电请求-------------------");
|
log.info(platformStopCharging.toString());
|
});
|
return R.ok();
|
}
|
|
|
/**
|
* 获取充电后没有扣除费用的数据
|
* @return
|
*/
|
@Override
|
public R getNotPaymentChargingOrder() {
|
List<TChargingOrder> list = this.list(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getPaymentAmount, 0)
|
.ne(TChargingOrder::getElectricity, 0).in(TChargingOrder::getStatus, Arrays.asList(4, 5)));
|
List<Map<String, Object>> mapList = new ArrayList<>();
|
for (TChargingOrder order : list) {
|
TransactionRecord transactionRecord = transactionRecordClient.findTransactionRecord(order.getCode()).getData();
|
Map<String, Object> map = new HashMap<>();
|
map.put("order", order);
|
map.put("transactionRecord", transactionRecord);
|
mapList.add(map);
|
}
|
return R.ok(mapList);
|
}
|
}
|