vue2-client 1.20.71 → 1.20.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/MarsCodeWorkspaceAppSettings.xml +7 -0
- package/.idea/af-vue2-client.iml +3 -2
- package/.idea/deployment.xml +14 -0
- package/.idea/encodings.xml +6 -0
- package/.idea/gradle.xml +7 -0
- package/.idea/inspectionProfiles/Project_Default.xml +0 -17
- package/.idea/misc.xml +6 -0
- package/package.json +2 -2
- package/src/assets/svg/unknown-icon.svg +3 -3
- package/src/base-client/components/common/AfMap/InfoWindowComponent.vue +141 -141
- package/src/base-client/components/common/AfMap/demo.vue +492 -492
- package/src/base-client/components/common/XInspectionDetailDrawer/components/AiDeviceStatus.vue +402 -199
- package/src/base-client/components/common/XInspectionDetailDrawer/components/CheckItems.vue +0 -34
- package/src/base-client/components/common/XInspectionDetailDrawer/demo.vue +3 -3
- package/src/base-client/components/common/XInspectionDetailDrawer/index.vue +40 -25
- package/src/base-client/components/common/XInspectionDetailDrawer/services/inspectionDetailApi.js +0 -1
- package/src/base-client/components/common/XInspectionDetailDrawer/services/inspectionService.js +6 -63
- package/src/components/ImagePreview/ImagePreview.vue +323 -323
- package/logs/afgit.config.log +0 -12
- package/logs/afgit.config.log.2026-02-27 +0 -7
- package/logs/afgit.config_error.log +0 -6
- package/logs/afgit.config_error.log.2026-02-27 +0 -3
package/src/base-client/components/common/XInspectionDetailDrawer/components/AiDeviceStatus.vue
CHANGED
|
@@ -5,78 +5,160 @@
|
|
|
5
5
|
<template slot="title">
|
|
6
6
|
<div class="device-header">
|
|
7
7
|
<div class="device-title">
|
|
8
|
-
<a-icon type="tool" style="color: #1890FF;"
|
|
9
|
-
<span>AI
|
|
8
|
+
<a-icon type="tool" style="color: #1890FF;"/>
|
|
9
|
+
<span>{{ config?.titleText || 'AI检测结果' }}</span>
|
|
10
10
|
</div>
|
|
11
11
|
<div class="device-count">
|
|
12
|
-
AI识别 {{ (deviceList || []).length }}
|
|
12
|
+
{{ config?.titleLeftCountText || 'AI识别' }}{{ (deviceList || []).length }}{{
|
|
13
|
+
config?.titleLeftCountUnitText
|
|
14
|
+
|| '项'
|
|
15
|
+
}}
|
|
13
16
|
</div>
|
|
14
17
|
</div>
|
|
15
18
|
</template>
|
|
16
19
|
|
|
17
20
|
<!-- 设备网格 -->
|
|
18
21
|
<div class="device-grid">
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class="device-item"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
<!-- 第一行:两个卡片并排 -->
|
|
23
|
+
<div class="device-row">
|
|
24
|
+
<!-- 操作违规 -->
|
|
25
|
+
<div class="device-item">
|
|
26
|
+
<div class="device-content">
|
|
27
|
+
<div class="device-item-header">
|
|
28
|
+
<div class="device-info-section">
|
|
29
|
+
<div class="device-icon">
|
|
30
|
+
<device-icon type="stove"/>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="device-info">
|
|
33
|
+
<div class="device-name">{{ getDeviceByName('operationalViolation')?.name }}</div>
|
|
34
|
+
<div class="device-brand-model">{{ getDeviceByName('operationalViolation')?.desc }}</div>
|
|
35
|
+
</div>
|
|
33
36
|
</div>
|
|
34
|
-
<div class="device-
|
|
35
|
-
<
|
|
36
|
-
<div class="device-brand-model"></div>
|
|
37
|
+
<div class="device-status-badge status-warning">
|
|
38
|
+
<span class="status-text">{{ getDeviceByName('operationalViolation')?.tag }}</span>
|
|
37
39
|
</div>
|
|
38
40
|
</div>
|
|
39
|
-
<div class="
|
|
40
|
-
<
|
|
41
|
+
<div class="violation-section">
|
|
42
|
+
<div class="violation-row section-header">
|
|
43
|
+
<span class="header-item">详情</span>
|
|
44
|
+
<span class="header-item">图片</span>
|
|
45
|
+
</div>
|
|
46
|
+
<div
|
|
47
|
+
v-for="item in getDeviceByName('operationalViolation')?.item || []"
|
|
48
|
+
:key="item.key"
|
|
49
|
+
class="violation-row">
|
|
50
|
+
<span class="violation-key">{{ item.key }}</span>
|
|
51
|
+
<div class="violation-images" v-if="item.img && item.img.length > 0">
|
|
52
|
+
<img
|
|
53
|
+
v-for="(imgUrl, idx) in item.img"
|
|
54
|
+
:key="idx"
|
|
55
|
+
:src="imgUrl"
|
|
56
|
+
:alt="item.key + '-' + idx"
|
|
57
|
+
class="violation-img"
|
|
58
|
+
/>
|
|
59
|
+
</div>
|
|
60
|
+
<div v-else class="violation-images-empty"></div>
|
|
61
|
+
</div>
|
|
62
|
+
<div v-if="(!getDeviceByName('operationalViolation')?.item || getDeviceByName('operationalViolation')?.item.length === 0)" class="empty-content">
|
|
63
|
+
<span>暂无数据</span>
|
|
64
|
+
</div>
|
|
41
65
|
</div>
|
|
42
66
|
</div>
|
|
67
|
+
</div>
|
|
43
68
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
<div class="
|
|
69
|
+
<!-- 检测结果不一致 -->
|
|
70
|
+
<div class="device-item">
|
|
71
|
+
<div class="device-content">
|
|
72
|
+
<div class="device-item-header">
|
|
73
|
+
<div class="device-info-section">
|
|
74
|
+
<div class="device-icon">
|
|
75
|
+
<device-icon type="stove"/>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="device-info">
|
|
78
|
+
<div class="device-name">{{ getDeviceByName('detectionResultInconsistent')?.name }}</div>
|
|
79
|
+
<div class="device-brand-model">{{ getDeviceByName('detectionResultInconsistent')?.desc }}</div>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="device-status-badge status-warning">
|
|
83
|
+
<span class="status-text">{{ getDeviceByName('detectionResultInconsistent')?.tag }}</span>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="inconsistent-section">
|
|
87
|
+
<div class="inconsistent-row section-header">
|
|
88
|
+
<span class="header-item">详情</span>
|
|
89
|
+
<span class="header-item">图片</span>
|
|
90
|
+
<span class="header-item">安检结果</span>
|
|
91
|
+
<span class="header-item">AI检测结果</span>
|
|
92
|
+
</div>
|
|
48
93
|
<div
|
|
49
|
-
v-for="
|
|
50
|
-
:key="
|
|
51
|
-
class="
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
<
|
|
55
|
-
|
|
94
|
+
v-for="item in getDeviceByName('detectionResultInconsistent')?.item || []"
|
|
95
|
+
:key="item.index"
|
|
96
|
+
class="inconsistent-row">
|
|
97
|
+
<div class="inconsistent-item">{{ item.name }}</div>
|
|
98
|
+
<div class="inconsistent-item"><img v-if="item.inspectorImg" :src="item.inspectorImg" class="violation-img" /><span v-else></span></div>
|
|
99
|
+
<div class="inconsistent-item">
|
|
100
|
+
<a-tag :color="getStatusTag(item.inspectorVal, item.options)?.color">
|
|
101
|
+
{{ getStatusTag(item.inspectorVal, item.options)?.text }}
|
|
102
|
+
</a-tag>
|
|
103
|
+
</div>
|
|
104
|
+
<div class="inconsistent-action">
|
|
105
|
+
<a-tag
|
|
106
|
+
:color="getStatusTag(item.aiVal, item.options)?.color"
|
|
107
|
+
:class="{ 'clickable-tag': isInconsistent(item) }"
|
|
108
|
+
@click="isInconsistent(item) && handleProcess(item)"
|
|
109
|
+
>
|
|
110
|
+
{{ getStatusTag(item.aiVal, item.options)?.text }}
|
|
111
|
+
</a-tag>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
<div v-if="(!getDeviceByName('detectionResultInconsistent')?.item || getDeviceByName('detectionResultInconsistent')?.item.length === 0)" class="empty-content">
|
|
115
|
+
<span>暂无数据</span>
|
|
56
116
|
</div>
|
|
57
117
|
</div>
|
|
58
118
|
</div>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
59
121
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
122
|
+
<!-- 第二行:新增隐患(只有item长度大于0才展示) -->
|
|
123
|
+
<div class="device-row" v-if="getDeviceByName('addDanger')?.item && getDeviceByName('addDanger')?.item.length > 0">
|
|
124
|
+
<div class="device-item danger-full-width">
|
|
125
|
+
<div class="device-content">
|
|
126
|
+
<div class="device-item-header">
|
|
127
|
+
<div class="device-info-section">
|
|
128
|
+
<div class="device-icon">
|
|
129
|
+
<device-icon type="stove"/>
|
|
130
|
+
</div>
|
|
131
|
+
<div class="device-info">
|
|
132
|
+
<div class="device-name">{{ getDeviceByName('addDanger')?.name }}</div>
|
|
133
|
+
<div class="device-brand-model">{{ getDeviceByName('addDanger')?.desc }}</div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="device-status-badge status-warning">
|
|
137
|
+
<span class="status-text">{{ getDeviceByName('addDanger')?.tag }}</span>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
<div class="danger-section">
|
|
141
|
+
<div class="danger-row section-header">
|
|
142
|
+
<span class="header-item">详情</span>
|
|
143
|
+
<span class="header-item">图片</span>
|
|
144
|
+
<span class="header-item">AI检测结果</span>
|
|
145
|
+
</div>
|
|
146
|
+
<div
|
|
147
|
+
v-for="item in getDeviceByName('addDanger')?.item || []"
|
|
148
|
+
:key="item.index"
|
|
149
|
+
class="danger-row">
|
|
150
|
+
<div class="danger-item">{{ item.name }}</div>
|
|
151
|
+
<div class="danger-item"><img v-if="item.aiImg" :src="item.aiImg" class="violation-img" /><span v-else></span></div>
|
|
152
|
+
<div class="danger-item">{{ item.aiVal }}</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
72
155
|
</div>
|
|
73
|
-
|
|
74
156
|
</div>
|
|
75
157
|
</div>
|
|
76
158
|
|
|
77
159
|
<!-- 空状态 -->
|
|
78
|
-
<div v-if="
|
|
79
|
-
<a-icon type="tool" style="font-size: 48px; color: #d9d9d9;"
|
|
160
|
+
<div v-if="deviceList.length === 0" class="device-empty">
|
|
161
|
+
<a-icon type="tool" style="font-size: 48px; color: #d9d9d9;"/>
|
|
80
162
|
<p style="color: #999; margin-top: 16px;">暂无设备信息</p>
|
|
81
163
|
</div>
|
|
82
164
|
</div>
|
|
@@ -85,7 +167,7 @@
|
|
|
85
167
|
</template>
|
|
86
168
|
|
|
87
169
|
<script>
|
|
88
|
-
import {
|
|
170
|
+
import {FileImageGroup} from '@vue2-client/base-client/components/common/FileImage'
|
|
89
171
|
import DeviceIcon from './DeviceIcon.vue'
|
|
90
172
|
|
|
91
173
|
export default {
|
|
@@ -95,180 +177,89 @@ export default {
|
|
|
95
177
|
DeviceIcon
|
|
96
178
|
},
|
|
97
179
|
inject: {
|
|
98
|
-
serviceName: {
|
|
180
|
+
serviceName: {default: ''}
|
|
99
181
|
},
|
|
100
182
|
props: {
|
|
101
183
|
deviceList: {
|
|
102
184
|
type: Array,
|
|
103
185
|
default: () => []
|
|
186
|
+
},
|
|
187
|
+
config: {
|
|
188
|
+
type: Object,
|
|
189
|
+
default: () => {
|
|
190
|
+
}
|
|
104
191
|
}
|
|
105
192
|
},
|
|
106
193
|
methods: {
|
|
107
|
-
/**
|
|
108
|
-
* 根据设备信息获取图标类型
|
|
109
|
-
*/
|
|
110
|
-
getDeviceIconType (device) {
|
|
111
|
-
// 根据设备名称判断类型
|
|
112
|
-
return 'stove'
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
getDeviceName (device) {
|
|
116
|
-
// 根据设备名称判断类型
|
|
117
|
-
const find = device.properties.find(item => item.key === '名称')
|
|
118
|
-
return find?.value || 'default'
|
|
119
|
-
},
|
|
120
|
-
|
|
121
|
-
getDeviceKxd (device) {
|
|
122
|
-
// 根据设备名称判断类型
|
|
123
|
-
const find = device.properties.find(item => item.key === '可信度')
|
|
124
|
-
return find?.value || '90%'
|
|
125
|
-
},
|
|
126
|
-
|
|
127
|
-
getDeviceDetail (device) {
|
|
128
|
-
// 过滤掉“名称”
|
|
129
|
-
const filter = device.properties.filter(item => item.key !== '名称')
|
|
130
|
-
|
|
131
|
-
// 遍历处理“可信度”
|
|
132
|
-
const result = filter.map(item => {
|
|
133
|
-
if (item.key === '可信度') {
|
|
134
|
-
const val = item.value
|
|
135
|
-
|
|
136
|
-
// 如果是类似 "62.7%" 或 "62.86000000000001%"
|
|
137
|
-
if (typeof val === 'string' && val.includes('%')) {
|
|
138
|
-
const num = parseFloat(val.replace('%', ''))
|
|
139
|
-
|
|
140
|
-
if (!isNaN(num)) {
|
|
141
|
-
// 控制精度(保留1位 or 2位按你需求)
|
|
142
|
-
item.value = num.toFixed(1) + '%'
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// 如果是纯数字(例如 0.6286)
|
|
147
|
-
else if (typeof val === 'number') {
|
|
148
|
-
item.value = (val * 100).toFixed(1) + '%'
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return item
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
console.warn('getDeviceDetail', result)
|
|
156
|
-
return result || []
|
|
157
|
-
},
|
|
158
194
|
|
|
159
195
|
/**
|
|
160
|
-
*
|
|
196
|
+
* 根据key获取设备数据
|
|
197
|
+
* @param {string} key - 设备key
|
|
198
|
+
* @returns {object|null} - 设备数据
|
|
161
199
|
*/
|
|
162
|
-
|
|
163
|
-
return
|
|
200
|
+
getDeviceByName(key) {
|
|
201
|
+
return this.deviceList.find(device => device.key === key)
|
|
164
202
|
},
|
|
165
203
|
|
|
166
204
|
/**
|
|
167
|
-
*
|
|
205
|
+
* 判断安检结果和AI检测结果是否不一致
|
|
206
|
+
* @param {object} item - 检测项数据
|
|
207
|
+
* @returns {boolean} - 是否不一致
|
|
168
208
|
*/
|
|
169
|
-
|
|
170
|
-
|
|
209
|
+
isInconsistent(item) {
|
|
210
|
+
const inspectorTag = this.getStatusTag(item.inspectorVal, item.options)
|
|
211
|
+
const aiTag = this.getStatusTag(item.aiVal, item.options)
|
|
212
|
+
return inspectorTag?.text !== aiTag?.text
|
|
171
213
|
},
|
|
172
214
|
|
|
173
215
|
/**
|
|
174
|
-
*
|
|
216
|
+
* 根据值和options判断状态
|
|
217
|
+
* @param {string} value - 当前值
|
|
218
|
+
* @param {array} options - 选项配置数组
|
|
219
|
+
* @returns {object} - { color, text }
|
|
175
220
|
*/
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
warning: 'status-warning',
|
|
180
|
-
error: 'status-error'
|
|
181
|
-
}
|
|
182
|
-
// 根据设备名称判断类型
|
|
183
|
-
const find = device.properties.find(item => item.key === '可信度')
|
|
184
|
-
const value = parseFloat(find?.value)
|
|
185
|
-
console.warn('getStatusBadgeClass', value)
|
|
186
|
-
|
|
187
|
-
if (isNaN(value)) return statusMap.error
|
|
188
|
-
|
|
189
|
-
if (value >= 70) {
|
|
190
|
-
return statusMap.normal
|
|
191
|
-
} else if (value >= 40) {
|
|
192
|
-
return statusMap.warning
|
|
193
|
-
} else {
|
|
194
|
-
return statusMap.error
|
|
221
|
+
getStatusTag(value, options) {
|
|
222
|
+
if (!options || !Array.isArray(options)) {
|
|
223
|
+
return { color: 'default', text: value || '未知' }
|
|
195
224
|
}
|
|
196
|
-
},
|
|
197
225
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
formatFieldValue (field) {
|
|
202
|
-
if (!field.value) return '——'
|
|
226
|
+
// 扁平化 options(处理二维数组)
|
|
227
|
+
const flatOptions = options.flat()
|
|
228
|
+
const matchedOption = flatOptions.find(opt => opt.data === value)
|
|
203
229
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
230
|
+
if (matchedOption) {
|
|
231
|
+
if (matchedOption.isdefect) {
|
|
232
|
+
return { color: 'red', text: '异常' }
|
|
233
|
+
} else {
|
|
234
|
+
return { color: 'green', text: '正常' }
|
|
235
|
+
}
|
|
207
236
|
}
|
|
208
237
|
|
|
209
|
-
return
|
|
238
|
+
return { color: 'default', text: value || '未知' }
|
|
210
239
|
},
|
|
211
240
|
|
|
212
241
|
/**
|
|
213
|
-
*
|
|
242
|
+
* 处理按钮点击事件 - 将数据抛出到父组件
|
|
214
243
|
*/
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
try {
|
|
219
|
-
const date = new Date(dateStr)
|
|
220
|
-
if (isNaN(date.getTime())) return dateStr
|
|
221
|
-
|
|
222
|
-
return date.toISOString().substring(0, 10)
|
|
223
|
-
} catch (error) {
|
|
224
|
-
return dateStr
|
|
225
|
-
}
|
|
244
|
+
handleProcess(item) {
|
|
245
|
+
this.$emit('process-item', item)
|
|
226
246
|
},
|
|
227
247
|
|
|
228
248
|
/**
|
|
229
|
-
*
|
|
249
|
+
* 获取设备照片(将 url 数组转换为 {url} 数组)
|
|
230
250
|
*/
|
|
231
|
-
|
|
232
|
-
return
|
|
251
|
+
getImagesPhotos(images) {
|
|
252
|
+
return Array.isArray(images)
|
|
253
|
+
? images.map(url => ({url}))
|
|
254
|
+
: []
|
|
233
255
|
},
|
|
234
256
|
|
|
235
257
|
/**
|
|
236
258
|
* 预览隐患照片
|
|
237
259
|
*/
|
|
238
|
-
handlePreviewHazardPhotos
|
|
260
|
+
handlePreviewHazardPhotos(hazardPhotos, currentIndex = 0) {
|
|
239
261
|
const photos = hazardPhotos.map(photo => photo.url)
|
|
240
262
|
this.$emit('preview-photos', photos, currentIndex)
|
|
241
|
-
},
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* 获取检查值样式类
|
|
245
|
-
*/
|
|
246
|
-
getCheckValueClass (isRisk) {
|
|
247
|
-
return isRisk ? 'check-value-risk' : 'check-value-normal'
|
|
248
|
-
},
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* 获取建议样式类
|
|
252
|
-
*/
|
|
253
|
-
getAdviceClass (status) {
|
|
254
|
-
const classMap = {
|
|
255
|
-
normal: 'advice-normal',
|
|
256
|
-
warning: 'advice-warning',
|
|
257
|
-
error: 'advice-error'
|
|
258
|
-
}
|
|
259
|
-
return classMap[status] || 'advice-normal'
|
|
260
|
-
},
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* 获取建议图标
|
|
264
|
-
*/
|
|
265
|
-
getAdviceIcon (status) {
|
|
266
|
-
const iconMap = {
|
|
267
|
-
normal: 'check-circle',
|
|
268
|
-
warning: 'exclamation-circle',
|
|
269
|
-
error: 'close-circle'
|
|
270
|
-
}
|
|
271
|
-
return iconMap[status] || 'info-circle'
|
|
272
263
|
}
|
|
273
264
|
}
|
|
274
265
|
}
|
|
@@ -304,10 +295,15 @@ export default {
|
|
|
304
295
|
}
|
|
305
296
|
|
|
306
297
|
.device-grid {
|
|
307
|
-
display:
|
|
308
|
-
|
|
298
|
+
display: flex;
|
|
299
|
+
flex-direction: column;
|
|
300
|
+
gap: 16px;
|
|
301
|
+
min-height: 150px;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.device-row {
|
|
305
|
+
display: flex;
|
|
309
306
|
gap: 16px;
|
|
310
|
-
min-height: 200px;
|
|
311
307
|
}
|
|
312
308
|
|
|
313
309
|
.device-item {
|
|
@@ -318,11 +314,16 @@ export default {
|
|
|
318
314
|
overflow: hidden;
|
|
319
315
|
background: white;
|
|
320
316
|
transition: all 0.3s ease;
|
|
317
|
+
width: calc(50% - 8px);
|
|
321
318
|
|
|
322
319
|
&:hover {
|
|
323
320
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
324
321
|
transform: translateY(-2px);
|
|
325
322
|
}
|
|
323
|
+
|
|
324
|
+
&.danger-full-width {
|
|
325
|
+
width: calc(50% - 8px);
|
|
326
|
+
}
|
|
326
327
|
}
|
|
327
328
|
|
|
328
329
|
.device-status-bar {
|
|
@@ -358,7 +359,7 @@ export default {
|
|
|
358
359
|
gap: 4px;
|
|
359
360
|
padding: 2px 8px;
|
|
360
361
|
border-radius: 12px;
|
|
361
|
-
font-size:
|
|
362
|
+
font-size: 12px;
|
|
362
363
|
font-weight: 500;
|
|
363
364
|
border: 1px solid;
|
|
364
365
|
white-space: nowrap; // 禁止换行,防止打印时文字竖排显示
|
|
@@ -431,12 +432,12 @@ export default {
|
|
|
431
432
|
}
|
|
432
433
|
|
|
433
434
|
span {
|
|
434
|
-
font-size:
|
|
435
|
+
font-size: 12px;
|
|
435
436
|
}
|
|
436
437
|
}
|
|
437
438
|
|
|
438
439
|
.device-details {
|
|
439
|
-
font-size:
|
|
440
|
+
font-size: 12px;
|
|
440
441
|
color: #6b7280;
|
|
441
442
|
line-height: 1.4;
|
|
442
443
|
max-height: 120px;
|
|
@@ -492,20 +493,45 @@ export default {
|
|
|
492
493
|
text-align: center;
|
|
493
494
|
}
|
|
494
495
|
|
|
496
|
+
/* 空内容样式 */
|
|
497
|
+
.empty-content {
|
|
498
|
+
display: flex;
|
|
499
|
+
align-items: center;
|
|
500
|
+
justify-content: center;
|
|
501
|
+
padding: 16px;
|
|
502
|
+
color: #9ca3af;
|
|
503
|
+
font-size: 12px;
|
|
504
|
+
}
|
|
505
|
+
|
|
495
506
|
/* 响应式适配 */
|
|
496
507
|
@media (max-width: 1200px) {
|
|
497
508
|
.device-grid {
|
|
498
|
-
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
|
|
499
509
|
gap: 12px;
|
|
500
510
|
}
|
|
511
|
+
|
|
512
|
+
.device-row {
|
|
513
|
+
gap: 12px;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
.device-item {
|
|
517
|
+
width: calc(50% - 6px);
|
|
518
|
+
}
|
|
501
519
|
}
|
|
502
520
|
|
|
503
521
|
@media (max-width: 768px) {
|
|
504
522
|
.device-grid {
|
|
505
|
-
grid-template-columns: 1fr;
|
|
506
523
|
gap: 12px;
|
|
507
524
|
}
|
|
508
525
|
|
|
526
|
+
.device-row {
|
|
527
|
+
flex-direction: column;
|
|
528
|
+
gap: 12px;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
.device-item {
|
|
532
|
+
width: 100%;
|
|
533
|
+
}
|
|
534
|
+
|
|
509
535
|
.device-content {
|
|
510
536
|
padding: 12px;
|
|
511
537
|
}
|
|
@@ -617,7 +643,7 @@ export default {
|
|
|
617
643
|
}
|
|
618
644
|
|
|
619
645
|
.tag-label {
|
|
620
|
-
font-size:
|
|
646
|
+
font-size: 12px;
|
|
621
647
|
color: #6b7280;
|
|
622
648
|
font-weight: 500;
|
|
623
649
|
}
|
|
@@ -635,8 +661,9 @@ export default {
|
|
|
635
661
|
}
|
|
636
662
|
|
|
637
663
|
.check-item {
|
|
638
|
-
display:
|
|
639
|
-
|
|
664
|
+
display: grid;
|
|
665
|
+
grid-template-columns: 1fr 60px;
|
|
666
|
+
gap: 12px;
|
|
640
667
|
align-items: center;
|
|
641
668
|
font-size: 12px;
|
|
642
669
|
padding: 6px 0;
|
|
@@ -648,6 +675,11 @@ export default {
|
|
|
648
675
|
}
|
|
649
676
|
}
|
|
650
677
|
|
|
678
|
+
.check-text {
|
|
679
|
+
display: flex;
|
|
680
|
+
align-items: center;
|
|
681
|
+
}
|
|
682
|
+
|
|
651
683
|
.check-label {
|
|
652
684
|
color: #6b7280;
|
|
653
685
|
flex-shrink: 0;
|
|
@@ -663,6 +695,18 @@ export default {
|
|
|
663
695
|
font-weight: 600;
|
|
664
696
|
}
|
|
665
697
|
|
|
698
|
+
.check-photo {
|
|
699
|
+
width: 60px;
|
|
700
|
+
height: 40px;
|
|
701
|
+
border-radius: 4px;
|
|
702
|
+
overflow: hidden;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
.check-photo-placeholder {
|
|
706
|
+
width: 60px;
|
|
707
|
+
height: 40px;
|
|
708
|
+
}
|
|
709
|
+
|
|
666
710
|
.hazard-photos-section {
|
|
667
711
|
.hazard-photos-grid {
|
|
668
712
|
display: grid;
|
|
@@ -786,6 +830,165 @@ export default {
|
|
|
786
830
|
}
|
|
787
831
|
}
|
|
788
832
|
|
|
833
|
+
/* 标题行样式 */
|
|
834
|
+
.section-header {
|
|
835
|
+
font-size: 12px;
|
|
836
|
+
font-weight: 600;
|
|
837
|
+
color: #6b7280;
|
|
838
|
+
border-bottom: 1px solid #e5e7eb;
|
|
839
|
+
margin-bottom: 8px;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
/* 操作违规样式 */
|
|
843
|
+
.violation-section {
|
|
844
|
+
margin-top: 12px;
|
|
845
|
+
|
|
846
|
+
.section-header {
|
|
847
|
+
.header-item:nth-child(1) {
|
|
848
|
+
flex: 3;
|
|
849
|
+
}
|
|
850
|
+
.header-item:nth-child(2) {
|
|
851
|
+
flex: 1;
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
.violation-row {
|
|
857
|
+
display: flex;
|
|
858
|
+
align-items: center;
|
|
859
|
+
gap: 12px;
|
|
860
|
+
padding: 8px 0;
|
|
861
|
+
border-bottom: 1px solid #f0f0f0;
|
|
862
|
+
|
|
863
|
+
&:last-child {
|
|
864
|
+
border-bottom: none;
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
.violation-key {
|
|
869
|
+
font-size: 12px;
|
|
870
|
+
color: #374151;
|
|
871
|
+
flex: 1;
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
.violation-images {
|
|
875
|
+
display: flex;
|
|
876
|
+
gap: 8px;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
.violation-img {
|
|
880
|
+
width: 50px;
|
|
881
|
+
height: 50px;
|
|
882
|
+
border-radius: 4px;
|
|
883
|
+
object-fit: cover;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
.violation-images-empty {
|
|
887
|
+
width: 50px;
|
|
888
|
+
height: 50px;
|
|
889
|
+
border: 1px dashed #d1d5db;
|
|
890
|
+
border-radius: 4px;
|
|
891
|
+
background: #f9fafb;
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
/* 检测结果不一致样式 */
|
|
895
|
+
.inconsistent-section {
|
|
896
|
+
margin-top: 12px;
|
|
897
|
+
|
|
898
|
+
.section-header {
|
|
899
|
+
display: grid;
|
|
900
|
+
grid-template-columns: 5fr 3fr 3fr 3fr;
|
|
901
|
+
gap: 8px;
|
|
902
|
+
padding: 8px;
|
|
903
|
+
border-bottom: 1px solid #e5e7eb;
|
|
904
|
+
margin-bottom: 8px;
|
|
905
|
+
font-size: 12px;
|
|
906
|
+
font-weight: 600;
|
|
907
|
+
color: #6b7280;
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
.inconsistent-row {
|
|
912
|
+
display: grid;
|
|
913
|
+
grid-template-columns: 5fr 3fr 3fr 3fr;
|
|
914
|
+
gap: 4px;
|
|
915
|
+
padding: 8px;
|
|
916
|
+
border-radius: 8px;
|
|
917
|
+
margin-bottom: 8px;
|
|
918
|
+
font-size: 12px;
|
|
919
|
+
color: #6b7280;
|
|
920
|
+
|
|
921
|
+
&:last-child {
|
|
922
|
+
margin-bottom: 0;
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
.inconsistent-item {
|
|
927
|
+
display: flex;
|
|
928
|
+
align-items: center;
|
|
929
|
+
justify-content: left;
|
|
930
|
+
word-break: break-word;
|
|
931
|
+
text-align: left;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
.inconsistent-action {
|
|
935
|
+
display: flex;
|
|
936
|
+
align-items: center;
|
|
937
|
+
justify-content: center;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
.clickable-tag {
|
|
941
|
+
cursor: pointer;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
/* 新增隐患样式 */
|
|
945
|
+
.danger-section {
|
|
946
|
+
margin-top: 12px;
|
|
947
|
+
|
|
948
|
+
.section-header {
|
|
949
|
+
display: grid;
|
|
950
|
+
grid-template-columns: 3fr 2fr 2fr;
|
|
951
|
+
gap: 8px;
|
|
952
|
+
padding: 8px;
|
|
953
|
+
//border-bottom: 1px solid #e5e7eb;
|
|
954
|
+
//margin-bottom: 8px;
|
|
955
|
+
font-size: 12px;
|
|
956
|
+
font-weight: 600;
|
|
957
|
+
color: #6b7280;
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
.danger-row {
|
|
962
|
+
display: grid;
|
|
963
|
+
grid-template-columns: 3fr 2fr 2fr;
|
|
964
|
+
gap: 8px;
|
|
965
|
+
padding: 8px;
|
|
966
|
+
//background: #fff5f5;
|
|
967
|
+
border-radius: 8px;
|
|
968
|
+
margin-bottom: 8px;
|
|
969
|
+
//border: 1px solid #ffccc7;
|
|
970
|
+
font-size: 12px;
|
|
971
|
+
color: #6b7280;
|
|
972
|
+
|
|
973
|
+
&:last-child {
|
|
974
|
+
margin-bottom: 0;
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
.danger-item {
|
|
979
|
+
display: flex;
|
|
980
|
+
align-items: center;
|
|
981
|
+
justify-content: left;
|
|
982
|
+
word-break: break-word;
|
|
983
|
+
text-align: left;
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
.danger-action {
|
|
987
|
+
display: flex;
|
|
988
|
+
align-items: center;
|
|
989
|
+
justify-content: center;
|
|
990
|
+
}
|
|
991
|
+
|
|
789
992
|
/* 响应式适配优化 */
|
|
790
993
|
@media (max-width: 1024px) {
|
|
791
994
|
.basic-info-tags {
|
|
@@ -798,7 +1001,7 @@ export default {
|
|
|
798
1001
|
}
|
|
799
1002
|
|
|
800
1003
|
.tag-value {
|
|
801
|
-
font-size:
|
|
1004
|
+
font-size: 12px;
|
|
802
1005
|
}
|
|
803
1006
|
|
|
804
1007
|
.device-icon {
|
|
@@ -815,7 +1018,7 @@ export default {
|
|
|
815
1018
|
}
|
|
816
1019
|
|
|
817
1020
|
.device-brand-model {
|
|
818
|
-
font-size:
|
|
1021
|
+
font-size: 12px;
|
|
819
1022
|
}
|
|
820
1023
|
}
|
|
821
1024
|
|
|
@@ -846,11 +1049,11 @@ export default {
|
|
|
846
1049
|
}
|
|
847
1050
|
|
|
848
1051
|
.section-title {
|
|
849
|
-
font-size:
|
|
1052
|
+
font-size: 12px;
|
|
850
1053
|
}
|
|
851
1054
|
|
|
852
1055
|
.check-item {
|
|
853
|
-
font-size:
|
|
1056
|
+
font-size: 12px;
|
|
854
1057
|
}
|
|
855
1058
|
}
|
|
856
1059
|
</style>
|