目录结构
image.png
入参公共类相当于model
@Data
public class OrderRequest extends RequestPage {
@Schema(description = "订单类型 101本地订单 102酒店订单")
private Integer type;
@Schema(description = "本地订单对象")
private LocalOrder localOrder;
@Schema(description = "酒店订单对象")
private HotelOrder hotelOrder;
}
Service 共用接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 订单服务接口
*/
@FeignClient(value = "${***.***-***-***}", path = "/odr")
public interface OperatorOrderService {
/**
* 分页查询订单
* @param request
* @return
*/
@GetMapping("/order/getListPage")
PageResponse<?> getListPage(@RequestBody OrderRequest request);
}
接口实现类,通过订单类型获取对应的订单服务策略
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
/**
* 根据订单类型获取对应订单的分页数据
*/
@Service
@Primary
public class OperatorOrderServiceImpl implements OperatorOrderService {
// 根据订单类型获取对应的订单服务策略
@Override
public PageResponse<?> getListPage(OrderRequest request) {
Integer orderType = request.getType();
OrderServiceStrategy orderServiceStrategy = OrderServiceStrategy.fromCode(orderType);
if (null != orderServiceStrategy) {
// 调用策略类的方法并返回分页结果
return orderServiceStrategy.getOperatorOrderService().getListPage(request);
}
return new PageResponse<>();
}
}
不同的策略路由返回不同的结果
image.png
不同订单去实现Service接口,处理不同业务返回不同结果
import com.alibaba.nacos.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 酒店订单服务实现类
*
* @author
* @since
*/
@Slf4j
@Service("HotelOrderServiceImpl")
public class HotelOrderServiceImpl extends BaseServiceImpl<HotelOrderMapper, HotelOrderEntity> implements OperatorOrderService {
/**
* 酒店订单分页查询
* @param request
* @return
*/
@Override
public PageResponse<HotelOrder> getListPage(OrderRequest request) {
return new PageResponse<>();
}
}
/**
* 本地订单服务实现类
*
* @author
* @since
*/
@Slf4j
@Service("LocalOrderServiceImpl")
public class LocalOrderServiceImpl extends BaseServiceImpl<LocalOrderMapper, LocalOrderEntity> implements OperatorOrderService {
/**
* 本地订单分页查询
*
* @param request
* @return
*/
@Override
public PageResponse<LocalOrder> getListPage(OrderRequest request) {
return new PageResponse<>();
}
枚举类
image.png
import lombok.Getter;
import java.util.Arrays;
/**
* 订单枚举类
*
* @author
* @date
*/
@Getter
public enum OrderServiceStrategy {
// 定义枚举实例,每个实例对应一个具体的订单服务策略
LOCAL(101, "本地订单", new LocalOrderServiceImpl()),
HOTEL(102, "酒店订单", new HotelOrderServiceImpl());
private final int code; // 订单服务策略的编号
private final String description; // 订单服务策略的描述
private final OperatorOrderService operatorOrderService;// 订单服务实现
// 枚举实例的构造方法
OrderServiceStrategy(int code, String description, OperatorOrderService operatorOrderService) {
this.code = code;
this.description = description;
this.operatorOrderService = operatorOrderService;
}
// 根据编号获取对应的订单服务策略枚举实例
public static OrderServiceStrategy fromCode(Integer code) {
return Arrays.stream(OrderServiceStrategy.values())
.filter(c -> c.getCode() == code).findFirst()
.orElse(null);
}
}
最后直接通过接口请求传参即可
{
"type": 102,
"hotelOrder": {
"stateOne":"***"
}
}