优化异常订单审核

This commit is contained in:
yuyang 2022-08-29 17:36:28 +08:00
parent 5cdd792800
commit 3fbdde558b

View File

@ -13,6 +13,7 @@ import com.xhpc.common.core.web.domain.AjaxResult;
import com.xhpc.common.core.web.service.BaseService; import com.xhpc.common.core.web.service.BaseService;
import com.xhpc.common.data.redis.CacheOrderData; import com.xhpc.common.data.redis.CacheOrderData;
import com.xhpc.common.data.redis.CacheRealtimeData; import com.xhpc.common.data.redis.CacheRealtimeData;
import com.xhpc.common.domain.XhpcRate;
import com.xhpc.common.enums.StopReasonEnum; import com.xhpc.common.enums.StopReasonEnum;
import com.xhpc.common.redis.service.RedisService; import com.xhpc.common.redis.service.RedisService;
import com.xhpc.common.security.service.TokenService; import com.xhpc.common.security.service.TokenService;
@ -165,7 +166,6 @@ public class XhpcRealTimeOrderServiceImpl extends BaseService implements IXhpcRe
@Transactional @Transactional
@Override @Override
public Map<String, Object> getExamineMessage(Long realTimeOrderId,Long chargeOrderId) { public Map<String, Object> getExamineMessage(Long realTimeOrderId,Long chargeOrderId) {
if(realTimeOrderId==null){ if(realTimeOrderId==null){
Map<String, Object> message = xhpcRealTimeOrderMapper.getMessageChargeOrderId(chargeOrderId); Map<String, Object> message = xhpcRealTimeOrderMapper.getMessageChargeOrderId(chargeOrderId);
message.put("powerPriceTotal",0); message.put("powerPriceTotal",0);
@ -182,141 +182,222 @@ public class XhpcRealTimeOrderServiceImpl extends BaseService implements IXhpcRe
} }
//获取开始充电时间结束时间计费模型充电度数已充金额 //获取开始充电时间结束时间计费模型充电度数已充金额
XhpcChargeOrder chargeOrder = xhpcChargeOrderService.getChargingOrderId(Long.parseLong(message.get("chargeOrderId").toString())); XhpcChargeOrder chargeOrder = xhpcChargeOrderService.getChargingOrderId(Long.parseLong(message.get("chargeOrderId").toString()));
if(chargeOrder.getRateModelId()==null || "".equals(chargeOrder.getRateModelId())){ if(chargeOrder.getRateModelId()==null || "".equals(chargeOrder.getRateModelId().toString())){
Map<String, Object> xhpcChargingStationMap = xhpcRealTimeOrderMapper.getXhpcChargingStationById(chargeOrder.getChargingStationId()); Map<String, Object> xhpcChargingStationMap = xhpcRealTimeOrderMapper.getXhpcChargingStationById(chargeOrder.getChargingStationId());
chargeOrder.setRateModelId(Long.valueOf(xhpcChargingStationMap.get("rateModelId").toString())); chargeOrder.setRateModelId(Long.valueOf(xhpcChargingStationMap.get("rateModelId").toString()));
} }
//获取该订单最后一条实时数据 //获取该订单最后一条实时数据
Map<String, Object> cacheMap = redisService.getCacheMap("order:" + chargeOrder.getSerialNumber()); Map<String, Object> cacheMap = redisService.getCacheMap("order:" + chargeOrder.getSerialNumber());
List<CacheRealtimeData> list = (List<CacheRealtimeData>) cacheMap.get("realtimeDataList"); Long rateModelId = chargeOrder.getRateModelId();
if(cacheMap !=null && cacheMap.get("orderData") !=null){
CacheRealtimeData startData =new CacheRealtimeData(); CacheOrderData cacheOrderData = (CacheOrderData)cacheMap.get("orderData");
CacheRealtimeData endData =new CacheRealtimeData(); BigDecimal bigDecimal = new BigDecimal(10000);
BigDecimal money = new BigDecimal(cacheOrderData.getCost()).divide(bigDecimal,2,BigDecimal.ROUND_HALF_UP);
if (list != null && list.size() > 0) { //00: 尖费率 01: 峰费率 02: 平费率 03: 谷费率
endData =list.get(list.size()-1); BigDecimal t1powerFee =new BigDecimal(0);
for (int i = 0; i <list.size() ; i++) { BigDecimal t2powerFee =new BigDecimal(0);
startData =list.get(i); BigDecimal t3powerFee =new BigDecimal(0);
if(startData.getAmountCharged()>0 && startData.getChargingTime()>0){ BigDecimal t4powerFee =new BigDecimal(0);
break; BigDecimal t1serviceFee =new BigDecimal(0);
BigDecimal t2serviceFee =new BigDecimal(0);
BigDecimal t3serviceFee =new BigDecimal(0);
BigDecimal t4serviceFee =new BigDecimal(0);
//费率计费模型
List<XhpcRate> rateModelList = xhpcChargeOrderService.getRateModelId(rateModelId);
for (XhpcRate xhpcRate:rateModelList) {
if("00".equals(xhpcRate.getRateValue())){
t1powerFee = xhpcRate.getPowerFee();
t1serviceFee =xhpcRate.getServiceFee();
}
if("01".equals(xhpcRate.getRateValue())){
t2powerFee = xhpcRate.getPowerFee();
t2serviceFee =xhpcRate.getServiceFee();
}
if("02".equals(xhpcRate.getRateValue())){
t3powerFee = xhpcRate.getPowerFee();
t3serviceFee = xhpcRate.getServiceFee();
}
if("03".equals(xhpcRate.getRateValue())){
t4powerFee = xhpcRate.getPowerFee();
t4serviceFee =xhpcRate.getServiceFee();
} }
} }
} BigDecimal powerPrice =new BigDecimal(0);
BigDecimal servicePrice =new BigDecimal(0);
Long rateModelId = chargeOrder.getRateModelId(); //因桩有误差电费和服务费重新计算
if(!"0".equals(cacheOrderData.getT1PowerQuantity().toString())){
if(endData !=null && endData.getAmountCharged() !=null && startData.getChargingTime()>0){ BigDecimal multiply1 = new BigDecimal(cacheOrderData.getT1PowerQuantity()).divide(bigDecimal).multiply(t1powerFee).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal multiply2 = new BigDecimal(cacheOrderData.getT1PowerQuantity()).divide(bigDecimal).multiply(t1serviceFee).setScale(2, BigDecimal.ROUND_HALF_UP);
message.put("soc",endData.getSoc()); powerPrice=powerPrice.add(multiply1);
//最后一祯时间 servicePrice=servicePrice.add(multiply2);
Date endTime = DateUtil.parse(endData.getCreateTime());
Date startTime =DateUtil.parse(startData.getCreateTime());
//充电时长
Long tiem = (endTime.getTime() - startTime.getTime()) / 1000;
if (tiem > 3600) {
long hours = tiem / 3600;
double mins = (double) ((tiem - (hours * 3600)) / 60);
message.put("chargingTime",hours + "" + new BigDecimal(mins).setScale(0) + "");
chargeOrder.setChargingTime(hours + "" + new BigDecimal(mins).setScale(0) + "");
} else {
double mins = (double) (tiem / 60);
message.put("chargingTime",new BigDecimal(mins).setScale(0) + "");
chargeOrder.setChargingTime(new BigDecimal(mins).setScale(0) + "");
} }
BigDecimal chargingDegree = new BigDecimal(endData.getChargingDegree()).divide(new BigDecimal(10000), 2, BigDecimal.ROUND_HALF_UP); if(!"0".equals(cacheOrderData.getT2PowerQuantity().toString())){
message.put("chargingDegree",chargingDegree); BigDecimal multiply1 = new BigDecimal(cacheOrderData.getT2PowerQuantity()).divide(bigDecimal).multiply(t2powerFee).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal multiply2 = new BigDecimal(cacheOrderData.getT2PowerQuantity()).divide(bigDecimal).multiply(t2serviceFee).setScale(2, BigDecimal.ROUND_HALF_UP);
chargeOrder.setStartTime(startTime); powerPrice=powerPrice.add(multiply1);
chargeOrder.setEndTime(endTime); servicePrice=servicePrice.add(multiply2);
chargeOrder.setStartSoc(startData.getSoc().toString()); }
chargeOrder.setEndSoc(endData.getSoc().toString()); if(!"0".equals(cacheOrderData.getT3PowerQuantity().toString())){
chargeOrder.setChargingTimeNumber(tiem); BigDecimal multiply1 = new BigDecimal(cacheOrderData.getT3PowerQuantity()).divide(bigDecimal).multiply(t3powerFee).setScale(2, BigDecimal.ROUND_HALF_UP);
chargeOrder.setChargingDegree(chargingDegree); BigDecimal multiply2 = new BigDecimal(cacheOrderData.getT3PowerQuantity()).divide(bigDecimal).multiply(t3serviceFee).setScale(2, BigDecimal.ROUND_HALF_UP);
chargeOrder.setType("平台停止"); powerPrice=powerPrice.add(multiply1);
chargeOrder.setAmountCharged(new BigDecimal(endData.getAmountCharged()).divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP)); servicePrice=servicePrice.add(multiply2);
}
if(!"0".equals(cacheOrderData.getT4PowerQuantity().toString())){
BigDecimal multiply1 = new BigDecimal(cacheOrderData.getT4PowerQuantity()).divide(bigDecimal).multiply(t4powerFee).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal multiply2 = new BigDecimal(cacheOrderData.getT4PowerQuantity()).divide(bigDecimal).multiply(t4serviceFee).setScale(2, BigDecimal.ROUND_HALF_UP);
powerPrice=powerPrice.add(multiply1);
servicePrice=servicePrice.add(multiply2);
}
powerPrice =powerPrice.setScale(2,BigDecimal.ROUND_HALF_UP);
//总服务费
servicePrice =servicePrice.setScale(2,BigDecimal.ROUND_HALF_UP);
message.put("powerPriceTotal",powerPrice);
message.put("servicePriceTotal",servicePrice);
chargeOrder.setStartTime(DateUtil.parse(cacheOrderData.getStartTime()));
chargeOrder.setEndTime(DateUtil.parse(cacheOrderData.getEndTime()));
if(cacheOrderData.getStartSoc() !=null){
chargeOrder.setStartSoc(cacheOrderData.getStartSoc()+"");
}
if(cacheOrderData.getEndTime() !=null){
chargeOrder.setEndSoc(cacheOrderData.getEndSoc()+"");
}
if(cacheOrderData.getTotalPowerQuantity() !=null){
BigDecimal chargingDegree1 = new BigDecimal(cacheOrderData.getTotalPowerQuantity()).divide(bigDecimal,2,BigDecimal.ROUND_HALF_UP);
chargeOrder.setChargingDegree(chargingDegree1);
}
chargeOrder.setAmountCharged(money);
}else{ }else{
//当没有缓存数据时查询数据库 if (cacheMap.get("startTime")!=null && cacheMap.get("lastOrderTime")!=null && cacheMap.get("totalPower")!=null && cacheMap.get("totalMoney")!=null) {
XhpcRealTimeOrder startRealTimeOrder = xhpcRealTimeOrderMapper.getChargingOrderId(chargeOrder.getChargeOrderId(), 1); chargeOrder.setStartTime(DateUtil.parse(cacheMap.get("startTime").toString()));
chargeOrder.setStartTime(DateUtil.parse(cacheMap.get("lastOrderTime").toString()));
if(startRealTimeOrder ==null){ String totalPower = cacheMap.get("totalPower").toString();
message.put("powerPriceTotal",0); String totalPowerSub = totalPower.substring(0, totalPower.length() - 1);
message.put("servicePriceTotal",0); chargeOrder.setChargingDegree(new BigDecimal(totalPowerSub));
return message;
}
XhpcRealTimeOrder endRealTimeOrder = xhpcRealTimeOrderMapper.getChargingOrderId(chargeOrder.getChargeOrderId(), 2);
message.put("soc",endRealTimeOrder.getSoc());
//最后一祯时间
Date endTime = endRealTimeOrder.getCreateTime();
Date startTime = startRealTimeOrder.getCreateTime();
BigDecimal chargingDegree = endRealTimeOrder.getChargingDegree();
message.put("chargingDegree",chargingDegree);
chargeOrder.setChargingTime(endRealTimeOrder.getChargingTime());
message.put("chargingTime",endRealTimeOrder.getChargingTime());
if(startRealTimeOrder.getRealTimeOrderId().equals(startRealTimeOrder.getRealTimeOrderId())){
message.put("powerPriceTotal",0);
message.put("servicePriceTotal",0);
return message;
}
chargeOrder.setStartTime(startTime);
chargeOrder.setEndTime(endTime);
chargeOrder.setStartSoc(startRealTimeOrder.getSoc());
chargeOrder.setEndSoc(endRealTimeOrder.getSoc());
Integer chargingTimeNumber = endRealTimeOrder.getChargingTimeNumber();
if(chargingTimeNumber>0){
chargeOrder.setChargingTimeNumber(Long.valueOf(chargingTimeNumber*60));
}else{ }else{
chargeOrder.setChargingTimeNumber(0L); //没有获取到时间 1.获取缓存数据 2.缓存没有获取数据库数据
List<CacheRealtimeData> list = (List<CacheRealtimeData>) cacheMap.get("realtimeDataList");
CacheRealtimeData startData =new CacheRealtimeData();
CacheRealtimeData endData =new CacheRealtimeData();
if (list != null && list.size() > 0) {
endData =list.get(list.size()-1);
for (int i = 0; i <list.size() ; i++) {
startData =list.get(i);
if(startData.getAmountCharged()>0 && startData.getChargingTime()>0){
break;
}
}
}
if(endData !=null && endData.getAmountCharged() !=null && startData.getChargingTime()>0){
//最后一祯时间
Date endTime = DateUtil.parse(endData.getCreateTime());
Date startTime =DateUtil.parse(startData.getCreateTime());
//充电时长
BigDecimal chargingDegree = new BigDecimal(endData.getChargingDegree()).divide(new BigDecimal(10000), 2, BigDecimal.ROUND_HALF_UP);
chargeOrder.setStartTime(startTime);
chargeOrder.setEndTime(endTime);
chargeOrder.setStartSoc(startData.getSoc().toString());
chargeOrder.setEndSoc(endData.getSoc().toString());
chargeOrder.setChargingDegree(chargingDegree);
chargeOrder.setAmountCharged(new BigDecimal(endData.getAmountCharged()).divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP));
}else{
//当没有缓存数据时查询数据库
XhpcRealTimeOrder startRealTimeOrder = xhpcRealTimeOrderMapper.getChargingOrderId(chargeOrder.getChargeOrderId(), 1);
if(startRealTimeOrder ==null){
message.put("powerPriceTotal",0);
message.put("servicePriceTotal",0);
return message;
}
XhpcRealTimeOrder endRealTimeOrder = xhpcRealTimeOrderMapper.getChargingOrderId(chargeOrder.getChargeOrderId(), 2);
//最后一祯时间
Date endTime = endRealTimeOrder.getCreateTime();
Date startTime = startRealTimeOrder.getCreateTime();
BigDecimal chargingDegree = endRealTimeOrder.getChargingDegree();
chargeOrder.setChargingTime(endRealTimeOrder.getChargingTime());
if(startRealTimeOrder.getRealTimeOrderId().equals(startRealTimeOrder.getRealTimeOrderId())){
message.put("powerPriceTotal",0);
message.put("servicePriceTotal",0);
return message;
}
chargeOrder.setStartTime(startTime);
chargeOrder.setEndTime(endTime);
chargeOrder.setStartSoc(startRealTimeOrder.getSoc());
chargeOrder.setEndSoc(endRealTimeOrder.getSoc());
Integer chargingTimeNumber = endRealTimeOrder.getChargingTimeNumber();
if(chargingTimeNumber>0){
chargeOrder.setChargingTimeNumber(Long.valueOf(chargingTimeNumber*60));
}else{
chargeOrder.setChargingTimeNumber(0L);
}
chargeOrder.setChargingDegree(chargingDegree);
chargeOrder.setAmountCharged(endRealTimeOrder.getAmountCharged());
}
} }
chargeOrder.setChargingDegree(chargingDegree); Date startTime2 = chargeOrder.getStartTime();
Date updateTime2 = chargeOrder.getEndTime();
BigDecimal amountCharged = chargeOrder.getAmountCharged();
//充电度数
BigDecimal chargingDegree = chargeOrder.getChargingDegree();
BigDecimal powerPriceTotal =new BigDecimal(0);
//1时间没有跨天
DateTime parse = DateUtil.parse(DateUtil.format(startTime2, "yyyy-MM-dd"), "yyyy-MM-dd");
DateTime parse1 = DateUtil.parse(DateUtil.format(updateTime2, "yyyy-MM-dd"), "yyyy-MM-dd");
//每分钟多少度电
BigDecimal decimal = new BigDecimal((updateTime2.getTime() - startTime2.getTime())).divide(new BigDecimal(60000),4,BigDecimal.ROUND_HALF_UP);
BigDecimal divide = chargingDegree.divide(decimal,4,BigDecimal.ROUND_HALF_UP);
long betweenDay = DateUtil.between(parse,parse1, DateUnit.DAY);
if(betweenDay==0){
powerPriceTotal = getBigDecimal(rateModelId,DateUtil.formatTime(startTime2), DateUtil.formatTime(updateTime2), powerPriceTotal, divide);
}else{
//跨天
powerPriceTotal = getBigDecimal(rateModelId, DateUtil.formatTime(startTime2), "23:59:59", powerPriceTotal, divide);
System.out.println(">>>>>>跨天前>>>>>>>"+powerPriceTotal);
//明天
DateTime tomorrow = DateUtil.offsetDay(startTime2,1);
Date startTime3 = DateUtil.beginOfDay(tomorrow);
powerPriceTotal = getBigDecimal(rateModelId, DateUtil.formatTime(startTime3), DateUtil.formatTime(updateTime2), powerPriceTotal, divide);
System.out.println(">>>>>>跨天后>>>>>>>"+powerPriceTotal);
}
//算服务费和电费
if(amountCharged.compareTo(powerPriceTotal)>-1){
BigDecimal servicePriceTotal =amountCharged.subtract(powerPriceTotal);
message.put("powerPriceTotal",powerPriceTotal);
message.put("servicePriceTotal",servicePriceTotal);
}else{
message.put("powerPriceTotal",amountCharged);
message.put("servicePriceTotal",0);
}
}
message.put("chargingDegree",chargeOrder.getChargingDegree());
Long tiem = (chargeOrder.getEndTime().getTime() - chargeOrder.getStartTime().getTime()) / 1000;
if (tiem > 3600) {
long hours = tiem / 3600;
double mins = (double) ((tiem - (hours * 3600)) / 60);
message.put("chargingTime",hours + "" + new BigDecimal(mins).setScale(0) + "");
chargeOrder.setChargingTime(hours + "" + new BigDecimal(mins).setScale(0) + "");
} else {
double mins = (double) (tiem / 60);
message.put("chargingTime",new BigDecimal(mins).setScale(0) + "");
chargeOrder.setChargingTime(new BigDecimal(mins).setScale(0) + "");
}
message.put("startSoc",chargeOrder.getStartSoc());
message.put("endSoc",chargeOrder.getEndSoc());
if(cacheMap.get("stopReasonHex") !=null && "".equals(cacheMap.get("stopReasonHex").toString())){
chargeOrder.setType(cacheMap.get("stopReasonHex").toString());
}else{
chargeOrder.setType("平台停止充电"); chargeOrder.setType("平台停止充电");
chargeOrder.setAmountCharged(endRealTimeOrder.getAmountCharged());
} }
Date startTime2 = chargeOrder.getStartTime();
Date updateTime2 = chargeOrder.getEndTime();
BigDecimal amountCharged = chargeOrder.getAmountCharged();
//充电度数
BigDecimal chargingDegree = chargeOrder.getChargingDegree();
BigDecimal powerPriceTotal =new BigDecimal(0);
//1时间没有跨天
DateTime parse = DateUtil.parse(DateUtil.format(startTime2, "yyyy-MM-dd"), "yyyy-MM-dd");
DateTime parse1 = DateUtil.parse(DateUtil.format(updateTime2, "yyyy-MM-dd"), "yyyy-MM-dd");
//每分钟多少度电
BigDecimal decimal = new BigDecimal((updateTime2.getTime() - startTime2.getTime())).divide(new BigDecimal(60000),4,BigDecimal.ROUND_HALF_UP);
BigDecimal divide = chargingDegree.divide(decimal,4,BigDecimal.ROUND_HALF_UP);
long betweenDay = DateUtil.between(parse,parse1, DateUnit.DAY);
if(betweenDay==0){
powerPriceTotal = getBigDecimal(rateModelId,DateUtil.formatTime(startTime2), DateUtil.formatTime(updateTime2), powerPriceTotal, divide);
}else{
//跨天
powerPriceTotal = getBigDecimal(rateModelId, DateUtil.formatTime(startTime2), "23:59:59", powerPriceTotal, divide);
System.out.println(">>>>>>跨天前>>>>>>>"+powerPriceTotal);
//明天
DateTime tomorrow = DateUtil.offsetDay(startTime2,1);
Date startTime3 = DateUtil.beginOfDay(tomorrow);
powerPriceTotal = getBigDecimal(rateModelId, DateUtil.formatTime(startTime3), DateUtil.formatTime(updateTime2), powerPriceTotal, divide);
System.out.println(">>>>>>跨天后>>>>>>>"+powerPriceTotal);
}
//算服务费和电费
if(amountCharged.compareTo(powerPriceTotal)>-1){
BigDecimal servicePriceTotal =amountCharged.subtract(powerPriceTotal);
message.put("powerPriceTotal",powerPriceTotal);
message.put("servicePriceTotal",servicePriceTotal);
}else{
message.put("powerPriceTotal",amountCharged);
message.put("servicePriceTotal",0);
}
//修改充电订单 //修改充电订单
xhpcChargeOrderService.updateXhpcChargeOrder(chargeOrder); xhpcChargeOrderService.updateXhpcChargeOrder(chargeOrder);
}catch (Exception e){ }catch (Exception e){
e.printStackTrace();
logger.info("======================异常订单审核异常=======================");
message.put("powerPriceTotal",0); message.put("powerPriceTotal",0);
message.put("servicePriceTotal",0); message.put("servicePriceTotal",0);
} }