From 74b0e0814e37d640596f44ec86d20fa9ecce9ed6 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 05 二月 2025 10:42:06 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  778 +++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 620 insertions(+), 158 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 9e8be3a..00e1c84 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
@@ -9,6 +9,7 @@
 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;
@@ -19,6 +20,7 @@
 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;
@@ -58,6 +60,8 @@
 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;
@@ -76,6 +80,7 @@
 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.*;
@@ -98,7 +103,8 @@
 	private ChargingGunClient chargingGunClient;
 	@Resource
 	private TSettlementConfirmMapper tSettlementConfirmMapper;
-
+	@Resource
+	private PartnerClient partnerClient;
 	@Resource
 	private SiteClient siteClient;
 	
@@ -882,10 +888,13 @@
 				dto.setRefundReason("充电失败,取消充电订单");
 				RefundResp resp = aliPaymentClient.refund(dto).getData();
 				if(null != resp){
-					AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", null);
-					if(success.isSuccess()){
-						chargingOrderRefundService.save(chargingOrderRefund);
+					chargingOrderRefundService.save(chargingOrderRefund);
+					try {
+						Thread.sleep(1000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
 					}
+					chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
 				}
 			}
 
@@ -932,7 +941,7 @@
 		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){
+		if(null == one || !one.getAppUserId().equals(userId)){
 			return null;
 		}
 		ChargingDetails chargingDetails = new ChargingDetails();
@@ -982,6 +991,10 @@
 		}
 		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));
@@ -1138,7 +1151,7 @@
 		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() != 3){
+		if(null != order && order.getStatus() != 4){
 			return;
 		}
 		
@@ -1205,6 +1218,41 @@
 			}
 			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");
@@ -1215,7 +1263,16 @@
 		 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());
 		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.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0"));
 			chargingOrderVO.setPlatFormMoney(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN):new BigDecimal("0"));
 			chargingOrderVO.setUid(chargingOrderVO.getId()+"");
@@ -1233,10 +1290,13 @@
 			// 充电订单 明细记录
 			List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>()
 					.eq("charging_order_id", chargingOrderVO.getId()));
-			UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
-			if (data5!=null){
-				long l = data5.getCumulative_charging_time() * 60L;
-				chargingOrderVO.setChargingSecond(l);
+			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();
@@ -1257,27 +1317,31 @@
 
 			}
 		}
+
+
+		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.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0"));
 			if (chargingOrderVO.getChargingCapacity()!=null){
-				total = total.add(chargingOrderVO.getElectricity());
+				total = total.add(chargingOrderVO.getElectricity()!=null?chargingOrderVO.getElectricity():new BigDecimal("0"));
 			}
-			// 充电订单 明细记录
-			List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>()
-					.eq("charging_order_id", chargingOrderVO.getId()));
-			UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
-			if (data5!=null){
-				long l = data5.getCumulative_charging_time() * 60L;
-				chargingOrderVO.setChargingSecond(l);
-				time+=l;
+			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 = chargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getRefundStatus, 2)
-					.eq(TChargingOrderRefund::getChargingOrderId, chargingOrderVO.getId()).list();
+			List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId()))
+					.collect(Collectors.toList());
 			for (TChargingOrderRefund tChargingOrderRefund : list2) {
-				if (tChargingOrderRefund.getRefundStatus()==2){
 					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"));
@@ -1336,8 +1400,8 @@
 	}
 
 	@Override
-	public Map<String, Object> countAll(LocalDate sixBefore) {
-		return this.baseMapper.countAll(sixBefore);
+	public Map<String, Object> countAll(LocalDate sixBefore,List<Integer> siteIds) {
+		return this.baseMapper.countAll(sixBefore,siteIds);
 	}
 
 	@Override
@@ -1365,7 +1429,8 @@
 		return this.baseMapper.getYearData(chargingOrderIds);
 	}
 
-	
+	@Resource
+	private SysUserClient sysUserClient;
 	@Override
 	public ChargingOrderTimeVO chargingList(ChargingListQuery dto) {
 		String startTime1 = null;
@@ -1409,9 +1474,52 @@
 				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){
@@ -1421,9 +1529,9 @@
 			chargingOrderListVO.setUid(chargingOrderListVO.getId()+"");
 			List<Integer> integers = new ArrayList<>();
 			integers.add(chargingOrderListVO.getSiteId());
-			List<Site> data = siteClient.getSiteByIds(integers).getData();
-			if (!data.isEmpty()) {
-				chargingOrderListVO.setSiteName(data.get(0).getName());
+			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 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData();
@@ -1432,13 +1540,12 @@
 					chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
 				}
 			}
-			// 获取充电时间
-			UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderListVO.getCode()).getData();
-			if (data5!=null){
-				if (data5.getTime_remaining()!=null){
-					chargingOrderListVO.setChargingSecond(data5.getCumulative_charging_time()*60L);
-
-				}
+			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){
@@ -1474,7 +1581,6 @@
 						}
 					}
 					chargingOrderListVO.setPhone(data3.getPhone());
-
 				}
 			}
 			List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery()
@@ -1523,6 +1629,28 @@
 		// 不分页
 		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 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData();
+				TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderListVO.getChargingPileId()).getData();
+				if (data2 != null && data1 != null) {
+					chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
+				}
+			}
+		}
 		chargingOrderTimeVO.setExportList(list1);
 		chargingOrderTimeVO.setOrderCount(list1.size());
 		// 计算充电总度数
@@ -1548,14 +1676,17 @@
 		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 = chargingOrderAccountingStrategyService.lambdaQuery()
-					.eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list();
+			List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId()))
+					.collect(Collectors.toList());
 			for (TChargingOrderAccountingStrategy temp : list2) {
 				switch (temp.getType()){
 					case 1:
@@ -1637,6 +1768,8 @@
 	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){
@@ -1713,13 +1846,12 @@
 
 			chargingOrderListInfoVO.setList(data6);
 		}
-		// 获取充电时间
-		UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
-		if (data5!=null){
-			if (data5.getTime_remaining()!=null){
-				chargingOrderListInfoVO.setChargingSecond(data5.getCumulative_charging_time()*60L+"");
-
-			}
+		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){
@@ -1834,83 +1966,134 @@
 		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);
+		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;
-					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;
+					}
+					//阶段(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);
 				}
-				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;
+					}
+					//阶段(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();
 		}
 		
 		//开始处理明细
-		SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS");
-		SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
-		Date start = null;
-		Date end = null;
-		try {
-			start = sdf3.parse(vo.getStart_time());
-			end = sdf3.parse(vo.getEnd_time());
-		} catch (ParseException e) {
-			throw new RuntimeException(e);
-		}
-
-		for (AccountingStrategyDetailOrderVo strategyDetail : lists) {
+		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());
@@ -1919,16 +2102,17 @@
 			chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
 			chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
 			chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
-			
-			if(start.getTime() >= strategyDetail.getStart()){
-				chargingOrderAccountingStrategy.setStartTime(sdf2.format(start));
+			if(i == 0){
+				String time = vo.getStart_time().split(" ")[1];
+				chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":")));
 			}else{
 				chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime());
 			}
-			if(end.getTime() >= strategyDetail.getEnd()){
-				chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
+			if(i == lists.size() - 1){
+				String time = vo.getEnd_time().split(" ")[1];
+				chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":")));
 			}else{
-				chargingOrderAccountingStrategy.setEndTime(sdf2.format(end));
+				chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
 			}
 			
 			//已充电总度数
@@ -1938,6 +2122,7 @@
 			BigDecimal vipDiscountAmount = BigDecimal.ZERO;
 			//计算优惠金额
 			if(null != chargingOrder.getVipDiscount()){
+				//0.58折
 				vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount()));
 				serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount());
 			}
@@ -1953,8 +2138,6 @@
 			periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
 			total = total.add(electrovalenc.add(originalServicePrice));
 		}
-		
-		
 		
 		//原金额
 		BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
@@ -2137,6 +2320,7 @@
 		referralReward(chargingOrder);
 		
 		//开始构建退款费用
+		refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
 		if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
 			Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
 			//构建退款明细
@@ -2174,20 +2358,21 @@
 			if(2 == rechargePaymentType){
 				RefundReq dto = new RefundReq();
 				dto.setOutTradeNo(chargingOrder.getCode());
-				dto.setOutRequestNo(chargingOrderRefund.getCode());
+				dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
 				dto.setRefundAmount(refundAmount.toString());
 				dto.setRefundReason("充电完成退款");
 				RefundResp resp = aliPaymentClient.refund(dto).getData();
 				if(null != resp){
-					AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", null);
-					if(success.isSuccess()){
-						chargingOrderRefundService.save(chargingOrderRefund);
-					}
+					chargingOrderRefundService.save(chargingOrderRefund);
+					this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
 				}
 			}
 			
 		}
 	}
+	
+	
+	
 	
 	@Override
 	public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) {
@@ -2210,8 +2395,8 @@
 	}
 
 	@Override
-	public List<Map<String, Object>> usersDay() {
-		return this.baseMapper.usersDay();
+	public List<Map<String, Object>> usersDay(ChargingStatisticsQueryDto statisticsQueryDto) {
+		return this.baseMapper.usersDay(statisticsQueryDto);
 	}
 
 	@Override
@@ -2277,6 +2462,10 @@
 	private TVipOrderService vipOrderService;
 	@Resource
 	private TVipOrderRefundService vipOrderRefundService;
+	
+	
+	
+	
 	@Override
 	public R payRefund(PayOrderRefundDto payOrderQueryDto) {
 			if (payOrderQueryDto.getType()==1){
@@ -2334,7 +2523,6 @@
 					dto.setRefundReason("取消订单");
 					RefundResp resp = aliPaymentClient.refund(dto).getData();
 					if(null != resp){
-						SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
 						chargingOrderRefund.setRefundStatus(2);
 						chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
 						this.baseMapper.updateById(tChargingOrder);
@@ -2342,11 +2530,6 @@
 
 					}
 				}
-
-
-
-
-
 			}
 			if (payOrderQueryDto.getType()==2){
 				TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());
@@ -2402,16 +2585,10 @@
 					dto.setRefundReason("取消订单");
 					RefundResp resp = aliPaymentClient.refund(dto).getData();
 					if(null != resp){
-						SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
-
 						tChargingOrder.setRefundStatus(2);
 						tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
-
-
 						shoppingOrderService.updateById(tChargingOrder);
-
 						shoppingOrderRefundService.save(chargingOrderRefund);
-
 					}
 				}
 
@@ -2422,8 +2599,6 @@
 			if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
 				return R.fail("退款金额需小于支付金额");
 			}
-
-
 			TVipOrderRefund chargingOrderRefund = new TVipOrderRefund();
 			chargingOrderRefund.setVipOrderId(tChargingOrder.getId());
 			chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -2469,23 +2644,13 @@
 				dto.setRefundReason("取消订单");
 				RefundResp resp = aliPaymentClient.refund(dto).getData();
 				if(null != resp){
-					SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
-
 					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();
 	}
 
@@ -2541,7 +2706,7 @@
 				.eq("recharge_payment_status",2);
 		switch (dto.getType()){
 			case 1:
-				eq.between("start_time", localDateTime, localDateTime1);
+				eq.between("pay_time", localDateTime, localDateTime1);
 				break;
 			case 2:
 				eq.between("end_time", localDateTime, localDateTime1);
@@ -2677,9 +2842,49 @@
 		}
 		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()){
@@ -2702,12 +2907,265 @@
 
 	@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);
+		}
 		SettlementTotalVO res = new SettlementTotalVO();
-		List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time);
+		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);
+		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 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData();
+			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 = this.baseMapper.selectList(eq);
+			Map<String,TChargingOrder> map = new HashMap<>();
+			StringBuilder stringBuilder = new StringBuilder();
+			for (TChargingOrder tChargingOrder : tChargingOrders) {
+				stringBuilder.append(tChargingOrder.getCode()).append(",");
+
+			}
+			// 充电总时长
+
+			Long temp = 1L;
+			if (StringUtils.hasLength(stringBuilder.toString())){
+				String substring = stringBuilder.substring(0, stringBuilder.length() - 1);
+				for (String s : substring.split(",")) {
+					UploadRealTimeMonitoringData data6 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(s).getData();
+					if (data6!=null){
+						temp+=(data6.getCumulative_charging_time()*60);
+
+					}
+
+				}
+			}
+			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 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);
+		}
+		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<>();
 
@@ -3010,6 +3468,10 @@
 	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());

--
Gitblit v1.7.1