|
|
@@ -1,13 +1,12 @@ |
|
|
|
package com.cnbm.qualityPlanning.common; |
|
|
|
|
|
|
|
|
|
|
|
import com.cnbm.qualityPlanning.entity.ControlLimit; |
|
|
|
import com.cnbm.qualityPlanning.entity.ControlLimitDetail; |
|
|
|
import com.cnbm.qualityPlanning.entity.Point; |
|
|
|
import io.swagger.models.auth.In; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Set; |
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
/** |
|
|
|
* @Desc: "检测参数统计受控 检验类" |
|
|
@@ -27,18 +26,18 @@ public class StatisticalControlledTest { |
|
|
|
private static final Integer rule10Number = 10; |
|
|
|
|
|
|
|
public static List<Point> createData(){ |
|
|
|
Point point = new Point(1,new Double(1)); |
|
|
|
Point point2 = new Point(2,new Double(2)); |
|
|
|
Point point3 = new Point(3,new Double(3)); |
|
|
|
Point point4 = new Point(4,new Double(4)); |
|
|
|
Point point5 = new Point(5,new Double(5)); |
|
|
|
Point point6 = new Point(6,new Double(6)); |
|
|
|
Point point7 = new Point(7,new Double(7)); |
|
|
|
Point point8 = new Point(8,new Double(8)); |
|
|
|
Point point9 = new Point(9,new Double(9)); |
|
|
|
Point point10 = new Point(10,new Double(10)); |
|
|
|
Point point11 = new Point(11,new Double(11)); |
|
|
|
Point point12 = new Point(12,new Double(12)); |
|
|
|
Point point = new Point(1,new Double(1.7)); |
|
|
|
Point point2 = new Point(2,new Double(8)); |
|
|
|
Point point3 = new Point(3,new Double(8)); |
|
|
|
Point point4 = new Point(4,new Double(1.7)); |
|
|
|
Point point5 = new Point(5,new Double(1.7)); |
|
|
|
Point point6 = new Point(6,new Double(1.7)); //3 |
|
|
|
Point point7 = new Point(7,new Double(1.7)); //3 |
|
|
|
Point point8 = new Point(8,new Double(1.7)); //3 //3 |
|
|
|
Point point9 = new Point(9,new Double(1.7)); |
|
|
|
Point point10 = new Point(10,new Double(1.7)); |
|
|
|
Point point11 = new Point(11,new Double(1.7)); |
|
|
|
Point point12 = new Point(12,new Double(1.7)); |
|
|
|
List<Point> list = new ArrayList<>(); |
|
|
|
list.add(point); |
|
|
|
list.add(point2); |
|
|
@@ -58,33 +57,60 @@ public class StatisticalControlledTest { |
|
|
|
public static void main(String[] args) { |
|
|
|
List<Point> list = createData(); |
|
|
|
ControlLimit controlLimit = new ControlLimit(new Double(12),new Double(2),new Double(1)); |
|
|
|
|
|
|
|
//TEST FOR RULE1 |
|
|
|
Boolean aBoolean1 = rule1(list, controlLimit); |
|
|
|
|
|
|
|
// |
|
|
|
// //TEST FOR RULE1 |
|
|
|
// Boolean aBoolean1 = rule1(list, controlLimit); |
|
|
|
// |
|
|
|
//TEST FOR RULE2 |
|
|
|
Boolean aBoolean2 = rule2(list, controlLimit, 9); |
|
|
|
System.out.println(); |
|
|
|
|
|
|
|
|
|
|
|
//TEST FOR RULE3 |
|
|
|
Boolean aBoolean3 = rule3(list, 3); |
|
|
|
// |
|
|
|
// |
|
|
|
// //TEST FOR RULE3 |
|
|
|
// Boolean aBoolean3 = rule3(list, 3); |
|
|
|
// System.out.println(); |
|
|
|
// |
|
|
|
// |
|
|
|
// //TEST FOR RULE4 |
|
|
|
// Boolean aBoolean4 = rule4(list, 4); |
|
|
|
// System.out.println(); |
|
|
|
|
|
|
|
// //TEST FOR RULE5 |
|
|
|
// Boolean aBoolean5 = rule5(list, controlLimit, 3,2); |
|
|
|
// System.out.println(); |
|
|
|
|
|
|
|
// //TEST FOR RULE6 |
|
|
|
// Boolean aBoolean6 = rule6(list, controlLimit, 3,2); |
|
|
|
// System.out.println(); |
|
|
|
|
|
|
|
//TEST FOR RULE7 |
|
|
|
//LC0 = 1.6666 ;; UC1 = 5 |
|
|
|
Boolean aBoolean7 = rule7(list, controlLimit,7); |
|
|
|
System.out.println(); |
|
|
|
|
|
|
|
// int[] array={1,2,3,4,5,6}; |
|
|
|
// int[] ret=new int[3]; |
|
|
|
// System.arraycopy(array,0,ret,0,3); |
|
|
|
// System.out.println(Arrays.toString(ret)); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* name : 规则1 |
|
|
|
* desc : 控制图上有 1 个点位于三倍标准差以外(对中心线来说)(母体的 $\sigma$ ) |
|
|
|
* |
|
|
|
* return : 返回的 就是不满足 规则1 的点。 |
|
|
|
* 注意: 如果存在满足rule1的点,会在原数组 Point.unsatisfiedRules 里标注出来。 |
|
|
|
* return : |
|
|
|
* 存在满足rule1的点 => true |
|
|
|
* 不存在满足rule1的点 => false |
|
|
|
* */ |
|
|
|
private static Boolean rule1(List<Point> data, ControlLimit controlLimit){ |
|
|
|
Boolean flag = false; |
|
|
|
for(Point i:data){ |
|
|
|
if(i.getValue() > controlLimit.getUCL() || i.getValue() < controlLimit.getLCL()){ |
|
|
|
i.getUnsatisfiedRules().add(1); |
|
|
|
i.getUnsatisfiedRules().add(rule1Number); |
|
|
|
flag = true; |
|
|
|
} |
|
|
|
} |
|
|
|
return true; |
|
|
|
return flag; |
|
|
|
} |
|
|
|
|
|
|
|
private static void markUnsatisfiedRulesByKeys(List<Point> data,List<Integer> keys,Integer ruleNumber){ |
|
|
@@ -96,8 +122,11 @@ public class StatisticalControlledTest { |
|
|
|
/** |
|
|
|
* name : 规则2 |
|
|
|
* desc : 连续 n 点落在中心线的用一侧 (默认:9) |
|
|
|
* |
|
|
|
* return : 返回的 就是不满足 规则2 的点。 |
|
|
|
* 注意: 如果存在满足rule2的点,会在原数组 Point.unsatisfiedRules 里标注出来。 |
|
|
|
* //todo 存在bug while((upi+1) < data.size()){ ,最后一个点轮询不到 |
|
|
|
* return : |
|
|
|
* 存在满足rule2的点 => true |
|
|
|
* 不存在满足rule2的点 => false |
|
|
|
* */ |
|
|
|
private static Boolean rule2(List<Point> data, ControlLimit controlLimit,Integer n){ |
|
|
|
List<Point> upList = new ArrayList<>(); |
|
|
@@ -113,13 +142,19 @@ public class StatisticalControlledTest { |
|
|
|
//上侧的情况 |
|
|
|
Integer upi = 0; |
|
|
|
Integer uptime = 0; |
|
|
|
Integer upTotalSize = upList.size(); |
|
|
|
//标注不合格的 参数 |
|
|
|
List<Point> forMarkPoints = new ArrayList<>(); |
|
|
|
|
|
|
|
while((upi+1) < upList.size()){ |
|
|
|
//if((upList.get(upi).getPosition()+1)==upList.get(upi+1).getPosition()){ |
|
|
|
if(isBetween(upList.get(upi),upList.get(upi+1))){ |
|
|
|
uptime +=1; |
|
|
|
forMarkPoints.add(upList.get(upi)); |
|
|
|
if((upi+1)==upTotalSize){ |
|
|
|
uptime +=1; |
|
|
|
forMarkPoints.add(upList.get(upi+1)); |
|
|
|
} |
|
|
|
//只要到达n 了,就return,防止中间段到达 后面又被重置了 |
|
|
|
if(uptime>=n){ |
|
|
|
//1. |
|
|
@@ -138,6 +173,7 @@ public class StatisticalControlledTest { |
|
|
|
} |
|
|
|
}else { |
|
|
|
forMarkPoints = new ArrayList<>(); |
|
|
|
upTotalSize-=1; |
|
|
|
uptime = 0; |
|
|
|
} |
|
|
|
upi++; |
|
|
@@ -147,11 +183,16 @@ public class StatisticalControlledTest { |
|
|
|
//下侧的情况 |
|
|
|
Integer downi = 0; |
|
|
|
Integer downtime = 0; |
|
|
|
Integer totalSize = downList.size(); |
|
|
|
forMarkPoints = new ArrayList<>(); |
|
|
|
while((downi+1) < downList.size()){ |
|
|
|
if(isBetween(downList.get(upi),downList.get(upi+1))){ |
|
|
|
if(isBetween(downList.get(downi),downList.get(downi+1))){ |
|
|
|
downtime +=1; |
|
|
|
forMarkPoints.add(downList.get(downi)); |
|
|
|
if((downi+1)==totalSize){ |
|
|
|
downtime++; |
|
|
|
forMarkPoints.add(downList.get(downi+1)); |
|
|
|
} |
|
|
|
if(downtime>=n){ |
|
|
|
|
|
|
|
for (Point key:forMarkPoints){ |
|
|
@@ -166,6 +207,7 @@ public class StatisticalControlledTest { |
|
|
|
return true; |
|
|
|
} |
|
|
|
}else { |
|
|
|
totalSize-=1; |
|
|
|
forMarkPoints = new ArrayList<>(); |
|
|
|
downtime = 0; |
|
|
|
} |
|
|
@@ -179,8 +221,10 @@ public class StatisticalControlledTest { |
|
|
|
/** |
|
|
|
* name : 规则3 |
|
|
|
* desc : 连续 n 点递增或者递减 (默认:6) |
|
|
|
* |
|
|
|
* return : 返回的 就是不满足 规则2 的点。 |
|
|
|
* 注意: 如果存在满足rule3的点,会在原数组 Point.unsatisfiedRules 里标注出来。 |
|
|
|
* return : |
|
|
|
* 存在满足rule3的点 => true |
|
|
|
* 不存在满足rule3的点 => false |
|
|
|
* */ |
|
|
|
private static Boolean rule3(List<Point> data, Integer n){ |
|
|
|
|
|
|
@@ -232,6 +276,257 @@ public class StatisticalControlledTest { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* name : 规则4 |
|
|
|
* desc : 连续 n 点中 相邻点 交替上下 ( 默认:14 ) |
|
|
|
* 注意: 如果存在满足rule4的点,会在原数组 Point.unsatisfiedRules 里标注出来。 |
|
|
|
* //todo 有bug while((upi+1) < data.size()) 这里 upi+1 会存在问题 |
|
|
|
* return : |
|
|
|
* 存在满足rule4的点 => true |
|
|
|
* 不存在满足rule4的点 => false |
|
|
|
* */ |
|
|
|
private static Boolean rule4(List<Point> data, Integer n){ |
|
|
|
Integer upi = 0; |
|
|
|
Boolean current; |
|
|
|
Boolean nextNeeded; |
|
|
|
Integer times = 0; |
|
|
|
List<Integer> forMarkKey = new ArrayList<>(); |
|
|
|
if(isSmall(data.get(0),data.get(1))){ |
|
|
|
current = true; |
|
|
|
nextNeeded = true; |
|
|
|
}else { |
|
|
|
current = false; |
|
|
|
nextNeeded = false; |
|
|
|
} |
|
|
|
|
|
|
|
while((upi+1) < data.size()){ |
|
|
|
if(isBetween( data.get(upi),data.get(upi+1) )){ |
|
|
|
//A-B<0 True |
|
|
|
//A-B>0 False |
|
|
|
if(isSmall(data.get(upi),data.get(upi+1))){ |
|
|
|
current = true; |
|
|
|
}else { |
|
|
|
current = false; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (current.equals(nextNeeded)){ |
|
|
|
times++; |
|
|
|
forMarkKey.add(upi); |
|
|
|
if(times == n){ |
|
|
|
for(Integer key:forMarkKey){ |
|
|
|
data.get(key).getUnsatisfiedRules().add(rule4Number); |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
}else { |
|
|
|
times=0; |
|
|
|
forMarkKey = new ArrayList<>(); |
|
|
|
} |
|
|
|
nextNeeded = !current; |
|
|
|
}else { |
|
|
|
times = 0; |
|
|
|
forMarkKey = new ArrayList<>(); |
|
|
|
} |
|
|
|
upi++; |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* name : 规则5 |
|
|
|
* desc : 连续 m 点中 有 n 点 落在中心线同一侧,B区以外。( 默认 m:3 , n:2 ) |
|
|
|
* 注意: 如果存在满足rule5的点,会在原数组 Point.unsatisfiedRules 里标注出来。 |
|
|
|
* return : |
|
|
|
* 存在满足rule5的点 => true |
|
|
|
* 不存在满足rule5的点 => false |
|
|
|
* */ |
|
|
|
private static Boolean rule5(List<Point> data,ControlLimit controlLimit, Integer m, Integer n){ |
|
|
|
Integer upi = 0; |
|
|
|
List<Point> upforMarkKey = new ArrayList<>(); |
|
|
|
List<Point> downforMarkKey = new ArrayList<>(); |
|
|
|
// Double[] dataArray = (Double[])data.toArray(); |
|
|
|
Object[] dataArray = data.toArray(); |
|
|
|
ControlLimitDetail controlLimitDetail = new ControlLimitDetail(controlLimit.getUCL(), controlLimit.getCL(), controlLimit.getLCL()); |
|
|
|
System.out.println("controlLimitDetail : "+controlLimitDetail.toString()); |
|
|
|
Boolean lastFlag = false; |
|
|
|
while(upi < data.size()){ |
|
|
|
Point[] keyList = new Point[m]; |
|
|
|
if(m>=(data.size()-upi)){ |
|
|
|
if(lastFlag){ |
|
|
|
break; |
|
|
|
} |
|
|
|
//System.arraycopy(dataArray , 10 , keyList , 0 , 2 ); |
|
|
|
System.arraycopy(dataArray,upi,keyList,0,(data.size()-upi)); |
|
|
|
lastFlag = true; |
|
|
|
}else { |
|
|
|
System.arraycopy(dataArray,upi,keyList,0,m); |
|
|
|
} |
|
|
|
|
|
|
|
Integer upTimes = 0; |
|
|
|
Integer downTimes = 0; |
|
|
|
for(Point i:keyList){ |
|
|
|
if(i.getValue()>controlLimitDetail.getUB()[1]){ |
|
|
|
upTimes++; |
|
|
|
upforMarkKey.add(i); |
|
|
|
System.out.println(); |
|
|
|
} |
|
|
|
if(i.getValue()<controlLimitDetail.getLB()[0]){ |
|
|
|
downTimes++; |
|
|
|
downforMarkKey.add(i); |
|
|
|
} |
|
|
|
} |
|
|
|
if(upTimes>=n || downTimes>=n){ |
|
|
|
if(upTimes>=n){ |
|
|
|
for(Point i:upforMarkKey){ |
|
|
|
i.getUnsatisfiedRules().add(rule5Number); |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
if(downTimes>=n){ |
|
|
|
for(Point i:downforMarkKey){ |
|
|
|
i.getUnsatisfiedRules().add(rule5Number); |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
upi++; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* name : 规则6 |
|
|
|
* desc : 连续 m 点中 有 n 点 落在中心线同一侧,C区以外。( 默认 m:5 , n:4 ) |
|
|
|
* 注意: 如果存在满足rule5的点,会在原数组 Point.unsatisfiedRules 里标注出来。 |
|
|
|
* return : |
|
|
|
* 存在满足rule6的点 => true |
|
|
|
* 不存在满足rule6的点 => false |
|
|
|
* */ |
|
|
|
private static Boolean rule6(List<Point> data,ControlLimit controlLimit, Integer m, Integer n){ |
|
|
|
Integer upi = 0; |
|
|
|
List<Point> upforMarkKey = new ArrayList<>(); |
|
|
|
List<Point> downforMarkKey = new ArrayList<>(); |
|
|
|
// Double[] dataArray = (Double[])data.toArray(); |
|
|
|
Object[] dataArray = data.toArray(); |
|
|
|
ControlLimitDetail controlLimitDetail = new ControlLimitDetail(controlLimit.getUCL(), controlLimit.getCL(), controlLimit.getLCL()); |
|
|
|
System.out.println("controlLimitDetail : "+controlLimitDetail.toString()); |
|
|
|
Boolean lastFlag = false; |
|
|
|
while(upi < data.size()){ |
|
|
|
Point[] keyList = new Point[m]; |
|
|
|
if(m>=(data.size()-upi)){ |
|
|
|
if(lastFlag){ |
|
|
|
break; |
|
|
|
} |
|
|
|
//System.arraycopy(dataArray , 10 , keyList , 0 , 2 ); |
|
|
|
System.arraycopy(dataArray,upi,keyList,0,(data.size()-upi)); |
|
|
|
lastFlag = true; |
|
|
|
}else { |
|
|
|
System.arraycopy(dataArray,upi,keyList,0,m); |
|
|
|
} |
|
|
|
|
|
|
|
Integer upTimes = 0; |
|
|
|
Integer downTimes = 0; |
|
|
|
for(Point i:keyList){ |
|
|
|
if(i.getValue()>controlLimitDetail.getUC()[1]){ |
|
|
|
upTimes++; |
|
|
|
upforMarkKey.add(i); |
|
|
|
System.out.println(); |
|
|
|
} |
|
|
|
if(i.getValue()<controlLimitDetail.getLC()[0]){ |
|
|
|
downTimes++; |
|
|
|
downforMarkKey.add(i); |
|
|
|
} |
|
|
|
} |
|
|
|
if(upTimes>=n || downTimes>=n){ |
|
|
|
if(upTimes>=n){ |
|
|
|
for(Point i:upforMarkKey){ |
|
|
|
i.getUnsatisfiedRules().add(rule6Number); |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
if(downTimes>=n){ |
|
|
|
for(Point i:downforMarkKey){ |
|
|
|
i.getUnsatisfiedRules().add(rule6Number); |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
upi++; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* name : 规则7 |
|
|
|
* desc : 连续 n 点 落在中心线两侧的C区内。( 默认 n:15 ) |
|
|
|
* 注意: 如果存在满足rule5的点,会在原数组 Point.unsatisfiedRules 里标注出来。 |
|
|
|
* return : |
|
|
|
* 存在满足rule7的点 => true |
|
|
|
* 不存在满足rule7的点 => false |
|
|
|
* */ |
|
|
|
private static Boolean rule7(List<Point> data,ControlLimit controlLimit, Integer n){ |
|
|
|
|
|
|
|
|
|
|
|
Integer upi = 0; |
|
|
|
ControlLimitDetail controlLimitDetail = new ControlLimitDetail(controlLimit.getUCL(), controlLimit.getCL(), controlLimit.getLCL()); |
|
|
|
System.out.println(controlLimitDetail.toString()); |
|
|
|
Integer times = 0; |
|
|
|
List<Point> markKey = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
for(int i=0;i<data.size();i++){ |
|
|
|
//判断最后一次 |
|
|
|
if((upi+1) == data.size()){ |
|
|
|
Point point = data.get(upi); |
|
|
|
if(point.getValue()>controlLimitDetail.getLC()[0] && point.getValue()<controlLimitDetail.getUC()[1]){ |
|
|
|
times++; |
|
|
|
markKey.add(point); |
|
|
|
if(times==n){ |
|
|
|
for(Point j:markKey){ |
|
|
|
j.getUnsatisfiedRules().add(rule7Number); |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
}else { |
|
|
|
times = 0; |
|
|
|
markKey = new ArrayList<>(); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
//通常情况 |
|
|
|
Point point = data.get(i); |
|
|
|
if( isBetween( data.get(upi),data.get(upi+1) ) ){ |
|
|
|
if(point.getValue()>controlLimitDetail.getLC()[0] && point.getValue()<controlLimitDetail.getUC()[1]){ |
|
|
|
times++; |
|
|
|
markKey.add(point); |
|
|
|
if(times==n){ |
|
|
|
for(Point j:markKey){ |
|
|
|
j.getUnsatisfiedRules().add(rule7Number); |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
}else { |
|
|
|
times = 0; |
|
|
|
markKey = new ArrayList<>(); |
|
|
|
} |
|
|
|
}else { |
|
|
|
times = 0; |
|
|
|
markKey = new ArrayList<>(); |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|