mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-20 11:05:18 +08:00
查询订单折扣
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 重试订单退款接口/重试退款按钮 (批量)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user