新增判读方案

This commit is contained in:
caixiang
2022-07-13 16:41:43 +08:00
parent facfe5c7a2
commit 970359823b
18 changed files with 1100 additions and 14 deletions

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ym-pass</artifactId>
<groupId>com.cnbm</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ym-quality-planning</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.cnbm</groupId>
<artifactId>ym-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,257 @@
package com.cnbm.qualityPlanning.common;
import com.cnbm.qualityPlanning.entity.ControlLimit;
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;
/**
* @Desc: "检测参数统计受控 检验类"
* @Author: caixiang
* @DATE: 2022/7/11 15:27
*/
public class StatisticalControlledTest {
private static final Integer rule1Number = 1;
private static final Integer rule2Number = 2;
private static final Integer rule3Number = 3;
private static final Integer rule4Number = 4;
private static final Integer rule5Number = 5;
private static final Integer rule6Number = 6;
private static final Integer rule7Number = 7;
private static final Integer rule8Number = 8;
private static final Integer rule9Number = 9;
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));
List<Point> list = new ArrayList<>();
list.add(point);
list.add(point2);
list.add(point3);
list.add(point4);
list.add(point5);
list.add(point6);
list.add(point7);
list.add(point8);
list.add(point9);
list.add(point10);
list.add(point11);
list.add(point12);
return list;
}
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 RULE2
Boolean aBoolean2 = rule2(list, controlLimit, 9);
System.out.println();
//TEST FOR RULE3
Boolean aBoolean3 = rule3(list, 3);
System.out.println();
}
/**
* name : 规则1
* desc : 控制图上有 1 个点位于三倍标准差以外(对中心线来说)(母体的 $\sigma$
*
* return : 返回的 就是不满足 规则1 的点。
* */
private static Boolean rule1(List<Point> data, ControlLimit controlLimit){
for(Point i:data){
if(i.getValue() > controlLimit.getUCL() || i.getValue() < controlLimit.getLCL()){
i.getUnsatisfiedRules().add(1);
}
}
return true;
}
private static void markUnsatisfiedRulesByKeys(List<Point> data,List<Integer> keys,Integer ruleNumber){
for (Integer key:keys){
data.get(key).getUnsatisfiedRules().add(ruleNumber);
}
}
/**
* name : 规则2
* desc : 连续 n 点落在中心线的用一侧 (默认9)
*
* return : 返回的 就是不满足 规则2 的点。
* */
private static Boolean rule2(List<Point> data, ControlLimit controlLimit,Integer n){
List<Point> upList = new ArrayList<>();
List<Point> downList = new ArrayList<>();
for(Point i:data){
if(i.getValue() > controlLimit.getCL()){
upList.add(i);
}else if(i.getValue() < controlLimit.getCL()){
downList.add(i);
}
}
//上侧的情况
Integer upi = 0;
Integer uptime = 0;
//标注不合格的 参数
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));
//只要到达n 了就return防止中间段到达 后面又被重置了
if(uptime>=n){
//1.
for (Point key:forMarkPoints){
for(Point j:data){
if(key.getPosition()== j.getPosition()){
j.getUnsatisfiedRules().add(rule2Number);
continue;
}
}
}
//2.
// markUnsatisfiedRulesByKeys(data,forMarkKey,rule2Number);
return true;
}
}else {
forMarkPoints = new ArrayList<>();
uptime = 0;
}
upi++;
}
//下侧的情况
Integer downi = 0;
Integer downtime = 0;
forMarkPoints = new ArrayList<>();
while((downi+1) < downList.size()){
if(isBetween(downList.get(upi),downList.get(upi+1))){
downtime +=1;
forMarkPoints.add(downList.get(downi));
if(downtime>=n){
for (Point key:forMarkPoints){
for(Point j:data){
if(key.getPosition()== j.getPosition()){
j.getUnsatisfiedRules().add(rule2Number);
continue;
}
}
}
return true;
}
}else {
forMarkPoints = new ArrayList<>();
downtime = 0;
}
downi++;
}
return false;
}
/**
* name : 规则3
* desc : 连续 n 点递增或者递减 (默认6)
*
* return : 返回的 就是不满足 规则2 的点。
* */
private static Boolean rule3(List<Point> data, Integer n){
//递增情况
Integer upi = 0;
Integer uptime = 0;
List<Integer> forMarkKey = new ArrayList<>();
while((upi+1) < data.size()){
if((isBetween( data.get(upi),data.get(upi+1) )) && isSmall( data.get(upi),data.get(upi+1) ) ){
uptime +=1;
forMarkKey.add(upi);
if(uptime>=n){
for(Integer key:forMarkKey){
data.get(key).getUnsatisfiedRules().add(rule3Number);
}
return true;
}
}else {
uptime = 0;
forMarkKey = new ArrayList<>();
}
upi++;
}
//递减情况
Integer downi = 0;
Integer downtime = 0;
forMarkKey = new ArrayList<>();
while((downi+1) < data.size()){
if((isBetween( data.get(downi),data.get(downi+1) )) && isBig( data.get(downi),data.get(downi+1) ) ){
downtime +=1;
forMarkKey.add(downi);
if(downtime>=n){
for(Integer key:forMarkKey){
data.get(key).getUnsatisfiedRules().add(rule3Number);
}
return true;
}
}else {
downtime = 0;
forMarkKey = new ArrayList<>();
}
downi++;
}
return false;
}
/**
* 如果 这两个点是相邻的 ==》 true
* */
private static boolean isBetween(Point head,Point after){
return (head.getPosition()+1) == after.getPosition();
}
/**
* 如果 head 小于 after ==》 true
* */
private static boolean isSmall(Point head,Point after){
return (head.getValue()- after.getValue()) < 0;
}
/**
* 如果 head 大于 after ==》 true
* */
private static boolean isBig(Point head,Point after){
return (head.getValue()- after.getValue()) > 0;
}
}

View File

@@ -0,0 +1,261 @@
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

@@ -0,0 +1,257 @@
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;
}
}

View File

@@ -0,0 +1,24 @@
package com.cnbm.qualityPlanning.entity;
import lombok.Data;
/**
* @Desc: ""
* @Author: caixiang
* @DATE: 2022/7/12 15:17
*/
@Data
public class ControlLimit {
//控制上限
private Double UCL;
//控制中心线
private Double CL;
//控制下限
private Double LCL;
public ControlLimit(Double UCL,Double CL,Double LCL){
this.UCL = UCL;
this.CL = CL;
this.LCL = LCL;
}
}

View File

@@ -0,0 +1,29 @@
package com.cnbm.qualityPlanning.entity;
import io.swagger.models.auth.In;
import lombok.Data;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @Desc: ""
* @Author: caixiang
* @DATE: 2022/7/12 15:12
*/
@Data
public class Point {
private Integer position;
private Double value;
//不满足的 规则 例子 : [1,2] => 代表 不满足 规则1 和 规则2
private Set<Integer> unsatisfiedRules;
public Point(Integer position , Double value){
this.position = position;
this.value = value;
this.unsatisfiedRules = new HashSet();
}
}

View File

@@ -0,0 +1,18 @@
package com.cnbm.qualityPlanning.entity;
import lombok.Data;
/**
* @Desc: ""
* @Author: caixiang
* @DATE: 2022/7/12 15:19
*/
@Data
public class SpecificationLimit {
//规格上限
private Double USL;
//规格中心线
private Double SL;
//规格下限
private Double LSL;
}