查询订单折扣

This commit is contained in:
Guoqs
2025-03-25 15:16:51 +08:00
parent 8e1fcd008d
commit a180c1d830
4 changed files with 180 additions and 16 deletions

View File

@@ -4,22 +4,14 @@ import com.alibaba.fastjson2.JSON;
import com.google.common.collect.ImmutableMap;
import com.jsowell.adapay.dto.BalancePaymentRequestDTO;
import com.jsowell.adapay.service.AdapayService;
import com.jsowell.common.YouDianUtils;
import com.jsowell.common.annotation.Anonymous;
import com.jsowell.common.core.controller.BaseController;
import com.jsowell.common.core.domain.AjaxResult;
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.common.enums.ebike.EBikeStopReasonEnum;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.response.RestApiResponse;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.SecurityUtils;
import com.jsowell.pile.domain.AdapayMemberAccount;
import com.jsowell.pile.domain.MemberPlateNumberRelation;
import com.jsowell.pile.domain.OrderBasicInfo;
import com.jsowell.pile.domain.PileMerchantInfo;
import com.jsowell.pile.domain.ebike.deviceupload.EBikeMessageCmd03;
import com.jsowell.pile.domain.*;
import com.jsowell.pile.domain.ykcCommond.EBikeStartChargingCommand;
import com.jsowell.pile.domain.ykcCommond.ReservationChargingCommand;
import com.jsowell.pile.domain.ykcCommond.StopChargingCommand;
@@ -733,6 +725,26 @@ public class TempController extends BaseController {
return response;
}
/**
* 查询订单折扣接口
* http://localhost:8080/order/queryOrderDiscount
*/
@PostMapping("/queryOrderDiscount")
public RestApiResponse<?> queryOrderDiscount(@RequestBody QueryOrderDTO dto) {
RestApiResponse<?> response;
try {
OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(dto.getOrderCode());
OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderBasicInfo.getOrderCode());
// 计算订单折扣
tempService.calculateOrderDiscountsV2(orderBasicInfo, orderDetail);
response = new RestApiResponse<>();
} catch (Exception e) {
logger.error("查询订单折扣接口 error,", e);
response = new RestApiResponse<>();
}
return response;
}
/**
* 重试订单退款接口/重试退款按钮 (批量)

View File

@@ -29,9 +29,7 @@ import com.jsowell.pile.dto.SettleOrderReportDTO;
import com.jsowell.pile.mapper.OrderBasicInfoMapper;
import com.jsowell.pile.mapper.PileMsgRecordMapper;
import com.jsowell.pile.service.*;
import com.jsowell.pile.vo.web.ClearingBillVO;
import com.jsowell.pile.vo.web.OrderListVO;
import com.jsowell.pile.vo.web.OrderPaymentDetailVO;
import com.jsowell.pile.vo.web.*;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,6 +38,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -67,6 +66,9 @@ public class TempService {
@Autowired
private AdapayCallbackRecordService adapayCallbackRecordService;
@Autowired
protected MemberGroupService memberGroupService;
@Autowired
private WxpayRefundCallbackService wxpayRefundCallbackService;
@@ -724,5 +726,146 @@ public class TempService {
// 关闭未支付订单
orderBasicInfoService.closeUnpaidOrders(unpaidOrderList);
}
public void calculateOrderDiscountsV2(OrderBasicInfo orderBasicInfo, OrderDetail orderDetail) {
String memberId = orderBasicInfo.getMemberId(); // 会员id
String stationId = orderBasicInfo.getStationId(); // 站点id
String merchantId = orderBasicInfo.getMerchantId(); // 运营商id
if (orderDetail == null) {
logger.info("计算订单折扣V2, OrderDetail为空(orderCode:{}, transactionCode:{}), 直接返回!",
orderBasicInfo.getOrderCode(), orderBasicInfo.getTransactionCode());
return;
}
// 原始电费金额
BigDecimal originalTotalElectricityAmount = orderDetail.getTotalElectricityAmount();
// 原始服务费金额
BigDecimal originalTotalServiceAmount = orderDetail.getTotalServiceAmount();
// 电费折扣金额 初始值为0
BigDecimal electricityAmountDiscount = BigDecimal.ZERO;
// 服务费折扣金额 初始值为0
BigDecimal serviceAmountDiscount = BigDecimal.ZERO;
// 优惠后电费金额 初始值为优惠前金额
BigDecimal afterDiscountElectricityAmount = BigDecimal.ZERO;
// 优惠后服务费金额 初始值为优惠前金额
BigDecimal afterDiscountServiceAmount = BigDecimal.ZERO;
// 查询会员在该站点享受的优惠
MemberDiscountVO memberDiscountVO = memberGroupService.queryMemberDiscountV2(merchantId, stationId, memberId);
if (memberDiscountVO == null) {
// 如果没有优惠,则优惠后金额 等于优惠前金额
afterDiscountServiceAmount = orderDetail.getTotalServiceAmount();
afterDiscountElectricityAmount = orderDetail.getTotalElectricityAmount();
} else {
// 集团会员的订单,记录集团编号
orderBasicInfo.setGroupCode(memberDiscountVO.getGroupCode());
// 集团会员的优惠计费模板
BillingTemplateVO billingTemplateVO = memberDiscountVO.getBillingTemplateVO();
// 尖时段用电量
BigDecimal sharpUsedElectricity = orderDetail.getSharpUsedElectricity();
if (sharpUsedElectricity != null) {
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal sharpElectricityAmount = billingTemplateVO.getSharpElectricityPrice()
.multiply(sharpUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 计算该时段服务费
BigDecimal sharpServiceAmount = billingTemplateVO.getSharpServicePrice()
.multiply(sharpUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 汇总
afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(sharpElectricityAmount);
afterDiscountServiceAmount = afterDiscountServiceAmount.add(sharpServiceAmount);
}
// 峰时段用电量
BigDecimal peakUsedElectricity = orderDetail.getPeakUsedElectricity();
if (peakUsedElectricity != null) {
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal peakElectricityAmount = billingTemplateVO.getPeakElectricityPrice()
.multiply(peakUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 计算该时段服务费
BigDecimal peakServiceAmount = billingTemplateVO.getPeakServicePrice()
.multiply(peakUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 汇总
afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(peakElectricityAmount);
afterDiscountServiceAmount = afterDiscountServiceAmount.add(peakServiceAmount);
}
// 平时段用电量
BigDecimal flatUsedElectricity = orderDetail.getFlatUsedElectricity();
if (flatUsedElectricity != null) {
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal flatElectricityAmount = billingTemplateVO.getFlatElectricityPrice()
.multiply(flatUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 计算该时段服务费
BigDecimal flatServiceAmount = billingTemplateVO.getFlatServicePrice()
.multiply(flatUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 汇总
afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(flatElectricityAmount);
afterDiscountServiceAmount = afterDiscountServiceAmount.add(flatServiceAmount);
}
// 谷时段用电量
BigDecimal valleyUsedElectricity = orderDetail.getValleyUsedElectricity();
if (valleyUsedElectricity != null) {
// 计算该时段电费 = 电费单价 x 用电量
BigDecimal valleyElectricityAmount = billingTemplateVO.getValleyElectricityPrice()
.multiply(valleyUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 计算该时段服务费
BigDecimal valleyServiceAmount = billingTemplateVO.getValleyServicePrice()
.multiply(valleyUsedElectricity)
.setScale(2, RoundingMode.DOWN);
// 汇总
afterDiscountElectricityAmount = afterDiscountElectricityAmount.add(valleyElectricityAmount);
afterDiscountServiceAmount = afterDiscountServiceAmount.add(valleyServiceAmount);
}
// 计算优惠了多少钱
// 电费折扣金额 = 优惠前电费 - 优惠后电费
electricityAmountDiscount = originalTotalElectricityAmount.subtract(afterDiscountElectricityAmount);
// 服务费折扣金额 = 优惠前服务费 - 优惠后服务费
serviceAmountDiscount = originalTotalServiceAmount.subtract(afterDiscountServiceAmount);
}
/*
更新 数据
*/
// 订单折扣金额 = 电费折扣金额 + 服务费折扣金额
BigDecimal discountAmount = electricityAmountDiscount.add(serviceAmountDiscount);
orderBasicInfo.setDiscountAmount(discountAmount);
// 更新结算金额 结算金额 = 消费金额 - 虚拟金额 - 优惠金额
BigDecimal newSettleAmount = orderBasicInfo.getSettleAmount().subtract(discountAmount);
if (newSettleAmount.compareTo(BigDecimal.ZERO) < 0) {
// 如果结算金额为0减去优惠金额后为负数还设置为0
newSettleAmount = BigDecimal.ZERO;
}
orderBasicInfo.setSettleAmount(newSettleAmount);
// 优惠后总消费金额 = 折扣后电费 + 折扣后服务费
BigDecimal totalConsumeAmount = afterDiscountServiceAmount.add(afterDiscountElectricityAmount);
// 更新退款金额 = 支付金额 - 优惠后总消费金额
BigDecimal refundAmount = orderBasicInfo.getPayAmount().subtract(totalConsumeAmount).setScale(2, RoundingMode.DOWN);
orderBasicInfo.setRefundAmount(refundAmount);
// 电费折扣金额(电费便宜了多少钱)
orderDetail.setDiscountElectricityAmount(electricityAmountDiscount);
// 服务费折扣金额(服务费便宜了多少钱)
orderDetail.setDiscountServiceAmount(serviceAmountDiscount);
logger.info("计算订单折扣, orderCode:{}, memberId:{}, 订单折扣金额:{}, 电费折扣金额:{}, 服务费折扣金额:{}, 优惠后总消费金额:{}",
orderBasicInfo.getOrderCode(), memberId, discountAmount, electricityAmountDiscount, serviceAmountDiscount, totalConsumeAmount);
}
}