init
This commit is contained in:
@@ -799,6 +799,144 @@ a:hover {
|
|||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ================================
|
||||||
|
设计建议列表
|
||||||
|
================================ */
|
||||||
|
.recommendations-section {
|
||||||
|
margin-top: var(--space-6);
|
||||||
|
padding-top: var(--space-6);
|
||||||
|
border-top: 1px solid var(--border-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendations-section h5 {
|
||||||
|
font-size: var(--text-base);
|
||||||
|
font-weight: var(--font-semibold);
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-bottom: var(--space-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendations-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--space-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendation-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: var(--space-3);
|
||||||
|
padding: var(--space-3);
|
||||||
|
background: var(--bg-secondary);
|
||||||
|
border-radius: var(--radius-lg);
|
||||||
|
border-left: 4px solid var(--gray-300);
|
||||||
|
transition: all var(--duration-fast) var(--ease-default);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendation-item:hover {
|
||||||
|
background: var(--gray-50);
|
||||||
|
transform: translateX(2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendation-item.critical {
|
||||||
|
border-left-color: var(--red-500);
|
||||||
|
background: linear-gradient(90deg, var(--red-50), transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendation-item.high {
|
||||||
|
border-left-color: var(--orange-500);
|
||||||
|
background: linear-gradient(90deg, var(--orange-50), transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendation-item.medium {
|
||||||
|
border-left-color: var(--blue-500);
|
||||||
|
background: linear-gradient(90deg, var(--blue-50), transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendation-item.low {
|
||||||
|
border-left-color: var(--green-500);
|
||||||
|
background: linear-gradient(90deg, var(--green-50), transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.priority-badge {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: var(--space-1) var(--space-2);
|
||||||
|
font-size: var(--text-xs);
|
||||||
|
font-weight: var(--font-semibold);
|
||||||
|
border-radius: var(--radius-full);
|
||||||
|
white-space: nowrap;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.priority-badge.critical {
|
||||||
|
background: var(--red-500);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.priority-badge.high {
|
||||||
|
background: var(--orange-500);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.priority-badge.medium {
|
||||||
|
background: var(--blue-500);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.priority-badge.low {
|
||||||
|
background: var(--green-500);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendation-text {
|
||||||
|
flex: 1;
|
||||||
|
font-size: var(--text-sm);
|
||||||
|
color: var(--text-primary);
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommendation-reason {
|
||||||
|
font-size: var(--text-xs);
|
||||||
|
color: var(--text-tertiary);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================
|
||||||
|
分析摘要
|
||||||
|
================================ */
|
||||||
|
.analysis-summary {
|
||||||
|
background: linear-gradient(135deg, var(--blue-50), var(--purple-50));
|
||||||
|
border: 1px solid var(--border-light);
|
||||||
|
border-radius: var(--radius-xl);
|
||||||
|
padding: var(--space-6);
|
||||||
|
margin-bottom: var(--space-6);
|
||||||
|
box-shadow: var(--shadow-sm);
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--space-3);
|
||||||
|
margin-bottom: var(--space-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-header h4 {
|
||||||
|
font-size: var(--text-lg);
|
||||||
|
font-weight: var(--font-semibold);
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-icon {
|
||||||
|
font-size: var(--text-xl);
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-content {
|
||||||
|
font-size: var(--text-base);
|
||||||
|
color: var(--text-secondary);
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
/* ================================
|
/* ================================
|
||||||
数据表格
|
数据表格
|
||||||
================================ */
|
================================ */
|
||||||
|
|||||||
+67
-6
@@ -172,6 +172,16 @@ const App = {
|
|||||||
initAuth();
|
initAuth();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const getPriorityText = (priority) => {
|
||||||
|
const priorityMap = {
|
||||||
|
'critical': '紧急',
|
||||||
|
'high': '高',
|
||||||
|
'medium': '中',
|
||||||
|
'low': '低'
|
||||||
|
};
|
||||||
|
return priorityMap[priority] || priority;
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
route,
|
route,
|
||||||
router,
|
router,
|
||||||
@@ -179,6 +189,7 @@ const App = {
|
|||||||
menuItems,
|
menuItems,
|
||||||
isActive,
|
isActive,
|
||||||
handleLogout,
|
handleLogout,
|
||||||
|
getPriorityText,
|
||||||
dismissNotification: (id) => {
|
dismissNotification: (id) => {
|
||||||
const index = appState.notifications.findIndex(n => n.id === id);
|
const index = appState.notifications.findIndex(n => n.id === id);
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
@@ -1104,6 +1115,17 @@ const ResultView = {
|
|||||||
<div v-if="state.task.analysis_result" class="viewer-section">
|
<div v-if="state.task.analysis_result" class="viewer-section">
|
||||||
<h3>分析结果详情</h3>
|
<h3>分析结果详情</h3>
|
||||||
|
|
||||||
|
<!-- 分析摘要 -->
|
||||||
|
<div class="analysis-summary" v-if="state.task.analysis_result.analysis_summary">
|
||||||
|
<div class="summary-header">
|
||||||
|
<h4>分析摘要</h4>
|
||||||
|
<span class="summary-icon">📋</span>
|
||||||
|
</div>
|
||||||
|
<div class="summary-content">
|
||||||
|
{{ state.task.analysis_result.analysis_summary }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="result-grid">
|
<div class="result-grid">
|
||||||
<div class="result-card full-width">
|
<div class="result-card full-width">
|
||||||
<h4>1. 产品特征识别</h4>
|
<h4>1. 产品特征识别</h4>
|
||||||
@@ -1117,19 +1139,19 @@ const ResultView = {
|
|||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="info-label">壁厚分布</span>
|
<span class="info-label">壁厚分布</span>
|
||||||
<span class="info-value">{{ state.task.analysis_result.detected_features?.find(f => f.type === 'wall_thickness')?.description || '待分析' }}</span>
|
<span class="info-value">{{ state.task.analysis_result.detected_features?.find(f => f.feature_type === 'wall_thickness')?.description || '待分析' }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="info-label">加强筋位置和密度</span>
|
<span class="info-label">加强筋位置和密度</span>
|
||||||
<span class="info-value">{{ state.task.analysis_result.detected_features?.filter(f => f.type === 'rib').length || 0 }} 个加强筋</span>
|
<span class="info-value">{{ state.task.analysis_result.detected_features?.filter(f => f.feature_type === 'rib').length || 0 }} 个加强筋</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="info-label">孔洞和凹槽位置</span>
|
<span class="info-label">孔洞和凹槽位置</span>
|
||||||
<span class="info-value">{{ state.task.analysis_result.detected_features?.filter(f => f.type === 'hole' || f.type === 'pocket').length || 0 }} 个孔洞/凹槽</span>
|
<span class="info-value">{{ state.task.analysis_result.detected_features?.filter(f => f.feature_type === 'hole' || f.feature_type === 'pocket').length || 0 }} 个孔洞/凹槽</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="info-label">倒扣区域检测</span>
|
<span class="info-label">倒扣区域检测</span>
|
||||||
<span class="info-value">{{ state.task.analysis_result.detected_features?.filter(f => f.type === 'undercut').length || 0 }} 个倒扣区域</span>
|
<span class="info-value">{{ state.task.analysis_result.detected_features?.filter(f => f.feature_type === 'undercut').length || 0 }} 个倒扣区域</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="info-label">对称性分析</span>
|
<span class="info-label">对称性分析</span>
|
||||||
@@ -1166,12 +1188,27 @@ const ResultView = {
|
|||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="info-label">定位结构设计</span>
|
<span class="info-label">定位结构设计</span>
|
||||||
<span class="info-value">{{ state.task.analysis_result.detected_features?.filter(f => f.type === '定位').length || 0 }} 个定位特征</span>
|
<span class="info-value">{{ state.task.analysis_result.detected_features?.filter(f => f.feature_type === '定位').length || 0 }} 个定位特征</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="info-label">分型面选择</span>
|
<span class="info-label">分型面选择</span>
|
||||||
<span class="info-value">基于产品几何:自动推荐最优分型面</span>
|
<span class="info-value">基于产品几何:自动推荐最优分型面</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 设计建议列表 -->
|
||||||
|
<div class="recommendations-section" v-if="state.task.analysis_result.design_recommendations?.length">
|
||||||
|
<h5>详细设计建议</h5>
|
||||||
|
<div class="recommendations-list">
|
||||||
|
<div v-for="rec in state.task.analysis_result.design_recommendations.sort((a, b) => {
|
||||||
|
const priorityOrder = { 'critical': 0, 'high': 1, 'medium': 2, 'low': 3 };
|
||||||
|
return priorityOrder[a.priority] - priorityOrder[b.priority];
|
||||||
|
})" :key="rec.type" class="recommendation-item" :class="rec.priority">
|
||||||
|
<span class="priority-badge" :class="rec.priority">{{ getPriorityText(rec.priority) }}</span>
|
||||||
|
<span class="recommendation-text">{{ rec.description }}</span>
|
||||||
|
<span class="recommendation-reason" v-if="rec.reason">({{ rec.reason }})</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -1184,7 +1221,11 @@ const ResultView = {
|
|||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="info-label">模架尺寸</span>
|
<span class="info-label">模架尺寸</span>
|
||||||
<span class="info-value">基于泡沫外形自动计算</span>
|
<span class="info-value">{{ state.task.key_info?.mold_parameters?.mold_size || '基于泡沫外形自动计算' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-item" v-if="state.task.key_info?.geometric_characteristics">
|
||||||
|
<span class="info-label">预估锁模力</span>
|
||||||
|
<span class="info-value">{{ state.task.key_info.geometric_characteristics.estimated_clamping_force || '自动计算' }} 吨</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="info-label">顶出系统</span>
|
<span class="info-label">顶出系统</span>
|
||||||
@@ -1198,6 +1239,26 @@ const ResultView = {
|
|||||||
<span class="info-label">材料选择</span>
|
<span class="info-label">材料选择</span>
|
||||||
<span class="info-value">{{ state.task.analysis_result.quality_metrics?.volume ? '根据产量和精度自动推荐' : '7075 铝合金' }}</span>
|
<span class="info-value">{{ state.task.analysis_result.quality_metrics?.volume ? '根据产量和精度自动推荐' : '7075 铝合金' }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="info-item" v-if="state.task.analysis_result.quality_metrics">
|
||||||
|
<span class="info-label">体积利用率</span>
|
||||||
|
<span class="info-value">{{ (state.task.analysis_result.quality_metrics.volume_utilization * 100)?.toFixed(1) || 'N/A' }}%</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-item" v-if="state.task.analysis_result.quality_metrics">
|
||||||
|
<span class="info-label">拓扑复杂度</span>
|
||||||
|
<span class="info-value">{{ state.task.analysis_result.quality_metrics.topology_complexity?.toFixed(2) || 'N/A' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-item" v-if="state.task.analysis_result.quality_metrics">
|
||||||
|
<span class="info-label">壁厚均匀性</span>
|
||||||
|
<span class="info-value">{{ (state.task.analysis_result.quality_metrics.wall_uniformity * 100)?.toFixed(1) || 'N/A' }}%</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-item" v-if="state.task.key_info?.quality_considerations">
|
||||||
|
<span class="info-label">翘曲风险</span>
|
||||||
|
<span class="info-value">{{ state.task.key_info.quality_considerations.warpage_risk || '低风险' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-item" v-if="state.task.key_info?.quality_considerations">
|
||||||
|
<span class="info-label">潜在焊缝线</span>
|
||||||
|
<span class="info-value">{{ state.task.key_info.quality_considerations.potential_weld_lines || 0 }} 条</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user