|
|
|
@ -0,0 +1,188 @@
|
|
|
|
|
|
|
|
<template>
|
|
|
|
|
|
|
|
<div class="item-analysis-container">
|
|
|
|
|
|
|
|
<div class="item-select-section">
|
|
|
|
|
|
|
|
<el-form :model="analysisForm" label-width="100px">
|
|
|
|
|
|
|
|
<el-form-item label="项目名称">
|
|
|
|
|
|
|
|
<el-select
|
|
|
|
|
|
|
|
v-model="analysisForm.selectedItem"
|
|
|
|
|
|
|
|
placeholder="请选择要分析的项目"
|
|
|
|
|
|
|
|
style="width: 300px"
|
|
|
|
|
|
|
|
clearable
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<el-option
|
|
|
|
|
|
|
|
v-for="item in itemList"
|
|
|
|
|
|
|
|
:key="item"
|
|
|
|
|
|
|
|
:label="item"
|
|
|
|
|
|
|
|
:value="item"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</el-select>
|
|
|
|
|
|
|
|
<el-button
|
|
|
|
|
|
|
|
type="primary"
|
|
|
|
|
|
|
|
style="margin-left: 10px"
|
|
|
|
|
|
|
|
:disabled="!analysisForm.selectedItem"
|
|
|
|
|
|
|
|
@click="handleAnalyzeItem"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
分析
|
|
|
|
|
|
|
|
</el-button>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
</el-form>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 分析结果显示区域 -->
|
|
|
|
|
|
|
|
<div v-if="analysisResult" class="analysis-result">
|
|
|
|
|
|
|
|
<h3>{{ analysisForm.selectedItem }} - 分析结果</h3>
|
|
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
|
|
v-model="analysisResult"
|
|
|
|
|
|
|
|
type="textarea"
|
|
|
|
|
|
|
|
:rows="10"
|
|
|
|
|
|
|
|
readonly
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
|
|
|
import { ref, reactive } from 'vue'
|
|
|
|
|
|
|
|
import { AI_CONFIG, CURRENT_AI_MODEL } from "@/config/ai"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
|
|
|
paretoData: {
|
|
|
|
|
|
|
|
type: Array,
|
|
|
|
|
|
|
|
default: () => []
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
dateRange: {
|
|
|
|
|
|
|
|
type: Object,
|
|
|
|
|
|
|
|
default: () => ({
|
|
|
|
|
|
|
|
start_date: '',
|
|
|
|
|
|
|
|
end_date: ''
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const emit = defineEmits(['ai-analysis-complete'])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 分析表单数据
|
|
|
|
|
|
|
|
const analysisForm = reactive({
|
|
|
|
|
|
|
|
selectedItem: ''
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 分析结果
|
|
|
|
|
|
|
|
const analysisResult = ref('')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 项目名称列表
|
|
|
|
|
|
|
|
const itemList = ref([
|
|
|
|
|
|
|
|
'漆膜厚度',
|
|
|
|
|
|
|
|
'击穿电压2(kv)',
|
|
|
|
|
|
|
|
'击穿电压5(kv)',
|
|
|
|
|
|
|
|
'击穿电压4(kv)',
|
|
|
|
|
|
|
|
'击穿电压3(kv)',
|
|
|
|
|
|
|
|
'回弹角(°)1',
|
|
|
|
|
|
|
|
'回弹角(°)2',
|
|
|
|
|
|
|
|
'击穿电压1(kv)',
|
|
|
|
|
|
|
|
'漆膜连续性(个)',
|
|
|
|
|
|
|
|
'最大外径',
|
|
|
|
|
|
|
|
'伸长率(%)1',
|
|
|
|
|
|
|
|
'导体f值',
|
|
|
|
|
|
|
|
'电阻值',
|
|
|
|
|
|
|
|
'预置伸长率',
|
|
|
|
|
|
|
|
'伸长率(%)2',
|
|
|
|
|
|
|
|
'平均单刮(N)',
|
|
|
|
|
|
|
|
'单向刮漆min(N)'
|
|
|
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 项目分析功能
|
|
|
|
|
|
|
|
async function handleAnalyzeItem() {
|
|
|
|
|
|
|
|
if (!analysisForm.selectedItem) {
|
|
|
|
|
|
|
|
emit('ai-analysis-complete', '请先选择要分析的项目')
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 在帕累托数据中查找选中项目的数据
|
|
|
|
|
|
|
|
const selectedItemData = props.paretoData.find(item => item.item_name === analysisForm.selectedItem)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 准备分析提示词
|
|
|
|
|
|
|
|
const prompt = `请对以下质检项目进行详细分析:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
项目名称: ${analysisForm.selectedItem}
|
|
|
|
|
|
|
|
数据范围: ${props.dateRange.start_date} 至 ${props.dateRange.end_date}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
该项目相关数据:
|
|
|
|
|
|
|
|
${selectedItemData ?
|
|
|
|
|
|
|
|
`- 缺陷数量: ${selectedItemData.defect_count}\n- 缺陷占比: ${selectedItemData.defect_percentage}%\n- 累计占比: ${selectedItemData.cumulative_percentage}%` :
|
|
|
|
|
|
|
|
'该项目在当前帕累托分析数据中不存在'}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
请从以下角度进行分析:
|
|
|
|
|
|
|
|
1. 该项目缺陷对整体质量的影响
|
|
|
|
|
|
|
|
2. 产生缺陷的可能原因分析
|
|
|
|
|
|
|
|
3. 针对该项目的改进建议
|
|
|
|
|
|
|
|
4. 该项目与其他项目的关联性分析`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 获取当前AI模型配置
|
|
|
|
|
|
|
|
const currentAIConfig = AI_CONFIG[CURRENT_AI_MODEL]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 调用AI模型API进行分析
|
|
|
|
|
|
|
|
const response = await fetch(`${currentAIConfig.BASE_URL}/chat/completions`, {
|
|
|
|
|
|
|
|
method: 'POST',
|
|
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
|
|
|
|
'Authorization': `Bearer ${currentAIConfig.API_KEY}`
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
body: JSON.stringify({
|
|
|
|
|
|
|
|
model: currentAIConfig.MODEL,
|
|
|
|
|
|
|
|
messages: [
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
role: 'system',
|
|
|
|
|
|
|
|
content: '你是一位专业的质量控制专家,擅长分析具体质检项目并提供针对性的改进建议。'
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
role: 'user',
|
|
|
|
|
|
|
|
content: prompt
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
temperature: 0.3,
|
|
|
|
|
|
|
|
max_tokens: 1500
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!response.ok) {
|
|
|
|
|
|
|
|
throw new Error(`API调用失败: ${response.status}`)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const data = await response.json()
|
|
|
|
|
|
|
|
const result = data.choices[0].message.content
|
|
|
|
|
|
|
|
analysisResult.value = result
|
|
|
|
|
|
|
|
// 发送分析结果完成事件
|
|
|
|
|
|
|
|
emit('ai-analysis-complete', result)
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
|
|
console.error('项目分析失败:', error)
|
|
|
|
|
|
|
|
const errorMessage = `项目分析失败: ${error.message}\n\n请检查网络连接或稍后再试。`
|
|
|
|
|
|
|
|
analysisResult.value = errorMessage
|
|
|
|
|
|
|
|
// 发送分析结果失败事件
|
|
|
|
|
|
|
|
emit('ai-analysis-complete', errorMessage)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
|
|
|
.item-analysis-container {
|
|
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
|
|
padding: 20px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.item-select-section {
|
|
|
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
|
|
|
padding: 15px;
|
|
|
|
|
|
|
|
background-color: #f5f7fa;
|
|
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.analysis-result {
|
|
|
|
|
|
|
|
margin-top: 20px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.analysis-result h3 {
|
|
|
|
|
|
|
|
margin-bottom: 15px;
|
|
|
|
|
|
|
|
color: #409eff;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
</style>
|