From c91851e0b0e9cc3d08095defde2efc18bb21cb32 Mon Sep 17 00:00:00 2001 From: bestlee Date: Tue, 15 Sep 2026 10:27:08 +0800 Subject: [PATCH] =?UTF-8?q?fmea=E8=AF=84=E5=88=86=E6=A0=87=E5=87=86?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/my/initiateChange/modules/fmea.vue | 274 ++++++++++-------- src/views/my/initiateChange/modules/hazop.vue | 2 +- 2 files changed, 155 insertions(+), 121 deletions(-) diff --git a/src/views/my/initiateChange/modules/fmea.vue b/src/views/my/initiateChange/modules/fmea.vue index 885bb1e..b83d3d9 100644 --- a/src/views/my/initiateChange/modules/fmea.vue +++ b/src/views/my/initiateChange/modules/fmea.vue @@ -25,17 +25,19 @@ const currentModalTitle = ref(''); const currentModalType = ref(''); // 当前弹框对象 const currentModalObj = ref(''); +// 评分标准弹框 +const ruleModal = ref(false); // 项目总体信息与过程设置弹窗 const openSetModal = ref(false); // 项目总体信息 const description = ref(''); const nodeList = ref([]); const name = ref(''); -// 过程流程描述 +// 步骤流程描述 const node_description = ref(''); -// 过程操作方式 +// 步骤操作方式 const node_way = ref(''); -// 过程保护措施 +// 步骤保护措施 const node_protection = ref(''); // 分析列表弹窗 const openListModal = ref(false); @@ -47,6 +49,8 @@ const currentNodeIndex = ref(-1) // 打开分析列表弹框 const openList = () => { + currentNodeList.value = JSON.parse(JSON.stringify(nodes.value[currentNodeIndex.value]?.deviations || [])) + currentNodeListSource.value = JSON.parse(JSON.stringify(currentNodeList.value)) node_description.value = currentNode.value?.description || '' openListModal.value = true } @@ -236,33 +240,29 @@ const setSave = async () => { const handleSelect = (key: string) => { runAi(key); } - -const selectOptions = computed(() => { - const l = props.fmeaRiskMatrixConfig?.probability?.map((item:{key:string,label:string}, index:number) => ({ - label: 'L'+'_'+Number(index + 1), - value: 'L'+'_'+Number(index + 1) - })); - const s = props.fmeaRiskMatrixConfig?.consequence?.map((item:{key:string,label:string}, index:number) => ({ - label: 'S'+'_'+Number(index + 1), - value: 'S'+'_'+Number(index + 1) - })); - return [...l, ...s]; -}); - -const l_options = computed(() => { - const newArr = props.fmeaRiskMatrixConfig?.probability?.map((item:{key:string,label:string}, index:number) => ({ - ...item, - key: Number(index + 1) - })); - return newArr; -}); +console.log(props.fmeaRiskMatrixConfig) const s_options = computed(() => { - const newArr = props.fmeaRiskMatrixConfig?.consequence?.map((item:{key:string,label:string}, index:number) => ({ - ...item, - key: Number(index + 1) + const newArr = props.fmeaRiskMatrixConfig?.s_grades?.map((item:any) => ({ + label: item.label+'('+item.score+')', + value: item.score })); return newArr; }); +const p_options = computed(() => { + const newArr = props.fmeaRiskMatrixConfig?.p_grades?.map((item:any) => ({ + label: item.label+'('+item.score+')', + value: item.score + })); + return newArr; +}); +const d_options = computed(() => { + const newArr = props.fmeaRiskMatrixConfig?.d_grades?.map((item:any) => ({ + label: item.label+'('+item.score+')', + value: item.score + })); + return newArr; +}); + // 右键菜单状态 const contextMenuShow = ref(false) const contextMenuX = ref(0) @@ -450,85 +450,22 @@ const runInference = async () => { }, 1000) } -// 根据l和s计算RR风险等级 -const riskLevel = (l: number, s: number) => { - const num = l * s; - for (let i = 0; i < props.fmeaRiskMatrixConfig?.risk_grades.length; i++) { - const item = props.fmeaRiskMatrixConfig?.risk_grades[i]; - if (num >= item.min && num <= item.max) { - return item; // 返回整条数据 - } - } - return null; -} -// 计算RR1风险等级 -const countRiskLevel = (row: any) => { - const l = row.l_value; - const s = row.s_value; - const newArr = [...row?.safeguards || [],...row?.suggestions || []]; - const result:any = { L: 0, S: 0 }; - newArr.forEach(item => { - if (!item.value) return; // 跳过空值 - const parts = item.value.split('_'); - if (parts.length === 2) { - const type = parts[0].toUpperCase(); // 统一大写 - const num = parseInt(parts[1], 10); - if (!isNaN(num) && (type === 'L' || type === 'S')) { - result[type] += num; - } - } - }); - const newL = (l - result.L) > 0 ? l - result.L : 1; - const newS = (s - result.S) > 0 ? s - result.S : 1; - return riskLevel(newL, newS); -} - -// 新增安全措施 -const addSafeguard = (index: number) => { - if(currentDev.value.rows[index].safeguards){ - currentDev.value.rows[index].safeguards.push({name:'',value:''}); - }else{ - currentDev.value.rows[index].safeguards = [{name:'',value:''}]; - } - save() -} -// 删除安全措施 -const delSafeguard = (index: number, safeguardIndex: number) => { - currentDev.value.rows[index].safeguards.splice(safeguardIndex, 1); - save() -} -// 新增建议措施 -const addSuggestion = (index: number) => { - if(currentDev.value.rows[index].suggestions){ - currentDev.value.rows[index].suggestions.push({name:'',value:''}); - }else{ - currentDev.value.rows[index].suggestions = [{name:'',value:''}]; - } - save() -} -// 删除建议措施 -const delSuggestion = (index: number, suggestionIndex: number) => { - currentDev.value.rows[index].suggestions.splice(suggestionIndex, 1); - save() -} - // 新增行 const addRow = async () => { - console.log(props.fmeaRiskMatrixConfig) - if(!currentDev.value){ - return window.$message?.warning("请先在左侧选择失效模式") - } - currentDev.value.rows.push({ - id: 0, - cause: "", - effect: "", - s_value: 0, - p_value: 0, - d_value: 0, - residual_level: '', - safeguards: '', - suggestions: '', - }); + if(!currentDev.value){ + return window.$message?.warning("请先在左侧选择失效模式") + } + currentDev.value.rows.push({ + id: 0, + cause: "", + effect: "", + s_value: null, + p_value: null, + d_value: null, + residual_level: '', + safeguards: '', + suggestions: '', + }); }; // 删除行 const delRow = async (index: number) => { @@ -859,8 +796,6 @@ onBeforeUnmount(() => {
当前位置: - 工作步骤:{{ currentNode?.node_name ?? '未选择' }} 失效模式:{{ currentDev?.deviation ?? '未选择' }} @@ -894,7 +829,7 @@ onBeforeUnmount(() => {
{{ dev.deviation }} @@ -907,6 +842,9 @@ onBeforeUnmount(() => {
+ + 评分标准 +
@@ -924,20 +862,20 @@ onBeforeUnmount(() => { 风险等级按风险矩阵RPN = S × P × D 取值实时重算;「入表」将本条选入风险分析记录表
-
+
- - - - - - + + + + + + - + @@ -968,22 +906,22 @@ onBeforeUnmount(() => { + + + + + + + + + + + + + + + +
+

表 2:风险的发生几率(OCC)评分制

+ +
+ + + + + + + + + + + + + +
+

表 3:风险被检测或发现的可能性(DET)评分制

+ +
+ + + + + + + + + + + + + + + +
+

评价结果

+

风险评价结果首先遵循:风险严重程度为高风险的即为高风险。

+
+
+ + {{item.name}} + + {{item.min_rpn}}-{{item.max_rpn}}分: + {{item.control_measure}} +
+
+
+ + diff --git a/src/views/my/initiateChange/modules/hazop.vue b/src/views/my/initiateChange/modules/hazop.vue index b47edc9..5f056d0 100644 --- a/src/views/my/initiateChange/modules/hazop.vue +++ b/src/views/my/initiateChange/modules/hazop.vue @@ -1057,7 +1057,7 @@ onBeforeUnmount(() => {
{{ dev.deviation }}
操作失效后果S失效原因P现有措施D失效后果S失效原因P现有措施D RPN 风险等级建议措施建议措施
- + - + - + - + - + - + + +
+

风险优先系数(RPN)= 严重性(S)× 可能性(P)× 可测定性(D)

+
+

表 1:风险的严重程度(SEV)评分制

+ +
结果结果的严重性评分
{{item.label}}{{item.description}}{{item.score}}
失败发生的可能性评分
{{item.label}}:{{item.description}}{{item.score}}
发现的可能性在发生之前通过过程控制可以检测出缺陷的可能性大小评分
{{item.label}}{{item.description}}{{item.score}}