1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
| import com.alibaba.fastjson.JSONObject; import lombok.Data; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal; import java.util.List;
public class GrayUtils { public static boolean isHitGray(String jsonString) { GrayConfDTO grayConfDTO = JSONObject.parseObject(jsonString, GrayConfDTO.class); return grayConfDTO.isHitGray(); } public static boolean isHitGray(String jsonString, Long id) { GrayConfDTO grayConfDTO = JSONObject.parseObject(jsonString, GrayConfDTO.class); return grayConfDTO.isHitGray(id); } public static boolean isHitGrayWithoutId(String jsonString) { GrayConfDTO grayConfDTO = JSONObject.parseObject(jsonString, GrayConfDTO.class); return grayConfDTO.isHitGrayWithoutId(); }
@Data static class GrayConfDTO {
private Boolean needGray;
private Boolean needCheck;
private List<Long> whiteIdList;
private String whitePercent;
public boolean isHitGray() { return needGray; }
public boolean isHitGray(Long id) { if (!needGray) { return Boolean.FALSE; }
if (!needCheck) { return Boolean.TRUE; }
if (id == null) { return Boolean.FALSE; }
if (CollectionUtils.isNotEmpty(whiteIdList) && whiteIdList.contains(id)) { return Boolean.TRUE; }
if (StringUtils.isNotBlank(whitePercent)) { return isHitPercent(id, whitePercent); }
return Boolean.FALSE; }
public boolean isHitGrayWithoutId() { if (!needGray) { return Boolean.FALSE; }
if (!needCheck) { return Boolean.TRUE; }
if (StringUtils.isNotBlank(whitePercent)) { return isHitPercent(System.currentTimeMillis(), whitePercent); }
return Boolean.FALSE; }
private Boolean isHitPercent(Long id, String whitePercent) { BigDecimal dividend = new BigDecimal(id); BigDecimal divisor = new BigDecimal("100"); BigDecimal remainder = new BigDecimal(whitePercent.trim());
int decimalPlaces = countDecimalPlaces(whitePercent); divisor = divisor.scaleByPowerOfTen(decimalPlaces); remainder = remainder.scaleByPowerOfTen(decimalPlaces);
BigDecimal idRemainder = dividend.remainder(divisor);
if (idRemainder.compareTo(remainder) < 0) { return Boolean.TRUE; } return Boolean.FALSE; }
private int countDecimalPlaces(String stringNumber) { if (!stringNumber.contains(".")) { return 0; } return stringNumber.length() - stringNumber.indexOf('.') - 1; } } }
|