新增 MR MS 控制图

This commit is contained in:
caixiang 2022-07-29 10:28:14 +08:00
parent fde6a8b684
commit e7a542d386
14 changed files with 628 additions and 36 deletions

View File

@ -182,7 +182,7 @@ public class Main {
private static List<FluxTable> query(QueryDataParam param,InfluxDBClient influxDBClient){ private static List<FluxTable> query(QueryDataParam param,InfluxDBClient influxDBClient){
String measurement = param.getMeasurement(); String measurement = param.getMeasurement();
String dropedTagName = param.getDropedTagName(); List<String> dropedTagName = param.getDropedTagNames();
Range range = param.getRange(); Range range = param.getRange();
String bucket = param.getBucket(); String bucket = param.getBucket();
String tagName = param.getTag().getTagName(); String tagName = param.getTag().getTagName();
@ -193,7 +193,9 @@ public class Main {
flux += "|> range(start: "+range.getBegin().toString()+",stop:"+range.getEnd().toString()+") \n"; flux += "|> range(start: "+range.getBegin().toString()+",stop:"+range.getEnd().toString()+") \n";
flux += "|> filter(fn: (r) => r[\"_measurement\"] == \""+measurement+"\") \n"; flux += "|> filter(fn: (r) => r[\"_measurement\"] == \""+measurement+"\") \n";
flux += "|> filter(fn: (r) => r[\""+tagName+"\"] == \""+tagValue+"\") \n"; flux += "|> filter(fn: (r) => r[\""+tagName+"\"] == \""+tagValue+"\") \n";
flux += "|> drop(columns: [\""+dropedTagName+"\"]) \n"; for(String dropName:dropedTagName){
flux += "|> drop(columns: [\""+ dropName +"\"]) \n";
}
flux += "|> sort(columns: [\"_time\"], desc: true) \n"; flux += "|> sort(columns: [\"_time\"], desc: true) \n";
if(pageInfo!=null){ if(pageInfo!=null){
flux += "|> limit(n: "+pageInfo.getSize()+", offset: "+(pageInfo.getCurrent()-1)* pageInfo.getSize()+")"; flux += "|> limit(n: "+pageInfo.getSize()+", offset: "+(pageInfo.getCurrent()-1)* pageInfo.getSize()+")";

View File

@ -78,6 +78,7 @@ public enum InfluxClient {
public void insert(Event event, String measurement){ public void insert(Event event, String measurement){
Point point = Point.measurement(measurement) Point point = Point.measurement(measurement)
.addTag("transationId", event.getTransationId()) .addTag("transationId", event.getTransationId())
.addTag("inspectionSheet", event.getInspectionSheet())
.addTag("argName", event.getArgName()) .addTag("argName", event.getArgName())
.addField("argValue", event.getArgValue()) .addField("argValue", event.getArgValue())
.time(event.getTime().toEpochMilli(), WritePrecision.MS); .time(event.getTime().toEpochMilli(), WritePrecision.MS);
@ -92,6 +93,7 @@ public enum InfluxClient {
for(Event event:events){ for(Event event:events){
Point point = Point.measurement(measurement) Point point = Point.measurement(measurement)
.addTag("transationId", event.getTransationId()) .addTag("transationId", event.getTransationId())
.addTag("inspectionSheet", event.getInspectionSheet())
.addTag("argName", event.getArgName()) .addTag("argName", event.getArgName())
.addField("argValue", event.getArgValue()) .addField("argValue", event.getArgValue())
.time(event.getTime().toEpochMilli(), WritePrecision.MS); .time(event.getTime().toEpochMilli(), WritePrecision.MS);
@ -103,7 +105,7 @@ public enum InfluxClient {
public List<FluxTable> query(QueryDataParam param){ public List<FluxTable> query(QueryDataParam param){
String measurement = param.getMeasurement(); String measurement = param.getMeasurement();
String dropedTagName = param.getDropedTagName(); List<String> dropedTagNames = param.getDropedTagNames();
Range range = param.getRange(); Range range = param.getRange();
String bucket = param.getBucket(); String bucket = param.getBucket();
String tagName = param.getTag().getTagName(); String tagName = param.getTag().getTagName();
@ -114,7 +116,9 @@ public enum InfluxClient {
flux += "|> range(start: "+range.getBegin()+",stop:"+range.getEnd()+")"; flux += "|> range(start: "+range.getBegin()+",stop:"+range.getEnd()+")";
flux += "|> filter(fn: (r) => r[\"_measurement\"] == \""+measurement+"\")"; flux += "|> filter(fn: (r) => r[\"_measurement\"] == \""+measurement+"\")";
flux += "|> filter(fn: (r) => r[\""+tagName+"\"] == \""+tagValue+"\")"; flux += "|> filter(fn: (r) => r[\""+tagName+"\"] == \""+tagValue+"\")";
flux += "|> drop(columns: [\""+dropedTagName+"\"])"; for(String dropName:dropedTagNames){
flux += "|> drop(columns: [\""+dropName+"\"])";
}
flux += "|> sort(columns: [\"_time\"], desc: true)"; flux += "|> sort(columns: [\"_time\"], desc: true)";
if(pageInfo!=null){ if(pageInfo!=null){
flux += "|> limit(n: "+pageInfo.getSize()+", offset: "+(pageInfo.getCurrent()-1)* pageInfo.getSize()+")"; flux += "|> limit(n: "+pageInfo.getSize()+", offset: "+(pageInfo.getCurrent()-1)* pageInfo.getSize()+")";

View File

@ -32,7 +32,6 @@ public class S7DemoController {
List<Event> list = new ArrayList<>(); List<Event> list = new ArrayList<>();
Random r = new Random(); Random r = new Random();
for(int i=0;i<999;i++){ for(int i=0;i<999;i++){
Thread.sleep(10); Thread.sleep(10);
Event event = new Event(); Event event = new Event();
@ -46,6 +45,27 @@ public class S7DemoController {
InfluxClient.Client.batchInsert(list,"Weight"); InfluxClient.Client.batchInsert(list,"Weight");
} }
@PostMapping("/insertBatchJYD")
public void insertBatchJYD() throws InterruptedException {
List<Event> list = new ArrayList<>();
Random r = new Random();
for(int j=0;j<10;j++){
for(int i=0;i<99;i++){
Thread.sleep(10);
Event event = new Event();
event.setTime(Instant.now());
event.setTransationId("asas"+i);
event.setArgName("LTWeight");
Double d = r.nextDouble() * 2.5 + 66;
event.setInspectionSheet(j+"");
event.setArgValue(d);
list.add(event);
}
}
InfluxClient.Client.batchInsert(list,"Weight");
}
/** /**
* 测试连接是否正常 * 测试连接是否正常
* *
@ -66,7 +86,10 @@ public class S7DemoController {
QueryDataParam queryDataParam = new QueryDataParam(); QueryDataParam queryDataParam = new QueryDataParam();
queryDataParam.setBucket("qgs-bucket"); queryDataParam.setBucket("qgs-bucket");
queryDataParam.setMeasurement("ASProcessCompleteEventAS"); queryDataParam.setMeasurement("ASProcessCompleteEventAS");
queryDataParam.setDropedTagName("transationId"); List<String> dropNames = new ArrayList<>();
dropNames.add("transationId");
dropNames.add("inspectionSheet");
queryDataParam.setDropedTagNames(dropNames);
queryDataParam.setTag(new Tag("argName","arg6")); queryDataParam.setTag(new Tag("argName","arg6"));
queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(),Instant.now())); queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(),Instant.now()));
queryDataParam.setPageInfo(new PageInfo(1,10)); queryDataParam.setPageInfo(new PageInfo(1,10));
@ -89,7 +112,10 @@ public class S7DemoController {
QueryDataParam queryDataParam = new QueryDataParam(); QueryDataParam queryDataParam = new QueryDataParam();
queryDataParam.setBucket("qgs-bucket"); queryDataParam.setBucket("qgs-bucket");
queryDataParam.setMeasurement("ASProcessCompleteEventAS"); queryDataParam.setMeasurement("ASProcessCompleteEventAS");
queryDataParam.setDropedTagName("transationId"); List<String> dropNames = new ArrayList<>();
dropNames.add("transationId");
dropNames.add("inspectionSheet");
queryDataParam.setDropedTagNames(dropNames);
queryDataParam.setTag(new Tag("argName","arg7")); queryDataParam.setTag(new Tag("argName","arg7"));
queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(),Instant.now())); queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(),Instant.now()));
queryDataParam.setPageInfo(new PageInfo(2,10)); queryDataParam.setPageInfo(new PageInfo(2,10));

View File

@ -4,6 +4,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.util.List;
/** /**
* @Desc: "influx 查询条件构造" * @Desc: "influx 查询条件构造"
* @Author: caixiang * @Author: caixiang
@ -25,7 +27,7 @@ import lombok.experimental.Accessors;
public class QueryDataParam extends BaseParam{ public class QueryDataParam extends BaseParam{
private Tag tag; private Tag tag;
//查询的时候需要忽略的字段(transationId是唯一标识会对 最终的查询结果集产生影响) //查询的时候需要忽略的字段(transationId是唯一标识会对 最终的查询结果集产生影响)
private String dropedTagName; private List<String> dropedTagNames;
private String bucket; private String bucket;
} }

View File

@ -14,8 +14,11 @@ import java.time.Instant;
*/ */
@Data @Data
public class Event { public class Event {
private Instant time; private Instant time;
private String inspectionSheet;
private String transationId; private String transationId;
private String argName; private String argName;

View File

@ -1,34 +1,20 @@
package com.cnbm.processInspection.controller; package com.cnbm.processInspection.controller;
import com.cnbm.basic.dto.FactoryDTO;
import com.cnbm.basic.dto.UnitDTO;
import com.cnbm.basic.entity.ProductFeatures; import com.cnbm.basic.entity.ProductFeatures;
import com.cnbm.common.spc.math.StandardDiviation; import com.cnbm.common.spc.math.StandardDiviation;
import com.cnbm.common.spc.util.DataUtils; import com.cnbm.common.spc.util.DataUtils;
import com.cnbm.common.utils.Result;
import com.cnbm.common.vo.R; import com.cnbm.common.vo.R;
import com.cnbm.influx.config.InfluxClient;
import com.cnbm.influx.constant.Constant; import com.cnbm.influx.constant.Constant;
import com.cnbm.influx.param.PageInfo;
import com.cnbm.influx.param.QueryDataParam; import com.cnbm.influx.param.QueryDataParam;
import com.cnbm.influx.param.Range; import com.cnbm.influx.param.Range;
import com.cnbm.influx.param.Tag;
import com.cnbm.influx.template.Event;
import com.cnbm.processInspection.dto.GraphArg; import com.cnbm.processInspection.dto.GraphArg;
import com.cnbm.processInspection.dto.InterpretationListArg; import com.cnbm.processInspection.dto.InterpretationListArg;
import com.cnbm.processInspection.dto.XbarRGraphData;
import com.cnbm.processInspection.dto.XbarSGraphData; import com.cnbm.processInspection.dto.XbarSGraphData;
import com.cnbm.processInspection.graphAnalyzed.MeanStandardDeviationGraph; import com.cnbm.processInspection.graphAnalyzed.mr.MeanRGraph;
import com.cnbm.qualityPlanning.common.StatisticalControlledTest; import com.cnbm.processInspection.graphAnalyzed.ms.MeanStandardDeviationGraph;
import com.cnbm.qualityPlanning.entity.ControlLimit;
import com.cnbm.qualityPlanning.entity.Point;
import com.cnbm.qualityPlanning.entity.SpecificationLimit;
import com.cnbm.qualityPlanning.entity.XbarSPoint;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -37,9 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Random;
@RestController @RestController
@RequestMapping("/processInspection") @RequestMapping("/processInspection")
@ -58,6 +42,12 @@ public class ProcessInspectionController {
productFeatures.setName("LTWeight"); productFeatures.setName("LTWeight");
productFeatures.setSampleSize(BigDecimal.TEN); productFeatures.setSampleSize(BigDecimal.TEN);
MeanStandardDeviationGraph meanStandardDeviationGraph = new MeanStandardDeviationGraph(productFeatures); MeanStandardDeviationGraph meanStandardDeviationGraph = new MeanStandardDeviationGraph(productFeatures);
//判读方案
List<InterpretationListArg> interpretationScheme = new ArrayList<>();
interpretationScheme.add(new InterpretationListArg(1,null,null));
interpretationScheme.add(new InterpretationListArg(5,3,2));
meanStandardDeviationGraph.isNeedInterpretation(interpretationScheme);
QueryDataParam queryDataParam = new QueryDataParam(); QueryDataParam queryDataParam = new QueryDataParam();
queryDataParam.setMeasurement("Weight"); queryDataParam.setMeasurement("Weight");
@ -76,6 +66,40 @@ public class ProcessInspectionController {
return R.ok("成功",xbarSGraphData); return R.ok("成功",xbarSGraphData);
} }
@PostMapping("/XbarRGraphTest")
public R<XbarRGraphData> XbarRGraphTest() throws Exception {
ProductFeatures productFeatures = new ProductFeatures();
productFeatures.setSl(new Float(5));
productFeatures.setUsl(new Float(10));
productFeatures.setLsl(new Float(1));
productFeatures.setName("LTWeight");
productFeatures.setSampleSize(BigDecimal.TEN);
MeanRGraph meanRGraph = new MeanRGraph(productFeatures);
//判读方案
List<InterpretationListArg> interpretationScheme = new ArrayList<>();
interpretationScheme.add(new InterpretationListArg(1,null,null));
interpretationScheme.add(new InterpretationListArg(5,3,2));
meanRGraph.isNeedInterpretation(interpretationScheme);
QueryDataParam queryDataParam = new QueryDataParam();
queryDataParam.setMeasurement("Weight");
queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(), Instant.now()));
meanRGraph.initialDate(queryDataParam);
XbarRGraphData xbarSGraphData = new XbarRGraphData(
meanRGraph.getMrGraphEntity(),
meanRGraph.getXbarCL(),
meanRGraph.getRCL(),
meanRGraph.getSpecificationLimit(),
meanRGraph.getProcessCapacity(),
new StandardDiviation(meanRGraph.getXigma(),meanRGraph.getTotalXigma())
);
return R.ok("成功",xbarSGraphData);
}
//筛选条件顺序 //筛选条件顺序
// 先工厂产品表 => 检验类型产品表=> 产品名产品表=> 工序产品表=> 特性检验参数name product_features // 先工厂产品表 => 检验类型产品表=> 产品名产品表=> 工序产品表=> 特性检验参数name product_features
@ -109,4 +133,32 @@ public class ProcessInspectionController {
return R.ok("成功",xbarSGraphData); return R.ok("成功",xbarSGraphData);
} }
@PostMapping("/XbarRGraph")
public R<XbarRGraphData> XbarRGraph(@RequestBody GraphArg graphArg) throws Exception {
//new 对象
ProductFeatures productFeatures = graphArg.getProductFeatures();
MeanRGraph meanRGraph = new MeanRGraph(productFeatures);
//如果要检验那么set 判读方案
if(graphArg.getInterpretationScheme()!=null){
meanRGraph.isNeedInterpretation(graphArg.getInterpretationScheme());
}
QueryDataParam queryDataParam = new QueryDataParam();
queryDataParam.setMeasurement(Constant.measurement);
queryDataParam.setRange(new Range(graphArg.getBegin().toInstant(), graphArg.getEnd().toInstant()));
meanRGraph.initialDate(queryDataParam);
XbarRGraphData xbarSGraphData = new XbarRGraphData(
meanRGraph.getMrGraphEntity(),
meanRGraph.getXbarCL(),
meanRGraph.getRCL(),
meanRGraph.getSpecificationLimit(),
meanRGraph.getProcessCapacity(),
new StandardDiviation(meanRGraph.getXigma(),meanRGraph.getTotalXigma())
);
return R.ok("成功",xbarSGraphData);
}
} }

View File

@ -15,4 +15,13 @@ public class InterpretationListArg {
private Integer number; private Integer number;
private Integer arg1; private Integer arg1;
private Integer arg2; private Integer arg2;
public InterpretationListArg() {
}
public InterpretationListArg(Integer number, Integer arg1, Integer arg2) {
this.number = number;
this.arg1 = arg1;
this.arg2 = arg2;
}
} }

View File

@ -0,0 +1,45 @@
package com.cnbm.processInspection.dto;
import com.cnbm.common.spc.math.StandardDiviation;
import com.cnbm.processInspection.graphAnalyzed.mr.MRGraphEntity;
import com.cnbm.qualityPlanning.entity.ControlLimit;
import com.cnbm.qualityPlanning.entity.ProcessCapability;
import com.cnbm.qualityPlanning.entity.SpecificationLimit;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Desc: ""
* @Author: caixiang
* @DATE: 2022/7/22 14:18
*/
@Data
@ApiModel(value = "均值极差控制图 结果类")
public class XbarRGraphData {
@ApiModelProperty(value = "控制图list数据")
private MRGraphEntity mrGraphEntity;
@ApiModelProperty(value = "xbar控制图 控制限")
private ControlLimit XBarCL;
@ApiModelProperty(value = "R控制图 控制限")
private ControlLimit RCL;
@ApiModelProperty(value = "工艺规格限")
private SpecificationLimit SL;
@ApiModelProperty(value = "工序能力")
private ProcessCapability processCapability;
@ApiModelProperty(value = "标准差/总体标准差")
private StandardDiviation standardDiviation;
public XbarRGraphData(MRGraphEntity mrGraphEntity, ControlLimit xBarCL, ControlLimit rCL, SpecificationLimit sl, ProcessCapability processCapability, StandardDiviation standardDiviation){
this.mrGraphEntity = mrGraphEntity;
this.XBarCL = xBarCL;
this.RCL = rCL;
this.SL = sl;
this.processCapability = processCapability;
this.standardDiviation = standardDiviation;
}
}

View File

@ -1,7 +1,7 @@
package com.cnbm.processInspection.dto; package com.cnbm.processInspection.dto;
import com.cnbm.common.spc.math.StandardDiviation; import com.cnbm.common.spc.math.StandardDiviation;
import com.cnbm.processInspection.graphAnalyzed.MSDGraphEntity; import com.cnbm.processInspection.graphAnalyzed.ms.MSDGraphEntity;
import com.cnbm.qualityPlanning.entity.ControlLimit; import com.cnbm.qualityPlanning.entity.ControlLimit;
import com.cnbm.qualityPlanning.entity.ProcessCapability; import com.cnbm.qualityPlanning.entity.ProcessCapability;
import com.cnbm.qualityPlanning.entity.SpecificationLimit; import com.cnbm.qualityPlanning.entity.SpecificationLimit;

View File

@ -0,0 +1,50 @@
package com.cnbm.processInspection.graphAnalyzed.mr;
import com.cnbm.qualityPlanning.entity.XbarRPoint;
import com.cnbm.qualityPlanning.entity.XbarSPoint;
import java.util.List;
/**
* @Desc: "xbar-R 结果类"
* @Author: caixiang
* @DATE: 2022/7/21 16:26
*/
public class MRGraphEntity {
private List<XbarRPoint> list;
private Double xbarbar;
private Double Rbar;
public MRGraphEntity(List<XbarRPoint> list, Double xbarbar,Double Rbar){
this.list = list;
this.Rbar = Rbar;
this.xbarbar = xbarbar;
}
public List<XbarRPoint> getList() {
return list;
}
public void setList(List<XbarRPoint> list) {
this.list = list;
}
public Double getXbarbar() {
return xbarbar;
}
public void setXbarbar(Double xbarbar) {
this.xbarbar = xbarbar;
}
public Double getRbar() {
return Rbar;
}
public void setRbar(Double rbar) {
Rbar = rbar;
}
}

View File

@ -0,0 +1,290 @@
package com.cnbm.processInspection.graphAnalyzed.mr;
import com.cnbm.basic.entity.ProductFeatures;
import com.cnbm.common.spc.math.Math;
import com.cnbm.common.spc.math.StandardDiviation;
import com.cnbm.common.spc.util.DataUtils;
import com.cnbm.influx.config.InfluxClient;
import com.cnbm.influx.constant.Constant;
import com.cnbm.influx.param.QueryDataParam;
import com.cnbm.influx.param.Range;
import com.cnbm.influx.param.Tag;
import com.cnbm.processInspection.controlCoefficientConstant.XBarRCoefficients;
import com.cnbm.processInspection.dto.InterpretationListArg;
import com.cnbm.qualityPlanning.common.StatisticalControlledTest;
import com.cnbm.qualityPlanning.entity.*;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import lombok.Data;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
/**
* @Desc: "均值标准差 控制图 , 计算类"
* @Author: caixiang
* @DATE: 2022/7/20 14:26
* 使用方式 先new MeanStandardDeviationGraph 对象 再initialData 初始化数据 再get 控制限
*
* 步骤
* 先读mysql表查询 product_features 先读到 sample_size样本量
* 再依据 influx.argName == mysql.product_feature.name && 时间段 查询所有的 参数数据
* 拿到参数数据后分组 整合成List<Point>,
* 计算控制限
* 计算 母体 \sigma bar{x}
* 计算CPK CPU CPL这些
* 如果配置了判读方案还要 调用 StatisticalControlledTest Function 检验
*
*/
@Data
public class MeanRGraph {
//母体的 μ = xbarbar
private Double miu;
//母体的 xigma 全局计算的;
private Double xigma;
//母体的 xigma 全局计算的;
private Double totalXigma;
//需要去检验的 判读方案 eg:[1,2,3,4,6]
private List<InterpretationListArg> interpretationScheme;
//这里 是特有参数 -- begin
private Double rbar;
private Double xbarbar;
private Double a2;
private Double d3;
private Double d4;
//这里 是特有参数 -- end
private Integer sampleSize;
private String argName;
private SpecificationLimit specificationLimit;
private MRGraphEntity mrGraphEntity;
public MeanRGraph(ProductFeatures productFeatures) throws Exception {
if(productFeatures.getSampleSize()==null || productFeatures.getName()==null){
throw new Exception("ProductFeatures 参数异常");
}
this.argName = productFeatures.getName();
this.sampleSize = productFeatures.getSampleSize().intValue();
this.a2 = XBarRCoefficients.getA2(sampleSize);
this.d3 = XBarRCoefficients.getD3(sampleSize);
this.d4 = XBarRCoefficients.getD4(sampleSize);
this.specificationLimit = new SpecificationLimit(
productFeatures.getUsl()==null?null:productFeatures.getUsl(),
productFeatures.getSl()==null?null:productFeatures.getSl(),
productFeatures.getUsl()==null?null:productFeatures.getUsl()
);
}
private Double[] toDoubleArray(Object[] o){
Double[] res= new Double[o.length];
for(int i=0;i<o.length;i++){
res[i] = (Double) o[i];
}
return res;
}
public void isNeedInterpretation(List<InterpretationListArg> list){
this.interpretationScheme = list;
}
/**
* name : 初始化数据函数
* desc : 从influxdb 里面读取数据然后 加工处理成 我需要的
* 步骤
*
* */
public void initialDate(QueryDataParam queryDataParam){
queryDataParam.setBucket(Constant.bucket);
List<String> dropNames = new ArrayList<>();
dropNames.add("transationId");
dropNames.add("inspectionSheet");
queryDataParam.setDropedTagNames(dropNames);
queryDataParam.setTag(new Tag("argName",argName));
queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(), Instant.now()));
List<FluxTable> query = InfluxClient.Client.query(queryDataParam);
//1. 先从fluxdb 里面提取原始数据
List<Double> originData = new ArrayList<>();
for (FluxTable fluxTable : query) {
List<FluxRecord> records = fluxTable.getRecords();
for (FluxRecord fluxRecord : records) {
//因为 传进去的就是Double 类型所以取出来自然而然就是Double
originData.add(Double.parseDouble(fluxRecord.getValueByKey("_value").toString()));
}
}
//2. convert to XbarSPoint
List<List<Double>> doubleListList = DataUtils.fixedGroup(originData, sampleSize);
List<XbarRPoint> list = new ArrayList<>();
List<Double> xbarArray = new ArrayList<>();
List<Double> rArray = new ArrayList<>();
for(int i=0;i<doubleListList.size();i++){
Double[] doubleList = toDoubleArray(doubleListList.get(i).toArray());
Double xbar = Math.getMean(doubleList);
Double r = Math.range(doubleList);
xbarArray.add(xbar);
rArray.add(r);
list.add(new XbarRPoint(
i,
new Double(0),
xbar,
r,
doubleListList.get(i)
)
);
}
//3. 以及一些 控制图的全局参数
Double xbarbar = Math.getMean(toDoubleArray(xbarArray.toArray()));
this.miu = xbarbar;
StandardDiviation standardDiviation =Math.StandardDiviation(toDoubleArray(originData.toArray()));
this.xigma = standardDiviation.getNormal();
this.totalXigma = standardDiviation.getTotality();
Double rbar = Math.getMean(toDoubleArray(rArray.toArray()));
this.mrGraphEntity = new MRGraphEntity(list,xbarbar,rbar);
//4.判读方案 校验
// 开始
if(this.interpretationScheme != null){
List<Point> forXBar = new ArrayList<>();
List<Point> forR = new ArrayList<>();
for(XbarRPoint x:list){
forXBar.add(new Point(x.getPosition(),x.getXbar()));
forR.add(new Point(x.getPosition(),x.getR()));
}
ControlLimit xbarcl = getXbarCL();
ControlLimit rcl = getRCL();
for(InterpretationListArg arg : this.interpretationScheme){
switch (arg.getNumber())//值必须是整型或者字符型
{
case 1:
StatisticalControlledTest.rule1(forXBar,xbarcl);
StatisticalControlledTest.rule1(forR,rcl);
break;
case 2:
StatisticalControlledTest.rule2(forXBar,xbarcl,arg.getArg1());
StatisticalControlledTest.rule2(forR,rcl,arg.getArg1());
break;
case 3:
StatisticalControlledTest.rule3(forXBar,arg.getArg1());
StatisticalControlledTest.rule3(forR,arg.getArg1());
break;
case 4:
StatisticalControlledTest.rule4(forXBar,arg.getArg1());
StatisticalControlledTest.rule4(forR,arg.getArg1());
break;
case 5:
StatisticalControlledTest.rule5(forXBar,xbarcl,arg.getArg1(), arg.getArg2());
StatisticalControlledTest.rule5(forR,rcl,arg.getArg1(), arg.getArg2());
break;
case 6:
StatisticalControlledTest.rule6(forXBar,xbarcl,arg.getArg1(), arg.getArg2());
StatisticalControlledTest.rule6(forR,rcl,arg.getArg1(), arg.getArg2());
break;
case 7:
StatisticalControlledTest.rule7(forXBar,xbarcl,arg.getArg1());
StatisticalControlledTest.rule7(forR,rcl, arg.getArg1());
break;
case 8:
StatisticalControlledTest.rule8(forXBar,xbarcl, arg.getArg1());
StatisticalControlledTest.rule8(forR,rcl, arg.getArg1());
break;
default:
break;
}
}
for(int i=0;i<list.size();i++){
list.get(i).setrUnsatisfiedRules(forR.get(i).getUnsatisfiedRules());
list.get(i).setXbarUnsatisfiedRules(forXBar.get(i).getUnsatisfiedRules());
}
}
// 结束
}
/**
* desc: get Xbar控制图 的控制限
* 注意此函数 要在 initialDate()函数执行之后
* */
public ControlLimit getXbarCL(){
return new ControlLimit(
(this.mrGraphEntity.getXbarbar() + a2*this.mrGraphEntity.getRbar()),
this.mrGraphEntity.getXbarbar(),
(this.mrGraphEntity.getXbarbar() - a2*this.mrGraphEntity.getRbar())
);
}
/**
* desc: get R控制图 的控制限
* 注意此函数 要在 initialDate()函数执行之后
* */
public ControlLimit getRCL(){
return new ControlLimit(
( d4 * this.mrGraphEntity.getRbar() ) ,
this.mrGraphEntity.getRbar() ,
( d3 * this.mrGraphEntity.getRbar())
);
}
/**
* desc: get 工序能力
* 注意此函数 要在 initialDate()函数执行之后
* */
public ProcessCapability getProcessCapacity(){
SpecificationLimit sp = this.specificationLimit;
List<String> warming = new ArrayList<>();
Float usl = sp.getUSL();
Float lsl = sp.getLSL();
if(usl==null || lsl==null){
if(usl==null && lsl!=null){
if(this.miu<lsl){
warming.add("平均值已不能满足规范要求, 有相当多数据均为不合格, 则表示完全没有工序能力");
return new ProcessCapability(null,null,null,(double)0,warming);
}
Double cpl = ( (this.miu-lsl) / (3 * this.xigma) );
return new ProcessCapability(null,null,null,cpl,warming);
} else if (lsl == null && usl!=null) {
if(this.miu>usl){
warming.add("平均值已不能满足规范要求, 有相当多数据均为不合格, 则表示完全没有工序能力");
return new ProcessCapability(null,null,(double)0,null,warming);
}
Double cpu = ( (usl-this.miu) / (3 * this.xigma) );
return new ProcessCapability(null,null,cpu,null,warming);
}else {
return new ProcessCapability(null,null,null,null,warming);
}
}
//下面就是 usl lsl 都部位null的情况
Float k1 = usl-lsl;
Float k2 = usl+lsl;
Double cp = ( k1 / (6*this.xigma) );
Double k = ( java.lang.Math.abs( (this.miu-k2/2) ) / (k1/2) );
if(k>1){
warming.add("此工艺参数K 大于1, 说明均值μ已经偏离到规范范围意外,即相当多的工艺参数均不满足规范要求,这说明工艺加工结果很差,该设备根本不适用于批量生产");
}
Double cpk = cp * ( 1- k);
if(cpk<0){
warming.add("Cpk=0该工序完全没有能力 批量生产");
cpk = (double) 0;
}
Double cpu = ( (usl-this.miu) / (3 * this.xigma) );
Double cpl = ( (this.miu-lsl) / (3 * this.xigma) );
return new ProcessCapability(cp,cpk,cpu,cpl,warming);
}
}

View File

@ -1,4 +1,4 @@
package com.cnbm.processInspection.graphAnalyzed; package com.cnbm.processInspection.graphAnalyzed.ms;
@ -8,7 +8,7 @@ import java.util.Date;
import java.util.List; import java.util.List;
/** /**
* @Desc: "" * @Desc: "xbar-s 结果类"
* @Author: caixiang * @Author: caixiang
* @DATE: 2022/7/21 16:26 * @DATE: 2022/7/21 16:26
*/ */

View File

@ -1,4 +1,4 @@
package com.cnbm.processInspection.graphAnalyzed; package com.cnbm.processInspection.graphAnalyzed.ms;
import com.cnbm.basic.entity.ProductFeatures; import com.cnbm.basic.entity.ProductFeatures;
import com.cnbm.common.spc.math.Math; import com.cnbm.common.spc.math.Math;
@ -20,7 +20,6 @@ import lombok.Data;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
@ -99,7 +98,10 @@ public class MeanStandardDeviationGraph {
* */ * */
public void initialDate(QueryDataParam queryDataParam){ public void initialDate(QueryDataParam queryDataParam){
queryDataParam.setBucket(Constant.bucket); queryDataParam.setBucket(Constant.bucket);
queryDataParam.setDropedTagName("transationId"); List<String> dropNames = new ArrayList<>();
dropNames.add("transationId");
dropNames.add("inspectionSheet");
queryDataParam.setDropedTagNames(dropNames);
queryDataParam.setTag(new Tag("argName",argName)); queryDataParam.setTag(new Tag("argName",argName));
queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(), Instant.now())); queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(), Instant.now()));
@ -141,12 +143,12 @@ public class MeanStandardDeviationGraph {
} }
//3. 以及一些 控制图的全局参数 //3. 以及一些 控制图的全局参数
Double xbarbar = Math.getMean(toDoubleArray(xbarArray.toArray())); this.xbarbar = Math.getMean(toDoubleArray(xbarArray.toArray()));
this.miu = xbarbar; this.miu = xbarbar;
StandardDiviation standardDiviation =Math.StandardDiviation(toDoubleArray(originData.toArray())); StandardDiviation standardDiviation =Math.StandardDiviation(toDoubleArray(originData.toArray()));
this.xigma = standardDiviation.getNormal(); this.xigma = standardDiviation.getNormal();
this.totalXigma = standardDiviation.getTotality(); this.totalXigma = standardDiviation.getTotality();
Double sbar = Math.getMean(toDoubleArray(sArray.toArray())); this.sbar = Math.getMean(toDoubleArray(sArray.toArray()));
Double rbar = Math.getMean(toDoubleArray(rArray.toArray())); Double rbar = Math.getMean(toDoubleArray(rArray.toArray()));
this.msdGraphEntity = new MSDGraphEntity(list,xbarbar,sbar,rbar); this.msdGraphEntity = new MSDGraphEntity(list,xbarbar,sbar,rbar);

View File

@ -0,0 +1,107 @@
package com.cnbm.qualityPlanning.entity;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* @Desc: "整合,处理好 后的一行数据 (sampleSize 后的数据) "
* @Author: caixiang
* @DATE: 2022/7/21 9:43
*/
public class XbarRPoint extends Point {
List<Double> data = new ArrayList<>();
private Double xbar;
private Double r;
//position 是这个数据在数组中的位置 value 是待被判读方案 分析的value xbarsr 中选一
public XbarRPoint(Integer position, Double value) {
super(position, value);
}
//r 不满足 判读方案
private Set<Integer> rUnsatisfiedRules;
//xbar 不满足 判读方案
private Set<Integer> xbarUnsatisfiedRules;
private void setValueToTest(Double value){
setValueForInterpretation(value);
}
public Set<Integer> getrUnsatisfiedRules() {
return rUnsatisfiedRules;
}
public void setrUnsatisfiedRules(Set<Integer> rUnsatisfiedRules) {
this.rUnsatisfiedRules = rUnsatisfiedRules;
}
public Set<Integer> getXbarUnsatisfiedRules() {
return xbarUnsatisfiedRules;
}
public void setXbarUnsatisfiedRules(Set<Integer> xbarUnsatisfiedRules) {
this.xbarUnsatisfiedRules = xbarUnsatisfiedRules;
}
public List<Double> getData() {
return data;
}
public void setData(List<Double> data) {
this.data = data;
}
public Double getXbar() {
return xbar;
}
public void setXbar(Double xbar) {
this.xbar = xbar;
}
public Double getR() {
return r;
}
public void setR(Double r) {
this.r = r;
}
public XbarRPoint(Integer position, Double value, Double xbar, Double r, List<Double> data) {
super(position,value);
this.xbar = xbar;
this.r = r;
this.data = data;
}
@Override
public Integer getPosition() {
return super.getPosition();
}
@Override
public Double getValueForInterpretation() {
return super.getValueForInterpretation();
}
@Override
public Set<Integer> getUnsatisfiedRules() {
return super.getUnsatisfiedRules();
}
@Override
public void setPosition(Integer position) {
super.setPosition(position);
}
@Override
public void setValueForInterpretation(Double valueForInterpretation) {
super.setValueForInterpretation(valueForInterpretation);
}
@Override
public void setUnsatisfiedRules(Set<Integer> unsatisfiedRules) {
super.setUnsatisfiedRules(unsatisfiedRules);
}
}