From 98a1fc9eaa470f64eb117c3b112431fe22193346 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期二, 15 十月 2024 18:29:33 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java | 5
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 447 ++++++++++++++++++++++----------------------
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java | 9
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java | 7
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java | 16 +
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java | 2
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java | 49 ++++
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java | 20 ++
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java | 5
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java | 11 +
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java | 12
11 files changed, 351 insertions(+), 232 deletions(-)
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java
index f46fc43..1ab909b 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java
@@ -58,7 +58,7 @@
@TableField("vip_id")
private Integer vipId;
- @ApiModelProperty(value = "1月卡2季卡3年卡")
+ @ApiModelProperty(value = "1月卡2季卡3年卡4集团")
@TableField("vip_type")
private Integer vipType;
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
index 56baedd..e4a99c5 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -153,6 +153,11 @@
public void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply) {
log.error("停止充电应答处理失败:" + throwable.getMessage());
}
+
+ @Override
+ public void endChargeBillingCharge(TransactionRecordMessageVO vo) {
+ log.error("停止充电返回账单后计算费用处理失败:" + throwable.getMessage());
+ }
};
}
}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
index ae33132..3f10657 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -199,4 +199,11 @@
*/
@PostMapping("/t-charging-order/terminateSuccessfulResponse")
void terminateSuccessfulResponse(@RequestBody PlatformStopChargingReplyVO platformStopChargingReply);
+
+ /**
+ * 停止充电返回账单后计算费用
+ * @param vo
+ */
+ @PostMapping("/t-charging-order/endChargeBillingCharge")
+ void endChargeBillingCharge(@RequestBody TransactionRecordMessageVO vo);
}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
index 382ce1d..0202131 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
@@ -158,6 +158,10 @@
@ApiModelProperty(value = "退款流水号")
@TableField("refund_code")
private String refundCode;
+
+ @ApiModelProperty(value = "标题")
+ @TableField("title")
+ private String title;
@ApiModelProperty(value = "退款原因")
@TableField(exist = false)
private String refundReason;
@@ -173,6 +177,18 @@
@ApiModelProperty(value = "累计电费")
@TableField("electrovalence")
private BigDecimal electrovalence;
+ @ApiModelProperty(value = "电流")
+ @TableField("current")
+ private BigDecimal current;
+ @ApiModelProperty(value = "电压")
+ @TableField("voltage")
+ private BigDecimal voltage;
+ @ApiModelProperty(value = "电量")
+ @TableField("electricity")
+ private BigDecimal electricity;
+ @ApiModelProperty(value = "功率")
+ @TableField("power")
+ private BigDecimal power;
@ApiModelProperty(value = "退款状态(1=退款中,2=退款成功)")
@TableField("refund_status")
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java
new file mode 100644
index 0000000..7a6ce29
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java
@@ -0,0 +1,49 @@
+package com.ruoyi.order.api.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 交易记录
+ **/
+
+@Data
+public class TransactionRecordMessageVO {
+
+ private String transaction_serial_number;// 交易流水号
+ private String charging_pile_code;// 桩编码
+ private String charging_gun_code;// 抢号
+ private String start_time;// 开始时间
+ private String end_time;// 结束时间
+ private BigDecimal sharp_peak_unit_price;// 尖单价
+ private BigDecimal sharp_peak_charge;// 尖电量
+ private BigDecimal loss_sharp_peak_charge;// 计损尖电量
+ private BigDecimal sharp_peak_amount;// 尖金额
+ private BigDecimal peak_unit_price;// 峰单价
+ private BigDecimal peak_charge;// 峰电量
+ private BigDecimal loss_peak_charge;// 计损峰电量
+ private BigDecimal peak_amount;// 峰金额
+ private BigDecimal flat_peak_unit_price;// 平单价
+ private BigDecimal flat_peak_charge;// 平电量
+ private BigDecimal loss_flat_peak_charge;// 计损平电量
+ private BigDecimal flat_peak_amount;// 平金额
+ private BigDecimal low_peak_unit_price;// 谷单价
+ private BigDecimal low_peak_charge;// 谷电量
+ private BigDecimal loss_low_peak_charge;// 计损谷电量
+ private BigDecimal low_peak_amount;// 谷金额
+ private BigDecimal total_initial_value;// 电表总起值
+ private BigDecimal total_stop_value;// 电表总止值
+ private BigDecimal total_electricity;// 总电量
+ private BigDecimal loss_total_electricity;// 计损总电量
+ private BigDecimal payment_amount;// 消费金额
+ private String vin;// 电动汽车唯一标识
+ private Integer start_method;// 交易标识(1:app 启动,2:卡启动,4:离线卡启动,5: vin 码启动充电)
+ private String trade_date;// 交易日期、时间
+ private Integer stop_reason;// 停止原因
+ private String physical_card_number;// 物理卡号
+
+
+}
+
+
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
index d26dc29..4648622 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -443,5 +443,25 @@
String message = iotMessageProduce.sendMessage(platformStopCharging.getCharging_pile_code(), ServiceIdMenu.PLATFORM_STOP_CHARGING.getKey(),messageUtil.platformStopCharging(platformStopCharging));
return R.ok(message);
}
+ @ApiOperation(value = "计费模板下发",tags = {"硬件接口"})
+ @GetMapping(value = "/accountingStrategy")
+ public R accountingStrategy() {
+ String code = "3401231001200202";
+ String deviceId = "3401231001200202";
+ List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(code).getData();
+ Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails);
+ // 价格设置
+ AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply();
+ StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply);
+ // 时段设置
+ StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply);
+ TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailByCode(code).getData();
+ acquisitionBillingModeReply.setBilling_model_code(accountingStrategyDetail.getId().toString());
+ acquisitionBillingModeReply.setCharging_pile_code(code);
+ acquisitionBillingModeReply.setLoss_ratio(BigDecimal.ZERO);
+ System.err.println(acquisitionBillingModeReply);
+ iotMessageProduce.sendMessage(deviceId, ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getKey(),messageUtil.acquisitionBillingModeReply(acquisitionBillingModeReply));
+ return R.ok();
+ }
}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java
index f999d66..261e9c7 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java
@@ -36,25 +36,29 @@
public static void setStrategyPrice(Map<Integer, TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) {
accountingStrategyDetails.forEach((k,v)->{
BigDecimal electrovalence = v.getElectrovalence();
+ BigDecimal serviceCharge = v.getServiceCharge();
if(Objects.isNull(electrovalence)){
electrovalence = BigDecimal.ZERO;
+ }
+ if(Objects.isNull(serviceCharge)){
+ serviceCharge = BigDecimal.ZERO;
}
switch (k){
case 1:
acquisitionBillingModeReply.setSharp_peak_electricity_rate(electrovalence);
- acquisitionBillingModeReply.setSharp_peak_service_rate(new BigDecimal(0));
+ acquisitionBillingModeReply.setSharp_peak_service_rate(serviceCharge);
break;
case 2:
acquisitionBillingModeReply.setPeak_electricity_rate(electrovalence);
- acquisitionBillingModeReply.setPeak_service_rate(new BigDecimal(0));
+ acquisitionBillingModeReply.setPeak_service_rate(serviceCharge);
break;
case 3:
acquisitionBillingModeReply.setFlat_peak_electricity_rate(electrovalence);
- acquisitionBillingModeReply.setFlat_peak_service_rate(new BigDecimal(0));
+ acquisitionBillingModeReply.setFlat_peak_service_rate(serviceCharge);
break;
default:
acquisitionBillingModeReply.setLow_peak_electricity_rate(electrovalence);
- acquisitionBillingModeReply.setLow_peak_service_rate(new BigDecimal(0));
+ acquisitionBillingModeReply.setLow_peak_service_rate(serviceCharge);
break;
}
});
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
index 3e49851..d89f907 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
@@ -22,6 +22,7 @@
import com.ruoyi.order.api.vo.PlatformStartChargingReplyMessageVO;
import com.ruoyi.order.api.vo.PlatformStopChargingReplyVO;
import com.ruoyi.order.api.vo.SecurityDetectionVO;
+import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
@@ -365,6 +366,10 @@
chargingOrderRecord.setTotalElectricity(transactionRecordMessage.getTotal_electricity());
chargingOrderClient.updateChargingOrder(chargingOrderRecord);
}
+ //计算费用
+ TransactionRecordMessageVO vo = new TransactionRecordMessageVO();
+ BeanUtils.copyProperties(transactionRecordMessage,vo);
+ chargingOrderClient.endChargeBillingCharge(vo);
break;
case SendTagConstant.UPDATE_BALANCE_REPLY:
UpdateBalanceReplyMessage updateBalanceReplyMessage = message.getUpdateBalanceReplyMessage();
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index badb3e7..15d8184 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -579,6 +579,17 @@
}
+ /**
+ * 停止充电返回账单后计算费用
+ * @param vo
+ */
+ @PostMapping("/endChargeBillingCharge")
+ public void endChargeBillingCharge(@RequestBody TransactionRecordMessageVO vo){
+ log.error("-------------------停止充电返回账单后计算费用及修改业务状态-------------------:" + vo);
+ chargingOrderService.endChargeBillingCharge(vo);
+ }
+
+
@ResponseBody
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
index 5af0c8e..0593bb3 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -170,7 +170,14 @@
* @param code
*/
void endCharge(String code, Integer endMode);
-
+
+ /**
+ * 停止充电返回账单后计算费用
+ * @param vo
+ */
+ void endChargeBillingCharge(TransactionRecordMessageVO vo);
+
+
/**
* 异常结束充电处理逻辑
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 53455e0..780c63f 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
@@ -532,9 +532,9 @@
@GlobalTransactional(rollbackFor = Exception.class)
public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) {
TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
-// if(chargingOrder.getRechargePaymentStatus() == 2){
-// return AjaxResult.success();
-// }
+ if(chargingOrder.getRechargePaymentStatus() == 2){
+ return AjaxResult.success();
+ }
chargingOrder.setRechargePaymentStatus(2);
chargingOrder.setRechargeSerialNumber(transaction_id);
chargingOrder.setStatus(2);
@@ -911,7 +911,7 @@
public ChargingDetails getChargingDetails(Integer id) {
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::getEndTime).last(" limit 0, 1"));
+ .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0).orderByDesc(TChargingOrder::getStartTime).last(" limit 0, 1"));
if(null == one){
return null;
}
@@ -1028,12 +1028,11 @@
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
- continue;
}else{
log.error(code1 + ":-------------------远程停止充电请求成功-------------------");
stop_status = true;
+ break;
}
- break;
}
if(stop_status){
chargingOrder.setStatus(5);
@@ -1043,8 +1042,6 @@
editUserTag(chargingOrder);
//用户推荐奖励
referralReward(chargingOrder);
- //计算费用,处理退款
- endCharge(chargingOrder);
// 将枪状态重置为空闲
chargingGun.setStatus(2);
chargingGunClient.updateChargingGunById(chargingGun);
@@ -1213,210 +1210,12 @@
}
log.error(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause);
}else{
- order.setEndTime(LocalDateTime.now());
- order.setStatus(5);
order.setEndMode(1);
this.updateById(order);
- //计算用户标签
- editUserTag(order);
- //用户推荐奖励
- referralReward(order);
- //计算费用,处理退款
- endCharge(order);
- // 将枪状态重置为空闲
- chargingGun.setStatus(2);
- chargingGunClient.updateChargingGunById(chargingGun);
}
}
-
-
-
- /**
- * 手动结束后的费用计算和退款逻辑
- */
- @GlobalTransactional(rollbackFor = Exception.class)
- public void endCharge(TChargingOrder chargingOrder){
- //如果使用优惠券需要判断优惠券是否满足使用条件
- //根据实际的充电金额计算退款金额 退回费用=(原金额/总金额)*(总金额-实际充电金额)
- //退款金额=优惠券金额+剩余充电金额
- List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
- BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
- BigDecimal periodServicePrice_total = BigDecimal.ZERO;
- BigDecimal total = BigDecimal.ZERO;
- for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
- BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
- BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
- periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
- periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
- total = total.add(periodElectricPrice).add(periodServicePrice);
- }
- //原金额
- BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
- BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount();
- //总金额(充值金额+会员折扣金额)
- BigDecimal decimal = rechargeAmount.add(vipDiscountAmount);
- //退款金额(已经计算了折扣优惠部分)
- BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total));
- BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
- BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue());
- //折扣金额
- BigDecimal discountAmount = BigDecimal.ZERO;
- if(null != chargingOrder.getVipDiscount()){
- //服务费折扣
- discountAmount = periodServicePrice_total.multiply((new BigDecimal(10).subtract(chargingOrder.getVipDiscount())).divide(new BigDecimal(10)));
-
- TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
- if(null != appUser.getVipId()){
- //判断会员是否还有充电优惠次数
- GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
- getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
- getAppUserVipDetail.setVipId(appUser.getVipId());
- TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
- if(null != data && data.getChargeNum() > 0){
- data.setChargeNum(data.getChargeNum() - 1);
- appUserVipDetailClient.updateAppUserVipDetail(data);
- }
-
- TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
- BigDecimal maximumDeduction = vip.getMaximumDeduction();
- //普通会员有最高优惠限制
- if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){
- discountAmount = maximumDeduction;
- }
- }
- payAmount = payAmount.subtract(discountAmount);
- }
-
- if(chargingOrder.getEndMode() == 2){
- chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
- }
- chargingOrder.setStatus(5);
- chargingOrder.setOrderAmount(orderAmount);
- chargingOrder.setVipDiscountAmount(discountAmount);
-
- //计算优惠券
- if(null != chargingOrder.getAppCouponId()){
- //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
- TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
- String couponJson = appCoupon.getCouponJson();
- TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
- Integer preferentialMode = tCoupon.getPreferentialMode();
- if(1 == preferentialMode){
- //满减
- if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
- refundAmount = refundAmount.add(tCoupon.getDiscountAmount());
- chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount());
- payAmount = payAmount.subtract(tCoupon.getDiscountAmount());
- }else{
- chargingOrder.setAppCouponId(null);
- chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
- appCouponClient.refund(chargingOrder.getAppCouponId().toString());
- }
- }
- if(2 == preferentialMode){
- //抵扣
- if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
- //折扣金额
- BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
- divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
- refundAmount = refundAmount.add(divide);
- chargingOrder.setCouponDiscountAmount(divide);
- payAmount = payAmount.subtract(divide);
- }else{
- chargingOrder.setAppCouponId(null);
- chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
- appCouponClient.refund(chargingOrder.getAppCouponId().toString());
- }
- }
- }
- chargingOrder.setPaymentAmount(payAmount);
- this.updateById(chargingOrder);
-
- //添加积分
- TIntegralRule integralRule = integralRuleClient.getSet().getData();
- if(null != integralRule){
- TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
- Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
- Integer integral = payAmount.multiply(new BigDecimal(num1)).intValue();
- if(null != appUser.getVipId()){
- TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
- Integer doubleIntegration = vip.getDoubleIntegration();
- //双倍积分
- if(1 == doubleIntegration){
- integral *= 2;
- }
- }
-
- TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
- appUserIntegralChange.setAppUserId(appUser.getId());
- appUserIntegralChange.setChangeType(2);
- appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
- appUser.setPoints(appUser.getPoints() + integral);
- appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
- appUserIntegralChange.setCreateTime(LocalDateTime.now());
- appUserIntegralChange.setOrderCode(chargingOrder.getCode());
- appUserClient.updateAppUser(appUser);
- appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
- }
-
-
- //开始构建退款费用
- 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());
- chargingOrderRefund.setRefundTitle("充电完成退款");
- chargingOrderRefund.setRefundContent("充电完成退款");
- chargingOrderRefund.setRefundReason("充电完成退款");
- chargingOrderRefund.setRefundRemark("充电完成退款");
- chargingOrderRefund.setRefundTotalAmount(refundAmount);
- chargingOrderRefund.setPayAmount(rechargeAmount);
- if(1 == rechargePaymentType){
- WxPaymentRefundModel model = new WxPaymentRefundModel();
- model.setOut_trade_no(chargingOrder.getCode());
- model.setOut_refund_no(chargingOrderRefund.getRefundCode());
- model.setReason("充电完成退款");
- model.setNotify_url("/payment/wx/refund/notify");
- WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
- amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
- amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
- amount.setCurrency("CNY");
- model.setAmount(amount);
- R<String> orderR = wxPaymentClient.refundOrderR(model);
- if(200 == orderR.getCode()){
- chargingOrderRefundService.save(chargingOrderRefund);
- }
- }
- if(2 == rechargePaymentType){
- RefundReq dto = new RefundReq();
- dto.setOutTradeNo(chargingOrder.getCode());
- dto.setOutRequestNo(chargingOrderRefund.getCode());
- dto.setRefundAmount(rechargeAmount.toString());
- dto.setRefundReason("充电完成退款");
- RefundResp resp = aliPaymentClient.refund(dto).getData();
- if(null != resp){
- 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()){
- chargingOrderRefundService.save(chargingOrderRefund);
- }
- }
- }
-
- }
-
-
- }
@@ -1935,13 +1734,21 @@
if(chargingOrderAccountingStrategy.getAccountingStrategyDetailId().equals(strategyDetail.getId())){
//已充电总度数
BigDecimal charging_degree = query.getCharging_degree();
- BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
- BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
+ BigDecimal chargingCapacity = chargingOrderAccountingStrategy.getChargingCapacity();
+ //计算本阶段充电度数
+ BigDecimal subtract = charging_degree.subtract(chargingCapacity);
+ //计算本阶段费用
+ BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(subtract);
+ BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(subtract);
BigDecimal serviceCharge = originalServicePrice;
//计算优惠金额
if(null != chargingOrder.getVipDiscount()){
serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
}
+ //将本阶段的费用增加到总费用中
+ electrovalenc = electrovalenc.add(chargingOrderAccountingStrategy.getPeriodElectricPrice());
+ originalServicePrice = originalServicePrice.add(chargingOrderAccountingStrategy.getPeriodOriginalServicePrice());
+ serviceCharge = serviceCharge.add(chargingOrderAccountingStrategy.getPeriodServicePrice());
chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
@@ -2000,25 +1807,8 @@
@GlobalTransactional(rollbackFor = Exception.class)
public void endCharge(String orderCode, Integer endMode) {
TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
- Integer status = chargingOrder.getStatus();
- if(status == 4 || status == 5){
- return;
- }
- chargingOrder.setStatus(5);
chargingOrder.setEndMode(endMode);
- chargingOrder.setEndTime(LocalDateTime.now());
this.updateById(chargingOrder);
- // 将枪状态重置为空闲
- TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
- chargingGun.setStatus(2);
- chargingGunClient.updateChargingGunById(chargingGun);
-
- //计算用户标签
- editUserTag(chargingOrder);
- //用户推荐奖励
- referralReward(chargingOrder);
- //计算费用,处理退款
- endCharge(chargingOrder);
}
/**
@@ -2029,7 +1819,212 @@
public void excelEndCharge(String orderCode) {
endCharge(orderCode, 0);
}
-
+
+
+ /**
+ * 停止充电返回账单后计算费用
+ * @param vo
+ */
+ @Override
+ @GlobalTransactional(rollbackFor = Exception.class)
+ public void endChargeBillingCharge(TransactionRecordMessageVO vo) {
+ TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
+ Integer status = chargingOrder.getStatus();
+ if(status == 4 || status == 5){
+ return;
+ }
+
+ //计算用户标签
+ editUserTag(chargingOrder);
+ //用户推荐奖励
+ referralReward(chargingOrder);
+
+ //如果使用优惠券需要判断优惠券是否满足使用条件
+ //根据实际的充电金额计算退款金额 退回费用=(原金额/总金额)*(总金额-实际充电金额)
+ //退款金额=优惠券金额+剩余充电金额
+ List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
+ BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
+ BigDecimal periodServicePrice_total = BigDecimal.ZERO;
+ BigDecimal total = BigDecimal.ZERO;
+ for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
+ BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
+ BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
+ periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
+ periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
+ total = total.add(periodElectricPrice).add(periodServicePrice);
+ }
+ //原金额
+ BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+ BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount();
+ //总金额(充值金额+会员折扣金额)
+ BigDecimal decimal = rechargeAmount.add(vipDiscountAmount);
+ //退款金额(已经计算了折扣优惠部分)
+ BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total));
+ BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
+ BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue());
+ //折扣金额
+ BigDecimal discountAmount = BigDecimal.ZERO;
+ if(null != chargingOrder.getVipDiscount()){
+ //服务费折扣
+ discountAmount = periodServicePrice_total.multiply((new BigDecimal(10).subtract(chargingOrder.getVipDiscount())).divide(new BigDecimal(10)));
+
+ TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+ if(null != appUser.getVipId()){
+ //判断会员是否还有充电优惠次数
+ GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
+ getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
+ getAppUserVipDetail.setVipId(appUser.getVipId());
+ TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
+ if(null != data && data.getChargeNum() > 0){
+ data.setChargeNum(data.getChargeNum() - 1);
+ appUserVipDetailClient.updateAppUserVipDetail(data);
+ }
+
+ TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
+ BigDecimal maximumDeduction = vip.getMaximumDeduction();
+ //普通会员有最高优惠限制
+ if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){
+ discountAmount = maximumDeduction;
+ }
+ }
+ payAmount = payAmount.subtract(discountAmount);
+ }
+
+ if(chargingOrder.getEndMode() == 2){
+ chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
+ }
+ chargingOrder.setEndTime(LocalDateTime.now());
+ chargingOrder.setStatus(5);
+ chargingOrder.setOrderAmount(orderAmount);
+ chargingOrder.setVipDiscountAmount(discountAmount);
+ chargingOrder.setServiceCharge(periodServicePrice_total);
+ chargingOrder.setElectrovalence(periodElectricPrice_total);
+
+ //计算优惠券
+ if(null != chargingOrder.getAppCouponId()){
+ //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
+ TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
+ String couponJson = appCoupon.getCouponJson();
+ TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
+ Integer preferentialMode = tCoupon.getPreferentialMode();
+ if(1 == preferentialMode){
+ //满减
+ if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
+ refundAmount = refundAmount.add(tCoupon.getDiscountAmount());
+ chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount());
+ payAmount = payAmount.subtract(tCoupon.getDiscountAmount());
+ }else{
+ chargingOrder.setAppCouponId(null);
+ chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
+ appCouponClient.refund(chargingOrder.getAppCouponId().toString());
+ }
+ }
+ if(2 == preferentialMode){
+ //抵扣
+ if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
+ //折扣金额
+ BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
+ divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
+ refundAmount = refundAmount.add(divide);
+ chargingOrder.setCouponDiscountAmount(divide);
+ payAmount = payAmount.subtract(divide);
+ }else{
+ chargingOrder.setAppCouponId(null);
+ chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
+ appCouponClient.refund(chargingOrder.getAppCouponId().toString());
+ }
+ }
+ }
+ chargingOrder.setPaymentAmount(payAmount);
+ this.updateById(chargingOrder);
+
+ // 将枪状态重置为空闲
+ TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+ chargingGun.setStatus(2);
+ chargingGunClient.updateChargingGunById(chargingGun);
+
+ //添加积分
+ TIntegralRule integralRule = integralRuleClient.getSet().getData();
+ if(null != integralRule){
+ TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+ Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
+ Integer integral = payAmount.multiply(new BigDecimal(num1)).intValue();
+ if(null != appUser.getVipId()){
+ TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
+ Integer doubleIntegration = vip.getDoubleIntegration();
+ //双倍积分
+ if(1 == doubleIntegration){
+ integral *= 2;
+ }
+ }
+
+ TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
+ appUserIntegralChange.setAppUserId(appUser.getId());
+ appUserIntegralChange.setChangeType(2);
+ appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
+ appUser.setPoints(appUser.getPoints() + integral);
+ appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
+ appUserIntegralChange.setCreateTime(LocalDateTime.now());
+ appUserIntegralChange.setOrderCode(chargingOrder.getCode());
+ appUserClient.updateAppUser(appUser);
+ appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
+ }
+
+
+ //开始构建退款费用
+ 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());
+ chargingOrderRefund.setRefundTitle("充电完成退款");
+ chargingOrderRefund.setRefundContent("充电完成退款");
+ chargingOrderRefund.setRefundReason("充电完成退款");
+ chargingOrderRefund.setRefundRemark("充电完成退款");
+ chargingOrderRefund.setRefundTotalAmount(refundAmount);
+ chargingOrderRefund.setPayAmount(rechargeAmount);
+ if(1 == rechargePaymentType){
+ WxPaymentRefundModel model = new WxPaymentRefundModel();
+ model.setOut_trade_no(chargingOrder.getCode());
+ model.setOut_refund_no(chargingOrderRefund.getRefundCode());
+ model.setReason("充电完成退款");
+ model.setNotify_url("/payment/wx/refund/notify");
+ WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+ amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
+ amount.setCurrency("CNY");
+ model.setAmount(amount);
+ R<String> orderR = wxPaymentClient.refundOrderR(model);
+ if(200 == orderR.getCode()){
+ chargingOrderRefundService.save(chargingOrderRefund);
+ }
+ }
+ if(2 == rechargePaymentType){
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(chargingOrder.getCode());
+ dto.setOutRequestNo(chargingOrderRefund.getCode());
+ dto.setRefundAmount(rechargeAmount.toString());
+ dto.setRefundReason("充电完成退款");
+ RefundResp resp = aliPaymentClient.refund(dto).getData();
+ if(null != resp){
+ 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()){
+ chargingOrderRefundService.save(chargingOrderRefund);
+ }
+ }
+ }
+
+ }
+ }
+
@Override
public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) {
return this.baseMapper.getByDate(chargingOrderIds);
--
Gitblit v1.7.1