package com.boco.nbd.wios.flow.util; import cn.hutool.core.collection.CollUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; /** * @author:cao hai * @date:2022/8/23 16:37 * @version:V1.0 * @description: 1、5个服务商 35% 25% 20% 15% 5% * 2、4个服务商 40% 30% 20% 10% * 3、3个服务商 40% 35% 25% * 2、2个服务商 60% 40% * @modify: */ @Slf4j public class DispatchUtil { private static Random random = new Random(); private static final Integer MAX_BOUND = 101; /** * @param supplier total:初版暂时不做总量比例控制 * @return */ public static Integer findSupplier(List<Integer> supplier) { if (CollUtil.isEmpty(supplier)) { return null; } if (supplier.size() == 1) { return supplier.get(0); } List<Prize> prizes = Prize.create(supplier); // new Random() 开始闭合,结束关闭,开始包含,结束不包含 int selectNum = random.nextInt(MAX_BOUND); for (Prize s : prizes) { if (selectNum <= s.getNumber()) { return s.getId(); } } return null; } /** * prize */ @Data public static class Prize { private static List<List<Integer>> ratioList = new ArrayList<>(); static { ratioList.add(Arrays.asList(100)); ratioList.add(Arrays.asList(60, 100)); ratioList.add(Arrays.asList(40, 75, 100)); ratioList.add(Arrays.asList(40, 70, 90, 100)); ratioList.add(Arrays.asList(35, 60, 80, 95, 100)); } private Integer id; private Integer number; /** * 抽象算法 * * @param list * @return */ public static List<Prize> create(List<Integer> list) { Integer size = list.size(); if (size > ratioList.size()) { size = ratioList.size(); } List<Integer> ratios = ratioList.get(size - 1); List<Prize> prizes = new ArrayList<>(size); for (int i = 0; i < size; i++) { Prize prize = new Prize(); prize.setId(list.get(i)); prize.setNumber(ratios.get(i)); prizes.add(prize); } return prizes; } } }