提交 a2b2f4de authored 作者: hzh's avatar hzh

支付服务费功能实现

上级 596fe6d7
package org.dromara.order.constant;
import com.alibaba.excel.support.cglib.core.internal.Function;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.order.api.enums.OrderType;
import java.math.BigDecimal;
/**
* 云上服务费
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum YsServiceFee {
//(1) 中国境内机票(不含港澳台):30 元/票号(改期不收服务费,退票服务费不退)
//(2)中国境外机票(含港澳台):含税总价加收2%(改期不收服务费,退票服务费不退):
//(3)酒店:含税总价加收4%(取消服务费不退);
//(4)用车:含税总价加收4%(取消服务费不退)。
AIRPORT(OrderType.AIRPORT.getType(), amount -> new BigDecimal("30")),
TRAIN(OrderType.TRAIN.getType(), amount -> new BigDecimal("0")),
HOTEL(OrderType.HOTEL.getType(), amount -> amount.multiply(new BigDecimal("0.04"))),
CAR(OrderType.CAR.getType(), amount -> amount.multiply(new BigDecimal("0.04")));
/**
* 订单类型
*/
private final String orderType;
/**
* 服务费
*/
private final Function<BigDecimal, BigDecimal> serviceFeeFun;
/**
* 获取服务费
*
* @param orderType 订单类型
* @return 服务费
*/
public static YsServiceFee getFeeByOrderType(String orderType) {
for (YsServiceFee fee : YsServiceFee.values()) {
if (fee.getOrderType().equals(orderType)) {
return fee;
}
}
throw new RuntimeException("未找到对应的服务费");
}
}
...@@ -21,10 +21,7 @@ import org.dromara.order.domain.bo.OrderTradeBo; ...@@ -21,10 +21,7 @@ import org.dromara.order.domain.bo.OrderTradeBo;
import org.dromara.order.domain.vo.OrderFeeVo; import org.dromara.order.domain.vo.OrderFeeVo;
import org.dromara.order.domain.vo.OrderTradeVo; import org.dromara.order.domain.vo.OrderTradeVo;
import org.dromara.order.domain.vo.OrderVo; import org.dromara.order.domain.vo.OrderVo;
import org.dromara.order.service.IOrderFeeService; import org.dromara.order.service.*;
import org.dromara.order.service.IOrderService;
import org.dromara.order.service.IOrderTradeService;
import org.dromara.order.service.util.IPayStrategy;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -83,8 +80,14 @@ public class RemoteOrderServiceImpl implements RemoteOrderService { ...@@ -83,8 +80,14 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
List<OrderFeeVo> feeList = Optional.ofNullable(orderFeeService.queryList(new OrderFeeBo() List<OrderFeeVo> feeList = Optional.ofNullable(orderFeeService.queryList(new OrderFeeBo()
.setOrderNo(order.getOrderNo()))) .setOrderNo(order.getOrderNo())))
.orElseGet(() -> { .orElseGet(() -> {
//创建订单费用信息 //创建订单费用信息
List<RemoteSaveOrder.Fee> list = remoteOrder.getFeeList(); List<RemoteSaveOrder.Fee> list = remoteOrder.getFeeList();
//获取服务费信息
RemoteSaveOrder.Fee serviceFee = IOrderServiceFeeStrategy.calcServiceFee(remoteOrder.getSource(), remoteOrder.getOrderType(), list);
list.add(serviceFee);
List<OrderFeeBo> ofList = list.stream().map(fee -> { List<OrderFeeBo> ofList = list.stream().map(fee -> {
return new OrderFeeBo() return new OrderFeeBo()
.setOrderNo(order.getOrderNo()) .setOrderNo(order.getOrderNo())
......
package org.dromara.order.service;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.order.api.domain.RemoteSaveOrder;
import org.dromara.order.api.enums.OrderType;
import org.dromara.order.api.enums.Source;
import java.util.List;
/**
* 账单策略
* @author wenhe
*/
public interface IOrderServiceFeeStrategy {
String BASE_NAME = "OrderServiceFeeStrategy";
/**
* 获取服务费信息
*
* @param source 订单来源
* @param orderType 订单类型
* @param feeList 订单费用集合
* @return 费用信息
*/
static RemoteSaveOrder.Fee calcServiceFee(Source source, OrderType orderType, List<RemoteSaveOrder.Fee> feeList) {
// 授权类型和客户端id
String beanName = source.getSource() + BASE_NAME;
if (!SpringUtils.containsBean(beanName)) {
throw new ServiceException("服务类型不正确!");
}
IOrderServiceFeeStrategy instance = SpringUtils.getBean(beanName);
return instance.calcServiceFee(orderType, feeList);
}
/**
* 获取服务费信息
*
* @param orderType 订单类型
* @param feeList 费用集合
* @return 费用信息
*/
RemoteSaveOrder.Fee calcServiceFee(OrderType orderType, List<RemoteSaveOrder.Fee> feeList);
}
package org.dromara.order.service.util; package org.dromara.order.service;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.SpringUtils;
......
package org.dromara.order.service.util.impl; package org.dromara.order.service.impl;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
...@@ -23,7 +23,7 @@ import org.dromara.common.json.utils.JsonUtils; ...@@ -23,7 +23,7 @@ import org.dromara.common.json.utils.JsonUtils;
import org.dromara.order.config.WechatPayConfiguration; import org.dromara.order.config.WechatPayConfiguration;
import org.dromara.order.domain.bo.OrderTradeBo; import org.dromara.order.domain.bo.OrderTradeBo;
import org.dromara.order.domain.vo.OrderFeeVo; import org.dromara.order.domain.vo.OrderFeeVo;
import org.dromara.order.service.util.IPayStrategy; import org.dromara.order.service.IPayStrategy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
......
package org.dromara.order.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.order.api.domain.RemoteSaveOrder;
import org.dromara.order.api.enums.FeeType;
import org.dromara.order.api.enums.OrderType;
import org.dromara.order.constant.YsServiceFee;
import org.dromara.order.service.IOrderServiceFeeStrategy;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
* 云上服务费收取策略
*
* @author hzh
* @date 2024-12-09
**/
@Slf4j
@Service("YS" + IOrderServiceFeeStrategy.BASE_NAME)
@RequiredArgsConstructor
public class YsOrderServiceFeeStrategy implements IOrderServiceFeeStrategy {
@Override
public RemoteSaveOrder.Fee calcServiceFee(OrderType orderType, List<RemoteSaveOrder.Fee> feeList) {
YsServiceFee fee = YsServiceFee.getFeeByOrderType(orderType.getType());
BigDecimal amount = feeList.stream().map(RemoteSaveOrder.Fee::getFeeAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
return new RemoteSaveOrder.Fee()
.setFeeDesc("云上服务费")
.setFeeAmount(fee.getServiceFeeFun().apply(amount))
.setFeeType(FeeType.SERVICE_FEE);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论