From 8ca33caf9f4c2bef4c6775d7d9eb7002673110b5 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期四, 13 十一月 2025 18:01:02 +0800
Subject: [PATCH] 增加退款金额超出剩余金额的逻辑

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java                            |   68 ++++++++++++++++++++-------------
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/UploadRealTimeMonitoringDataService.java          |   12 ++++++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java                               |    4 ++
 ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml                                                                  |    8 ++--
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java |   16 ++++++++
 5 files changed, 77 insertions(+), 31 deletions(-)

diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
index daec325..0cb076f 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -173,6 +173,10 @@
     @ApiOperation(value = "选择车辆列表", tags = {"小程序-扫一扫"})
     @PostMapping(value = "/scan/carList")
     public R<List<TAppUserCar>> carList() {
+        String token = SecurityUtils.getToken(ServletUtils.getRequest());
+        if(!StringUtils.hasLength(token)){
+            return R.ok(new ArrayList<>());
+        }
         List<TAppUserCar> appUserId = appUserCarService.list(new QueryWrapper<TAppUserCar>()
                 .eq("app_user_id",tokenService.getLoginUserApplet().getUserId()));
         appUserId.forEach(s->s.setId_(s.getId().toString()));
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml
index e0d0a05..073be15 100644
--- a/ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml
+++ b/ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml
@@ -57,14 +57,14 @@
         service: ${spring.application.name}
         group: DEFAULT_GROUP
         namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
-        username: nacos
-        password: nacos
+        username: mxcd
+        password: Mxdlcdz@#2024&
       config:
         # 配置中心地址
         server-addr: 192.168.0.137:8848,192.168.0.123:8848
         namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
-        username: nacos
-        password: nacos
+        username: mxcd
+        password: Mxdlcdz@#2024&
         group: DEFAULT_GROUP
         name: ${spring.application.name}
         # 配置文件格式
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 070bbbc..ff3a2bc 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
@@ -1804,7 +1804,11 @@
 		PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
 		List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
 		List<Site> sites = siteClient.getSiteAll().getData();
-		
+		List<Long> collect1 = list.stream().map(ChargingOrderListVO::getId).collect(Collectors.toList());
+		if(collect1.isEmpty()){
+			collect1.add(-1L);
+		}
+		List<TChargingOrderAccountingStrategy> chargingOrderAccountingStrategies = chargingOrderAccountingStrategyService.list();
 		for (ChargingOrderListVO chargingOrderListVO : list) {
 			if (roleType == 2) {
 				List<Boolean> data = partnerClient.getChargingListMenu(sysUser.getObjectId(), chargingOrderListVO.getSiteId()).getData();
@@ -1840,21 +1844,13 @@
 			}
 			// 获取开始SOC 结束soc
 			if (chargingOrderListVO.getCode() != null) {
-				List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrderListVO.getCode());
-				
-				if (data6 != null && !data6.isEmpty()) {
-					int min = 100;
-					int max = 0;
-					for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
-						if (uploadRealTimeMonitoringData.getSoc() > max) {
-							max = uploadRealTimeMonitoringData.getSoc();
-						}
-						if (uploadRealTimeMonitoringData.getSoc() != 0 && uploadRealTimeMonitoringData.getSoc() < min) {
-							min = uploadRealTimeMonitoringData.getSoc();
-						}
-					}
-					chargingOrderListVO.setEndSoc(max + "");
-					chargingOrderListVO.setStartSoc(min + "");
+				UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrderListVO.getCode(), "asc");
+				UploadRealTimeMonitoringData desc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrderListVO.getCode(), "desc");
+				if(null != asc){
+					chargingOrderListVO.setStartSoc(asc.getSoc().toString());
+				}
+				if(null != desc){
+					chargingOrderListVO.setEndSoc(desc.getSoc().toString());
 				}
 			}
 			
@@ -1876,8 +1872,7 @@
 					chargingOrderListVO.setPhone(data3.getPhone());
 				}
 			}
-			List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery()
-					.eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list();
+			List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(s->s.getChargingOrderId().equals(chargingOrderListVO.getId())).collect(Collectors.toList());
 			// 尖峰平谷充电量 度数
 			BigDecimal jian = new BigDecimal("0");
 			BigDecimal feng = new BigDecimal("0");
@@ -1925,6 +1920,9 @@
 				chargingOrderListVO.setSharingAmount(new BigDecimal("0"));
 			}
 		}
+
+
+
 		// 不分页
 		PageInfo<ChargingOrderListVO> pageInfo1 = new PageInfo<>(1, 999999999);
 		List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(pageInfo1, dto, startTime1, startTime2, endTime1, endTime2);
@@ -1975,7 +1973,6 @@
 		BigDecimal feng = new BigDecimal("0");
 		BigDecimal ping = new BigDecimal("0");
 		BigDecimal gu = new BigDecimal("0");
-		List<TChargingOrderAccountingStrategy> chargingOrderAccountingStrategies = chargingOrderAccountingStrategyService.list();
 		for (ChargingOrderListVO chargingOrderListVO : list1) {
 			List<TChargingOrderAccountingStrategy> collect = chargingOrderAccountingStrategies.stream().filter(s -> s.getChargingOrderId().equals(chargingOrderListVO.getId())).collect(Collectors.toList());
 			BigDecimal periodServicePrice = collect.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -1991,9 +1988,7 @@
 				paymentAmount = paymentAmount.add(periodElectricPrice).add(periodServicePrice);
 			}
 			if (!chargingOrderListVO.getOrderSource().equals(2)) {
-				List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId()))
-						.collect(Collectors.toList());
-				for (TChargingOrderAccountingStrategy temp : list2) {
+				for (TChargingOrderAccountingStrategy temp : collect) {
 					switch (temp.getType()) {
 						case 1:
 							jian = jian.add(temp.getChargingCapacity());
@@ -2018,9 +2013,7 @@
 					}
 				}
 			} else {
-				List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId()))
-						.collect(Collectors.toList());
-				for (TChargingOrderAccountingStrategy temp : list2) {
+				for (TChargingOrderAccountingStrategy temp : collect) {
 					BigDecimal multiply = temp.getPeriodServicePrice().multiply(new BigDecimal("0.8"));
 					switch (temp.getType()) {
 						case 1:
@@ -2684,15 +2677,14 @@
 				
 				//开始构建退款费用
 				refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
+				Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
 				if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
-					Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
 					//构建退款明细
 					TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
 					chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
 					SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
 					chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
 					chargingOrderRefund.setRefundAmount(refundAmount);
-					chargingOrderRefund.setRefundStatus(1);
 					chargingOrderRefund.setPayType(rechargePaymentType);
 					chargingOrderRefund.setRefundStatus(1);
 					chargingOrderRefund.setCode(chargingOrder.getCode());
@@ -2748,6 +2740,28 @@
 							this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
 						}
 					}
+				}else{
+					//构建退款明细
+					TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
+					chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
+					SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+					chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+					chargingOrderRefund.setRefundAmount(refundAmount);
+					chargingOrderRefund.setRefundStatus(2);
+					chargingOrderRefund.setPayType(rechargePaymentType);
+					chargingOrderRefund.setCode(chargingOrder.getCode());
+					chargingOrderRefund.setRefundTitle("充电完成退款");
+					chargingOrderRefund.setRefundContent("充电完成退款");
+					chargingOrderRefund.setRefundReason("充电完成退款");
+					chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
+					chargingOrderRefund.setRefundTotalAmount(refundAmount);
+					chargingOrderRefund.setPayAmount(rechargeAmount);
+					chargingOrderRefund.setRefundTime(LocalDateTime.now());
+					chargingOrderRefundService.save(chargingOrderRefund);
+
+					chargingOrder.setRefundStatus(2);
+					chargingOrder.setRefundTime(LocalDateTime.now());
+					this.updateById(chargingOrder);
 				}
 			}
 			
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/UploadRealTimeMonitoringDataService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/UploadRealTimeMonitoringDataService.java
index ae90d10..5343237 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/UploadRealTimeMonitoringDataService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/UploadRealTimeMonitoringDataService.java
@@ -16,6 +16,18 @@
 	 * @return
 	 */
 	List<UploadRealTimeMonitoringData> getDataByOrderCode(String code);
+
+
+	/**
+	 * 查询数据,排序
+	 * @param code
+	 * @param sort
+	 * @return
+	 */
+	UploadRealTimeMonitoringData getDataByOrderCode(String code, String sort);
+
+
+
 	UploadRealTimeMonitoringPageData getDataAll(MongoChargingOrderQuery mongoChargingOrderQuery) throws ParseException;
 
 	/**
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
index 1e0b313..fb4bdd8 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
@@ -60,6 +60,22 @@
         return uploadRealTimeMonitoringData;
     }
 
+
+    @Override
+    public UploadRealTimeMonitoringData getDataByOrderCode(String code, String sort) {
+        Query query = new Query();
+        if(StringUtils.isNotEmpty(code)){
+            query = query.addCriteria(Criteria.where("transaction_serial_number").is(code));
+        }
+        if("asc".equals(sort)){
+            query = query.with(Sort.by(Sort.Order.asc("create_time")));
+        }else{
+            query = query.with(Sort.by(Sort.Order.desc("create_time")));
+        }
+        query = query.limit(1);
+        return mongoTemplate.findOne(query, UploadRealTimeMonitoringData.class);
+    }
+
     @Override
     public UploadRealTimeMonitoringPageData getDataAll(MongoChargingOrderQuery mongoChargingOrderQuery) throws ParseException {
         Query query = new Query();

--
Gitblit v1.7.1