update 计算订单会员折扣逻辑

This commit is contained in:
2024-01-11 16:14:35 +08:00
parent 2c50f827b1
commit e71ddfb2c8
8 changed files with 104 additions and 56 deletions

View File

@@ -499,9 +499,13 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
// settleOrder(data, orderInfo);
// 新逻辑
String mode = pileMerchantInfoService.getDelayModeByMerchantId(orderInfo.getMerchantId());
AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(mode);
orderLogic.settleOrder(data, orderInfo);
try {
String mode = pileMerchantInfoService.getDelayModeByMerchantId(orderInfo.getMerchantId());
AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(mode);
orderLogic.settleOrder(data, orderInfo);
} catch (Exception e) {
logger.error("充电桩启动失败,执行退款逻辑发生异常", e);
}
}
/**
@@ -2369,12 +2373,12 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
if (platformTesterVO != null && StringUtils.equals(Constants.ONE, platformTesterVO.getStatus())) {
// 是平台测试员
accountBalance = new BigDecimal("500");
accountBalance = Constants.whitelistDefaultAmount;
payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();
} else if (pileStationWhitelist != null) {
// 站点白名单
accountBalance = new BigDecimal("500");
accountBalance = Constants.whitelistDefaultAmount;
payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();
} else {
// 通过memberId获取账户余额
@@ -2384,9 +2388,13 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
}
accountBalance = memberVO.getTotalAccountAmount();
if (accountBalance.compareTo(BigDecimal.ZERO) <= 0) {
logger.info("充电桩主动申请启动充电生成订单 余额不足", JSON.toJSONString(dto));
logger.info("充电桩主动申请启动充电生成订单 余额不足, memberId:{}, MemberVO:{}", dto.getMemberId(), JSON.toJSONString(memberVO));
throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT);
}
BigDecimal defaultAmount = Constants.balancePayMaxAmount;
if (accountBalance.compareTo(defaultAmount) > 0) {
accountBalance = defaultAmount;
}
payMode = OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue();
// accountBalance = memberVO.getTotalAccountAmount();
// dto.setChargeAmount(totalAccountAmount); // 充电金额
@@ -2961,7 +2969,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
resultMap.put("weixinMap", weixinMap);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付
// 白名单支付可以直接调支付回调方法
dto.setPayAmount(new BigDecimal("500"));
dto.setPayAmount(Constants.whitelistDefaultAmount);
whiteListPayOrder(dto);
}
return resultMap;

View File

@@ -19,6 +19,8 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class OrderPayRecordServiceImpl implements OrderPayRecordService {
@@ -50,6 +52,10 @@ public class OrderPayRecordServiceImpl implements OrderPayRecordService {
@Override
public int batchInsert(List<OrderPayRecord> payRecordList) {
if (CollectionUtils.isEmpty(payRecordList)) {
return 0;
}
payRecordList = payRecordList.stream().filter(Objects::nonNull).collect(Collectors.toList());
return orderPayRecordMapper.batchInsert(payRecordList);
}

View File

@@ -22,6 +22,7 @@ import com.jsowell.pile.dto.*;
import com.jsowell.pile.service.*;
import com.jsowell.pile.transaction.dto.OrderTransactionDTO;
import com.jsowell.pile.transaction.service.TransactionService;
import com.jsowell.pile.vo.uniapp.MemberVO;
import com.jsowell.pile.vo.uniapp.PileConnectorDetailVO;
import com.jsowell.pile.vo.web.*;
import com.jsowell.wxpay.service.WxAppletRemoteService;
@@ -481,27 +482,6 @@ public abstract class AbstractProgramLogic implements InitializingBean {
return resultMap;
}
public static void main(String[] args) {
// BigDecimal orderAmount= new BigDecimal("0.06");
// List<OrderPayRecord> payRecordList = Lists.newArrayList();
String deductionRecord = "[{\"paymentId\":\"002212023091416010010548305359259512832\",\"amount\":0.97},{\"paymentId\":\"002212023091416110010548307874223849472\",\"amount\":1.00}]";
// payRecordList.add(OrderPayRecord.builder().deductionRecord(deductionRecord).build());
Object object = JSON.parse(deductionRecord);
// 都放入list里
List<PaymentInfo> resultList = Lists.newArrayList();
String s = JSON.toJSONString(object);
if (object instanceof JSONArray) {
List<PaymentInfo> paymentInfos = JSON.parseArray(s, PaymentInfo.class);
resultList.addAll(paymentInfos);
} else {
PaymentInfo paymentInfo = JSON.parseObject(s, PaymentInfo.class);
resultList.add(paymentInfo);
}
System.out.println(JSON.toJSONString(resultList));
}
/**
* 计算解冻金额
* @param orderAmount 订单消费金额
@@ -789,8 +769,34 @@ public abstract class AbstractProgramLogic implements InitializingBean {
BigDecimal discountAmount = discountServiceAmount.add(discountElectricityAmount);
orderBasicInfo.setDiscountAmount(discountAmount);
// 更新退款金额 = 退款金额 - 折扣金额
orderBasicInfo.setRefundAmount(orderBasicInfo.getRefundAmount().subtract(discountAmount));
BigDecimal refundAmount = orderBasicInfo.getRefundAmount().subtract(discountAmount);
orderBasicInfo.setRefundAmount(refundAmount);
orderDetail.setDiscountElectricityAmount(discountElectricityAmount);
orderDetail.setDiscountServiceAmount(discountServiceAmount);
logger.info("计算订单折扣, orderCode:{}, memberId:{}, discountAmount:{}, discountElectricityAmount:{}, discountServiceAmount:{}",
orderBasicInfo.getOrderCode(), memberId, discountAmount, discountElectricityAmount, discountServiceAmount);
}
/**
* 计算余额支付下发金额
*/
protected Map<String, BigDecimal> calculateTheAmount(MemberVO memberVO) {
BigDecimal principalBalancePay;
BigDecimal giftBalancePay;
BigDecimal totalAccountAmount = memberVO.getTotalAccountAmount();
// 余额支付最大下发200
BigDecimal defaultAmount = Constants.balancePayMaxAmount;
if (totalAccountAmount.compareTo(defaultAmount) < 0) {
principalBalancePay = memberVO.getPrincipalBalance();
giftBalancePay = memberVO.getGiftBalance();
} else {
principalBalancePay = defaultAmount.min(memberVO.getPrincipalBalance());
giftBalancePay = defaultAmount.subtract(principalBalancePay);
}
Map<String, BigDecimal> resultMap = Maps.newHashMap();
resultMap.put("principalBalancePay", principalBalancePay);
resultMap.put("giftBalancePay", giftBalancePay);
return resultMap;
}
}

View File

@@ -103,7 +103,7 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic {
resultMap.put("weixinMap", weixinMap);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付
// 白名单支付可以直接调支付回调方法
dto.setPayAmount(new BigDecimal("500"));
dto.setPayAmount(Constants.whitelistDefaultAmount);
whitelistPaymentOrder(dto);
}
return resultMap;
@@ -232,7 +232,17 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic {
// 总余额小于充电金额
throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT);
}
BigDecimal principalPay = chargeAmount;
// 本金支付金额
BigDecimal principalBalancePay = BigDecimal.ZERO;
// 赠送金支付金额
BigDecimal giftBalancePay = BigDecimal.ZERO;
// 计算下发金额
Map<String, BigDecimal> stringBigDecimalMap = calculateTheAmount(memberVO);
if (stringBigDecimalMap != null) {
principalBalancePay = stringBigDecimalMap.get("principalBalancePay");
giftBalancePay = stringBigDecimalMap.get("giftBalancePay");
}
// 更新会员钱包 全部金额都用于支付订单
UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder()
@@ -240,33 +250,39 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic {
.targetMerchantId(merchantId)
.type(MemberWalletEnum.TYPE_OUT.getValue())
.subType(MemberWalletEnum.SUBTYPE_PAYMENT_FOR_ORDER.getValue())
.updatePrincipalBalance(memberVO.getPrincipalBalance()) // 使用本金支付的金额
.updateGiftBalance(memberVO.getGiftBalance()) // 赠送金额支付
.updatePrincipalBalance(principalBalancePay) // 使用本金支付的金额
.updateGiftBalance(giftBalancePay) // 赠送金额支付
.relatedOrderCode(orderCode)
.build();
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
// 本金支付
OrderPayRecord principalPayRecord = OrderPayRecord.builder()
.orderCode(orderCode)
.payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue())
.payAmount(memberVO.getPrincipalBalance())
.acquirer(AcquirerEnum.LOCAL.getValue())
.createBy(memberId)
.createTime(DateUtils.getNowDate())
.delFlag(DelFlagEnum.NORMAL.getValue())
.build();
OrderPayRecord principalPayRecord = null;
if (principalBalancePay.compareTo(BigDecimal.ZERO) > 0) {
principalPayRecord = OrderPayRecord.builder()
.orderCode(orderCode)
.payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue())
.payAmount(principalBalancePay)
.acquirer(AcquirerEnum.LOCAL.getValue())
.createBy(memberId)
.createTime(DateUtils.getNowDate())
.delFlag(DelFlagEnum.NORMAL.getValue())
.build();
}
// 赠送金支付
OrderPayRecord giftPayRecord = OrderPayRecord.builder()
.orderCode(orderCode)
.payMode(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue())
.payAmount(memberVO.getGiftBalance())
.acquirer(AcquirerEnum.LOCAL.getValue())
.createBy(memberId)
.createTime(DateUtils.getNowDate())
.delFlag(DelFlagEnum.NORMAL.getValue())
.build();
OrderPayRecord giftPayRecord = null;
if (giftBalancePay.compareTo(BigDecimal.ZERO) > 0) {
giftPayRecord = OrderPayRecord.builder()
.orderCode(orderCode)
.payMode(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue())
.payAmount(giftBalancePay)
.acquirer(AcquirerEnum.LOCAL.getValue())
.createBy(memberId)
.createTime(DateUtils.getNowDate())
.delFlag(DelFlagEnum.NORMAL.getValue())
.build();
}
// 记录支订单付流水 记录两条支付
List<OrderPayRecord> payRecordList = Lists.newArrayList(principalPayRecord, giftPayRecord);

View File

@@ -216,7 +216,7 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic {
resultMap.put("weixinMap", weixinMap);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付
// 白名单支付可以直接调支付回调方法
dto.setPayAmount(new BigDecimal("500"));
dto.setPayAmount(Constants.whitelistDefaultAmount);
whitelistPaymentOrder(dto);
}
return resultMap;