hsy
6 天以前 0b2c40437bee95ecca2168fb154e675bb9f0d404
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<script lang="ts" setup>
import { IconifyIcon } from '@vben/icons';
 
defineOptions({ name: 'DashboardAiInsights' });
 
const props = defineProps<{
  activeOrderCount: number;
}>();
 
const emit = defineEmits<{
  navigate: [name: string];
}>();
 
interface AiCapability {
  key: string;
  title: string;
  desc: string;
  icon: string;
  gradient: string;
  route: string;
}
 
const capabilities: AiCapability[] = [
  {
    key: 'material',
    title: 'AI 物料预测',
    desc: '预测物料需求与短缺风险',
    icon: 'lucide:package-open',
    gradient: 'from-violet-500 to-purple-500',
    route: 'MesProWorkOrder',
  },
  {
    key: 'duration',
    title: 'AI 时长预测',
    desc: '预测各工序生产耗时',
    icon: 'lucide:clock',
    gradient: 'from-sky-500 to-blue-500',
    route: 'MesProWorkOrder',
  },
  {
    key: 'risk',
    title: 'AI 风险预测',
    desc: '识别潜在生产风险并给出建议',
    icon: 'lucide:shield-alert',
    gradient: 'from-orange-500 to-red-500',
    route: 'MesProWorkOrder',
  },
  {
    key: 'delivery',
    title: 'AI 交付评估',
    desc: '评估订单交付准时率与延期因素',
    icon: 'lucide:truck',
    gradient: 'from-emerald-500 to-teal-500',
    route: 'MesProWorkOrder',
  },
];
</script>
 
<template>
  <div class="glass-card mb-4 rounded-2xl p-5">
    <div class="mb-4 flex items-center justify-between">
      <h3 class="text-base font-semibold text-gray-800 dark:text-gray-100">
        AI 智能分析
      </h3>
      <span class="rounded-full bg-violet-50 px-3 py-0.5 text-xs font-medium text-violet-600 dark:bg-violet-500/15 dark:text-violet-400">
        {{ activeOrderCount }} 个工单可分析
      </span>
    </div>
    <div class="grid grid-cols-2 gap-3 lg:grid-cols-4">
      <div
        v-for="cap in capabilities"
        :key="cap.key"
        class="group flex cursor-pointer items-center gap-3 rounded-xl p-3 transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg"
        @click="emit('navigate', cap.route)"
      >
        <div
          class="flex size-10 flex-shrink-0 items-center justify-center rounded-lg bg-gradient-to-br shadow-md transition-transform duration-300 group-hover:scale-110"
          :class="cap.gradient"
        >
          <IconifyIcon :icon="cap.icon" class="size-5 text-white" />
        </div>
        <div class="min-w-0 flex-1">
          <div class="text-sm font-medium text-gray-800 dark:text-gray-100">
            {{ cap.title }}
          </div>
          <div class="text-xs text-gray-400">{{ cap.desc }}</div>
        </div>
        <IconifyIcon icon="lucide:chevron-right" class="size-4 text-gray-300 transition-transform duration-200 group-hover:translate-x-0.5" />
      </div>
    </div>
  </div>
</template>
 
<style scoped>
.glass-card {
  background: linear-gradient(135deg, rgba(255,255,255,0.85), rgba(255,255,255,0.55));
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border: 1px solid rgba(255,255,255,0.6);
  box-shadow:
    0 4px 24px rgba(0,0,0,0.04),
    0 1px 4px rgba(0,0,0,0.02),
    inset 0 1px 0 rgba(255,255,255,0.8);
}
 
.dark .glass-card {
  background: linear-gradient(135deg, rgba(30,30,55,0.75), rgba(20,20,40,0.5));
  border: 1px solid rgba(255,255,255,0.08);
  box-shadow:
    0 4px 24px rgba(0,0,0,0.3),
    0 1px 4px rgba(0,0,0,0.2),
    inset 0 1px 0 rgba(255,255,255,0.04);
}
</style>