@@ -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()+")"; | ||||
@@ -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()+")"; | ||||
@@ -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)); | ||||
@@ -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; | ||||
} | } |
@@ -14,11 +14,14 @@ 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; | ||||
private Double argValue; | private Double argValue; | ||||
} | |||||
} |
@@ -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.qualityPlanning.common.StatisticalControlledTest; | |||||
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 com.cnbm.processInspection.graphAnalyzed.mr.MeanRGraph; | |||||
import com.cnbm.processInspection.graphAnalyzed.ms.MeanStandardDeviationGraph; | |||||
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); | |||||
} | |||||
} | } |
@@ -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; | |||||
} | |||||
} | } |
@@ -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; | |||||
} | |||||
} |
@@ -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; | ||||
@@ -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; | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -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 | ||||
*/ | */ |
@@ -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); | ||||
@@ -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(从 xbar、s、r 中选一) | |||||
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); | |||||
} | |||||
} |