From 4bf9185195316791f0339af501f12d97d8519c2c Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期六, 04 一月 2025 11:52:47 +0800
Subject: [PATCH] 修改计费bug

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  182 ++++++++++++++++++++++++++++++--------------
 1 files changed, 123 insertions(+), 59 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
index e21b823..6766c5f 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -1928,68 +1928,132 @@
 		chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
 		SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 		List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>();
-		for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
-			Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
-			try {
-				AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
-				//阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
-				Object invoke = null;
-				switch (strategyDetail.getType()){
-					case 1:
-						//充电度数
-						invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
-						break;
-					case 2:
-						//充电度数
-						invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
-						break;
-					case 3:
-						//充电度数
-						invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
-						break;
-					case 4:
-						//充电度数
-						invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
-						break;
+		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();
+				boolean b = false;
+				Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
+				for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
+					AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
+					long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime();
+					if(start >= time){
+						b = true;
+					}
+					//开始充电
+					if(b){
+						//阶段(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);
+					}
 				}
-				if(null == invoke || Double.valueOf(invoke.toString()) == 0){
-					continue;
+				
+				//第二天的
+				//开始通过计费策略遍历解析每个时段的费用明细
+				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;
+					}
+					//开始充电
+					if(b){
+						//阶段(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);
+					}
 				}
-				BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
-				AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
-				BeanUtils.copyProperties(strategyDetail, vo1);
-				vo1.setStart(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime());
-				vo1.setEnd(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime());
-				vo1.setChargingCapacity(sharp_peak_charge);
-				lists.add(vo1);
-			} catch (IllegalAccessException e) {
-				throw new RuntimeException(e);
-			} catch (InvocationTargetException e) {
-				throw new RuntimeException(e);
-			} catch (NoSuchMethodException e) {
-				throw new RuntimeException(e);
-			} catch (ParseException e) {
-				throw new RuntimeException(e);
+			}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);
+				}
 			}
-		}
-		Collections.sort(lists, new Comparator<AccountingStrategyDetailOrderVo>() {
-			public int compare(AccountingStrategyDetailOrderVo s1, AccountingStrategyDetailOrderVo s2) {
-				return s1.getStart() < s2.getStart() ? -1 : s1.getStart() == s2.getStart() ? 0 : 1;
-			}
-		});
-		if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){
-			List<AccountingStrategyDetailOrderVo> list1 = new ArrayList<>(lists);
-			for (AccountingStrategyDetailOrderVo orderVo : list1) {
-				Calendar start = Calendar.getInstance();
-				start.setTimeInMillis(orderVo.getStart());
-				start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1);
-				orderVo.setStart(start.getTimeInMillis());
-				Calendar end = Calendar.getInstance();
-				end.setTimeInMillis(orderVo.getEnd());
-				end.set(Calendar.DAY_OF_YEAR, end.get(Calendar.DAY_OF_YEAR) + 1);
-				orderVo.setEnd(end.getTimeInMillis());
-			}
-			lists.addAll(list1);
+		}catch (Exception e){
+			e.printStackTrace();
 		}
 		
 		//开始处理明细

--
Gitblit v1.7.1