fmea插件保存完成

This commit is contained in:
2026-09-15 11:05:13 +08:00
parent c91851e0b0
commit 8dffb76a16
+66 -23
View File
@@ -240,28 +240,38 @@ const setSave = async () => {
const handleSelect = (key: string) => {
runAi(key);
}
console.log(props.fmeaRiskMatrixConfig)
const s_options = computed(() => {
const newArr = props.fmeaRiskMatrixConfig?.s_grades?.map((item:any) => ({
label: item.label+'('+item.score+')',
value: item.score
text: item.label,
value: item.score,
key: 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
text: item.label,
value: item.score,
key: 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
text: item.label,
value: item.score,
key: item.score
}));
return newArr;
});
// 用value找到text
const getText = (value:number, options:any[]) => {
const item = options.find((item:any) => item.value === value);
return item?.text || '';
}
// 右键菜单状态
const contextMenuShow = ref<boolean>(false)
@@ -348,6 +358,14 @@ const save = async (isClick: boolean = false) => {
const { org_name, ...rest } = item;
return rest;
});
// 修改residual_level值
nodes.value?.forEach((node:any) =>
node?.deviations?.forEach((dev:any) =>
dev?.rows?.forEach((row:any) => {
row.residual_level = calculateRiskGrade(row.s_value, row.p_value, row.d_value)?.name || '';
})
)
);
const {error} = await fmeaSaveApi(props.currentId, {
nodes: nodes.value,
users: workers,
@@ -450,6 +468,16 @@ const runInference = async () => {
}, 1000)
}
// 计算风险等级
const calculateRiskGrade = (s: number,p: number,d: number) => {
const rpn = s * p * d;
const levels = props.fmeaRiskMatrixConfig?.risk_grades || [];
if (!Number.isFinite(rpn)) {
return null
}
return levels.find((item:any) => rpn >= item.min_rpn && rpn <= item.max_rpn) || null;
}
// 新增行
const addRow = async () => {
if(!currentDev.value){
@@ -517,7 +545,6 @@ const modalSave = async () => {
deviation: name.value,
rows: []
}
console.log(contextTarget.value?.nodeIndex)
if(nodes.value[contextTarget.value?.nodeIndex].deviations){
nodes.value[contextTarget.value?.nodeIndex].deviations.push(dev);
}else {
@@ -658,7 +685,6 @@ const getFmeaNodes = async () => {
loading.value = true;
const {data,error} = await fmeaNodesApi(props.currentId);
if(!error){
console.log(data)
nodes.value = data.nodes;
selectedWorkers.value = data.users;
clickDev(nodes.value[0]?.deviations[0] || null,0)
@@ -909,47 +935,64 @@ onBeforeUnmount(() => {
<NInput type="textarea" size="small" v-model:value="row.effect" :autosize="{minRows:1}" class="text-xs" />
</td>
<td :class="TD" class="text-center">
<NSelect v-model:value="row.s_value" size="tiny" :options="s_options" placeholder="请选择" class="text-center w-full mt-2px" />
<NDropdown trigger="click" :options="s_options" @select="(key) => row.s_value = key">
<div class="cursor-pointer" title="点击选择">
<p>{{row.s_value || '-'}}</p>
<p class="text-slate-400">{{getText(row.s_value, s_options) || '点击选择'}}</p>
</div>
</NDropdown>
</td>
<td :class="TD">
<NInput type="textarea" size="small" v-model:value="row.cause" :autosize="{minRows:1}" class="text-xs" />
</td>
<td :class="TD" class="text-center">
<NSelect v-model:value="row.p_value" size="tiny" :options="p_options" placeholder="请选择" class="text-center w-full mt-2px" />
<NDropdown trigger="click" :options="p_options" @select="(key) => row.p_value = key">
<div class="cursor-pointer" title="点击选择">
<p>{{row.p_value || '-'}}</p>
<p class="text-slate-400">{{getText(row.p_value, p_options) || '点击选择'}}</p>
</div>
</NDropdown>
</td>
<td :class="TD">
<NInput type="textarea" size="small" v-model:value="row.safeguards" :autosize="{minRows:1}" class="text-xs" />
</td>
<td :class="TD" class="text-center">
<NSelect v-model:value="row.d_value" size="tiny" :options="d_options" placeholder="请选择" class="text-center w-full mt-2px" />
<NDropdown trigger="click" :options="d_options" @select="(key) => row.d_value = key">
<div class="cursor-pointer" title="点击选择">
<p>{{row.d_value || '-'}}</p>
<p class="text-slate-400">{{getText(row.d_value, d_options) || '点击选择'}}</p>
</div>
</NDropdown>
</td>
<td :class="TD" class="text-center">
<!-- <NTag
v-if="row.l_value>0 && row.s_value>0"
<NTag
v-if="calculateRiskGrade(row.s_value, row.p_value, row.d_value)"
class="text-[11px]"
size="small"
:color="{
color: riskLevel(row.l_value, row.s_value)?.bg_color,
textColor: riskLevel(row.l_value, row.s_value)?.font_color,
borderColor: riskLevel(row.l_value, row.s_value)?.bg_color,
color: calculateRiskGrade(row.s_value, row.p_value, row.d_value)?.bg_color,
textColor: calculateRiskGrade(row.s_value, row.p_value, row.d_value)?.font_color,
borderColor: calculateRiskGrade(row.s_value, row.p_value, row.d_value)?.bg_color,
}"
>
{{row.l_value * row.s_value}}
</NTag> -->
{{row.s_value * row.p_value * row.d_value}}
</NTag>
<span v-else>-</span>
</td>
<td :class="TD" class="text-center">
<!-- <NTag
v-if="row.l_value>0 && row.s_value>0"
<NTag
v-if="calculateRiskGrade(row.s_value, row.p_value, row.d_value)"
class="text-[11px]"
size="small"
:color="{
color: countRiskLevel(row)?.bg_color,
textColor: countRiskLevel(row)?.font_color,
borderColor: countRiskLevel(row)?.bg_color,
color: calculateRiskGrade(row.s_value, row.p_value, row.d_value)?.bg_color,
textColor: calculateRiskGrade(row.s_value, row.p_value, row.d_value)?.font_color,
borderColor: calculateRiskGrade(row.s_value, row.p_value, row.d_value)?.bg_color,
}"
>
{{countRiskLevel(row)?.name}}
</NTag> -->
{{calculateRiskGrade(row.s_value, row.p_value, row.d_value)?.name}}
</NTag>
<span v-else>-</span>
</td>
<td :class="TD">
<NInput type="textarea" size="small" v-model:value="row.suggestions" :autosize="{minRows:1}" class="text-xs" @blur="save()" />