|
|
|
|
@ -1,5 +1,6 @@
|
|
|
|
|
package com.aucma.base.service.impl;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Collections;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
@ -193,4 +194,115 @@ public class BaseDeviceParamValServiceImpl implements IBaseDeviceParamValService
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 参数追溯查询(按时间范围)
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public List<BaseDeviceParamVal> selectTraceList(String deviceCode, String paramCode, String startTime, String endTime) {
|
|
|
|
|
try {
|
|
|
|
|
Map<String, Object> params = new HashMap<>();
|
|
|
|
|
params.put("deviceCode", deviceCode);
|
|
|
|
|
params.put("paramCode", paramCode);
|
|
|
|
|
params.put("startTime", startTime);
|
|
|
|
|
params.put("endTime", endTime);
|
|
|
|
|
List<BaseDeviceParamVal> list = baseDeviceParamValMapper.selectTraceList(params);
|
|
|
|
|
return list != null ? list : Collections.emptyList();
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("参数追溯查询失败: {}", e.getMessage());
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取SPC分析数据
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Map<String, Object> getSPCData(String deviceCode, String paramCode, String startTime, String endTime) {
|
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
|
result.put("deviceCode", deviceCode);
|
|
|
|
|
result.put("paramCode", paramCode);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 查询参数名称
|
|
|
|
|
String paramName = baseDeviceParamValMapper.selectParamNameByCode(paramCode);
|
|
|
|
|
result.put("paramName", paramName != null ? paramName : paramCode);
|
|
|
|
|
|
|
|
|
|
// 查询参数历史值
|
|
|
|
|
Map<String, Object> params = new HashMap<>();
|
|
|
|
|
params.put("deviceCode", deviceCode);
|
|
|
|
|
params.put("paramCode", paramCode);
|
|
|
|
|
params.put("startTime", startTime);
|
|
|
|
|
params.put("endTime", endTime);
|
|
|
|
|
List<Double> values = baseDeviceParamValMapper.selectParamHistoryValues(params);
|
|
|
|
|
|
|
|
|
|
if (values == null || values.isEmpty()) {
|
|
|
|
|
result.put("values", new ArrayList<>());
|
|
|
|
|
result.put("sampleSize", 0);
|
|
|
|
|
result.put("mean", 0.0);
|
|
|
|
|
result.put("stdDev", 0.0);
|
|
|
|
|
result.put("cpk", 0.0);
|
|
|
|
|
result.put("ucl", 0.0);
|
|
|
|
|
result.put("lcl", 0.0);
|
|
|
|
|
result.put("cl", 0.0);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result.put("values", values);
|
|
|
|
|
result.put("sampleSize", values.size());
|
|
|
|
|
|
|
|
|
|
// 计算统计指标
|
|
|
|
|
double mean = calculateMean(values);
|
|
|
|
|
double stdDev = calculateStdDev(values, mean);
|
|
|
|
|
double ucl = mean + 3 * stdDev;
|
|
|
|
|
double lcl = mean - 3 * stdDev;
|
|
|
|
|
|
|
|
|
|
result.put("mean", Math.round(mean * 1000.0) / 1000.0);
|
|
|
|
|
result.put("stdDev", Math.round(stdDev * 1000.0) / 1000.0);
|
|
|
|
|
result.put("ucl", Math.round(ucl * 1000.0) / 1000.0);
|
|
|
|
|
result.put("lcl", Math.round(lcl * 1000.0) / 1000.0);
|
|
|
|
|
result.put("cl", Math.round(mean * 1000.0) / 1000.0);
|
|
|
|
|
|
|
|
|
|
// 计算CPK(假设规格限为均值±10%)
|
|
|
|
|
double usl = mean * 1.1;
|
|
|
|
|
double lsl = mean * 0.9;
|
|
|
|
|
double cpk = calculateCPK(mean, stdDev, usl, lsl);
|
|
|
|
|
result.put("cpk", Math.round(cpk * 100.0) / 100.0);
|
|
|
|
|
result.put("usl", Math.round(usl * 1000.0) / 1000.0);
|
|
|
|
|
result.put("lsl", Math.round(lsl * 1000.0) / 1000.0);
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("获取SPC分析数据失败: {}", e.getMessage());
|
|
|
|
|
result.put("error", e.getMessage());
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private double calculateMean(List<Double> values) {
|
|
|
|
|
if (values == null || values.isEmpty()) return 0.0;
|
|
|
|
|
double sum = 0.0;
|
|
|
|
|
for (Double v : values) {
|
|
|
|
|
if (v != null) sum += v;
|
|
|
|
|
}
|
|
|
|
|
return sum / values.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private double calculateStdDev(List<Double> values, double mean) {
|
|
|
|
|
if (values == null || values.size() < 2) return 0.0;
|
|
|
|
|
double sumSquares = 0.0;
|
|
|
|
|
for (Double v : values) {
|
|
|
|
|
if (v != null) {
|
|
|
|
|
sumSquares += Math.pow(v - mean, 2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return Math.sqrt(sumSquares / (values.size() - 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private double calculateCPK(double mean, double stdDev, double usl, double lsl) {
|
|
|
|
|
if (stdDev == 0) return 0.0;
|
|
|
|
|
double cpupper = (usl - mean) / (3 * stdDev);
|
|
|
|
|
double cplower = (mean - lsl) / (3 * stdDev);
|
|
|
|
|
return Math.min(cpupper, cplower);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|