From f2a57f2a9fa309f872d10c7fada992b63a0c0d5f Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期日, 27 十月 2024 20:52:48 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  193 +++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 166 insertions(+), 27 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 adc90fe..e7152ca 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
@@ -539,6 +539,7 @@
 		chargingOrder.setRechargePaymentStatus(2);
 		chargingOrder.setRechargeSerialNumber(transaction_id);
 		chargingOrder.setStatus(2);
+		chargingOrder.setPayTime(LocalDateTime.now());
 
 		//添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
 		PreChargeCheck preChargeCheck = new PreChargeCheck();
@@ -608,12 +609,16 @@
 						if(times > m){
 							//充电时间跨度两个计费策略,需要继续对下一个策略进行计算
 							serviceCharge = s_server_amount.multiply(new BigDecimal(m));
-							discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount)));
 							rechargeAmount1 = rechargeAmount1.subtract(s_total_amount.multiply(new BigDecimal(m)));
+							if(null != discount){
+								discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount)));
+							}
 							nowTimeMillis = null;
 						}else{
 							serviceCharge = s_server_amount.multiply(new BigDecimal(times));
-							discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount)));
+							if(null != discount){
+								discountAmount = discountAmount.add(serviceCharge.multiply(new BigDecimal(1).subtract(discount)));
+							}
 							break;
 						}
 					}
@@ -792,8 +797,11 @@
 		one.setRefundStatus(2);
 		one.setRefundTime(LocalDateTime.now());
 		chargingOrderRefundService.updateById(one);
+		
 		TChargingOrder chargingOrder = this.getById(one.getChargingOrderId());
-		chargingOrder.setPayTime(LocalDateTime.now());
+		chargingOrder.setRefundStatus(2);
+		chargingOrder.setRefundSerialNumber(refund_id);
+		chargingOrder.setRefundTime(LocalDateTime.now());
 		this.updateById(chargingOrder);
 		return AjaxResult.success();
 	}
@@ -836,6 +844,7 @@
 			Integer m = Integer.valueOf(data.getCumulative_charging_time() % 60);
 			chargingDetails.setChargedTime(String.format("%02d", h) + ":" + String.format("%02d", m));
 		}
+		//转换成UTC时间
 		ChargingHandshake chargingHandshake = chargingHandshakeClient.getDataByOrderCode(one.getCode()).getData();
 		if(null != chargingHandshake && null != data && null != one.getAppUserCarId()){
 			BigDecimal bms_battery_capacity = chargingHandshake.getBms_battery_capacity();
@@ -1283,8 +1292,8 @@
 			chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity());
 			chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getPaymentAmount());
 			BigDecimal bigDecimal = new BigDecimal("0.006");
-			if (chargingOrderListVO.getServiceCharge()!=null){
-				chargingOrderListVO.setCommissionAmount(chargingOrderListVO.getServiceCharge().multiply(bigDecimal));
+			if (chargingOrderListVO.getOrderAmount()!=null){
+				chargingOrderListVO.setCommissionAmount(chargingOrderListVO.getOrderAmount().multiply(bigDecimal));
 			}
 			chargingOrderListVO.setPaymentAmount(chargingOrderListVO.getResidualAmount()==null?chargingOrderListVO.getPaymentAmount():chargingOrderListVO.getPaymentAmount());
 			chargingOrderListVO.setUid(chargingOrderListVO.getId()+"");
@@ -1500,8 +1509,8 @@
 
 		chargingOrderListInfoVO.setStatus(chargingOrder.getStatus());
 		BigDecimal bigDecimal = new BigDecimal("0.006");
-		if (chargingOrder.getServiceCharge()!=null){
-			chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getServiceCharge().multiply(bigDecimal));
+		if (chargingOrder.getOrderAmount()!=null){
+			chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getOrderAmount().multiply(bigDecimal));
 		}
 		chargingOrderListInfoVO.setElectrovalence(chargingOrder.getElectrovalence());
 		chargingOrderListInfoVO.setServiceCharge(chargingOrder.getServiceCharge());
@@ -1865,7 +1874,7 @@
 		
 		//开始将优惠券优惠的金额添加到明细中
 		BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
-		if(couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){
+		if(null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){
 			List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId()));
 			for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
 				BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
@@ -1963,8 +1972,6 @@
 					SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
 					AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date()));
 					if(success.isSuccess()){
-						chargingOrder.setPayTime(LocalDateTime.now());
-						this.updateById(chargingOrder);
 						chargingOrderRefundService.save(chargingOrderRefund);
 					}
 				}
@@ -2043,7 +2050,7 @@
 	}
 
 	@Override
-	public Long getAver(List<Integer> siteIds) {
+	public Double getAver(List<Integer> siteIds) {
 		return this.baseMapper.getAver(siteIds);
 	}
 
@@ -2057,10 +2064,19 @@
 	private TShoppingOrderService shoppingOrderService;
 	@Resource
 	private TShoppingOrderRefundService shoppingOrderRefundService;
+	@Resource
+	private TVipOrderService vipOrderService;
+	@Resource
+	private TVipOrderRefundService vipOrderRefundService;
 	@Override
 	public R payRefund(PayOrderRefundDto payOrderQueryDto) {
 			if (payOrderQueryDto.getType()==1){
 				TChargingOrder tChargingOrder = this.baseMapper.selectById(payOrderQueryDto.getOrderId());
+				if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
+					return R.fail("退款金额需小于支付金额");
+				}
+
+
 				TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
 				chargingOrderRefund.setChargingOrderId(tChargingOrder.getId());
 				chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -2122,6 +2138,9 @@
 			}
 			if (payOrderQueryDto.getType()==2){
 				TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());
+				if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
+					return R.fail("退款金额需小于支付金额");
+				}
 				TShoppingOrderRefund chargingOrderRefund = new TShoppingOrderRefund();
 				chargingOrderRefund.setShoppingOrderId(tChargingOrder.getId());
 				chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -2171,6 +2190,10 @@
 
 						tChargingOrder.setRefundStatus(2);
 						tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+
+						if (payOrderQueryDto.getRefundAmount().compareTo(tChargingOrder.getPaymentAmount())==0){
+							tChargingOrder.setStatus(5);
+						}
 						shoppingOrderService.updateById(tChargingOrder);
 
 						shoppingOrderRefundService.save(chargingOrderRefund);
@@ -2179,6 +2202,71 @@
 				}
 
 			}
+
+		if (payOrderQueryDto.getType()==3){
+			TVipOrder tChargingOrder = vipOrderService.getById(payOrderQueryDto.getOrderId());
+			if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
+				return R.fail("退款金额需小于支付金额");
+			}
+			TVipOrderRefund chargingOrderRefund = new TVipOrderRefund();
+			chargingOrderRefund.setVipOrderId(tChargingOrder.getId());
+			chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
+			chargingOrderRefund.setRefundStatus(1);
+			chargingOrderRefund.setPayType(tChargingOrder.getPaymentType());
+			chargingOrderRefund.setRefundTime(LocalDateTime.now());
+			chargingOrderRefund.setCode(tChargingOrder.getCode());
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+			chargingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+			chargingOrderRefund.setRefundTitle("后台退款");
+			chargingOrderRefund.setRefundContent("后台退款");
+			chargingOrderRefund.setRefundReason("后台退款");
+			chargingOrderRefund.setRefundRemark(payOrderQueryDto.getRemark());
+			chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount()));
+			chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount());
+
+			if(1 == tChargingOrder.getPaymentType()){
+				WxPaymentRefundModel model = new WxPaymentRefundModel();
+				model.setOut_trade_no(tChargingOrder.getCode());
+				model.setOut_refund_no(chargingOrderRefund.getRefundCode());
+				model.setTransaction_id(tChargingOrder.getSerialNumber());
+				model.setReason("取消订单");
+				model.setNotify_url("/order/t-shopping-order/cancelShoppingOrderWxRefund");
+				WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+				amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
+				amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
+				amount.setCurrency("CNY");
+				model.setAmount(amount);
+				R<String> orderR = wxPaymentClient.refundOrderR(model);
+				if(200 == orderR.getCode()){
+					tChargingOrder.setRefundStatus(2);
+					tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+					vipOrderService.updateById(tChargingOrder);
+					vipOrderRefundService.save(chargingOrderRefund);
+				}
+			}
+
+			if(2 == tChargingOrder.getPaymentType()){
+				RefundReq dto = new RefundReq();
+				dto.setOutTradeNo(tChargingOrder.getCode());
+				dto.setOutRequestNo(tChargingOrder.getCode());
+				dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
+				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);
+
+				}
+			}
+
+		}
 
 
 
@@ -2233,6 +2321,7 @@
 		// 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表
 		QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
 				.eq("site_id", dto.getSiteId())
+				.eq("status", 5)
 				.eq("recharge_payment_status",2);
 		switch (dto.getType()){
 			case 1:
@@ -2290,31 +2379,27 @@
 			}
 			if (tChargingOrder.getRefundStatus()!=null &&tChargingOrder.getRefundStatus() == 2){
 				// 如果成功退款 那么减去退款金额
-				paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount().subtract(tChargingOrder.getRefundAmount()));
+				paymentAmount = paymentAmount.add(tChargingOrder.getOrderAmount());
 			}else{
 				if (tChargingOrder.getPaymentAmount()!=null){
-					paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount());
+					paymentAmount = paymentAmount.add(tChargingOrder.getOrderAmount());
 				}
 			}
 		}
 		// 三方交易手续费 三方收费*0.6%
 		commissionAmount = sharingAmount.multiply(new BigDecimal("0.006"));
 		// 订单手续费 订单支付金额 - 退款金额*0.6%
-		orderCommission = paymentAmount.multiply(new BigDecimal("0.006"));
-		tSettlementConfirm.setSharingAmount(sharingAmount);
-		tSettlementConfirm.setCommissionAmount(commissionAmount);
-		tSettlementConfirm.setElectrovalence(electrovalence);
-		// 服务费=总服务费-三费收费-交易手续费-交易手续费-服务费会员抵扣-服务费优惠券抵扣
-		tSettlementConfirm.setServiceCharge(serviceCharge.subtract(commissionAmount).subtract(sharingAmount).subtract(orderCommission).subtract(vipDiscount).subtract(couponDiscount));
+		orderCommission = paymentAmount.multiply(new BigDecimal("0.006").setScale(2,RoundingMode.HALF_DOWN));
+		tSettlementConfirm.setSharingAmount(sharingAmount.setScale(2, RoundingMode.HALF_DOWN));
+		tSettlementConfirm.setCommissionAmount(commissionAmount.setScale(2, RoundingMode.HALF_DOWN));
+		tSettlementConfirm.setElectrovalence(electrovalence.setScale(2, RoundingMode.HALF_DOWN));
+		tSettlementConfirm.setServiceCharge(serviceCharge.setScale(2, RoundingMode.HALF_DOWN));
 		tSettlementConfirm.setOrderCommission(orderCommission);
 		tSettlementConfirm.setVipDiscount(vipDiscount);
 		tSettlementConfirm.setCouponDiscount(couponDiscount);
 		tSettlementConfirm.setSiteId(dto.getSiteId());
 		tSettlementConfirm.setChargingElectronic(chargingElectronic);
 		tSettlementConfirm.setIncome(chargingElectronic.add(serviceCharge));
-		tSettlementConfirm.setProfitMoney(new BigDecimal("0"));
-		tSettlementConfirm.setNewMoney(new BigDecimal("0"));
-		tSettlementConfirm.setNewSettlement(new BigDecimal("0"));
 		tSettlementConfirm.setVipDiscount(vipDiscount);
 		tSettlementConfirm.setCouponDiscount(couponDiscount);
 		tSettlementConfirm.setType(dto.getType());
@@ -2335,11 +2420,23 @@
 			tSettlementConfirm.setRemark(dto.getRemark());
 			tSettlementConfirm.setServicePartner(dto.getServicePartner());
 			tSettlementConfirm.setServiceMoney(dto.getServiceMoney());
+			BigDecimal subtract = new BigDecimal("1").subtract(dto.getProportionPartner());
+			// 总电损费用
+			BigDecimal divide = tSettlementConfirm.getProportionMoney().divide(subtract, 2, RoundingMode.HALF_DOWN);
+			// 平台承担电损
+			BigDecimal subtract1 = divide.subtract(tSettlementConfirm.getProportionMoney());
+			BigDecimal multiply = dto.getServiceMoney().multiply(subtract);
+			BigDecimal subtract2 = multiply.subtract(subtract1);
+			tSettlementConfirm.setNewMoney(subtract2);
+
 			tSettlementConfirm.setTotalService(dto.getTotalService());
 			tSettlementConfirm.setServiceRemark(dto.getServiceRemark());
 			tSettlementConfirm.setDistribution(dto.getDistribution());
 			tSettlementConfirm.setIncome(dto.getElectrovalence().add(dto.getServiceCharge()));
-			tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain()));
+			tSettlementConfirm.setCost(dto.getVenue().add(dto.getClean()).add(dto.getMaintain()).add(dto.getMetering()));
+			tSettlementConfirm.setProfitMoney(chargingElectronic.add(serviceCharge).subtract(tSettlementConfirm.getCost()));
+			tSettlementConfirm.setNewSettlement(subtract2.subtract(tSettlementConfirm.getCost()));
+
 			tSettlementConfirmMapper.insert(tSettlementConfirm);
 		}
 		return tSettlementConfirm;
@@ -2347,6 +2444,18 @@
 
 	@Override
 	public PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto) {
+		if (StringUtils.hasLength(dto.getStartTime())){
+			dto.setType(1);
+			String[] split = dto.getStartTime().split(" - ");
+			dto.setStartTime(split[0]);
+			dto.setEndTime(split[1]);
+		}
+		if (StringUtils.hasLength(dto.getEndTime())){
+			dto.setType(2);
+			String[] split = dto.getStartTime().split(" - ");
+			dto.setStartTime(split[0]);
+			dto.setEndTime(split[1]);
+		}
 		PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
 		List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo,dto);
 		for (TSettlementConfirm tSettlementConfirm : list) {
@@ -2411,11 +2520,12 @@
 //		tSettlementConfirm1.setIncomePercentage();
 //		tSettlementConfirm1.setTotalPercentage();
 		tSettlementConfirm1.setElectronicRefund(0);
-// 上月成本合计
+		// 上月成本合计
 		BigDecimal beforeCost= new BigDecimal("0");
 		// 上月利润合计
 		BigDecimal beforeIncome= new BigDecimal("0");
 		for (TSettlementConfirm tSettlementConfirm : list1) {
+			tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
 			List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData();
 			if (!data1.isEmpty()){
 				tSettlementConfirm.setSiteName(data1.get(0).getName());
@@ -2468,11 +2578,14 @@
 			StringBuilder stringBuilder = new StringBuilder();
 			for (TChargingOrder tChargingOrder : tChargingOrders) {
 				stringBuilder.append(tChargingOrder.getCode()).append(",");
+
 			}
+			// 充电总时长
+
 			Long temp = 0L;
 			if (StringUtils.hasLength(stringBuilder.toString())){
 				List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getOrderInfoByCodes(stringBuilder.substring(0,stringBuilder.length()-1)).getData();
-				temp+=data6.stream().mapToLong(UploadRealTimeMonitoringData::getCumulative_charging_time).sum();
+				temp+=(data6.stream().mapToLong(UploadRealTimeMonitoringData::getCumulative_charging_time).sum()*60);
 			}
 			List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData();
 			// 计算充电桩的功率平均值
@@ -2483,11 +2596,32 @@
 
 
 			tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge()));
-			// todo 计算利用率 该电站充电桩本月利用率:
 			//利用率=充电量/(桩数量*功率*时间)
+			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) {
 				settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge()));
+				tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
 				if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())){
 					// 电站相同比较收入涨幅跌幅
 					if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO)>0){
@@ -2544,7 +2678,7 @@
 			tSettlementConfirm.setIncomePercentage(0+"%");
 			tSettlementConfirm.setIncomePercentage(0+"%");
 		}else{
-			BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
+			BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome,2,RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
 			tSettlementConfirm.setIncomePercentage(subtract+"%");
 			tSettlementConfirm.setIncomePercentage(subtract+"%");
 
@@ -2664,4 +2798,9 @@
 		info.setDuration(0 == hour ? String.format("%s分钟", second) : String.format("%s小时%s分钟", hour, second));
 		return info;
 	}
+
+	@Override
+	public Long countNoTag() {
+		return this.baseMapper.countNoTag();
+	}
 }

--
Gitblit v1.7.1