Переглянути джерело

feat(equipManage): add equipment ledger page

实现了设备台账管理页面,包含查询列表、增删改查、定检记录管理等完整功能
huoyi 1 місяць тому
батько
коміт
529cef0efb

+ 394 - 0
src/views/equipManage/equipLedger/index.vue

@@ -0,0 +1,394 @@
1
+<template>
2
+  <div class="app-container">
3
+    <!-- 查询条件 -->
4
+    <div class="filter-container">
5
+      <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
6
+        <el-form-item label="设备名称" prop="equipName">
7
+          <el-input v-model="queryParams.equipName" placeholder="请输入设备名称" clearable style="width: 200px" />
8
+        </el-form-item>
9
+        <el-form-item label="使用状态" prop="usageStatus">
10
+          <el-select v-model="queryParams.usageStatus" placeholder="请选择使用状态" clearable style="width: 200px">
11
+            <el-option label="使用中" value="1" />
12
+            <el-option label="已停用" value="0" />
13
+          </el-select>
14
+        </el-form-item>
15
+        <el-form-item label="最近定/自检日期" prop="lastCheckDate">
16
+          <el-date-picker v-model="queryParams.lastCheckDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择日期" style="width: 200px" />
17
+        </el-form-item>
18
+        <el-form-item label="检查成员" prop="checkMember">
19
+          <el-input v-model="queryParams.checkMember" placeholder="请输入检查成员" clearable style="width: 200px" />
20
+        </el-form-item>
21
+        <el-form-item>
22
+          <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
23
+          <el-button icon="Refresh" @click="resetQuery">重置</el-button>
24
+        </el-form-item>
25
+      </el-form>
26
+    </div>
27
+
28
+    <!-- 操作按钮 -->
29
+    <div class="operation-container">
30
+      <el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
31
+      <el-button type="danger" plain icon="Delete" :disabled="single" @click="handleBatchDelete">删除</el-button>
32
+      <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
33
+      <el-button type="info" plain icon="Upload" @click="handleImport">导入</el-button>
34
+    </div>
35
+
36
+    <!-- 数据表格 -->
37
+    <el-table v-loading="loading" :data="tableData" border @selection-change="handleSelectionChange">
38
+      <el-table-column type="selection" width="55" align="center" />
39
+      <el-table-column label="序号" prop="rowIndex" width="70" align="center" />
40
+      <el-table-column label="设备编号" prop="equipCode" align="center" min-width="120" />
41
+      <el-table-column label="设备名称" prop="equipName" align="center" min-width="150" show-overflow-tooltip />
42
+      <el-table-column label="设备序列号" prop="serialNumber" align="center" min-width="150" show-overflow-tooltip />
43
+      <el-table-column label="安装位置" prop="installLocation" align="center" min-width="150" show-overflow-tooltip />
44
+      <el-table-column label="使用状态" prop="usageStatus" align="center" min-width="100">
45
+        <template #default="scope">
46
+          <el-tag :type="scope.row.usageStatus === '1' ? 'success' : 'danger'">
47
+            {{ scope.row.usageStatus === '1' ? '使用中' : '已停用' }}
48
+          </el-tag>
49
+        </template>
50
+      </el-table-column>
51
+      <el-table-column label="定/自检小组组长" prop="checkTeamLeader" align="center" min-width="120" show-overflow-tooltip />
52
+      <el-table-column label="定/自检小组组员" prop="checkTeamMembers" align="center" min-width="120" show-overflow-tooltip />
53
+      <el-table-column label="最近定检/自检日期" prop="lastCheckDate" align="center" min-width="120" />
54
+      <el-table-column label="操作" align="center" width="180" fixed="right">
55
+        <template #default="scope">
56
+          <el-button link type="primary" icon="View" @click="handleDetail(scope.row)">详情</el-button>
57
+          <el-button link type="primary" icon="Edit" @click="handleEdit(scope.row)">编辑</el-button>
58
+          <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
59
+        </template>
60
+      </el-table-column>
61
+    </el-table>
62
+
63
+    <!-- 编辑/详情弹窗 -->
64
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="900px" :close-on-click-modal="false">
65
+      <el-form :model="form" ref="formRef" :rules="rules" label-width="140px">
66
+        <el-row :gutter="20">
67
+          <el-col :span="12">
68
+            <el-form-item label="设备名称" prop="equipName">
69
+              <el-input v-model="form.equipName" placeholder="请输入设备名称" :disabled="formDisabled" />
70
+            </el-form-item>
71
+          </el-col>
72
+          <el-col :span="12">
73
+            <el-form-item label="设备种类" prop="equipType">
74
+              <el-input v-model="form.equipType" placeholder="请输入设备种类" :disabled="formDisabled" />
75
+            </el-form-item>
76
+          </el-col>
77
+          <el-col :span="12">
78
+            <el-form-item label="设备类别" prop="equipCategory">
79
+              <el-input v-model="form.equipCategory" placeholder="请输入设备类别" :disabled="formDisabled" />
80
+            </el-form-item>
81
+          </el-col>
82
+          <el-col :span="12">
83
+            <el-form-item label="设备品牌" prop="equipBrand">
84
+              <el-input v-model="form.equipBrand" placeholder="请输入设备品牌" :disabled="formDisabled" />
85
+            </el-form-item>
86
+          </el-col>
87
+          <el-col :span="12">
88
+            <el-form-item label="设备型号" prop="equipModel">
89
+              <el-input v-model="form.equipModel" placeholder="请输入设备型号" :disabled="formDisabled" />
90
+            </el-form-item>
91
+          </el-col>
92
+          <el-col :span="12">
93
+            <el-form-item label="设备序列号" prop="serialNumber">
94
+              <el-input v-model="form.serialNumber" placeholder="请输入设备序列号" :disabled="formDisabled" />
95
+            </el-form-item>
96
+          </el-col>
97
+          <el-col :span="12">
98
+            <el-form-item label="生产厂家" prop="manufacturer">
99
+              <el-input v-model="form.manufacturer" placeholder="请输入生产厂家" :disabled="formDisabled" />
100
+            </el-form-item>
101
+          </el-col>
102
+          <el-col :span="12">
103
+            <el-form-item label="出厂日期" prop="factoryDate">
104
+              <el-date-picker v-model="form.factoryDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择出厂日期" :disabled="formDisabled" />
105
+            </el-form-item>
106
+          </el-col>
107
+          <el-col :span="12">
108
+            <el-form-item label="绩效日期" prop="performanceDate">
109
+              <el-date-picker v-model="form.performanceDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择绩效日期" :disabled="formDisabled" />
110
+            </el-form-item>
111
+          </el-col>
112
+          <el-col :span="12">
113
+            <el-form-item label="启用日期" prop="enableDate">
114
+              <el-date-picker v-model="form.enableDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择启用日期" :disabled="formDisabled" />
115
+            </el-form-item>
116
+          </el-col>
117
+          <el-col :span="12">
118
+            <el-form-item label="使用状态" prop="usageStatus">
119
+              <el-select v-model="form.usageStatus" placeholder="请选择使用状态" :disabled="formDisabled">
120
+                <el-option label="使用中" value="1" />
121
+                <el-option label="已停用" value="0" />
122
+              </el-select>
123
+            </el-form-item>
124
+          </el-col>
125
+          <el-col :span="12">
126
+            <el-form-item label="报废日期" prop="retireDate">
127
+              <el-date-picker v-model="form.retireDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择报废日期" :disabled="formDisabled" />
128
+            </el-form-item>
129
+          </el-col>
130
+          <el-col :span="12">
131
+            <el-form-item label="安装位置" prop="installLocation">
132
+              <el-input v-model="form.installLocation" placeholder="请输入安装位置" :disabled="formDisabled" />
133
+            </el-form-item>
134
+          </el-col>
135
+          <el-col :span="12">
136
+            <el-form-item label="定/自检日期" prop="checkDate">
137
+              <el-date-picker v-model="form.checkDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择定/自检日期" :disabled="formDisabled" />
138
+            </el-form-item>
139
+          </el-col>
140
+          <el-col :span="12">
141
+            <el-form-item label="定/自检周期" prop="checkCycle">
142
+              <el-input-number v-model="form.checkCycle" placeholder="请输入定/自检周期" :min="0" :disabled="formDisabled" />
143
+            </el-form-item>
144
+          </el-col>
145
+          <el-col :span="12">
146
+            <el-form-item label="定/自检到期日期" prop="checkExpireDate">
147
+              <el-date-picker v-model="form.checkExpireDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择定/自检到期日期" :disabled="formDisabled" />
148
+            </el-form-item>
149
+          </el-col>
150
+          <el-col :span="12">
151
+            <el-form-item label="定/自检小组组长" prop="checkTeamLeader">
152
+              <el-input v-model="form.checkTeamLeader" placeholder="请输入定/自检小组组长" :disabled="formDisabled" />
153
+            </el-form-item>
154
+          </el-col>
155
+          <el-col :span="12">
156
+            <el-form-item label="定/自检小组组员" prop="checkTeamMembers">
157
+              <el-input v-model="form.checkTeamMembers" placeholder="请输入定/自检小组组员" :disabled="formDisabled" />
158
+            </el-form-item>
159
+          </el-col>
160
+          <el-col :span="24">
161
+            <el-form-item label="首次验收情况" prop="firstAcceptance">
162
+              <el-input v-model="form.firstAcceptance" type="textarea" :rows="3" placeholder="请输入首次验收情况" :disabled="formDisabled" />
163
+            </el-form-item>
164
+          </el-col>
165
+          <el-col :span="24">
166
+            <el-form-item label="设备图片" prop="equipImages">
167
+              <ImageUpload v-model="form.equipImages" :disabled="formDisabled" />
168
+            </el-form-item>
169
+          </el-col>
170
+        </el-row>
171
+
172
+        <!-- 定检记录表格 -->
173
+        <el-divider content-position="left">定检记录</el-divider>
174
+        <el-button type="primary" plain icon="Plus" @click="addCheckRecord" v-if="!formDisabled">新增定检记录</el-button>
175
+        <el-table :data="form.checkRecords" border style="margin-top: 10px">
176
+          <el-table-column label="定检日期" prop="checkRecordDate">
177
+            <template #default="scope">
178
+              <el-date-picker v-model="scope.row.checkRecordDate" type="date" value-format="YYYY-MM-DD" placeholder="选择日期" :disabled="formDisabled" />
179
+            </template>
180
+          </el-table-column>
181
+          <el-table-column label="定检小组" prop="checkTeam">
182
+            <template #default="scope">
183
+              <el-input v-model="scope.row.checkTeam" placeholder="定检小组" :disabled="formDisabled" />
184
+            </template>
185
+          </el-table-column>
186
+          <el-table-column label="定检结论" prop="checkConclusion">
187
+            <template #default="scope">
188
+              <el-input v-model="scope.row.checkConclusion" placeholder="定检结论" :disabled="formDisabled" />
189
+            </template>
190
+          </el-table-column>
191
+          <el-table-column label="定检性质" prop="checkNature">
192
+            <template #default="scope">
193
+              <el-select v-model="scope.row.checkNature" placeholder="请选择" :disabled="formDisabled">
194
+                <el-option label="重大维修" value="major_repair" />
195
+                <el-option label="移机" value="relocation" />
196
+              </el-select>
197
+            </template>
198
+          </el-table-column>
199
+          <el-table-column label="操作" width="80" v-if="!formDisabled">
200
+            <template #default="scope">
201
+              <el-button type="danger" link icon="Delete" @click="removeCheckRecord(scope.$index)">删除</el-button>
202
+            </template>
203
+          </el-table-column>
204
+        </el-table>
205
+      </el-form>
206
+
207
+      <template #footer>
208
+        <el-button @click="dialog.visible = false">取消</el-button>
209
+        <el-button type="primary" @click="submitForm" v-if="!formDisabled">确定</el-button>
210
+      </template>
211
+    </el-dialog>
212
+
213
+    
214
+  </div>
215
+</template>
216
+
217
+<script setup>
218
+import { ref, reactive } from 'vue'
219
+import { ElMessage } from 'element-plus'
220
+import ImageUpload from '@/components/ImageUpload/index.vue'
221
+
222
+const loading = ref(false)
223
+const queryFormRef = ref()
224
+const formRef = ref()
225
+const tableData = ref([])
226
+const single = ref(true)
227
+const multiple = ref(true)
228
+const queryParams = reactive({
229
+  equipName: '',
230
+  usageStatus: '',
231
+  lastCheckDate: '',
232
+  checkMember: ''
233
+})
234
+const dialog = reactive({
235
+  visible: false,
236
+  title: ''
237
+})
238
+const detailVisible = ref(false)
239
+const formDisabled = ref(false)
240
+const form = reactive({
241
+  equipName: '',
242
+  equipType: '',
243
+  equipCategory: '',
244
+  equipBrand: '',
245
+  equipModel: '',
246
+  serialNumber: '',
247
+  manufacturer: '',
248
+  factoryDate: '',
249
+  performanceDate: '',
250
+  enableDate: '',
251
+  usageStatus: '1',
252
+  retireDate: '',
253
+  installLocation: '',
254
+  checkDate: '',
255
+  checkCycle: 0,
256
+  checkExpireDate: '',
257
+  checkTeamLeader: '',
258
+  checkTeamMembers: '',
259
+  firstAcceptance: '',
260
+  checkRecords: []
261
+})
262
+const rules = {
263
+  equipName: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }],
264
+  serialNumber: [{ required: true, message: '设备序列号不能为空', trigger: 'blur' }]
265
+}
266
+const selectedIds = ref([])
267
+
268
+function handleQuery() {
269
+  loading.value = true
270
+  setTimeout(() => {
271
+    loading.value = false
272
+  }, 300)
273
+}
274
+
275
+function resetQuery() {
276
+  queryFormRef.value?.resetFields()
277
+  handleQuery()
278
+}
279
+
280
+function handleSelectionChange(selection) {
281
+  selectedIds.value = selection.map(item => item.id)
282
+  single.value = selection.length !== 1
283
+  multiple.value = selection.length > 0
284
+}
285
+
286
+function handleAdd() {
287
+  resetForm()
288
+  formDisabled.value = false
289
+  dialog.title = '新增设备'
290
+  dialog.visible = true
291
+}
292
+
293
+function handleEdit(row) {
294
+  Object.assign(form, row)
295
+  formDisabled.value = false
296
+  dialog.title = '编辑设备'
297
+  dialog.visible = true
298
+}
299
+
300
+function handleDetail(row) {
301
+  Object.assign(form, row)
302
+  formDisabled.value = true
303
+  dialog.title = '设备详情'
304
+  dialog.visible = true
305
+}
306
+
307
+function handleDelete(row) {
308
+  ElMessage.success('删除成功')
309
+}
310
+
311
+function handleBatchDelete() {
312
+  ElMessage.success('批量删除成功')
313
+}
314
+
315
+function handleExport() {
316
+  ElMessage.success('导出功能开发中')
317
+}
318
+
319
+function handleImport() {
320
+  ElMessage.info('导入功能开发中')
321
+}
322
+
323
+function resetForm() {
324
+  Object.assign(form, {
325
+    equipName: '',
326
+    equipType: '',
327
+    equipCategory: '',
328
+    equipBrand: '',
329
+    equipModel: '',
330
+    serialNumber: '',
331
+    manufacturer: '',
332
+    factoryDate: '',
333
+    performanceDate: '',
334
+    enableDate: '',
335
+    usageStatus: '1',
336
+    retireDate: '',
337
+    installLocation: '',
338
+    checkDate: '',
339
+    checkCycle: 0,
340
+    checkExpireDate: '',
341
+    checkTeamLeader: '',
342
+    checkTeamMembers: '',
343
+    firstAcceptance: '',
344
+    checkRecords: []
345
+  })
346
+}
347
+
348
+function submitForm() {
349
+  formRef.value?.validate(valid => {
350
+    if (valid) {
351
+      ElMessage.success('保存成功')
352
+      dialog.visible = false
353
+      handleQuery()
354
+    }
355
+  })
356
+}
357
+
358
+function addCheckRecord() {
359
+  form.checkRecords.push({
360
+    checkRecordDate: '',
361
+    checkTeam: '',
362
+    checkConclusion: '',
363
+    checkNature: ''
364
+  })
365
+}
366
+
367
+function removeCheckRecord(index) {
368
+  form.checkRecords.splice(index, 1)
369
+}
370
+
371
+onMounted(() => {
372
+  handleQuery()
373
+})
374
+</script>
375
+
376
+<style scoped>
377
+.app-container {
378
+  padding: 20px;
379
+}
380
+
381
+.filter-container {
382
+  margin-bottom: 20px;
383
+}
384
+
385
+.operation-container {
386
+  margin-bottom: 15px;
387
+}
388
+
389
+.search-form {
390
+  display: flex;
391
+  flex-wrap: wrap;
392
+  gap: 10px;
393
+}
394
+</style>

+ 0 - 0
src/views/equipManage/equipLedger/设备台账