This commit is contained in:
ls
2025-06-17 14:25:09 +08:00
parent 9a214a210b
commit c624cc6146
7 changed files with 278 additions and 25 deletions

View File

@@ -6,10 +6,6 @@ package org.jeecg.modules.database.service;
import org.jeecg.modules.database.entity.Experiment;
import org.jeecg.modules.database.entity.ExperimentSampleInfo;
import org.jeecg.modules.system.cache.AuthStateRedisCache;
import java.util.HashMap;
import java.util.Map;
/**
* @author lise
@@ -18,6 +14,8 @@ import java.util.Map;
public interface IExperimentReviewRuleExecutor {
String getProcessType();
int getPriority();
int getPriority();
String execute(Experiment experiment, ExperimentSampleInfo sampleInfo);
}

View File

@@ -1,6 +1,7 @@
package org.jeecg.modules.database.service.executor;
import jakarta.annotation.PostConstruct;
import org.jeecg.modules.database.constant.ExperimentReviewResultEnum;
import org.jeecg.modules.database.entity.Experiment;
import org.jeecg.modules.database.entity.ExperimentSampleInfo;
import org.jeecg.modules.database.service.IExperimentReviewRuleExecutor;
@@ -25,6 +26,10 @@ public class ExecutorHolder {
if (executor == null) {
return null;
}
return executor.execute(experiment, sampleInfo);
try {
return executor.execute(experiment, sampleInfo);
} catch (Exception e) {
return ExperimentReviewResultEnum.UNKNOWN;
}
}
}

View File

@@ -4,19 +4,31 @@
*/
package org.jeecg.modules.database.service.executor;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.database.constant.ExperimentReviewProcessType;
import org.jeecg.modules.database.constant.ExperimentReviewResultEnum;
import org.jeecg.modules.database.entity.Experiment;
import org.jeecg.modules.database.entity.ExperimentSampleInfo;
import org.jeecg.modules.database.service.IExperimentReviewRuleExecutor;
import org.jeecg.modules.database.dto.RadiationDetailDTO;
import org.jeecg.modules.database.dto.RadiationMapDTO;
import org.jeecg.modules.database.entity.*;
import org.jeecg.modules.database.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author lise
* @version GJB548C1Executor.java, v 0.1 2025年06月16日 20:57 lise
*/
@Component
public class GJB548C1Executor implements IExperimentReviewRuleExecutor {
@Autowired
private IExperimentService experimentService;
@Autowired
private IExperimentRadiationProcessService experimentRadiationProcessService;
@Override
public String getProcessType() {
return ExperimentReviewProcessType.GJB548C;
@@ -27,8 +39,45 @@ public class GJB548C1Executor implements IExperimentReviewRuleExecutor {
return 1;
}
/**
* 1
*
* 模拟器件未进行ELDRS试验
*
* 可能高估器件的抗辐射性能
*
* 参见附件二知识库中68条目《双极器件的低剂量率效应》的解释。
*
* a)已知器件设计不包含双极晶体管; b)已知器件设计不包含任何线性电路功能; c)业已证明该器件类型或IC工艺并未表现出器件参数ELDRS,而且也已证明影呴ELDRS 响应的变量对于特定的生产方工艺过程已处于受控状态
*
* 样片类型为模拟集成电路样片名称中含有双极的字段。但是实际剂量率大于0.01 rad (Si) /s并且备注中没有加速试验的备注情况下启动这条评定建议
*
* @param experiment
* @param sampleInfo
* @return
*/
@Override
public String execute(Experiment experiment, ExperimentSampleInfo sampleInfo) {
return ExperimentReviewResultEnum.HIGH;
experimentService.fetchExperimentDetail(experiment);
List<ExperimentRadiationProcess> radiationProcessList = experimentRadiationProcessService.getByExperimentId(experiment.getId());
for (ExperimentRadiationProcess radiationProcess : radiationProcessList) {
if (!StringUtils.contains(radiationProcess.getSampleInfo(), sampleInfo.getId())) {
continue;
}
String radiationDetailJson = radiationProcess.getRadiationDetail();
RadiationMapDTO radiationMap = JSON.parseObject(radiationDetailJson, RadiationMapDTO.class);
List<RadiationDetailDTO> detailDTOList = radiationMap.assembleDetails();
Double minRate = detailDTOList.stream().map(obj -> obj.getActualMeasurementRate()).filter(
point -> StringUtils.isNotBlank(point)).filter(str -> str.matches("-?\\d+(\\.\\d+)?")).mapToDouble(Double::parseDouble)
.min().orElse(0d);
if (sampleInfo.getSampleName().contains("双极") && sampleInfo.getSampleType().equals("模拟集成电路") && NumberUtil.compare(
minRate, 0.01d) > 0 && StringUtils.contains(radiationProcess.getComment(), "加速试验")) {
return ExperimentReviewResultEnum.HIGH;
}
}
return ExperimentReviewResultEnum.ITEM_PASS;
}
}

View File

@@ -4,13 +4,20 @@
*/
package org.jeecg.modules.database.service.executor;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.database.constant.ExperimentReviewProcessType;
import org.jeecg.modules.database.constant.ExperimentReviewResultEnum;
import org.jeecg.modules.database.entity.Experiment;
import org.jeecg.modules.database.entity.ExperimentSampleInfo;
import org.jeecg.modules.database.service.IExperimentReviewRuleExecutor;
import org.jeecg.modules.database.dto.RadiationDetailDTO;
import org.jeecg.modules.database.dto.RadiationMapDTO;
import org.jeecg.modules.database.entity.*;
import org.jeecg.modules.database.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author lise
* @version GJB548C1Executor.java, v 0.1 2025年06月16日 20:57 lise
@@ -18,6 +25,11 @@ import org.springframework.stereotype.Component;
@Component
public class GJB548C2Executor implements IExperimentReviewRuleExecutor {
@Autowired
private IExperimentService experimentService;
@Autowired
private IExperimentRadiationProcessService experimentRadiationProcessService;
@Override
public String getProcessType() {
return ExperimentReviewProcessType.GJB548C;
@@ -28,8 +40,43 @@ public class GJB548C2Executor implements IExperimentReviewRuleExecutor {
return 2;
}
/**
* 2
*
* 选择剂量率低于规定剂量率进行辐照试验
*
* 可能低估器件的抗辐射性能
*
* 参见附件二知识库中83条目《双极器件的辐射试验-辐照剂量率》的解释
*
* 可参考 QJ10004A-2018的相关规定分析剂量率选择在QJ10004A-2018的适用性
*
* 样片类型非模拟集成电路样片名称中不含有双极的字段。但是实际剂量率小于50 rad (Si) /s启动这条评定建议
*
* @param experiment
* @param sampleInfo
* @return
*/
@Override
public String execute(Experiment experiment, ExperimentSampleInfo sampleInfo) {
experimentService.fetchExperimentDetail(experiment);
List<ExperimentRadiationProcess> radiationProcessList = experimentRadiationProcessService.getByExperimentId(experiment.getId());
for (ExperimentRadiationProcess radiationProcess : radiationProcessList) {
if (!StringUtils.contains(radiationProcess.getSampleInfo(), sampleInfo.getId())) {
continue;
}
String radiationDetailJson = radiationProcess.getRadiationDetail();
RadiationMapDTO radiationMap = JSON.parseObject(radiationDetailJson, RadiationMapDTO.class);
List<RadiationDetailDTO> detailDTOList = radiationMap.assembleDetails();
Double minRate = detailDTOList.stream().map(obj -> obj.getActualMeasurementRate()).filter(
point -> StringUtils.isNotBlank(point)).filter(str -> str.matches("-?\\d+(\\.\\d+)?")).mapToDouble(Double::parseDouble)
.max().orElse(0d);
if (!sampleInfo.getSampleName().contains("双极") && NumberUtil.compare(
minRate, 50d) < 0) {
return ExperimentReviewResultEnum.LOW;
}
}
return ExperimentReviewResultEnum.ITEM_PASS;
}
}

View File

@@ -4,13 +4,20 @@
*/
package org.jeecg.modules.database.service.executor;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.database.constant.ExperimentReviewProcessType;
import org.jeecg.modules.database.constant.ExperimentReviewResultEnum;
import org.jeecg.modules.database.entity.Experiment;
import org.jeecg.modules.database.entity.ExperimentSampleInfo;
import org.jeecg.modules.database.service.IExperimentReviewRuleExecutor;
import org.jeecg.modules.database.dto.RadiationDetailDTO;
import org.jeecg.modules.database.dto.RadiationMapDTO;
import org.jeecg.modules.database.entity.*;
import org.jeecg.modules.database.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author lise
* @version GJB548C1Executor.java, v 0.1 2025年06月16日 20:57 lise
@@ -18,6 +25,11 @@ import org.springframework.stereotype.Component;
@Component
public class GJB548C3Executor implements IExperimentReviewRuleExecutor {
@Autowired
private IExperimentService experimentService;
@Autowired
private IExperimentRadiationProcessService experimentRadiationProcessService;
@Override
public String getProcessType() {
return ExperimentReviewProcessType.GJB548C;
@@ -28,8 +40,45 @@ public class GJB548C3Executor implements IExperimentReviewRuleExecutor {
return 3;
}
/**
* 3
*
* 选择剂量率高于规定剂量率进行辐照试验
*
* 可能高估器件的抗辐射性能
*
* 参见附件二知识库中83条目《双极器件的辐射试验-辐照剂量率》的解释
*
* 可参考 QJ10004A-2018的相关规定分析剂量率选择在QJ10004A-2018的适用性
*
* 样片类型非模拟集成电路样片名称中不含有双极的字段。但是实际剂量率大于300 rad (Si) /s启动这条评定建议
*
* @param experiment
* @param sampleInfo
* @return
*/
@Override
public String execute(Experiment experiment, ExperimentSampleInfo sampleInfo) {
return ExperimentReviewResultEnum.HIGH;
experimentService.fetchExperimentDetail(experiment);
List<ExperimentRadiationProcess> radiationProcessList = experimentRadiationProcessService.getByExperimentId(experiment.getId());
for (ExperimentRadiationProcess radiationProcess : radiationProcessList) {
if (!StringUtils.contains(radiationProcess.getSampleInfo(), sampleInfo.getId())) {
continue;
}
String radiationDetailJson = radiationProcess.getRadiationDetail();
RadiationMapDTO radiationMap = JSON.parseObject(radiationDetailJson, RadiationMapDTO.class);
List<RadiationDetailDTO> detailDTOList = radiationMap.assembleDetails();
Double minRate = detailDTOList.stream().map(obj -> obj.getActualMeasurementRate()).filter(
point -> StringUtils.isNotBlank(point)).filter(str -> str.matches("-?\\d+(\\.\\d+)?")).mapToDouble(Double::parseDouble)
.max().orElse(0d);
if (!sampleInfo.getSampleName().contains("双极") && !sampleInfo.getSampleType().equals("模拟集成电路") && NumberUtil.compare(
minRate, 300d) > 0) {
return ExperimentReviewResultEnum.HIGH;
}
}
return ExperimentReviewResultEnum.ITEM_PASS;
}
}

View File

@@ -4,12 +4,20 @@
*/
package org.jeecg.modules.database.service.executor;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.database.constant.ExperimentReviewProcessType;
import org.jeecg.modules.database.entity.Experiment;
import org.jeecg.modules.database.entity.ExperimentSampleInfo;
import org.jeecg.modules.database.service.IExperimentReviewRuleExecutor;
import org.jeecg.modules.database.constant.ExperimentReviewResultEnum;
import org.jeecg.modules.database.dto.RadiationDetailDTO;
import org.jeecg.modules.database.dto.RadiationMapDTO;
import org.jeecg.modules.database.entity.*;
import org.jeecg.modules.database.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author lise
* @version GJB548C1Executor.java, v 0.1 2025年06月16日 20:57 lise
@@ -17,6 +25,11 @@ import org.springframework.stereotype.Component;
@Component
public class GJB548C4Executor implements IExperimentReviewRuleExecutor {
@Autowired
private IExperimentService experimentService;
@Autowired
private IExperimentRadiationProcessService experimentRadiationProcessService;
@Override
public String getProcessType() {
return ExperimentReviewProcessType.GJB548C;
@@ -27,8 +40,47 @@ public class GJB548C4Executor implements IExperimentReviewRuleExecutor {
return 4;
}
/**
* 4
*
* 器件没有通过电测试,未进行室温退火
*
* 可能低估器件的抗辐射性能
*
* 室温退火过程中的氧化物陷阱电荷的退火,器件的电参数有可能恢复
*
* 器件功能失效当预定应用环境辐射剂量率比试验剂量率高且高于0.001Gy(Si)/
* 剂量率高且高于0.001Gy(Si)/
*
* 样片类型非模拟集成电路样片名称中不含有双极的字段。但是实际剂量率大于300 rad (Si) /s启动这条评定建议
*
* @param experiment
* @param sampleInfo
* @return
*/
@Override
public String execute(Experiment experiment, ExperimentSampleInfo sampleInfo) {
return "";
experimentService.fetchExperimentDetail(experiment);
List<ExperimentRadiationProcess> radiationProcessList = experimentRadiationProcessService.getByExperimentId(experiment.getId());
for (ExperimentRadiationProcess radiationProcess : radiationProcessList) {
if (!StringUtils.contains(radiationProcess.getSampleInfo(), sampleInfo.getId())) {
continue;
}
String radiationDetailJson = radiationProcess.getRadiationDetail();
RadiationMapDTO radiationMap = JSON.parseObject(radiationDetailJson, RadiationMapDTO.class);
List<RadiationDetailDTO> detailDTOList = radiationMap.assembleDetails();
Double minRate = detailDTOList.stream().map(obj -> obj.getActualMeasurementRate()).filter(
point -> StringUtils.isNotBlank(point)).filter(str -> str.matches("-?\\d+(\\.\\d+)?")).mapToDouble(Double::parseDouble)
.max().orElse(0d);
if (!sampleInfo.getSampleName().contains("双极") && !sampleInfo.getSampleType().equals("模拟集成电路") && NumberUtil.compare(
minRate, 300d) > 0) {
return ExperimentReviewResultEnum.LOW;
}
}
return ExperimentReviewResultEnum.ITEM_PASS;
}
}

View File

@@ -4,18 +4,33 @@
*/
package org.jeecg.modules.database.service.executor;
import cn.hutool.core.collection.CollUtil;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.database.constant.ExperimentReviewProcessType;
import org.jeecg.modules.database.entity.Experiment;
import org.jeecg.modules.database.entity.ExperimentSampleInfo;
import org.jeecg.modules.database.service.IExperimentReviewRuleExecutor;
import org.jeecg.modules.database.constant.ExperimentReviewResultEnum;
import org.jeecg.modules.database.dto.TestMeteringPointDTO;
import org.jeecg.modules.database.entity.*;
import org.jeecg.modules.database.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author lise
*/
@Component
public class GJB548C5Executor implements IExperimentReviewRuleExecutor {
@Autowired
private IExperimentService experimentService;
@Autowired
private IExperimentRadiationProcessService experimentRadiationProcessService;
@Autowired
private IExperimentAnnealProcessService experimentAnnealProcessService;
@Autowired
private IExperimentTestProcessService experimentTestProcessService;
@Override
public String getProcessType() {
return ExperimentReviewProcessType.GJB548C;
@@ -26,8 +41,46 @@ public class GJB548C5Executor implements IExperimentReviewRuleExecutor {
return 4;
}
/**
* 5
*
* 不需要进行室温退火试验,但进行了室温退火
*
* 可能低估器件的抗辐射性能
*
* 退火过程中的界面态增长将可能导致元器件的后损伤
*
* 可参考 ESCC229000的相关规定分析退火时长在ESCC229000的适用性
*
* 最后一个剂量点测试通过但是退火过程中有室温退火退火温度为25℃识别为室温退火启动这条评定建议
*
* @param experiment
* @param sampleInfo
* @return
*/
@Override
public String execute(Experiment experiment, ExperimentSampleInfo sampleInfo) {
return "";
experimentService.fetchExperimentDetail(experiment);
List<ExperimentTestProcess> experimentTestProcesses = experimentTestProcessService.getByExperimentId(experiment.getId());
boolean condition1 = false, condition2 = false;
for (ExperimentTestProcess v : experimentTestProcesses) {
List<TestMeteringPointDTO> testMeteringPointList = v.getTestMeteringPointList();
TestMeteringPointDTO last = CollUtil.getLast(testMeteringPointList);
if (StringUtils.equals(last.getResult(), "合格")) {
condition1 = true;
break;
}
}
List<ExperimentAnnealProcess> experimentAnnealProcessList = experimentAnnealProcessService.getByExperimentId(experiment.getId());
for (ExperimentAnnealProcess experimentAnnealProcess : experimentAnnealProcessList) {
if (experimentAnnealProcess.getAnnealTemperature().equals("25")) {
condition2 = true;
break;
}
}
if (condition1 && condition2) {
return ExperimentReviewResultEnum.LOW;
}
return ExperimentReviewResultEnum.ITEM_PASS;
}
}