Ver código fonte

feat(blockingData): 添加大队筛选功能并优化表单验证

- 在blockingDataScreen页面添加大队筛选功能,显示不同的模块内容
- 新增ModuleBrigadeOne/Two/Three组件和RankList组件
- 优化dailyLuggageCheckInList表单验证规则和默认值
- 移除部分不再需要的表单字段
huoyi 2 dias atrás
pai
commit
97750498d9

+ 252 - 0
src/views/blockingData/blockingDataScreen/components/ModuleBrigadeOne.vue

@@ -0,0 +1,252 @@
1
+<template>
2
+  <module-container title="模块一 运行数据分析">
3
+    <div class="module-brigade-content">
4
+      <div class="combined-row">
5
+        <div class="stat-card">
6
+          <div class="stat-card-inner">
7
+            <div class="stat-left">
8
+              <div class="stat-label">查堵总数</div>
9
+              <div class="stat-value">819</div>
10
+              <div class="stat-unit">起</div>
11
+            </div>
12
+          </div>
13
+        </div>
14
+        <div class="chart-item">
15
+          <div class="chart-title">两楼每日查堵走势</div>
16
+          <div ref="chart1" class="echarts"></div>
17
+        </div>
18
+        <div class="chart-item">
19
+          <div class="chart-title">两楼每日过检图像数</div>
20
+          <div ref="chart2" class="echarts"></div>
21
+        </div>
22
+      </div>
23
+      
24
+      <div class="chart-row">
25
+        <div class="chart-item">
26
+          <div class="chart-title">两楼查堵数(包含行检)</div>
27
+          <div ref="chart3" class="echarts"></div>
28
+        </div>
29
+        <div class="chart-item">
30
+          <div class="chart-title">查堵时间段过检行李数</div>
31
+          <div ref="chart4" class="echarts"></div>
32
+        </div>
33
+      </div>
34
+      
35
+      <div class="chart-row">
36
+        <div class="chart-item">
37
+          <div class="chart-title">两楼每日查堵万分率</div>
38
+          <div ref="chart5" class="echarts"></div>
39
+        </div>
40
+        <div class="chart-item">
41
+          <div class="chart-title">查堵物品分布</div>
42
+          <div ref="chart6" class="echarts"></div>
43
+        </div>
44
+      </div>
45
+    </div>
46
+  </module-container>
47
+</template>
48
+
49
+<script setup>
50
+import { ref, onMounted } from 'vue'
51
+import * as echarts from 'echarts'
52
+import ModuleContainer from './ModuleContainer.vue'
53
+import { useEcharts } from '@/hooks/chart.js'
54
+
55
+const chart1 = ref(null)
56
+const chart2 = ref(null)
57
+const chart3 = ref(null)
58
+const chart4 = ref(null)
59
+const chart5 = ref(null)
60
+const chart6 = ref(null)
61
+
62
+const { setOption: setOption1 } = useEcharts(chart1)
63
+const { setOption: setOption2 } = useEcharts(chart2)
64
+const { setOption: setOption3 } = useEcharts(chart3)
65
+const { setOption: setOption4 } = useEcharts(chart4)
66
+const { setOption: setOption5 } = useEcharts(chart5)
67
+const { setOption: setOption6 } = useEcharts(chart6)
68
+
69
+const xAxisData = Array.from({ length: 30 }, (_, i) => `${i + 1}日`)
70
+
71
+const generateData = (count, min, max) => {
72
+  const data = []
73
+  for (let i = 0; i < count; i++) {
74
+    data.push(Math.floor(Math.random() * (max - min + 1)) + min)
75
+  }
76
+  return data
77
+}
78
+
79
+const lineChartOption = (data, color, title) => ({
80
+  grid: { left: '10%', top: '15%', right: '5%', bottom: '15%', containLabel: true },
81
+  xAxis: { type: 'category', data: xAxisData, axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' } },
82
+  yAxis: { type: 'value', axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' }, splitLine: { lineStyle: { color: '#eee' } } },
83
+  series: [{ name: title, type: 'line', smooth: true, symbol: 'circle', symbolSize: 6, data: data, itemStyle: { color: color }, lineStyle: { color: color } }]
84
+})
85
+
86
+const areaChartOption = (data, color) => ({
87
+  grid: { left: '10%', top: '15%', right: '5%', bottom: '15%', containLabel: true },
88
+  xAxis: { type: 'category', data: xAxisData, axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' } },
89
+  yAxis: { type: 'value', axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' }, splitLine: { lineStyle: { color: '#eee' } } },
90
+  series: [{ type: 'line', smooth: true, symbol: 'circle', symbolSize: 6, data: data, itemStyle: { color: color }, lineStyle: { color: color }, areaStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: color + '40' }, { offset: 1, color: color + '10' }]) } }]
91
+})
92
+
93
+const barChartOption = (data, color) => ({
94
+  grid: { left: '15%', top: '15%', right: '5%', bottom: '15%', containLabel: true },
95
+  xAxis: { type: 'category', data: data.map(d => d.name), axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' } },
96
+  yAxis: { type: 'value', axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' }, splitLine: { lineStyle: { color: '#eee' } } },
97
+  series: [{ type: 'bar', data: data.map(d => d.value), itemStyle: { color: color }, barWidth: 20 }]
98
+})
99
+
100
+const horizontalBarChartOption = (data, color) => ({
101
+  grid: { left: '20%', top: '15%', right: '5%', bottom: '15%', containLabel: true },
102
+  xAxis: { type: 'value', axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' }, splitLine: { lineStyle: { color: '#eee' } } },
103
+  yAxis: { type: 'category', data: data.map(d => d.name), axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' } },
104
+  series: [{ type: 'bar', data: data.map(d => d.value), itemStyle: { color: color }, barWidth: 15 }]
105
+})
106
+
107
+const pieChartOption = (data, colors) => ({
108
+  color: colors,
109
+  series: [{
110
+    type: 'pie',
111
+    radius: '65%',
112
+    center: ['50%', '55%'],
113
+    data: data,
114
+    label: { show: true, formatter: '{b}\n{c}%', fontSize: 10 }
115
+  }]
116
+})
117
+
118
+onMounted(() => {
119
+  setOption1(lineChartOption(generateData(30, 5, 20), '#3b82f6', '查堵数量'))
120
+  setOption2(areaChartOption(generateData(30, 10000, 30000), '#22c55e'))
121
+  setOption3(horizontalBarChartOption([{ name: 'T1', value: 388 }, { name: 'T2', value: 431 }], '#3b82f6'))
122
+  
123
+  const timeData = [
124
+    { name: '02:00-04:00', value: 20 },
125
+    { name: '04:00-06:00', value: 45 },
126
+    { name: '06:00-08:00', value: 80 },
127
+    { name: '08:00-10:00', value: 110 },
128
+    { name: '10:00-12:00', value: 95 },
129
+    { name: '12:00-14:00', value: 85 },
130
+    { name: '14:00-16:00', value: 100 },
131
+    { name: '16:00-18:00', value: 120 },
132
+    { name: '18:00-20:00', value: 115 },
133
+    { name: '20:00-22:00', value: 80 },
134
+    { name: '22:00-24:00', value: 45 }
135
+  ]
136
+  setOption4(barChartOption(timeData, '#3b82f6'))
137
+  
138
+  setOption5(lineChartOption(generateData(30, 0.5, 3.0), '#ec4899', '查堵万分率'))
139
+  
140
+  setOption6(pieChartOption([
141
+    { name: '水果刀', value: 1.02 },
142
+    { name: '警棍', value: 0.37 },
143
+    { name: '甩棍', value: 0.52 },
144
+    { name: '打火机', value: 50.52 },
145
+    { name: '其他', value: 47.57 }
146
+  ], ['#3b82f6', '#22c55e', '#f97316', '#ec4899', '#8b5cf6']))
147
+})
148
+</script>
149
+
150
+<style lang="less" scoped>
151
+.module-brigade-content {
152
+  height: 100%;
153
+  display: flex;
154
+  flex-direction: column;
155
+  gap: 10px;
156
+  overflow-y: auto;
157
+}
158
+
159
+.stats-row {
160
+  display: flex;
161
+  gap: 10px;
162
+  flex-shrink: 0;
163
+}
164
+
165
+.stat-card {
166
+  flex: 1;
167
+  background: #fff;
168
+  border-radius: 6px;
169
+  padding: 15px;
170
+  border: 1px solid #eee;
171
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
172
+  min-height: 120px;
173
+}
174
+
175
+.stat-card-inner {
176
+  display: flex;
177
+  height: 100%;
178
+  align-items: center;
179
+  justify-content: center;
180
+}
181
+
182
+.stat-left {
183
+  display: flex;
184
+  flex-direction: column;
185
+  align-items: center;
186
+}
187
+
188
+.stat-label {
189
+  font-size: 14px;
190
+  color: #666;
191
+  margin-bottom: 8px;
192
+}
193
+
194
+.stat-value {
195
+  font-size: 48px;
196
+  font-weight: bold;
197
+  color: #3b82f6;
198
+}
199
+
200
+.stat-unit {
201
+  font-size: 14px;
202
+  color: #666;
203
+  margin-top: 5px;
204
+}
205
+
206
+.combined-row {
207
+  display: flex;
208
+  gap: 10px;
209
+  flex-shrink: 0;
210
+}
211
+
212
+.combined-row .stat-card {
213
+  flex: 0.5;
214
+  min-height: 200px;
215
+}
216
+
217
+.combined-row .chart-item {
218
+  flex: 1;
219
+}
220
+
221
+.chart-row {
222
+  display: flex;
223
+  gap: 10px;
224
+  flex-shrink: 0;
225
+}
226
+
227
+.chart-item {
228
+  flex: 1;
229
+  background: #fff;
230
+  border-radius: 6px;
231
+  padding: 10px;
232
+  border: 1px solid #eee;
233
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
234
+  display: flex;
235
+  flex-direction: column;
236
+  min-height: 200px;
237
+}
238
+
239
+.chart-title {
240
+  font-size: 14px;
241
+  color: #333;
242
+  margin-bottom: 5px;
243
+  text-align: left;
244
+  font-weight: 500;
245
+}
246
+
247
+.echarts {
248
+  flex: 1;
249
+  width: 100%;
250
+  min-height: 0;
251
+}
252
+</style>

+ 97 - 0
src/views/blockingData/blockingDataScreen/components/ModuleBrigadeThree.vue

@@ -0,0 +1,97 @@
1
+<template>
2
+  <module-container title="模块三 培训质控分析">
3
+    <div class="module-brigade-content">
4
+      <div class="chart-row">
5
+        <div class="chart-item">
6
+          <div class="chart-title">查堵-人员自测漏检次数</div>
7
+          <div ref="chart1" class="echarts"></div>
8
+        </div>
9
+        <div class="chart-item">
10
+          <div class="chart-title">查堵人员月考成绩</div>
11
+          <div ref="chart2" class="echarts"></div>
12
+        </div>
13
+      </div>
14
+    </div>
15
+  </module-container>
16
+</template>
17
+
18
+<script setup>
19
+import { ref, onMounted } from 'vue'
20
+import * as echarts from 'echarts'
21
+import ModuleContainer from './ModuleContainer.vue'
22
+import { useEcharts } from '@/hooks/chart.js'
23
+
24
+const chart1 = ref(null)
25
+const chart2 = ref(null)
26
+
27
+const { setOption: setOption1 } = useEcharts(chart1)
28
+const { setOption: setOption2 } = useEcharts(chart2)
29
+
30
+const ringChartOption = (data, colors) => ({
31
+  color: colors,
32
+  series: [{
33
+    type: 'pie',
34
+    radius: ['40%', '65%'],
35
+    center: ['50%', '55%'],
36
+    data: data,
37
+    label: { show: true, formatter: '{b}\n{c}%', fontSize: 10 }
38
+  }]
39
+})
40
+
41
+onMounted(() => {
42
+  setOption1(ringChartOption([
43
+    { name: '漏检次数≤3次', value: 65.2 },
44
+    { name: '漏检次数4-6次', value: 22.8 },
45
+    { name: '漏检次数≥7次', value: 12.0 }
46
+  ], ['#22c55e', '#3b82f6', '#f97316']))
47
+
48
+  setOption2(ringChartOption([
49
+    { name: '优秀(90-100分)', value: 35.4 },
50
+    { name: '良好(80-89分)', value: 42.1 },
51
+    { name: '合格(70-79分)', value: 18.3 },
52
+    { name: '不合格(<70分)', value: 4.2 }
53
+  ], ['#22c55e', '#3b82f6', '#fbbf24', '#ef4444']))
54
+})
55
+</script>
56
+
57
+<style lang="less" scoped>
58
+.module-brigade-content {
59
+  height: 100%;
60
+  display: flex;
61
+  flex-direction: column;
62
+  gap: 10px;
63
+  overflow-y: auto;
64
+}
65
+
66
+.chart-row {
67
+  display: flex;
68
+  gap: 10px;
69
+  flex-shrink: 0;
70
+}
71
+
72
+.chart-item {
73
+  flex: 1;
74
+  background: #fff;
75
+  border-radius: 6px;
76
+  padding: 10px;
77
+  border: 1px solid #eee;
78
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
79
+  display: flex;
80
+  flex-direction: column;
81
+  min-height: 200px;
82
+}
83
+
84
+.chart-title {
85
+  font-size: 14px;
86
+  color: #333;
87
+  margin-bottom: 5px;
88
+  text-align: left;
89
+  font-weight: 500;
90
+}
91
+
92
+.echarts {
93
+  flex: 1;
94
+  width: 100%;
95
+  min-height: 0;
96
+}
97
+</style>

+ 301 - 0
src/views/blockingData/blockingDataScreen/components/ModuleBrigadeTwo.vue

@@ -0,0 +1,301 @@
1
+<template>
2
+  <module-container title="模块二 查堵人员分析">
3
+    <div class="module-brigade-content">
4
+      <div class="chart-row">
5
+        <div class="chart-item">
6
+          <div class="chart-title">查堵-主管排行榜</div>
7
+          <rank-list :rank-data="rankData1" title="查堵-主管排行榜" />
8
+        </div>
9
+        <div class="chart-item">
10
+          <div class="chart-title">查堵-班组长排行榜</div>
11
+          <rank-list :rank-data="rankData2" title="查堵-班组长排行榜" />
12
+        </div>
13
+        <div class="chart-item">
14
+          <div class="chart-title">查堵-员工排行榜</div>
15
+          <rank-list :rank-data="rankData3" title="查堵-员工排行榜" />
16
+        </div>
17
+      </div>
18
+      
19
+      <div class="chart-row">
20
+        <div class="chart-item">
21
+          <div class="chart-title">查堵男女比例</div>
22
+          <div ref="chart4" class="echarts"></div>
23
+        </div>
24
+        <div class="chart-item">
25
+          <div class="chart-title">查堵人员证书级别分布</div>
26
+          <div ref="chart5" class="echarts"></div>
27
+        </div>
28
+        <div class="chart-item">
29
+          <div class="chart-title">证书级别人员基数</div>
30
+          <div ref="chart6" class="echarts"></div>
31
+        </div>
32
+      </div>
33
+      
34
+      <div class="chart-row">
35
+        <div class="chart-item">
36
+          <div class="chart-title">查堵物品位置</div>
37
+          <div ref="chart7" class="echarts"></div>
38
+        </div>
39
+        <div class="chart-item">
40
+          <div class="chart-title">查堵-困难图像数</div>
41
+          <div class="number-display">
42
+            <div class="number-value">819</div>
43
+            <div class="number-unit">幅</div>
44
+          </div>
45
+        </div>
46
+        <div class="chart-item">
47
+          <div class="chart-title">查堵-简单图像数</div>
48
+          <div class="number-display">
49
+            <div class="number-value">819</div>
50
+            <div class="number-unit">幅</div>
51
+          </div>
52
+        </div>
53
+      </div>
54
+      
55
+      <div class="chart-row">
56
+        <div class="chart-item">
57
+          <div class="chart-title">查堵-主管分管次数</div>
58
+          <div ref="chart10" class="echarts"></div>
59
+        </div>
60
+        <div class="chart-item">
61
+          <div class="chart-title">查堵原因分类</div>
62
+          <div ref="chart11" class="echarts"></div>
63
+        </div>
64
+      </div>
65
+      
66
+      <div class="chart-row">
67
+        <div class="chart-item">
68
+          <div class="chart-title">查堵人员开机年限分布</div>
69
+          <div ref="chart12" class="echarts"></div>
70
+        </div>
71
+        <div class="chart-item">
72
+          <div class="chart-title">大队开机年限人员分布</div>
73
+          <div ref="chart13" class="echarts"></div>
74
+        </div>
75
+      </div>
76
+    </div>
77
+  </module-container>
78
+</template>
79
+
80
+<script setup>
81
+import { ref, onMounted, reactive } from 'vue'
82
+import * as echarts from 'echarts'
83
+import ModuleContainer from './ModuleContainer.vue'
84
+import RankList from './RankList.vue'
85
+import { useEcharts } from '@/hooks/chart.js'
86
+
87
+const chart4 = ref(null)
88
+const chart5 = ref(null)
89
+const chart6 = ref(null)
90
+const chart7 = ref(null)
91
+const chart10 = ref(null)
92
+const chart11 = ref(null)
93
+const chart12 = ref(null)
94
+const chart13 = ref(null)
95
+
96
+const { setOption: setOption4 } = useEcharts(chart4)
97
+const { setOption: setOption5 } = useEcharts(chart5)
98
+const { setOption: setOption6 } = useEcharts(chart6)
99
+const { setOption: setOption7 } = useEcharts(chart7)
100
+const { setOption: setOption10 } = useEcharts(chart10)
101
+const { setOption: setOption11 } = useEcharts(chart11)
102
+const { setOption: setOption12 } = useEcharts(chart12)
103
+const { setOption: setOption13 } = useEcharts(chart13)
104
+
105
+const rankData1 = reactive([
106
+  { name: '李鑫锋', value: 102 },
107
+  { name: '李学玲', value: 94 },
108
+  { name: '郑杰', value: 80 },
109
+  { name: '郭仁吉', value: 69 },
110
+  { name: '计沐', value: 67 },
111
+  { name: '方园', value: 62 },
112
+  { name: '符鑫日', value: 59 }
113
+])
114
+
115
+const rankData2 = reactive([
116
+  { name: '李雪琦', value: 44 },
117
+  { name: '林瑞玉', value: 42 },
118
+  { name: '吴明文', value: 40 },
119
+  { name: '吕吕俊', value: 36 },
120
+  { name: '潘任', value: 31 },
121
+  { name: '吴亚琪', value: 30 }
122
+])
123
+
124
+const rankData3 = reactive([
125
+  { name: '梁其松', value: 18 },
126
+  { name: '王名顺', value: 18 },
127
+  { name: '陈艳丽', value: 16 },
128
+  { name: '刘振华', value: 16 },
129
+  { name: '黄建成', value: 15 },
130
+  { name: '简句学', value: 15 },
131
+  { name: '郭可奇', value: 14 }
132
+])
133
+
134
+const pieChartOption = (data, colors) => ({
135
+  color: colors,
136
+  series: [{
137
+    type: 'pie',
138
+    radius: ['40%', '65%'],
139
+    center: ['50%', '55%'],
140
+    data: data,
141
+    label: { show: true, formatter: '{b}\n{c}%', fontSize: 10 }
142
+  }]
143
+})
144
+
145
+const donutChartOption = (data, colors) => ({
146
+  color: colors,
147
+  series: [{
148
+    type: 'pie',
149
+    radius: ['30%', '55%'],
150
+    center: ['50%', '55%'],
151
+    data: data,
152
+    label: { show: true, formatter: '{b}', fontSize: 10, position: 'outside' }
153
+  }]
154
+})
155
+
156
+const multiBarChartOption = (data, color) => ({
157
+  grid: { left: '15%', top: '15%', right: '5%', bottom: '15%', containLabel: true },
158
+  xAxis: { type: 'category', data: data.map(d => d.name), axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' } },
159
+  yAxis: { type: 'value', axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' }, splitLine: { lineStyle: { color: '#eee' } } },
160
+  series: [{ type: 'bar', data: data.map(d => d.value), itemStyle: { color: color }, barWidth: 20 }]
161
+})
162
+
163
+onMounted(() => {
164
+  setOption4(pieChartOption([
165
+    { name: '女', value: 52.26 },
166
+    { name: '男', value: 47.74 }
167
+  ], ['#ec4899', '#3b82f6']))
168
+
169
+  setOption5(pieChartOption([
170
+    { name: '高级', value: 49.81 },
171
+    { name: '中级', value: 50.19 }
172
+  ], ['#22c55e', '#3b82f6']))
173
+
174
+  setOption6(pieChartOption([
175
+    { name: '高级证书', value: 1.59 },
176
+    { name: '中级证书', value: 98.41 }
177
+  ], ['#22c55e', '#3b82f6']))
178
+
179
+  setOption7(donutChartOption([
180
+    { name: '中下', value: 6.35 },
181
+    { name: '中间', value: 11.85 },
182
+    { name: '右下', value: 7.74 },
183
+    { name: '右上', value: 7.56 },
184
+    { name: '左中', value: 7.26 },
185
+    { name: '左上', value: 6.61 },
186
+    { name: '左上', value: 11.16 },
187
+    { name: '右下', value: 6.45 },
188
+    { name: '右上', value: 12.42 },
189
+    { name: '中下', value: 7.41 },
190
+    { name: '右上', value: 6.11 },
191
+    { name: '左上', value: 10.24 }
192
+  ], ['#8b5cf6', '#ec4899', '#f97316', '#22c55e', '#3b82f6', '#14b8a6', '#ef4444', '#fbbf24', '#6366f1', '#06b6d4', '#84cc16', '#e11d48']))
193
+
194
+  setOption10(donutChartOption([
195
+    { name: '赵德峰', value: 12.46 },
196
+    { name: '刘佳', value: 7.94 },
197
+    { name: '郑晓华', value: 7.94 },
198
+    { name: '谢金艳', value: 7.82 },
199
+    { name: '潘仁芳', value: 7.33 },
200
+    { name: '张庆林', value: 7.2 },
201
+    { name: '陈颖', value: 7.2 },
202
+    { name: '李学芬', value: 7.2 },
203
+    { name: '李俊峰', value: 7.08 },
204
+    { name: '周雪梅', value: 7.08 },
205
+    { name: '刘旭', value: 6.46 },
206
+    { name: '李丽', value: 6.46 },
207
+    { name: '任静', value: 6.46 },
208
+    { name: '张静', value: 6.46 }
209
+  ], ['#3b82f6', '#22c55e', '#f97316', '#ec4899', '#8b5cf6', '#14b8a6', '#ef4444', '#fbbf24', '#6366f1', '#06b6d4', '#84cc16', '#e11d48', '#a855f7', '#f59e0b']))
210
+
211
+  setOption11(pieChartOption([
212
+    { name: '问题判断不清,未按规范检查导致漏检', value: 23.20 },
213
+    { name: '未按规范检查导致漏检', value: 7.04 },
214
+    { name: '判断不清,漏检', value: 6.48 },
215
+    { name: '未能辨别危险品', value: 5.92 },
216
+    { name: '未能辨别危险品', value: 5.92 },
217
+    { name: '未能辨别危险品', value: 2.88 },
218
+    { name: '简单漏检未能认真判断', value: 21.23 },
219
+    { name: '未能辨别危险品', value: 27.34 }
220
+  ], ['#3b82f6', '#22c55e', '#f97316', '#ec4899', '#8b5cf6', '#14b8a6', '#ef4444', '#fbbf24']))
221
+
222
+  setOption12(pieChartOption([
223
+    { name: '5年及5年以上', value: 30.71 },
224
+    { name: '4年人员数', value: 18.68 },
225
+    { name: '3年人员数', value: 22.47 },
226
+    { name: '2年人员数', value: 14.75 },
227
+    { name: '1年人员数', value: 6.76 },
228
+    { name: '不足1年人员数', value: 6.63 }
229
+  ], ['#3b82f6', '#22c55e', '#f97316', '#ec4899', '#8b5cf6', '#14b8a6']))
230
+
231
+  setOption13(multiBarChartOption([
232
+    { name: '安检一大队', value: 104 },
233
+    { name: '安检二大队', value: 39 },
234
+    { name: '安检三大队', value: 14 },
235
+    { name: '安检四大队', value: 13 },
236
+    { name: '安检五大队', value: 12 }
237
+  ], '#3b82f6'))
238
+})
239
+</script>
240
+
241
+<style lang="less" scoped>
242
+.module-brigade-content {
243
+  height: 100%;
244
+  display: flex;
245
+  flex-direction: column;
246
+  gap: 10px;
247
+  overflow-y: auto;
248
+}
249
+
250
+.chart-row {
251
+  display: flex;
252
+  gap: 10px;
253
+  flex-shrink: 0;
254
+}
255
+
256
+.chart-item {
257
+  flex: 1;
258
+  background: #fff;
259
+  border-radius: 6px;
260
+  padding: 10px;
261
+  border: 1px solid #eee;
262
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
263
+  display: flex;
264
+  flex-direction: column;
265
+  min-height: 200px;
266
+}
267
+
268
+.chart-title {
269
+  font-size: 14px;
270
+  color: #333;
271
+  margin-bottom: 5px;
272
+  text-align: left;
273
+  font-weight: 500;
274
+}
275
+
276
+.echarts {
277
+  flex: 1;
278
+  width: 100%;
279
+  min-height: 0;
280
+}
281
+
282
+.number-display {
283
+  flex: 1;
284
+  display: flex;
285
+  flex-direction: column;
286
+  align-items: center;
287
+  justify-content: center;
288
+}
289
+
290
+.number-value {
291
+  font-size: 48px;
292
+  font-weight: bold;
293
+  color: #3b82f6;
294
+}
295
+
296
+.number-unit {
297
+  font-size: 14px;
298
+  color: #666;
299
+  margin-top: 5px;
300
+}
301
+</style>

+ 4 - 21
src/views/blockingData/blockingDataScreen/components/ModuleTwo.vue

@@ -4,33 +4,15 @@
4 4
       <div class="top-row">
5 5
         <div class="table-card">
6 6
           <div class="chart-title">查堵-主管分管榜</div>
7
-          <div class="rank-table">
8
-            <div v-for="(item, index) in rankData1" :key="index" class="rank-row">
9
-              <span class="rank-number" :class="'rank-' + (index + 1)">NO.{{ index + 1 }}</span>
10
-              <span class="rank-name">{{ item.name }}</span>
11
-              <span class="rank-value">{{ item.value }}</span>
12
-            </div>
13
-          </div>
7
+          <rank-list :rank-data="rankData1" title="查堵-主管分管榜" />
14 8
         </div>
15 9
         <div class="table-card">
16 10
           <div class="chart-title">查堵-班组排行</div>
17
-          <div class="rank-table">
18
-            <div v-for="(item, index) in rankData2" :key="index" class="rank-row">
19
-              <span class="rank-number" :class="'rank-' + (index + 1)">NO.{{ index + 1 }}</span>
20
-              <span class="rank-name">{{ item.name }}</span>
21
-              <span class="rank-value">{{ item.value }}</span>
22
-            </div>
23
-          </div>
11
+          <rank-list :rank-data="rankData2" title="查堵-班组排行" />
24 12
         </div>
25 13
         <div class="table-card">
26 14
           <div class="chart-title">查堵-人员榜</div>
27
-          <div class="rank-table">
28
-            <div v-for="(item, index) in rankData3" :key="index" class="rank-row">
29
-              <span class="rank-number" :class="'rank-' + (index + 1)">NO.{{ index + 1 }}</span>
30
-              <span class="rank-name">{{ item.name }}</span>
31
-              <span class="rank-value">{{ item.value }}</span>
32
-            </div>
33
-          </div>
15
+          <rank-list :rank-data="rankData3" title="查堵-人员榜" />
34 16
         </div>
35 17
       </div>
36 18
 
@@ -78,6 +60,7 @@
78 60
 import { ref, onMounted, reactive } from 'vue'
79 61
 import * as echarts from 'echarts'
80 62
 import ModuleContainer from './ModuleContainer.vue'
63
+import RankList from './RankList.vue'
81 64
 import { useEcharts } from '@/hooks/chart.js'
82 65
 
83 66
 const chart1 = ref(null)

+ 204 - 0
src/views/blockingData/blockingDataScreen/components/RankList.vue

@@ -0,0 +1,204 @@
1
+<template>
2
+  <div class="rank-list-container">
3
+    <div class="rank-list-header">
4
+      <span class="header-label">排名</span>
5
+      <span class="header-name">分管班组长</span>
6
+      <span class="header-count">计数</span>
7
+    </div>
8
+    <div class="rank-list-body">
9
+      <div v-for="(item, index) in rankData" :key="index" class="rank-item" :class="'rank-item-' + getRankClass(index)">
10
+        <span class="rank-number" :class="'rank-number-' + getRankClass(index)">NO.{{ index + 1 }}</span>
11
+        <div class="rank-info">
12
+          <span class="rank-name">{{ item.name }}</span>
13
+          <div class="rank-bar">
14
+            <div class="rank-bar-fill" :class="'rank-bar-fill-' + getRankClass(index)" :style="{ width: getProgressWidth(item.value, maxValue) + '%' }"></div>
15
+          </div>
16
+        </div>
17
+        <span class="rank-count">{{ item.value }}</span>
18
+      </div>
19
+    </div>
20
+  </div>
21
+</template>
22
+
23
+<script setup>
24
+import { computed } from 'vue'
25
+
26
+const props = defineProps({
27
+  rankData: {
28
+    type: Array,
29
+    default: () => []
30
+  },
31
+  title: {
32
+    type: String,
33
+    default: '排行榜'
34
+  }
35
+})
36
+
37
+const maxValue = computed(() => {
38
+  if (props.rankData.length === 0) return 100
39
+  return Math.max(...props.rankData.map(item => item.value))
40
+})
41
+
42
+const getRankClass = (index) => {
43
+  if (index === 0) return 'first'
44
+  if (index === 1) return 'second'
45
+  if (index === 2) return 'third'
46
+  return 'default'
47
+}
48
+
49
+const getProgressWidth = (value, max) => {
50
+  return (value / max) * 100
51
+}
52
+</script>
53
+
54
+<style lang="less" scoped>
55
+.rank-list-container {
56
+  width: 100%;
57
+  height: 100%;
58
+  background: #fff;
59
+  border-radius: 8px;
60
+  padding: 16px;
61
+  display: flex;
62
+  flex-direction: column;
63
+}
64
+
65
+.rank-list-header {
66
+  display: flex;
67
+  align-items: center;
68
+  padding: 8px 0;
69
+  border-bottom: 1px solid #e5e7eb;
70
+  margin-bottom: 8px;
71
+}
72
+
73
+.header-label {
74
+  width: 80px;
75
+  font-size: 16px;
76
+  font-weight: 600;
77
+  color: #374151;
78
+}
79
+
80
+.header-name {
81
+  flex: 1;
82
+  font-size: 16px;
83
+  font-weight: 600;
84
+  color: #374151;
85
+}
86
+
87
+.header-count {
88
+  width: 80px;
89
+  text-align: right;
90
+  font-size: 16px;
91
+  font-weight: 600;
92
+  color: #374151;
93
+}
94
+
95
+.rank-list-body {
96
+  flex: 1;
97
+  overflow-y: auto;
98
+}
99
+
100
+.rank-item {
101
+  display: flex;
102
+  align-items: center;
103
+  padding: 10px 0;
104
+  border-radius: 8px;
105
+  transition: background-color 0.2s;
106
+}
107
+
108
+.rank-item-first {
109
+  background-color: #fef9e7;
110
+}
111
+
112
+.rank-item-second {
113
+  background-color: #f3f4f6;
114
+}
115
+
116
+.rank-item-third {
117
+  background-color: #fef2f2;
118
+}
119
+
120
+.rank-item:hover {
121
+  background-color: #f9fafb;
122
+}
123
+
124
+.rank-number {
125
+  width: 80px;
126
+  font-weight: bold;
127
+  font-size: 15px;
128
+  padding: 4px 8px;
129
+  border-radius: 4px;
130
+}
131
+
132
+.rank-number-first {
133
+  background-color: #fbbf24;
134
+  color: #fff;
135
+}
136
+
137
+.rank-number-second {
138
+  background-color: #9ca3af;
139
+  color: #fff;
140
+}
141
+
142
+.rank-number-third {
143
+  background-color: #f87171;
144
+  color: #fff;
145
+}
146
+
147
+.rank-number-default {
148
+  background-color: #e5e7eb;
149
+  color: #6b7280;
150
+}
151
+
152
+.rank-info {
153
+  flex: 1;
154
+  display: flex;
155
+  flex-direction: row;
156
+  align-items: center;
157
+  gap: 8px;
158
+}
159
+
160
+.rank-name {
161
+  font-size: 15px;
162
+  color: #1f2937;
163
+  font-weight: 500;
164
+  min-width: 80px;
165
+}
166
+
167
+.rank-bar {
168
+  flex: 1;
169
+  height: 12px;
170
+  background-color: #e5e7eb;
171
+  border-radius: 6px;
172
+  overflow: hidden;
173
+}
174
+
175
+.rank-bar-fill {
176
+  height: 100%;
177
+  border-radius: 6px;
178
+  transition: width 0.5s ease-out;
179
+}
180
+
181
+.rank-bar-fill-first {
182
+  background: linear-gradient(90deg, #fbbf24, #f59e0b);
183
+}
184
+
185
+.rank-bar-fill-second {
186
+  background: linear-gradient(90deg, #9ca3af, #6b7280);
187
+}
188
+
189
+.rank-bar-fill-third {
190
+  background: linear-gradient(90deg, #f87171, #ef4444);
191
+}
192
+
193
+.rank-bar-fill-default {
194
+  background: linear-gradient(90deg, #60a5fa, #3b82f6);
195
+}
196
+
197
+.rank-count {
198
+  width: 80px;
199
+  text-align: right;
200
+  font-size: 15px;
201
+  font-weight: 600;
202
+  color: #1f2937;
203
+}
204
+</style>

+ 17 - 3
src/views/blockingData/blockingDataScreen/index.vue

@@ -60,7 +60,7 @@
60 60
     </div>
61 61
 
62 62
     <div class="screen-content">
63
-      <div class="grid-layout">
63
+      <div v-if="filterParams.brigade === '全站'" class="grid-layout">
64 64
         <div class="grid-item">
65 65
           <module-one />
66 66
         </div>
@@ -74,6 +74,17 @@
74 74
           <module-four />
75 75
         </div>
76 76
       </div>
77
+      <div v-else class="grid-layout">
78
+        <div class="grid-item">
79
+          <module-brigade-one />
80
+        </div>
81
+        <div class="grid-item">
82
+          <module-brigade-two />
83
+        </div>
84
+        <div class="grid-item">
85
+          <module-brigade-three />
86
+        </div>
87
+      </div>
77 88
     </div>
78 89
   </div>
79 90
 </template>
@@ -85,6 +96,9 @@ import ModuleOne from './components/ModuleOne.vue'
85 96
 import ModuleTwo from './components/ModuleTwo.vue'
86 97
 import ModuleThree from './components/ModuleThree.vue'
87 98
 import ModuleFour from './components/ModuleFour.vue'
99
+import ModuleBrigadeOne from './components/ModuleBrigadeOne.vue'
100
+import ModuleBrigadeTwo from './components/ModuleBrigadeTwo.vue'
101
+import ModuleBrigadeThree from './components/ModuleBrigadeThree.vue'
88 102
 
89 103
 // 默认时间设置
90 104
 const defaultTime = [
@@ -99,7 +113,7 @@ const filterParams = reactive({
99 113
   teamLeader: '',
100 114
   area: '',
101 115
   missedItem: '',
102
-  brigade: ''
116
+  brigade: '全站'
103 117
 })
104 118
 
105 119
 // 选项数据
@@ -154,7 +168,7 @@ const resetFilter = () => {
154 168
     teamLeader: '',
155 169
     area: '',
156 170
     missedItem: '',
157
-    brigade: ''
171
+    brigade: '全站'
158 172
   })
159 173
   setDefaultDateRange()
160 174
 }

+ 51 - 59
src/views/blockingData/dailyLuggageCheckInList/index.vue

@@ -110,169 +110,142 @@
110 110
         <el-row :gutter="20">
111 111
           <el-col :span="12">
112 112
             <el-form-item label="T1旅检过检行李数" prop="t1TravelLuggageCount">
113
-              <el-input-number v-model="form.t1TravelLuggageCount" :min="0" style="width: 100%" />
113
+              <el-input-number v-model="form.t1TravelLuggageCount" :min="0" :precision="0" style="width: 100%" />
114 114
             </el-form-item>
115 115
           </el-col>
116 116
           <el-col :span="12">
117 117
             <el-form-item label="T2旅检过检行李数" prop="t2TravelLuggageCount">
118
-              <el-input-number v-model="form.t2TravelLuggageCount" :min="0" style="width: 100%" />
118
+              <el-input-number v-model="form.t2TravelLuggageCount" :min="0" :precision="0" style="width: 100%" />
119 119
             </el-form-item>
120 120
           </el-col>
121 121
         </el-row>
122 122
         <el-row :gutter="20">
123 123
           <el-col :span="12">
124 124
             <el-form-item label="T1行检过检行李数" prop="t1WalkLuggageCount">
125
-              <el-input-number v-model="form.t1WalkLuggageCount" :min="0" style="width: 100%" />
125
+              <el-input-number v-model="form.t1WalkLuggageCount" :min="0" :precision="0" style="width: 100%" />
126 126
             </el-form-item>
127 127
           </el-col>
128 128
           <el-col :span="12">
129 129
             <el-form-item label="T2行检过检行李数" prop="t2WalkLuggageCount">
130
-              <el-input-number v-model="form.t2WalkLuggageCount" :min="0" style="width: 100%" />
130
+              <el-input-number v-model="form.t2WalkLuggageCount" :min="0" :precision="0" style="width: 100%" />
131 131
             </el-form-item>
132 132
           </el-col>
133 133
         </el-row>
134 134
         <el-row :gutter="20">
135 135
           <el-col :span="12">
136
-            <el-form-item label="过检行李合计" prop="totalLuggageCount">
136
+            <!-- <el-form-item label="过检行李合计" prop="totalLuggageCount">
137 137
               <el-input-number v-model="form.totalLuggageCount" :min="0" style="width: 100%" />
138
-            </el-form-item>
138
+            </el-form-item> -->
139 139
           </el-col>
140 140
         </el-row>
141 141
         <el-row :gutter="20">
142 142
           <el-col :span="12">
143 143
             <el-form-item label="T1旅检查堵件数" prop="t1TravelBlockedCount">
144
-              <el-input-number v-model="form.t1TravelBlockedCount" :min="0" style="width: 100%" />
144
+              <el-input-number v-model="form.t1TravelBlockedCount" :min="0" :precision="0" style="width: 100%" />
145 145
             </el-form-item>
146 146
           </el-col>
147 147
           <el-col :span="12">
148
-            <el-form-item label="T1旅检万分率" prop="t1TravelBlockRate">
148
+            <!-- <el-form-item label="T1旅检万分率" prop="t1TravelBlockRate">
149 149
               <el-input-number v-model="form.t1TravelBlockRate" :min="0" :precision="2" style="width: 100%" />
150
-            </el-form-item>
150
+            </el-form-item> -->
151 151
           </el-col>
152 152
         </el-row>
153 153
         <el-row :gutter="20">
154 154
           <el-col :span="12">
155 155
             <el-form-item label="T2旅检查堵件数" prop="t2TravelBlockedCount">
156
-              <el-input-number v-model="form.t2TravelBlockedCount" :min="0" style="width: 100%" />
156
+              <el-input-number v-model="form.t2TravelBlockedCount" :min="0" :precision="0" style="width: 100%" />
157 157
             </el-form-item>
158 158
           </el-col>
159 159
           <el-col :span="12">
160
-            <el-form-item label="T2旅检万分率" prop="t2TravelBlockRate">
160
+            <!-- <el-form-item label="T2旅检万分率" prop="t2TravelBlockRate">
161 161
               <el-input-number v-model="form.t2TravelBlockRate" :min="0" :precision="2" style="width: 100%" />
162
-            </el-form-item>
162
+            </el-form-item> -->
163 163
           </el-col>
164 164
         </el-row>
165 165
         <el-row :gutter="20">
166 166
           <el-col :span="12">
167 167
             <el-form-item label="T1行检查堵件数" prop="t1WalkBlockedCount">
168
-              <el-input-number v-model="form.t1WalkBlockedCount" :min="0" style="width: 100%" />
168
+              <el-input-number v-model="form.t1WalkBlockedCount" :min="0" :precision="0" style="width: 100%" />
169 169
             </el-form-item>
170 170
           </el-col>
171 171
           <el-col :span="12">
172
-            <el-form-item label="T1行检万分率" prop="t1WalkBlockRate">
172
+            <!-- <el-form-item label="T1行检万分率" prop="t1WalkBlockRate">
173 173
               <el-input-number v-model="form.t1WalkBlockRate" :min="0" :precision="2" style="width: 100%" />
174
-            </el-form-item>
174
+            </el-form-item> -->
175 175
           </el-col>
176 176
         </el-row>
177 177
         <el-row :gutter="20">
178 178
           <el-col :span="12">
179 179
             <el-form-item label="T2行检查堵件数" prop="t2WalkBlockedCount">
180
-              <el-input-number v-model="form.t2WalkBlockedCount" :min="0" style="width: 100%" />
180
+              <el-input-number v-model="form.t2WalkBlockedCount" :min="0" :precision="0" style="width: 100%" />
181 181
             </el-form-item>
182 182
           </el-col>
183 183
           <el-col :span="12">
184
-            <el-form-item label="T2行检万分率" prop="t2WalkBlockRate">
184
+            <!-- <el-form-item label="T2行检万分率" prop="t2WalkBlockRate">
185 185
               <el-input-number v-model="form.t2WalkBlockRate" :min="0" :precision="2" style="width: 100%" />
186
-            </el-form-item>
186
+            </el-form-item> -->
187 187
           </el-col>
188 188
         </el-row>
189 189
         <el-row :gutter="20">
190
+          
190 191
           <el-col :span="12">
191
-            <el-form-item label="查堵合计件数" prop="totalBlockedCount">
192
-              <el-input-number v-model="form.totalBlockedCount" :min="0" style="width: 100%" />
193
-            </el-form-item>
194
-          </el-col>
195
-          <el-col :span="12">
196
-            <el-form-item label="当日查堵万分率" prop="dailyBlockRate">
192
+            <!-- <el-form-item label="当日查堵万分率" prop="dailyBlockRate">
197 193
               <el-input-number v-model="form.dailyBlockRate" :min="0" :precision="2" style="width: 100%" />
198
-            </el-form-item>
194
+            </el-form-item> -->
199 195
           </el-col>
200 196
         </el-row>
201 197
         <el-row :gutter="20">
202 198
           <el-col :span="12">
203 199
             <el-form-item label="T1复查图像总数" prop="t1ReviewImageTotal">
204
-              <el-input-number v-model="form.t1ReviewImageTotal" :min="0" style="width: 100%" />
200
+              <el-input-number v-model="form.t1ReviewImageTotal" :min="0" :precision="0" style="width: 100%" />
205 201
             </el-form-item>
206 202
           </el-col>
207 203
           <el-col :span="12">
208 204
             <el-form-item label="T1-AI标记总数" prop="t1AiMarkTotal">
209
-              <el-input-number v-model="form.t1AiMarkTotal" :min="0" style="width: 100%" />
205
+              <el-input-number v-model="form.t1AiMarkTotal" :min="0" :precision="0" style="width: 100%" />
210 206
             </el-form-item>
211 207
           </el-col>
212 208
         </el-row>
213 209
         <el-row :gutter="20">
214 210
           <el-col :span="12">
215 211
             <el-form-item label="T1-AI误判总数" prop="t1AiErrorTotal">
216
-              <el-input-number v-model="form.t1AiErrorTotal" :min="0" style="width: 100%" />
212
+              <el-input-number v-model="form.t1AiErrorTotal" :min="0" :precision="0" style="width: 100%" />
217 213
             </el-form-item>
218 214
           </el-col>
219 215
           <el-col :span="12">
220 216
             <el-form-item label="T1-AI漏判总数" prop="t1AiMissTotal">
221
-              <el-input-number v-model="form.t1AiMissTotal" :min="0" style="width: 100%" />
217
+              <el-input-number v-model="form.t1AiMissTotal" :min="0" :precision="0" style="width: 100%" />
222 218
             </el-form-item>
223 219
           </el-col>
224 220
         </el-row>
225 221
         <el-row :gutter="20">
226 222
           <el-col :span="12">
227 223
             <el-form-item label="T2复查图像总数" prop="t2ReviewImageTotal">
228
-              <el-input-number v-model="form.t2ReviewImageTotal" :min="0" style="width: 100%" />
224
+              <el-input-number v-model="form.t2ReviewImageTotal" :min="0" :precision="0" style="width: 100%" />
229 225
             </el-form-item>
230 226
           </el-col>
231 227
           <el-col :span="12">
232 228
             <el-form-item label="T2-AI标记总数" prop="t2AiMarkTotal">
233
-              <el-input-number v-model="form.t2AiMarkTotal" :min="0" style="width: 100%" />
229
+              <el-input-number v-model="form.t2AiMarkTotal" :min="0" :precision="0" style="width: 100%" />
234 230
             </el-form-item>
235 231
           </el-col>
236 232
         </el-row>
237 233
         <el-row :gutter="20">
238 234
           <el-col :span="12">
239 235
             <el-form-item label="T2-AI误判总数" prop="t2AiErrorTotal">
240
-              <el-input-number v-model="form.t2AiErrorTotal" :min="0" style="width: 100%" />
236
+              <el-input-number v-model="form.t2AiErrorTotal" :min="0" :precision="0" style="width: 100%" />
241 237
             </el-form-item>
242 238
           </el-col>
243 239
           <el-col :span="12">
244
-            <el-form-item label="T2AI漏判总数" prop="t2AiMissTotal">
245
-              <el-input-number v-model="form.t2AiMissTotal" :min="0" style="width: 100%" />
240
+            <el-form-item label="T2-AI漏判总数" prop="t2AiMissTotal">
241
+              <el-input-number v-model="form.t2AiMissTotal" :min="0" :precision="0" style="width: 100%" />
246 242
             </el-form-item>
247 243
           </el-col>
248 244
         </el-row>
249 245
         <el-form-item label="其他(VP通道)数量" prop="otherVipCount">
250 246
           <el-input-number v-model="form.otherVipCount" :min="0" style="width: 100%" />
251 247
         </el-form-item>
252
-        <el-row :gutter="20">
253
-          <el-col :span="12">
254
-            <el-form-item label="AI复查图像总数" prop="aiReviewImageTotal">
255
-              <el-input-number v-model="form.aiReviewImageTotal" :min="0" style="width: 100%" />
256
-            </el-form-item>
257
-          </el-col>
258
-          <el-col :span="12">
259
-            <el-form-item label="AI标记图像总数" prop="aiMarkTotal">
260
-              <el-input-number v-model="form.aiMarkTotal" :min="0" style="width: 100%" />
261
-            </el-form-item>
262
-          </el-col>
263
-        </el-row>
264
-        <el-row :gutter="20">
265
-          <el-col :span="12">
266
-            <el-form-item label="AI漏判图像总数" prop="aiMissImageTotal">
267
-              <el-input-number v-model="form.aiMissImageTotal" :min="0" style="width: 100%" />
268
-            </el-form-item>
269
-          </el-col>
270
-          <el-col :span="12">
271
-            <el-form-item label="AI误判图像总数" prop="aiErrorImageTotal">
272
-              <el-input-number v-model="form.aiErrorImageTotal" :min="0" style="width: 100%" />
273
-            </el-form-item>
274
-          </el-col>
275
-        </el-row>
248
+    
276 249
       </el-form>
277 250
       <template #footer>
278 251
         <div class="dialog-footer">
@@ -349,7 +322,24 @@ const form = reactive({})
349 322
 const rules = {
350 323
   statDate: [{ required: true, message: '日期不能为空', trigger: 'change' }],
351 324
   shiftType: [{ required: true, message: '班次不能为空', trigger: 'change' }],
352
-  brigadeName: [{ required: true, message: '当班大队不能为空', trigger: 'change' }]
325
+  brigadeName: [{ required: true, message: '当班大队不能为空', trigger: 'change' }],
326
+  t1TravelLuggageCount: [{ required: true, message: 'T1旅检过检行李数不能为空', trigger: 'change' }],
327
+  t2TravelLuggageCount: [{ required: true, message: 'T2旅检过检行李数不能为空', trigger: 'change' }],
328
+  t1WalkLuggageCount: [{ required: true, message: 'T1行检过检行李数不能为空', trigger: 'change' }],
329
+  t2WalkLuggageCount: [{ required: true, message: 'T2行检过检行李数不能为空', trigger: 'change' }],
330
+  t1TravelBlockedCount: [{ required: true, message: 'T1旅检查堵件数不能为空', trigger: 'change' }],
331
+  t2TravelBlockedCount: [{ required: true, message: 'T2旅检查堵件数不能为空', trigger: 'change' }],
332
+  t1WalkBlockedCount: [{ required: true, message: 'T1行检查堵件数不能为空', trigger: 'change' }],
333
+  t2WalkBlockedCount: [{ required: true, message: 'T2行检查堵件数不能为空', trigger: 'change' }],
334
+  t1ReviewImageTotal: [{ required: true, message: 'T1复查图像总数不能为空', trigger: 'change' }],
335
+  t1AiMarkTotal: [{ required: true, message: 'T1-AI标记总数不能为空', trigger: 'change' }],
336
+  t1AiErrorTotal: [{ required: true, message: 'T1-AI误判总数不能为空', trigger: 'change' }],
337
+  t1AiMissTotal: [{ required: true, message: 'T1-AI漏判总数不能为空', trigger: 'change' }],
338
+  t2ReviewImageTotal: [{ required: true, message: 'T2复查图像总数不能为空', trigger: 'change' }],
339
+  t2AiMarkTotal: [{ required: true, message: 'T2-AI标记总数不能为空', trigger: 'change' }],
340
+  t2AiErrorTotal: [{ required: true, message: 'T2-AI误判总数不能为空', trigger: 'change' }],
341
+  t2AiMissTotal: [{ required: true, message: 'T2-AI漏判总数不能为空', trigger: 'change' }]
342
+  // otherVipCount 不设置必填校验
353 343
 }
354 344
 
355 345
 // 大队选项
@@ -443,6 +433,8 @@ function handleSelectionChange(selection) {
443 433
 /** 新增按钮操作 */
444 434
 function handleAdd() {
445 435
   reset()
436
+  // 设置默认当前日期
437
+  form.statDate = new Date().toISOString().split('T')[0]
446 438
   open.value = true
447 439
   title.value = '添加每日行李查缉'
448 440
 }

+ 4 - 17
src/views/blockingData/dailyLuggageInspectionScheduleByTime/index.vue

@@ -109,7 +109,7 @@
109 109
         </el-row>
110 110
         <el-row :gutter="20">
111 111
           <el-col :span="12">
112
-            <el-form-item label="T2行检箱包数" prop="t2WalkBagCount">
112
+            <el-form-item label="T2行检箱包数(国内+国际)" prop="t2WalkBagCount">
113 113
               <el-input-number v-model="form.t2WalkBagCount" :min="0" style="width: 100%" />
114 114
             </el-form-item>
115 115
           </el-col>
@@ -121,7 +121,7 @@
121 121
         </el-row>
122 122
         <el-row :gutter="20">
123 123
           <el-col :span="12">
124
-            <el-form-item label="T1旅检箱包数" prop="t1TravelBagCount">
124
+            <el-form-item label="T1旅检箱包数(国内+国际+中转)" prop="t1TravelBagCount">
125 125
               <el-input-number v-model="form.t1TravelBagCount" :min="0" style="width: 100%" />
126 126
             </el-form-item>
127 127
           </el-col>
@@ -143,21 +143,8 @@
143 143
             </el-form-item>
144 144
           </el-col>
145 145
         </el-row>
146
-        <el-row :gutter="20">
147
-          <el-col :span="12">
148
-            <el-form-item label="过检行李数" prop="totalLuggageCount">
149
-              <el-input-number v-model="form.totalLuggageCount" :min="0" style="width: 100%" />
150
-            </el-form-item>
151
-          </el-col>
152
-          <el-col :span="12">
153
-            <el-form-item label="时段查堵件数" prop="totalBlockedCount">
154
-              <el-input-number v-model="form.totalBlockedCount" :min="0" style="width: 100%" />
155
-            </el-form-item>
156
-          </el-col>
157
-        </el-row>
158
-        <el-form-item label="查堵万分率" prop="blockedRate">
159
-          <el-input-number v-model="form.blockedRate" :min="0" :precision="2" style="width: 100%" />
160
-        </el-form-item>
146
+       
147
+       
161 148
       </el-form>
162 149
       <template #footer>
163 150
         <div class="dialog-footer">