From c624cc614600db4f5ccdf56a769498b0b6bfa98f Mon Sep 17 00:00:00 2001 From: ls Date: Tue, 17 Jun 2025 14:25:09 +0800 Subject: [PATCH] review --- .../IExperimentReviewRuleExecutor.java | 8 +-- .../service/executor/ExecutorHolder.java | 7 ++- .../service/executor/GJB548C1Executor.java | 57 +++++++++++++++-- .../service/executor/GJB548C2Executor.java | 53 +++++++++++++++- .../service/executor/GJB548C3Executor.java | 57 +++++++++++++++-- .../service/executor/GJB548C4Executor.java | 60 ++++++++++++++++-- .../service/executor/GJB548C5Executor.java | 61 +++++++++++++++++-- 7 files changed, 278 insertions(+), 25 deletions(-) diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/IExperimentReviewRuleExecutor.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/IExperimentReviewRuleExecutor.java index 0afb137..6eddb51 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/IExperimentReviewRuleExecutor.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/IExperimentReviewRuleExecutor.java @@ -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); } \ No newline at end of file diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/ExecutorHolder.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/ExecutorHolder.java index 6638465..54f62c7 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/ExecutorHolder.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/ExecutorHolder.java @@ -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; + } } } diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C1Executor.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C1Executor.java index da66d14..7720379 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C1Executor.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C1Executor.java @@ -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 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 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; } } \ No newline at end of file diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C2Executor.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C2Executor.java index 5731b48..683988e 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C2Executor.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C2Executor.java @@ -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 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 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; } } \ No newline at end of file diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C3Executor.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C3Executor.java index 01596d0..bb364e1 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C3Executor.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C3Executor.java @@ -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 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 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; } } \ No newline at end of file diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C4Executor.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C4Executor.java index f69e4db..67ce6e8 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C4Executor.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C4Executor.java @@ -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 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 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; + } } \ No newline at end of file diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C5Executor.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C5Executor.java index e2b89bd..72b70fe 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C5Executor.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/executor/GJB548C5Executor.java @@ -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 experimentTestProcesses = experimentTestProcessService.getByExperimentId(experiment.getId()); + boolean condition1 = false, condition2 = false; + for (ExperimentTestProcess v : experimentTestProcesses) { + List testMeteringPointList = v.getTestMeteringPointList(); + TestMeteringPointDTO last = CollUtil.getLast(testMeteringPointList); + if (StringUtils.equals(last.getResult(), "合格")) { + condition1 = true; + break; + } + } + List 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; } } \ No newline at end of file