|
|
|
@ -4,193 +4,183 @@ import java.util.HashMap;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
public class GB2828Sampler {
|
|
|
|
|
public static final Map<String, Integer> SAMPLE_SIZE_CODE_MAP = new HashMap<>();
|
|
|
|
|
public static final Map<String, int[]> AQL_TABLE = new HashMap<>();
|
|
|
|
|
private static final Map<String, String> CODE_MAP = new HashMap<>();
|
|
|
|
|
private static final Map<String, int[]> SAMPLE_SIZE_MAP = new HashMap<>();
|
|
|
|
|
private static final Map<String, int[]> AQL_TABLE = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
static {
|
|
|
|
|
// 检验水平I
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("2-8_I", 2);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("9-15_I", 2);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("16-25_I", 3);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("26-50_I", 3);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("51-90_I", 5);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("91-150_I", 5);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("151-280_I", 8);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("281-500_I", 13);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("501-1200_I", 20);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("1201-3200_I", 32);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("3201-10000_I", 50);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("10001-35000_I", 80);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("35001-150000_I", 125);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("150001-500000_I", 200);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("500001-_I", 315);
|
|
|
|
|
|
|
|
|
|
// 检验水平II (默认水平)
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("2-8_II", 2);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("9-15_II", 3);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("16-25_II", 5);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("26-50_II", 8);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("51-90_II", 13);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("91-150_II", 20);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("151-280_II", 32);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("281-500_II", 50);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("501-1200_II", 80);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("1201-3200_II", 125);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("3201-10000_II", 200);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("10001-35000_II", 315);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("35001-150000_II", 500);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("150001-500000_II", 800);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("500001-_II", 1250);
|
|
|
|
|
|
|
|
|
|
// 检验水平III
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("2-8_III", 3);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("9-15_III", 5);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("16-25_III", 8);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("26-50_III", 13);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("51-90_III", 20);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("91-150_III", 32);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("151-280_III", 50);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("281-500_III", 80);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("501-1200_III", 125);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("1201-3200_III", 200);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("3201-10000_III", 315);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("10001-35000_III", 500);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("35001-150000_III", 800);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("150001-500000_III", 1250);
|
|
|
|
|
SAMPLE_SIZE_CODE_MAP.put("500001-_III", 2000);
|
|
|
|
|
}
|
|
|
|
|
static {
|
|
|
|
|
// 样本量字码A-R对应的AQL接收数
|
|
|
|
|
AQL_TABLE.put("A", new int[]{0,0,0,0,0}); // 样本量2-3
|
|
|
|
|
AQL_TABLE.put("B", new int[]{0,0,0,0,0}); // 样本量5
|
|
|
|
|
AQL_TABLE.put("C", new int[]{0,0,0,0,0}); // 样本量8
|
|
|
|
|
AQL_TABLE.put("D", new int[]{0,0,0,0,1}); // 样本量13
|
|
|
|
|
AQL_TABLE.put("E", new int[]{0,0,0,1,1}); // 样本量20
|
|
|
|
|
AQL_TABLE.put("F", new int[]{0,0,1,1,2}); // 样本量32
|
|
|
|
|
AQL_TABLE.put("G", new int[]{0,1,1,2,3}); // 样本量50
|
|
|
|
|
AQL_TABLE.put("H", new int[]{1,1,2,3,5}); // 样本量80
|
|
|
|
|
AQL_TABLE.put("J", new int[]{1,2,3,5,7}); // 样本量125
|
|
|
|
|
AQL_TABLE.put("K", new int[]{2,3,5,7,10}); // 样本量200
|
|
|
|
|
AQL_TABLE.put("L", new int[]{3,5,7,10,14}); // 样本量315
|
|
|
|
|
AQL_TABLE.put("M", new int[]{5,7,10,14,21}); // 样本量500
|
|
|
|
|
AQL_TABLE.put("N", new int[]{7,10,14,21,21}); // 样本量800
|
|
|
|
|
AQL_TABLE.put("P", new int[]{10,14,21,21,21}); // 样本量1250
|
|
|
|
|
AQL_TABLE.put("Q", new int[]{14,21,21,21,21}); // 样本量2000
|
|
|
|
|
}
|
|
|
|
|
private int lotSize;
|
|
|
|
|
private String inspectionLevel;
|
|
|
|
|
private double aqlValue;
|
|
|
|
|
private boolean strictInspection;
|
|
|
|
|
|
|
|
|
|
public GB2828Sampler(int lotSize, String inspectionLevel, double aqlValue, boolean strictInspection) {
|
|
|
|
|
this.lotSize = lotSize;
|
|
|
|
|
this.inspectionLevel = inspectionLevel;
|
|
|
|
|
this.aqlValue = aqlValue;
|
|
|
|
|
this.strictInspection = strictInspection;
|
|
|
|
|
// 初始化样本量字码表
|
|
|
|
|
initCodeMap();
|
|
|
|
|
// 初始化样本量表
|
|
|
|
|
initSampleSizeMap();
|
|
|
|
|
// 初始化AQL表
|
|
|
|
|
initAqlTable();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getSampleSizeCode() {
|
|
|
|
|
// 根据批量范围和检验水平确定样本量字码
|
|
|
|
|
if (inspectionLevel.equals("I")) {
|
|
|
|
|
if (lotSize >= 2 && lotSize <= 8) return "A";
|
|
|
|
|
else if (lotSize >= 9 && lotSize <= 15) return "A";
|
|
|
|
|
else if (lotSize >= 16 && lotSize <= 25) return "B";
|
|
|
|
|
else if (lotSize >= 26 && lotSize <= 50) return "B";
|
|
|
|
|
else if (lotSize >= 51 && lotSize <= 90) return "C";
|
|
|
|
|
else if (lotSize >= 91 && lotSize <= 150) return "C";
|
|
|
|
|
else if (lotSize >= 151 && lotSize <= 280) return "D";
|
|
|
|
|
else if (lotSize >= 281 && lotSize <= 500) return "D";
|
|
|
|
|
else if (lotSize >= 501 && lotSize <= 1200) return "E";
|
|
|
|
|
else if (lotSize >= 1201 && lotSize <= 3200) return "E";
|
|
|
|
|
else if (lotSize >= 3201 && lotSize <= 10000) return "F";
|
|
|
|
|
else if (lotSize >= 10001 && lotSize <= 35000) return "F";
|
|
|
|
|
else if (lotSize >= 35001 && lotSize <= 150000) return "G";
|
|
|
|
|
else return "H";
|
|
|
|
|
private static void initCodeMap() {
|
|
|
|
|
|
|
|
|
|
// 常规检验水平(I/II/III)
|
|
|
|
|
CODE_MAP.put("2-8_I", "A"); CODE_MAP.put("2-8_II", "A"); CODE_MAP.put("2-8_III", "B");
|
|
|
|
|
CODE_MAP.put("9-15_I", "B"); CODE_MAP.put("9-15_II", "B"); CODE_MAP.put("9-15_III", "C");
|
|
|
|
|
CODE_MAP.put("16-25_I", "C"); CODE_MAP.put("16-25_II", "C"); CODE_MAP.put("16-25_III", "D");
|
|
|
|
|
CODE_MAP.put("26-50_I", "D"); CODE_MAP.put("26-50_II", "D"); CODE_MAP.put("26-50_III", "E");
|
|
|
|
|
CODE_MAP.put("51-90_I", "E"); CODE_MAP.put("51-90_II", "E"); CODE_MAP.put("51-90_III", "F");
|
|
|
|
|
CODE_MAP.put("91-150_I", "F"); CODE_MAP.put("91-150_II", "F"); CODE_MAP.put("91-150_III", "G");
|
|
|
|
|
CODE_MAP.put("151-280_I", "G"); CODE_MAP.put("151-280_II", "G"); CODE_MAP.put("151-280_III", "H");
|
|
|
|
|
CODE_MAP.put("281-500_I", "H"); CODE_MAP.put("281-500_II", "H"); CODE_MAP.put("281-500_III", "J");
|
|
|
|
|
CODE_MAP.put("501-1200_I", "J"); CODE_MAP.put("501-1200_II", "J"); CODE_MAP.put("501-1200_III", "K");
|
|
|
|
|
CODE_MAP.put("1201-3200_I", "K"); CODE_MAP.put("1201-3200_II", "K"); CODE_MAP.put("1201-3200_III", "L");
|
|
|
|
|
CODE_MAP.put("3201-10000_I", "L"); CODE_MAP.put("3201-10000_II", "L"); CODE_MAP.put("3201-10000_III", "M");
|
|
|
|
|
CODE_MAP.put("10001-35000_I", "M"); CODE_MAP.put("10001-35000_II", "M"); CODE_MAP.put("10001-35000_III", "N");
|
|
|
|
|
CODE_MAP.put("35001-150000_I", "N"); CODE_MAP.put("35001-150000_II", "N"); CODE_MAP.put("35001-150000_III", "P");
|
|
|
|
|
CODE_MAP.put("150001-500000_I", "P"); CODE_MAP.put("150001-500000_II", "P"); CODE_MAP.put("150001-500000_III", "Q");
|
|
|
|
|
CODE_MAP.put("500001+_I", "Q"); CODE_MAP.put("500001+_II", "Q"); CODE_MAP.put("500001+_III", "R");
|
|
|
|
|
|
|
|
|
|
// 特殊检验水平(S1-S4)
|
|
|
|
|
CODE_MAP.put("2-8_S1", "A"); CODE_MAP.put("2-8_S2", "A"); CODE_MAP.put("2-8_S3", "A"); CODE_MAP.put("2-8_S4", "A");
|
|
|
|
|
CODE_MAP.put("9-15_S1", "A"); CODE_MAP.put("9-15_S2", "A"); CODE_MAP.put("9-15_S3", "B"); CODE_MAP.put("9-15_S4", "B");
|
|
|
|
|
CODE_MAP.put("16-25_S1", "A"); CODE_MAP.put("16-25_S2", "B"); CODE_MAP.put("16-25_S3", "B"); CODE_MAP.put("16-25_S4", "C");
|
|
|
|
|
CODE_MAP.put("26-50_S1", "B"); CODE_MAP.put("26-50_S2", "B"); CODE_MAP.put("26-50_S3", "C"); CODE_MAP.put("26-50_S4", "D");
|
|
|
|
|
CODE_MAP.put("51-90_S1", "B"); CODE_MAP.put("51-90_S2", "C"); CODE_MAP.put("51-90_S3", "D"); CODE_MAP.put("51-90_S4", "E");
|
|
|
|
|
CODE_MAP.put("91-150_S1", "B"); CODE_MAP.put("91-150_S2", "C"); CODE_MAP.put("91-150_S3", "E"); CODE_MAP.put("91-150_S4", "F");
|
|
|
|
|
CODE_MAP.put("151-280_S1", "C"); CODE_MAP.put("151-280_S2", "D"); CODE_MAP.put("151-280_S3", "F"); CODE_MAP.put("151-280_S4", "G");
|
|
|
|
|
CODE_MAP.put("281-500_S1", "C"); CODE_MAP.put("281-500_S2", "E"); CODE_MAP.put("281-500_S3", "G"); CODE_MAP.put("281-500_S4", "H");
|
|
|
|
|
CODE_MAP.put("501-1200_S1", "D"); CODE_MAP.put("501-1200_S2", "F"); CODE_MAP.put("501-1200_S3", "H"); CODE_MAP.put("501-1200_S4", "J");
|
|
|
|
|
CODE_MAP.put("1201-3200_S1", "D"); CODE_MAP.put("1201-3200_S2", "G"); CODE_MAP.put("1201-3200_S3", "J"); CODE_MAP.put("1201-3200_S4", "K");
|
|
|
|
|
CODE_MAP.put("3201-10000_S1", "E"); CODE_MAP.put("3201-10000_S2", "H"); CODE_MAP.put("3201-10000_S3", "K"); CODE_MAP.put("3201-10000_S4", "L");
|
|
|
|
|
CODE_MAP.put("10001-35000_S1", "E"); CODE_MAP.put("10001-35000_S2", "J"); CODE_MAP.put("10001-35000_S3", "L"); CODE_MAP.put("10001-35000_S4", "M");
|
|
|
|
|
CODE_MAP.put("35001-150000_S1", "F"); CODE_MAP.put("35001-150000_S2", "K"); CODE_MAP.put("35001-150000_S3", "M"); CODE_MAP.put("35001-150000_S4", "N");
|
|
|
|
|
CODE_MAP.put("150001-500000_S1", "G"); CODE_MAP.put("150001-500000_S2", "L"); CODE_MAP.put("150001-500000_S3", "N"); CODE_MAP.put("150001-500000_S4", "P");
|
|
|
|
|
CODE_MAP.put("500001+_S1", "H"); CODE_MAP.put("500001+_S2", "M"); CODE_MAP.put("500001+_S3", "P"); CODE_MAP.put("500001+_S4", "Q");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else if (inspectionLevel.equals("II")) {
|
|
|
|
|
if (lotSize >= 2 && lotSize <= 8) return "A";
|
|
|
|
|
else if (lotSize >= 9 && lotSize <= 15) return "B";
|
|
|
|
|
else if (lotSize >= 16 && lotSize <= 25) return "C";
|
|
|
|
|
else if (lotSize >= 26 && lotSize <= 50) return "D";
|
|
|
|
|
else if (lotSize >= 51 && lotSize <= 90) return "E";
|
|
|
|
|
else if (lotSize >= 91 && lotSize <= 150) return "F";
|
|
|
|
|
else if (lotSize >= 151 && lotSize <= 280) return "G";
|
|
|
|
|
else if (lotSize >= 281 && lotSize <= 500) return "H";
|
|
|
|
|
else if (lotSize >= 501 && lotSize <= 1200) return "J";
|
|
|
|
|
else if (lotSize >= 1201 && lotSize <= 3200) return "K";
|
|
|
|
|
else if (lotSize >= 3201 && lotSize <= 10000) return "L";
|
|
|
|
|
else if (lotSize >= 10001 && lotSize <= 35000) return "M";
|
|
|
|
|
else if (lotSize >= 35001 && lotSize <= 150000) return "N";
|
|
|
|
|
else if (lotSize >= 150001 && lotSize <= 500000) return "P";
|
|
|
|
|
else return "Q";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static void initSampleSizeMap() {
|
|
|
|
|
SAMPLE_SIZE_MAP.put("A", new int[]{0,0,0,1,1,2,3,5,7,10,14,21});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("B", new int[]{0,0,1,2,3,5,7,10,14,21,30,42});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("C", new int[]{0,1,2,3,5,7,10,14,21,30,42,60});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("D", new int[]{1,1,3,5,7,10,14,21,30,42,60,90});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("E", new int[]{2,3,5,7,10,14,21,30,42,60,90,150});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("F", new int[]{3,5,7,10,14,21,30,42,60,90,150,240});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("G", new int[]{5,7,10,14,21,30,42,60,90,150,240,360});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("H", new int[]{7,10,14,21,30,42,60,90,150,240,360,540});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("J", new int[]{10,14,21,30,42,60,90,150,240,360,540,800});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("K", new int[]{14,21,30,42,60,90,150,240,360,540,800,1200});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("L", new int[]{21,30,42,60,90,150,240,360,540,800,1200,1800});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("M", new int[]{30,42,60,90,150,240,360,540,800,1200,1800,3000});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("N", new int[]{42,60,90,150,240,360,540,800,1200,1800,3000,4500});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("P", new int[]{60,90,150,240,360,540,800,1200,1800,3000,4500,7000});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("Q", new int[]{90,150,240,360,540,800,1200,1800,3000,4500,7000,10000});
|
|
|
|
|
SAMPLE_SIZE_MAP.put("R", new int[]{150,240,360,540,800,1200,1800,3000,4500,7000,10000,15000});
|
|
|
|
|
}
|
|
|
|
|
else { // 检验水平III
|
|
|
|
|
if (lotSize >= 2 && lotSize <= 8) return "B";
|
|
|
|
|
else if (lotSize >= 9 && lotSize <= 15) return "C";
|
|
|
|
|
else if (lotSize >= 16 && lotSize <= 25) return "D";
|
|
|
|
|
else if (lotSize >= 26 && lotSize <= 50) return "E";
|
|
|
|
|
else if (lotSize >= 51 && lotSize <= 90) return "F";
|
|
|
|
|
else if (lotSize >= 91 && lotSize <= 150) return "G";
|
|
|
|
|
else if (lotSize >= 151 && lotSize <= 280) return "H";
|
|
|
|
|
else if (lotSize >= 281 && lotSize <= 500) return "J";
|
|
|
|
|
else if (lotSize >= 501 && lotSize <= 1200) return "K";
|
|
|
|
|
else if (lotSize >= 1201 && lotSize <= 3200) return "L";
|
|
|
|
|
else if (lotSize >= 3201 && lotSize <= 10000) return "M";
|
|
|
|
|
else if (lotSize >= 10001 && lotSize <= 35000) return "N";
|
|
|
|
|
else if (lotSize >= 35001 && lotSize <= 150000) return "P";
|
|
|
|
|
else if (lotSize >= 150001 && lotSize <= 500000) return "Q";
|
|
|
|
|
else return "R";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static void initAqlTable() {
|
|
|
|
|
// 数组元素对应标准AQL值:0.065,0.10,0.15,0.25,0.40,0.65,1.0,1.5,2.5,4.0,6.5
|
|
|
|
|
AQL_TABLE.put("A", new int[]{0,0,1,1,2,3,5,7,10,14,21});
|
|
|
|
|
AQL_TABLE.put("B", new int[]{0,1,1,2,3,5,7,10,14,21,30});
|
|
|
|
|
AQL_TABLE.put("C", new int[]{0,1,2,3,5,7,10,14,21,30,42});
|
|
|
|
|
AQL_TABLE.put("D", new int[]{1,1,2,3,5,7,10,14,21,30,42});
|
|
|
|
|
AQL_TABLE.put("E", new int[]{1,2,3,5,7,10,14,21,30,42,60});
|
|
|
|
|
AQL_TABLE.put("F", new int[]{2,3,5,7,10,14,21,30,42,60,80});
|
|
|
|
|
AQL_TABLE.put("G", new int[]{3,5,7,10,14,21,30,42,60,80,120});
|
|
|
|
|
AQL_TABLE.put("H", new int[]{5,7,10,14,21,30,42,60,80,120,180});
|
|
|
|
|
AQL_TABLE.put("J", new int[]{7,10,14,21,30,42,60,80,120,180,280});
|
|
|
|
|
AQL_TABLE.put("K", new int[]{10,14,21,30,42,60,80,120,180,280,400});
|
|
|
|
|
AQL_TABLE.put("L", new int[]{14,21,30,42,60,80,120,180,280,400,600});
|
|
|
|
|
AQL_TABLE.put("M", new int[]{21,30,42,60,80,120,180,280,400,600,800});
|
|
|
|
|
AQL_TABLE.put("N", new int[]{30,42,60,80,120,180,280,400,600,800,1200});
|
|
|
|
|
AQL_TABLE.put("P", new int[]{42,60,80,120,180,280,400,600,800,1200,1800});
|
|
|
|
|
AQL_TABLE.put("Q", new int[]{60,80,120,180,280,400,600,800,1200,1800,2500});
|
|
|
|
|
AQL_TABLE.put("R", new int[]{80,120,180,280,400,600,800,1200,1800,2500,3200});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public SamplingResult getSamplingPlan(int lotSize, String level, double aql) {
|
|
|
|
|
String code = determineCode(lotSize, level);
|
|
|
|
|
int sampleSize = determineSampleSize(code, level);
|
|
|
|
|
int[] acRe = determineAcReNumbers(code, aql);
|
|
|
|
|
return new SamplingResult(code, sampleSize, acRe[0], acRe[1]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String determineCode(int lotSize, String level) {
|
|
|
|
|
String range = getRange(lotSize);
|
|
|
|
|
return CODE_MAP.getOrDefault(range + "_" + level, "K");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getRange(int size) {
|
|
|
|
|
if (size >= 2 && size <= 8) return "2-8";
|
|
|
|
|
else if (size >= 9 && size <= 15) return "9-15";
|
|
|
|
|
else if (size >= 16 && size <= 25) return "16-25";
|
|
|
|
|
else if (size >= 26 && size <= 50) return "26-50";
|
|
|
|
|
else if (size >= 51 && size <= 90) return "51-90";
|
|
|
|
|
else if (size >= 91 && size <= 150) return "91-150";
|
|
|
|
|
else if (size >= 151 && size <= 280) return "151-280";
|
|
|
|
|
else if (size >= 281 && size <= 500) return "281-500";
|
|
|
|
|
else if (size >= 501 && size <= 1200) return "501-1200";
|
|
|
|
|
else if (size >= 1201 && size <= 3200) return "1201-3200";
|
|
|
|
|
else if (size >= 3201 && size <= 10000) return "3201-10000";
|
|
|
|
|
else if (size >= 10001 && size <= 35000) return "10001-35000";
|
|
|
|
|
else if (size >= 35001 && size <= 150000) return "35001-150000";
|
|
|
|
|
else if (size >= 150001 && size <= 500000) return "150001-500000";
|
|
|
|
|
else return "500001+";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int determineSampleSize(String code, String level) {
|
|
|
|
|
int[] sizes = SAMPLE_SIZE_MAP.get(code);
|
|
|
|
|
switch(level) {
|
|
|
|
|
case "I": case "S1": case "S2": return sizes[0];
|
|
|
|
|
case "II": case "S3": return sizes[1];
|
|
|
|
|
case "III": case "S4": return sizes[2];
|
|
|
|
|
default: return sizes[1];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getSampleSize() {
|
|
|
|
|
String code = getSampleSizeCode();
|
|
|
|
|
// 根据字码获取具体样本量
|
|
|
|
|
switch(code) {
|
|
|
|
|
case "A": return 2;
|
|
|
|
|
case "B": return 3;
|
|
|
|
|
case "C": return 5;
|
|
|
|
|
case "D": return 8;
|
|
|
|
|
case "E": return 13;
|
|
|
|
|
case "F": return 20;
|
|
|
|
|
case "G": return 32;
|
|
|
|
|
case "H": return 50;
|
|
|
|
|
case "J": return 80;
|
|
|
|
|
case "K": return 125;
|
|
|
|
|
case "L": return 200;
|
|
|
|
|
case "M": return 315;
|
|
|
|
|
case "N": return 500;
|
|
|
|
|
case "P": return 800;
|
|
|
|
|
case "Q": return 1250;
|
|
|
|
|
case "R": return 2000;
|
|
|
|
|
default: return 125; // 默认返回检验水平II的中间值
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int[] getAcceptRejectNumbers() {
|
|
|
|
|
String code = getSampleSizeCode();
|
|
|
|
|
private int[] determineAcReNumbers(String code, double aql) {
|
|
|
|
|
int[] aqlValues = AQL_TABLE.get(code);
|
|
|
|
|
// 根据AQL值查找对应的接收/拒收数(GB/T 2828.1标准)
|
|
|
|
|
if (aqlValue <= 0.65) return new int[]{aqlValues[0], aqlValues[0]+1};
|
|
|
|
|
else if (aqlValue <= 1.0) return new int[]{aqlValues[1], aqlValues[1]+1};
|
|
|
|
|
else if (aqlValue <= 1.5) return new int[]{aqlValues[2], aqlValues[2]+1};
|
|
|
|
|
else if (aqlValue <= 2.5) return new int[]{aqlValues[3], aqlValues[3]+1};
|
|
|
|
|
else if (aqlValue <= 4.0) return new int[]{aqlValues[4], aqlValues[4]+1};
|
|
|
|
|
else if (aqlValue <= 6.5) return new int[]{aqlValues[5], aqlValues[5]+1};
|
|
|
|
|
else if (aqlValue <= 10.0) return new int[]{aqlValues[6], aqlValues[6]+1};
|
|
|
|
|
else return new int[]{aqlValues[aqlValues.length-1], aqlValues[aqlValues.length-1]+1};
|
|
|
|
|
if (aql <= 0.065) return new int[]{aqlValues[0], aqlValues[0]+1};
|
|
|
|
|
else if (aql <= 0.10) return new int[]{aqlValues[1], aqlValues[1]+1};
|
|
|
|
|
else if (aql <= 0.15) return new int[]{aqlValues[2], aqlValues[2]+1};
|
|
|
|
|
else if (aql <= 0.25) return new int[]{aqlValues[3], aqlValues[3]+1};
|
|
|
|
|
else if (aql <= 0.40) return new int[]{aqlValues[4], aqlValues[4]+1};
|
|
|
|
|
else if (aql <= 0.65) return new int[]{aqlValues[5], aqlValues[5]+1};
|
|
|
|
|
else if (aql <= 1.0) return new int[]{aqlValues[6], aqlValues[6]+1};
|
|
|
|
|
else if (aql <= 1.5) return new int[]{aqlValues[7], aqlValues[7]+1};
|
|
|
|
|
else if (aql <= 2.5) return new int[]{aqlValues[8], aqlValues[8]+1};
|
|
|
|
|
else if (aql <= 4.0) return new int[]{aqlValues[9], aqlValues[9]+1};
|
|
|
|
|
else if (aql <= 6.5) return new int[]{aqlValues[10], aqlValues[10]+1};
|
|
|
|
|
else return new int[]{aqlValues[11], aqlValues[11]+1};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public boolean isLotAccepted(int defectCount) {
|
|
|
|
|
int[] acRe = getAcceptRejectNumbers();
|
|
|
|
|
return defectCount <= acRe[0];
|
|
|
|
|
public static class SamplingResult {
|
|
|
|
|
public final String code;
|
|
|
|
|
public final int sampleSize;
|
|
|
|
|
public final int acceptNumber;
|
|
|
|
|
public final int rejectNumber;
|
|
|
|
|
|
|
|
|
|
public SamplingResult(String code, int sampleSize, int acceptNumber, int rejectNumber) {
|
|
|
|
|
this.code = code;
|
|
|
|
|
this.sampleSize = sampleSize;
|
|
|
|
|
this.acceptNumber = acceptNumber;
|
|
|
|
|
this.rejectNumber = rejectNumber;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
GB2828Sampler sampler = new GB2828Sampler(1000, "II", 1.0, false);
|
|
|
|
|
System.out.println("样本量字码: " + sampler.getSampleSizeCode());
|
|
|
|
|
System.out.println("样本量: " + sampler.getSampleSize());
|
|
|
|
|
int[] acRe = sampler.getAcceptRejectNumbers();
|
|
|
|
|
System.out.println("接收数/拒收数: " + acRe[0] + "/" + acRe[1]);
|
|
|
|
|
GB2828Sampler sampler = new GB2828Sampler();
|
|
|
|
|
|
|
|
|
|
// 常规检验水平II示例
|
|
|
|
|
GB2828Sampler.SamplingResult normalResult =
|
|
|
|
|
sampler.getSamplingPlan(5000 ,"III", 0.0);
|
|
|
|
|
System.out.println("常规检验: " + normalResult.code + " " +
|
|
|
|
|
normalResult.sampleSize + " " + normalResult.acceptNumber);
|
|
|
|
|
|
|
|
|
|
// 特殊检验水平S2示例
|
|
|
|
|
GB2828Sampler.SamplingResult specialResult =
|
|
|
|
|
sampler.getSamplingPlan(1500, "S4", 1.0);
|
|
|
|
|
System.out.println("特殊检验: " + specialResult.code + " " +
|
|
|
|
|
specialResult.sampleSize + " " + specialResult.acceptNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|