mark for pull

This commit is contained in:
caixiang
2022-07-20 15:33:30 +08:00
parent 13020d05c9
commit 2b34011129
20 changed files with 767 additions and 35 deletions

View File

@@ -4,13 +4,13 @@ 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.*;
/**
* @Desc: "检测参数统计受控 检验类"
* @Author: caixiang
* todo ① 开头第一组,和最后一组 是否漏掉 问题;② 中间情况 时候把最后一个元素漏掉。
* @DATE: 2022/7/11 15:27
*/
public class StatisticalControlledTest {
@@ -26,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.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));
Point point = new Point(1,new Double(0.7));
Point point2 = new Point(2,new Double(0.7));
Point point3 = new Point(3,new Double(3.7));
Point point4 = new Point(4,new Double(0.7));
Point point5 = new Point(5,new Double(0.7));
Point point6 = new Point(6,new Double(3.7)); //3
Point point7 = new Point(7,new Double(3.7)); //3
Point point8 = new Point(8,new Double(3.7)); //3 //3
Point point9 = new Point(9,new Double(3.7));
Point point10 = new Point(10,new Double(3.7));
Point point11 = new Point(11,new Double(3.7));
Point point12 = new Point(12,new Double(3.7));
List<Point> list = new ArrayList<>();
list.add(point);
list.add(point2);
@@ -62,8 +62,8 @@ public class StatisticalControlledTest {
// Boolean aBoolean1 = rule1(list, controlLimit);
//
//TEST FOR RULE2
Boolean aBoolean2 = rule2(list, controlLimit, 9);
System.out.println();
// Boolean aBoolean2 = rule2(list, controlLimit, 9);
// System.out.println();
//
//
// //TEST FOR RULE3
@@ -72,7 +72,7 @@ public class StatisticalControlledTest {
//
//
// //TEST FOR RULE4
// Boolean aBoolean4 = rule4(list, 4);
// Boolean aBoolean4 = rule4(list, 5);
// System.out.println();
// //TEST FOR RULE5
@@ -88,6 +88,10 @@ public class StatisticalControlledTest {
Boolean aBoolean7 = rule7(list, controlLimit,7);
System.out.println();
//TEST FOR RULE8
// Boolean aBoolean8 = rule8(list, controlLimit,8);
// System.out.println();
// int[] array={1,2,3,4,5,6};
// int[] ret=new int[3];
// System.arraycopy(array,0,ret,0,3);
@@ -123,7 +127,6 @@ public class StatisticalControlledTest {
* name : 规则2
* desc : 连续 n 点落在中心线的用一侧 (默认9)
* 注意: 如果存在满足rule2的点会在原数组 Point.unsatisfiedRules 里标注出来。
* //todo 存在bug while((upi+1) < data.size()){ ,最后一个点轮询不到
* return :
* 存在满足rule2的点 => true
* 不存在满足rule2的点 => false
@@ -160,7 +163,7 @@ public class StatisticalControlledTest {
//1.
for (Point key:forMarkPoints){
for(Point j:data){
if(key.getPosition()== j.getPosition()){
if(key.getPosition().equals(j.getPosition())){
j.getUnsatisfiedRules().add(rule2Number);
continue;
}
@@ -197,7 +200,7 @@ public class StatisticalControlledTest {
for (Point key:forMarkPoints){
for(Point j:data){
if(key.getPosition()== j.getPosition()){
if(key.getPosition().equals(j.getPosition())){
j.getUnsatisfiedRules().add(rule2Number);
continue;
}
@@ -280,7 +283,6 @@ public class StatisticalControlledTest {
* name : 规则4
* desc : 连续 n 点中 相邻点 交替上下 ( 默认14 )
* 注意: 如果存在满足rule4的点会在原数组 Point.unsatisfiedRules 里标注出来。
* //todo 有bug while((upi+1) < data.size()) 这里 upi+1 会存在问题
* return :
* 存在满足rule4的点 => true
* 不存在满足rule4的点 => false
@@ -301,6 +303,24 @@ public class StatisticalControlledTest {
while((upi+1) < data.size()){
if(isBetween( data.get(upi),data.get(upi+1) )){
//
if(forMarkKey.size()==(n-1)){
Double u1 = data.get(upi-2).getValue();
Double u2 = data.get(upi-1).getValue();
Double u3 = data.get(upi).getValue();
if(isUpAndDown(u1,u2,u3)){
forMarkKey.add(upi);
times++;
}
if(times >= n){
for(Integer key:forMarkKey){
data.get(key).getUnsatisfiedRules().add(rule4Number);
}
return true;
}
}
//A-B<0 True
//A-B>0 False
if(isSmall(data.get(upi),data.get(upi+1))){
@@ -313,7 +333,19 @@ public class StatisticalControlledTest {
if (current.equals(nextNeeded)){
times++;
forMarkKey.add(upi);
if(times == n){
//加入最后一个元素的判断
if((upi+1)==(data.size()-1)){
Double u0 = data.get(upi - 1).getValue();
Double u1 = data.get(upi).getValue();
Double u2 = data.get(upi + 1).getValue();
if(isUpAndDown(u0,u1,u2)){
forMarkKey.add(upi+1);
times++;
}
}
if(times >= n){
for(Integer key:forMarkKey){
data.get(key).getUnsatisfiedRules().add(rule4Number);
}
@@ -334,6 +366,8 @@ public class StatisticalControlledTest {
return false;
}
/**
* name : 规则5
* desc : 连续 m 点中 有 n 点 落在中心线同一侧B区以外。( 默认 m:3 , n:2 )
@@ -403,7 +437,7 @@ public class StatisticalControlledTest {
/**
* name : 规则6
* desc : 连续 m 点中 有 n 点 落在中心线同一侧C区以外。( 默认 m:5 , n:4 )
* 注意: 如果存在满足rule5的点,会在原数组 Point.unsatisfiedRules 里标注出来。
* 注意: 如果存在满足rule6的点,会在原数组 Point.unsatisfiedRules 里标注出来。
* return :
* 存在满足rule6的点 => true
* 不存在满足rule6的点 => false
@@ -469,7 +503,7 @@ public class StatisticalControlledTest {
/**
* name : 规则7
* desc : 连续 n 点 落在中心线两侧的C区内。( 默认 n:15 )
* 注意: 如果存在满足rule5的点,会在原数组 Point.unsatisfiedRules 里标注出来。
* 注意: 如果存在满足rule7的点,会在原数组 Point.unsatisfiedRules 里标注出来。
* return :
* 存在满足rule7的点 => true
* 不存在满足rule7的点 => false
@@ -477,7 +511,7 @@ public class StatisticalControlledTest {
private static Boolean rule7(List<Point> data,ControlLimit controlLimit, Integer n){
Integer upi = 0;
//Integer upi = 0;
ControlLimitDetail controlLimitDetail = new ControlLimitDetail(controlLimit.getUCL(), controlLimit.getCL(), controlLimit.getLCL());
System.out.println(controlLimitDetail.toString());
Integer times = 0;
@@ -486,12 +520,12 @@ public class StatisticalControlledTest {
for(int i=0;i<data.size();i++){
//判断最后一次
if((upi+1) == data.size()){
Point point = data.get(upi);
if((i+1) == data.size()){
Point point = data.get(i);
if(point.getValue()>controlLimitDetail.getLC()[0] && point.getValue()<controlLimitDetail.getUC()[1]){
times++;
markKey.add(point);
if(times==n){
if(times.equals(n)){
for(Point j:markKey){
j.getUnsatisfiedRules().add(rule7Number);
}
@@ -506,11 +540,11 @@ public class StatisticalControlledTest {
//通常情况
Point point = data.get(i);
if( isBetween( data.get(upi),data.get(upi+1) ) ){
if( isBetween( data.get(i),data.get(i+1) ) ){
if(point.getValue()>controlLimitDetail.getLC()[0] && point.getValue()<controlLimitDetail.getUC()[1]){
times++;
markKey.add(point);
if(times==n){
if(times.equals(n)){
for(Point j:markKey){
j.getUnsatisfiedRules().add(rule7Number);
}
@@ -528,8 +562,68 @@ public class StatisticalControlledTest {
return false;
}
/**
* name : 规则8
* desc : 连续 n 点 落在中心线两侧且无一点在C区内。( 默认 n:8 )
* 注意: 如果存在满足rule8的点会在原数组 Point.unsatisfiedRules 里标注出来。
* return :
* 存在满足rule8的点 => true
* 不存在满足rule8的点 => false
* */
private static Boolean rule8(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((i+1) == data.size()){
Point point = data.get(i);
if( point.getValue()>controlLimitDetail.getUC()[1] || point.getValue()<controlLimitDetail.getLC()[0] ){
times++;
markKey.add(point);
if(times.equals(n)){
for(Point j:markKey){
j.getUnsatisfiedRules().add(rule8Number);
}
return true;
}
}else {
times = 0;
markKey = new ArrayList<>();
}
break;
}
//通常情况
Point point = data.get(i);
if( isBetween( data.get(i),data.get(i+1) ) ){
if( point.getValue()>controlLimitDetail.getUC()[1] || point.getValue()<controlLimitDetail.getLC()[0] ){
times++;
markKey.add(point);
if(times.equals(n)){
for(Point j:markKey){
j.getUnsatisfiedRules().add(rule8Number);
}
return true;
}
}else {
times = 0;
markKey = new ArrayList<>();
}
}else {
times = 0;
markKey = new ArrayList<>();
}
}
return false;
}
/**
* 如果 这两个点是相邻的 ==》 true
* */
@@ -549,4 +643,19 @@ public class StatisticalControlledTest {
return (head.getValue()- after.getValue()) > 0;
}
/**
* 如果这三个参数 是起伏的 ====> true
*
* */
private static boolean isUpAndDown(Double u1,Double u2,Double u3){
Boolean r1 = ((u1-u2)>0);
Boolean r2 = ((u2-u3)>0);
if(!r1.equals(r2)){
return true;
}else {
return false;
}
}
}

View File

@@ -1,261 +0,0 @@
package com.cnbm.qualityPlanning.constant;
/**
* @Desc: " "x bar - R" 控制系数 "
* @Author: caixiang
* @DATE: 2022/6/30 10:44
*/
public class XBarRCoefficients {
public static Double getA2(Integer sampleSize){
if(sampleSize<=1){
return null;
}
Double res = null;
switch(sampleSize){
//P92
case 2:
res = new Double(1.880);
break;
case 3:
res = new Double(1.023);
break;
case 4:
res = new Double(0.729);
break;
case 5:
res = new Double(0.577);
break;
case 6:
res = new Double(0.483);
break;
case 7:
res = new Double(0.419);
break;
case 8:
res = new Double(0.373);
break;
case 9:
res = new Double(0.337);
break;
case 10:
res = new Double(0.308);
break;
case 11:
res = new Double(0.285);
break;
case 12:
res = new Double(0.266);
break;
case 13:
res = new Double(0.249);
break;
case 14:
res = new Double(0.235);
break;
case 15:
res = new Double(0.223);
break;
case 16:
res = new Double(0.212);
break;
case 17:
res = new Double(0.203);
break;
case 18:
res = new Double(0.194);
break;
case 19:
res = new Double(0.187);
break;
case 20:
res = new Double(0.180);
break;
case 21:
res = new Double(0.173);
break;
case 22:
res = new Double(0.167);
break;
case 23:
res = new Double(0.162);
break;
case 24:
res = new Double(0.157);
break;
//大于等于25 都是用0.153
default :
res = new Double(0.153);
break;
}
return res;
}
public static Double getD3(Integer sampleSize){
if(sampleSize<=1){
return null;
}
Double res = null;
switch(sampleSize){
//P92
case 2:
res = new Double(0);
break;
case 3:
res = new Double(0);
break;
case 4:
res = new Double(0);
break;
case 5:
res = new Double(0);
break;
case 6:
res = new Double(0);
break;
case 7:
res = new Double(0.076);
break;
case 8:
res = new Double(0.136);
break;
case 9:
res = new Double(0.184);
break;
case 10:
res = new Double(0.223);
break;
case 11:
res = new Double(0.256);
break;
case 12:
res = new Double(0.283);
break;
case 13:
res = new Double(0.307);
break;
case 14:
res = new Double(0.328);
break;
case 15:
res = new Double(0.347);
break;
case 16:
res = new Double(0.363);
break;
case 17:
res = new Double(0.378);
break;
case 18:
res = new Double(0.391);
break;
case 19:
res = new Double(0.403);
break;
case 20:
res = new Double(0.415);
break;
case 21:
res = new Double(0.425);
break;
case 22:
res = new Double(0.434);
break;
case 23:
res = new Double(0.443);
break;
case 24:
res = new Double(0.451);
break;
//大于等于25 都是用0.459
default :
res = new Double(0.459);
break;
}
return res;
}
public static Double getD4(Integer sampleSize){
if(sampleSize<=1){
return null;
}
Double res = null;
switch(sampleSize){
//P92
case 2:
res = new Double(3.267);
break;
case 3:
res = new Double(2.574);
break;
case 4:
res = new Double(2.282);
break;
case 5:
res = new Double(2.114);
break;
case 6:
res = new Double(2.004);
break;
case 7:
res = new Double(1.924);
break;
case 8:
res = new Double(1.864);
break;
case 9:
res = new Double(1.816);
break;
case 10:
res = new Double(1.777);
break;
case 11:
res = new Double(1.744);
break;
case 12:
res = new Double(1.717);
break;
case 13:
res = new Double(1.693);
break;
case 14:
res = new Double(1.672);
break;
case 15:
res = new Double(1.653);
break;
case 16:
res = new Double(1.637);
break;
case 17:
res = new Double(1.622);
break;
case 18:
res = new Double(1.608);
break;
case 19:
res = new Double(1.597);
break;
case 20:
res = new Double(1.585);
break;
case 21:
res = new Double(1.575);
break;
case 22:
res = new Double(1.566);
break;
case 23:
res = new Double(1.557);
break;
case 24:
res = new Double(1.548);
break;
//大于等于25 都是用1.541
default :
res = new Double(1.541);
break;
}
return res;
}
}

View File

@@ -1,257 +0,0 @@
package com.cnbm.qualityPlanning.constant;
/**
* @Desc: " "x bar - s" 控制系数 "
* @Author: caixiang
* @DATE: 2022/6/30 10:44
*/
public class XBarSCoefficients {
public static Double getAS(Integer sampleSize){
if(sampleSize<=1){
return null;
}
Double res = null;
switch(sampleSize){
case 2:
res = new Double(2.659);
break;
case 3:
res = new Double(1.954);
break;
case 4:
res = new Double(1.628);
break;
case 5:
res = new Double(1.427);
break;
case 6:
res = new Double(1.287);
break;
case 7:
res = new Double(1.182);
break;
case 8:
res = new Double(1.099);
break;
case 9:
res = new Double(1.032);
break;
case 10:
res = new Double(0.975);
break;
case 11:
res = new Double(0.972);
break;
case 12:
res = new Double(0.866);
break;
case 13:
res = new Double(0.850);
break;
case 14:
res = new Double(0.817);
break;
case 15:
res = new Double(0.789);
break;
case 16:
res = new Double(0.763);
break;
case 17:
res = new Double(0.739);
break;
case 18:
res = new Double(0.718);
break;
case 19:
res = new Double(0.698);
break;
case 20:
res = new Double(0.680);
break;
case 21:
res = new Double(0.663);
break;
case 22:
res = new Double(0.647);
break;
case 23:
res = new Double(0.633);
break;
case 24:
res = new Double(0.619);
break;
//大于等于25 都是用0.606
default :
res = new Double(0.606);
break;
}
return res;
}
public static Double getBU(Integer sampleSize){
if(sampleSize<=1){
return null;
}
Double res = null;
switch(sampleSize){
case 2:
res = new Double(3.267);
break;
case 3:
res = new Double(2.568);
break;
case 4:
res = new Double(2.266);
break;
case 5:
res = new Double(2.089);
break;
case 6:
res = new Double(1.970);
break;
case 7:
res = new Double(1.882);
break;
case 8:
res = new Double(1.815);
break;
case 9:
res = new Double(1.761);
break;
case 10:
res = new Double(1.716);
break;
case 11:
res = new Double(1.679);
break;
case 12:
res = new Double(1.646);
break;
case 13:
res = new Double(1.618);
break;
case 14:
res = new Double(1.594);
break;
case 15:
res = new Double(1.572);
break;
case 16:
res = new Double(1.552);
break;
case 17:
res = new Double(1.534);
break;
case 18:
res = new Double(1.518);
break;
case 19:
res = new Double(1.503);
break;
case 20:
res = new Double(1.490);
break;
case 21:
res = new Double(1.477);
break;
case 22:
res = new Double(1.466);
break;
case 23:
res = new Double(1.455);
break;
case 24:
res = new Double(1.445);
break;
//大于等于25 都是用1.435
default :
res = new Double(1.435);
break;
}
return res;
}
public static Double getBL(Integer sampleSize){
if(sampleSize<=1){
return null;
}
Double res = null;
switch(sampleSize){
case 2:
res = new Double(0);
break;
case 3:
res = new Double(0);
break;
case 4:
res = new Double(0);
break;
case 5:
res = new Double(0);
break;
case 6:
res = new Double(0.030);
break;
case 7:
res = new Double(0.118);
break;
case 8:
res = new Double(0.185);
break;
case 9:
res = new Double(0.239);
break;
case 10:
res = new Double(0.284);
break;
case 11:
res = new Double(0.321);
break;
case 12:
res = new Double(0.354);
break;
case 13:
res = new Double(0.382);
break;
case 14:
res = new Double(0.406);
break;
case 15:
res = new Double(0.428);
break;
case 16:
res = new Double(0.448);
break;
case 17:
res = new Double(0.466);
break;
case 18:
res = new Double(0.482);
break;
case 19:
res = new Double(0.497);
break;
case 20:
res = new Double(0.510);
break;
case 21:
res = new Double(0.523);
break;
case 22:
res = new Double(0.534);
break;
case 23:
res = new Double(0.545);
break;
case 24:
res = new Double(0.555);
break;
//大于等于25 都是用0.565
default :
res = new Double(0.565);
break;
}
return res;
}
}