From e7a542d3860f4d22e2be0be3709e640f525742c3 Mon Sep 17 00:00:00 2001 From: caixiang <939387484@qq.com> Date: Fri, 29 Jul 2022 10:28:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20MR=20=20MS=20=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/cnbm/influx/Main.java | 6 +- .../com/cnbm/influx/config/InfluxClient.java | 8 +- .../influx/controller/S7DemoController.java | 32 +- .../com/cnbm/influx/param/QueryDataParam.java | 4 +- .../java/com/cnbm/influx/template/Event.java | 5 +- .../ProcessInspectionController.java | 90 ++++-- .../dto/InterpretationListArg.java | 9 + .../processInspection/dto/XbarRGraphData.java | 45 +++ .../processInspection/dto/XbarSGraphData.java | 2 +- .../graphAnalyzed/mr/MRGraphEntity.java | 50 +++ .../graphAnalyzed/mr/MeanRGraph.java | 290 ++++++++++++++++++ .../{ => ms}/MSDGraphEntity.java | 4 +- .../{ => ms}/MeanStandardDeviationGraph.java | 12 +- .../qualityPlanning/entity/XbarRPoint.java | 107 +++++++ 14 files changed, 628 insertions(+), 36 deletions(-) create mode 100644 ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/XbarRGraphData.java create mode 100644 ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/mr/MRGraphEntity.java create mode 100644 ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/mr/MeanRGraph.java rename ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/{ => ms}/MSDGraphEntity.java (92%) rename ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/{ => ms}/MeanStandardDeviationGraph.java (96%) create mode 100644 ym-quality-planning/src/main/java/com/cnbm/qualityPlanning/entity/XbarRPoint.java diff --git a/ym-influx/src/main/java/com/cnbm/influx/Main.java b/ym-influx/src/main/java/com/cnbm/influx/Main.java index 1ea237f..5cc916c 100644 --- a/ym-influx/src/main/java/com/cnbm/influx/Main.java +++ b/ym-influx/src/main/java/com/cnbm/influx/Main.java @@ -182,7 +182,7 @@ public class Main { private static List query(QueryDataParam param,InfluxDBClient influxDBClient){ String measurement = param.getMeasurement(); - String dropedTagName = param.getDropedTagName(); + List dropedTagName = param.getDropedTagNames(); Range range = param.getRange(); String bucket = param.getBucket(); String tagName = param.getTag().getTagName(); @@ -193,7 +193,9 @@ public class Main { flux += "|> range(start: "+range.getBegin().toString()+",stop:"+range.getEnd().toString()+") \n"; flux += "|> filter(fn: (r) => r[\"_measurement\"] == \""+measurement+"\") \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"; if(pageInfo!=null){ flux += "|> limit(n: "+pageInfo.getSize()+", offset: "+(pageInfo.getCurrent()-1)* pageInfo.getSize()+")"; diff --git a/ym-influx/src/main/java/com/cnbm/influx/config/InfluxClient.java b/ym-influx/src/main/java/com/cnbm/influx/config/InfluxClient.java index 9bb554e..c0c5183 100644 --- a/ym-influx/src/main/java/com/cnbm/influx/config/InfluxClient.java +++ b/ym-influx/src/main/java/com/cnbm/influx/config/InfluxClient.java @@ -78,6 +78,7 @@ public enum InfluxClient { public void insert(Event event, String measurement){ Point point = Point.measurement(measurement) .addTag("transationId", event.getTransationId()) + .addTag("inspectionSheet", event.getInspectionSheet()) .addTag("argName", event.getArgName()) .addField("argValue", event.getArgValue()) .time(event.getTime().toEpochMilli(), WritePrecision.MS); @@ -92,6 +93,7 @@ public enum InfluxClient { for(Event event:events){ Point point = Point.measurement(measurement) .addTag("transationId", event.getTransationId()) + .addTag("inspectionSheet", event.getInspectionSheet()) .addTag("argName", event.getArgName()) .addField("argValue", event.getArgValue()) .time(event.getTime().toEpochMilli(), WritePrecision.MS); @@ -103,7 +105,7 @@ public enum InfluxClient { public List query(QueryDataParam param){ String measurement = param.getMeasurement(); - String dropedTagName = param.getDropedTagName(); + List dropedTagNames = param.getDropedTagNames(); Range range = param.getRange(); String bucket = param.getBucket(); String tagName = param.getTag().getTagName(); @@ -114,7 +116,9 @@ public enum InfluxClient { flux += "|> range(start: "+range.getBegin()+",stop:"+range.getEnd()+")"; flux += "|> filter(fn: (r) => r[\"_measurement\"] == \""+measurement+"\")"; 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)"; if(pageInfo!=null){ flux += "|> limit(n: "+pageInfo.getSize()+", offset: "+(pageInfo.getCurrent()-1)* pageInfo.getSize()+")"; diff --git a/ym-influx/src/main/java/com/cnbm/influx/controller/S7DemoController.java b/ym-influx/src/main/java/com/cnbm/influx/controller/S7DemoController.java index 40b0a10..123caa3 100644 --- a/ym-influx/src/main/java/com/cnbm/influx/controller/S7DemoController.java +++ b/ym-influx/src/main/java/com/cnbm/influx/controller/S7DemoController.java @@ -32,7 +32,6 @@ public class S7DemoController { List list = new ArrayList<>(); Random r = new Random(); - for(int i=0;i<999;i++){ Thread.sleep(10); Event event = new Event(); @@ -46,6 +45,27 @@ public class S7DemoController { InfluxClient.Client.batchInsert(list,"Weight"); } + @PostMapping("/insertBatchJYD") + public void insertBatchJYD() throws InterruptedException { + List 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.setBucket("qgs-bucket"); queryDataParam.setMeasurement("ASProcessCompleteEventAS"); - queryDataParam.setDropedTagName("transationId"); + List dropNames = new ArrayList<>(); + dropNames.add("transationId"); + dropNames.add("inspectionSheet"); + queryDataParam.setDropedTagNames(dropNames); queryDataParam.setTag(new Tag("argName","arg6")); queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(),Instant.now())); queryDataParam.setPageInfo(new PageInfo(1,10)); @@ -89,7 +112,10 @@ public class S7DemoController { QueryDataParam queryDataParam = new QueryDataParam(); queryDataParam.setBucket("qgs-bucket"); queryDataParam.setMeasurement("ASProcessCompleteEventAS"); - queryDataParam.setDropedTagName("transationId"); + List dropNames = new ArrayList<>(); + dropNames.add("transationId"); + dropNames.add("inspectionSheet"); + queryDataParam.setDropedTagNames(dropNames); queryDataParam.setTag(new Tag("argName","arg7")); queryDataParam.setRange(new Range(DataUtils.getBeforeDate(10).toInstant(),Instant.now())); queryDataParam.setPageInfo(new PageInfo(2,10)); diff --git a/ym-influx/src/main/java/com/cnbm/influx/param/QueryDataParam.java b/ym-influx/src/main/java/com/cnbm/influx/param/QueryDataParam.java index b2d011d..67b1746 100644 --- a/ym-influx/src/main/java/com/cnbm/influx/param/QueryDataParam.java +++ b/ym-influx/src/main/java/com/cnbm/influx/param/QueryDataParam.java @@ -4,6 +4,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.util.List; + /** * @Desc: "influx 查询条件构造" * @Author: caixiang @@ -25,7 +27,7 @@ import lombok.experimental.Accessors; public class QueryDataParam extends BaseParam{ private Tag tag; //查询的时候,需要忽略的字段。(transationId是唯一标识会对 最终的查询结果集产生影响) - private String dropedTagName; + private List dropedTagNames; private String bucket; } diff --git a/ym-influx/src/main/java/com/cnbm/influx/template/Event.java b/ym-influx/src/main/java/com/cnbm/influx/template/Event.java index 8595a1c..4d26892 100644 --- a/ym-influx/src/main/java/com/cnbm/influx/template/Event.java +++ b/ym-influx/src/main/java/com/cnbm/influx/template/Event.java @@ -14,11 +14,14 @@ import java.time.Instant; */ @Data public class Event { + private Instant time; + private String inspectionSheet; + private String transationId; private String argName; private Double argValue; -} +} \ No newline at end of file diff --git a/ym-process-inspection/src/main/java/com/cnbm/processInspection/controller/ProcessInspectionController.java b/ym-process-inspection/src/main/java/com/cnbm/processInspection/controller/ProcessInspectionController.java index fd97caf..e268cf4 100644 --- a/ym-process-inspection/src/main/java/com/cnbm/processInspection/controller/ProcessInspectionController.java +++ b/ym-process-inspection/src/main/java/com/cnbm/processInspection/controller/ProcessInspectionController.java @@ -1,34 +1,20 @@ 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.common.spc.math.StandardDiviation; import com.cnbm.common.spc.util.DataUtils; -import com.cnbm.common.utils.Result; import com.cnbm.common.vo.R; -import com.cnbm.influx.config.InfluxClient; import com.cnbm.influx.constant.Constant; -import com.cnbm.influx.param.PageInfo; import com.cnbm.influx.param.QueryDataParam; 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.InterpretationListArg; +import com.cnbm.processInspection.dto.XbarRGraphData; 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.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -37,9 +23,7 @@ import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.time.Instant; import java.util.ArrayList; -import java.util.Date; import java.util.List; -import java.util.Random; @RestController @RequestMapping("/processInspection") @@ -58,6 +42,12 @@ public class ProcessInspectionController { productFeatures.setName("LTWeight"); productFeatures.setSampleSize(BigDecimal.TEN); MeanStandardDeviationGraph meanStandardDeviationGraph = new MeanStandardDeviationGraph(productFeatures); + //判读方案 + List 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.setMeasurement("Weight"); @@ -76,6 +66,40 @@ public class ProcessInspectionController { return R.ok("成功",xbarSGraphData); } + @PostMapping("/XbarRGraphTest") + public R 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 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 表) ;; @@ -109,4 +133,32 @@ public class ProcessInspectionController { return R.ok("成功",xbarSGraphData); } + @PostMapping("/XbarRGraph") + public R 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); + } + } diff --git a/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/InterpretationListArg.java b/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/InterpretationListArg.java index 7f3e43f..ffea2fa 100644 --- a/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/InterpretationListArg.java +++ b/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/InterpretationListArg.java @@ -15,4 +15,13 @@ public class InterpretationListArg { private Integer number; private Integer arg1; private Integer arg2; + + public InterpretationListArg() { + } + + public InterpretationListArg(Integer number, Integer arg1, Integer arg2) { + this.number = number; + this.arg1 = arg1; + this.arg2 = arg2; + } } diff --git a/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/XbarRGraphData.java b/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/XbarRGraphData.java new file mode 100644 index 0000000..1bf1681 --- /dev/null +++ b/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/XbarRGraphData.java @@ -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; + } +} diff --git a/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/XbarSGraphData.java b/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/XbarSGraphData.java index eb2f8e8..eb83328 100644 --- a/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/XbarSGraphData.java +++ b/ym-process-inspection/src/main/java/com/cnbm/processInspection/dto/XbarSGraphData.java @@ -1,7 +1,7 @@ package com.cnbm.processInspection.dto; 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.ProcessCapability; import com.cnbm.qualityPlanning.entity.SpecificationLimit; diff --git a/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/mr/MRGraphEntity.java b/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/mr/MRGraphEntity.java new file mode 100644 index 0000000..0345f1c --- /dev/null +++ b/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/mr/MRGraphEntity.java @@ -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 list; + private Double xbarbar; + private Double Rbar; + + public MRGraphEntity(List list, Double xbarbar,Double Rbar){ + this.list = list; + this.Rbar = Rbar; + + this.xbarbar = xbarbar; + } + + public List getList() { + return list; + } + + public void setList(List 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; + } +} diff --git a/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/mr/MeanRGraph.java b/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/mr/MeanRGraph.java new file mode 100644 index 0000000..054488b --- /dev/null +++ b/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/mr/MeanRGraph.java @@ -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, + * 计算控制限 + * 计算 母体 的 \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 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 list){ + this.interpretationScheme = list; + } + + /** + * name : 初始化数据函数 + * desc : 从influxdb 里面读取数据,然后 加工处理成 我需要的 + * 步骤: + * ① + * */ + public void initialDate(QueryDataParam queryDataParam){ + queryDataParam.setBucket(Constant.bucket); + List 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 query = InfluxClient.Client.query(queryDataParam); + //1. 先从fluxdb 里面提取原始数据 + List originData = new ArrayList<>(); + for (FluxTable fluxTable : query) { + List records = fluxTable.getRecords(); + for (FluxRecord fluxRecord : records) { + //因为 传进去的就是Double 类型,所以取出来,自然而然就是Double + originData.add(Double.parseDouble(fluxRecord.getValueByKey("_value").toString())); + } + } + + //2. convert to XbarSPoint + List> doubleListList = DataUtils.fixedGroup(originData, sampleSize); + List list = new ArrayList<>(); + List xbarArray = new ArrayList<>(); + List rArray = new ArrayList<>(); + for(int i=0;i forXBar = new ArrayList<>(); + List 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 warming = new ArrayList<>(); + Float usl = sp.getUSL(); + Float lsl = sp.getLSL(); + if(usl==null || lsl==null){ + if(usl==null && lsl!=null){ + if(this.miuusl){ + 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); + } +} diff --git a/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/MSDGraphEntity.java b/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/ms/MSDGraphEntity.java similarity index 92% rename from ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/MSDGraphEntity.java rename to ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/ms/MSDGraphEntity.java index ccdaf77..759c818 100644 --- a/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/MSDGraphEntity.java +++ b/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/ms/MSDGraphEntity.java @@ -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; /** - * @Desc: "" + * @Desc: "xbar-s 结果类" * @Author: caixiang * @DATE: 2022/7/21 16:26 */ diff --git a/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/MeanStandardDeviationGraph.java b/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/ms/MeanStandardDeviationGraph.java similarity index 96% rename from ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/MeanStandardDeviationGraph.java rename to ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/ms/MeanStandardDeviationGraph.java index b85cb3e..a7ad932 100644 --- a/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/MeanStandardDeviationGraph.java +++ b/ym-process-inspection/src/main/java/com/cnbm/processInspection/graphAnalyzed/ms/MeanStandardDeviationGraph.java @@ -1,4 +1,4 @@ -package com.cnbm.processInspection.graphAnalyzed; +package com.cnbm.processInspection.graphAnalyzed.ms; import com.cnbm.basic.entity.ProductFeatures; import com.cnbm.common.spc.math.Math; @@ -20,7 +20,6 @@ import lombok.Data; import java.time.Instant; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -99,7 +98,10 @@ public class MeanStandardDeviationGraph { * */ public void initialDate(QueryDataParam queryDataParam){ queryDataParam.setBucket(Constant.bucket); - queryDataParam.setDropedTagName("transationId"); + List 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())); @@ -141,12 +143,12 @@ public class MeanStandardDeviationGraph { } //3. 以及一些 控制图的全局参数。 - Double xbarbar = Math.getMean(toDoubleArray(xbarArray.toArray())); + this.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 sbar = Math.getMean(toDoubleArray(sArray.toArray())); + this.sbar = Math.getMean(toDoubleArray(sArray.toArray())); Double rbar = Math.getMean(toDoubleArray(rArray.toArray())); this.msdGraphEntity = new MSDGraphEntity(list,xbarbar,sbar,rbar); diff --git a/ym-quality-planning/src/main/java/com/cnbm/qualityPlanning/entity/XbarRPoint.java b/ym-quality-planning/src/main/java/com/cnbm/qualityPlanning/entity/XbarRPoint.java new file mode 100644 index 0000000..2e9b5dd --- /dev/null +++ b/ym-quality-planning/src/main/java/com/cnbm/qualityPlanning/entity/XbarRPoint.java @@ -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 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 rUnsatisfiedRules; + //xbar 不满足 的 判读方案 + private Set xbarUnsatisfiedRules; + + + private void setValueToTest(Double value){ + setValueForInterpretation(value); + } + + public Set getrUnsatisfiedRules() { + return rUnsatisfiedRules; + } + + public void setrUnsatisfiedRules(Set rUnsatisfiedRules) { + this.rUnsatisfiedRules = rUnsatisfiedRules; + } + + public Set getXbarUnsatisfiedRules() { + return xbarUnsatisfiedRules; + } + + public void setXbarUnsatisfiedRules(Set xbarUnsatisfiedRules) { + this.xbarUnsatisfiedRules = xbarUnsatisfiedRules; + } + + public List getData() { + return data; + } + + public void setData(List 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 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 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 unsatisfiedRules) { + super.setUnsatisfiedRules(unsatisfiedRules); + } +}