diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java index e4d80b5d..26c08c9a 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java @@ -13,6 +13,7 @@ import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.common.core.web.service.BaseService; import com.xhpc.common.data.redis.CacheOrderData; import com.xhpc.common.data.redis.CacheRealtimeData; +import com.xhpc.common.domain.XhpcRate; import com.xhpc.common.enums.StopReasonEnum; import com.xhpc.common.redis.service.RedisService; import com.xhpc.common.security.service.TokenService; @@ -165,7 +166,6 @@ public class XhpcRealTimeOrderServiceImpl extends BaseService implements IXhpcRe @Transactional @Override public Map getExamineMessage(Long realTimeOrderId,Long chargeOrderId) { - if(realTimeOrderId==null){ Map message = xhpcRealTimeOrderMapper.getMessageChargeOrderId(chargeOrderId); 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())); - if(chargeOrder.getRateModelId()==null || "".equals(chargeOrder.getRateModelId())){ + if(chargeOrder.getRateModelId()==null || "".equals(chargeOrder.getRateModelId().toString())){ Map xhpcChargingStationMap = xhpcRealTimeOrderMapper.getXhpcChargingStationById(chargeOrder.getChargingStationId()); chargeOrder.setRateModelId(Long.valueOf(xhpcChargingStationMap.get("rateModelId").toString())); } //获取该订单最后一条实时数据 Map cacheMap = redisService.getCacheMap("order:" + chargeOrder.getSerialNumber()); - List list = (List) 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 0 && startData.getChargingTime()>0){ - break; + Long rateModelId = chargeOrder.getRateModelId(); + if(cacheMap !=null && cacheMap.get("orderData") !=null){ + CacheOrderData cacheOrderData = (CacheOrderData)cacheMap.get("orderData"); + BigDecimal bigDecimal = new BigDecimal(10000); + BigDecimal money = new BigDecimal(cacheOrderData.getCost()).divide(bigDecimal,2,BigDecimal.ROUND_HALF_UP); + //00: 尖费率 01: 峰费率 02: 平费率 03: 谷费率 + BigDecimal t1powerFee =new BigDecimal(0); + BigDecimal t2powerFee =new BigDecimal(0); + BigDecimal t3powerFee =new BigDecimal(0); + BigDecimal t4powerFee =new BigDecimal(0); + BigDecimal t1serviceFee =new BigDecimal(0); + BigDecimal t2serviceFee =new BigDecimal(0); + BigDecimal t3serviceFee =new BigDecimal(0); + BigDecimal t4serviceFee =new BigDecimal(0); + //费率计费模型 + List 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(); } } - } - - Long rateModelId = chargeOrder.getRateModelId(); - - if(endData !=null && endData.getAmountCharged() !=null && startData.getChargingTime()>0){ - - message.put("soc",endData.getSoc()); - //最后一祯时间 - 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 powerPrice =new BigDecimal(0); + BigDecimal servicePrice =new BigDecimal(0); + //因桩有误差,电费和服务费重新计算 + if(!"0".equals(cacheOrderData.getT1PowerQuantity().toString())){ + 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); + powerPrice=powerPrice.add(multiply1); + servicePrice=servicePrice.add(multiply2); } - BigDecimal chargingDegree = new BigDecimal(endData.getChargingDegree()).divide(new BigDecimal(10000), 2, BigDecimal.ROUND_HALF_UP); - message.put("chargingDegree",chargingDegree); - - chargeOrder.setStartTime(startTime); - chargeOrder.setEndTime(endTime); - chargeOrder.setStartSoc(startData.getSoc().toString()); - chargeOrder.setEndSoc(endData.getSoc().toString()); - chargeOrder.setChargingTimeNumber(tiem); - chargeOrder.setChargingDegree(chargingDegree); - chargeOrder.setType("平台停止"); - chargeOrder.setAmountCharged(new BigDecimal(endData.getAmountCharged()).divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP)); + if(!"0".equals(cacheOrderData.getT2PowerQuantity().toString())){ + 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); + powerPrice=powerPrice.add(multiply1); + servicePrice=servicePrice.add(multiply2); + } + if(!"0".equals(cacheOrderData.getT3PowerQuantity().toString())){ + BigDecimal multiply1 = new BigDecimal(cacheOrderData.getT3PowerQuantity()).divide(bigDecimal).multiply(t3powerFee).setScale(2, BigDecimal.ROUND_HALF_UP); + BigDecimal multiply2 = new BigDecimal(cacheOrderData.getT3PowerQuantity()).divide(bigDecimal).multiply(t3serviceFee).setScale(2, BigDecimal.ROUND_HALF_UP); + powerPrice=powerPrice.add(multiply1); + 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{ - //当没有缓存数据时,查询数据库 - 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); - - 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)); + if (cacheMap.get("startTime")!=null && cacheMap.get("lastOrderTime")!=null && cacheMap.get("totalPower")!=null && cacheMap.get("totalMoney")!=null) { + chargeOrder.setStartTime(DateUtil.parse(cacheMap.get("startTime").toString())); + chargeOrder.setStartTime(DateUtil.parse(cacheMap.get("lastOrderTime").toString())); + String totalPower = cacheMap.get("totalPower").toString(); + String totalPowerSub = totalPower.substring(0, totalPower.length() - 1); + chargeOrder.setChargingDegree(new BigDecimal(totalPowerSub)); }else{ - chargeOrder.setChargingTimeNumber(0L); + //没有获取到时间 1.获取缓存数据 2.缓存没有获取数据库数据 + List list = (List) 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 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.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); }catch (Exception e){ + e.printStackTrace(); + logger.info("======================异常订单审核异常======================="); message.put("powerPriceTotal",0); message.put("servicePriceTotal",0); }