From d2eed0eb7c2f9537d5eaab7ccc3b6ab258959227 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期六, 24 十月 2026 20:48:11 +0800
Subject: [PATCH] feat(device): 设备核查计划附件上传与运行记录导出调整
---
src/views/CNAS/resourceDemand/device/component/record.vue | 385 ++++++++++++++++++++++++++++++-------------------------
1 files changed, 210 insertions(+), 175 deletions(-)
diff --git a/src/views/CNAS/resourceDemand/device/component/record.vue b/src/views/CNAS/resourceDemand/device/component/record.vue
index 9c45784..add40c3 100644
--- a/src/views/CNAS/resourceDemand/device/component/record.vue
+++ b/src/views/CNAS/resourceDemand/device/component/record.vue
@@ -5,51 +5,67 @@
<el-form :model="search" ref="search" size="small" :inline="true">
<el-form-item label="鏍峰搧缂栧彿">
<el-input v-model="search.sampleCode" clearable placeholder="璇疯緭鍏�" size="small"
- @keyup.enter="getTableList(clickNodeVal.value)"></el-input>
+ @keyup.enter="getTableList()"></el-input>
</el-form-item>
- <el-form-item label="绠$悊缂栧彿">
+ <el-form-item label="璁惧缂栧彿">
<el-input v-model="search.managementNumber" clearable placeholder="璇疯緭鍏�" size="small"
- @keyup.enter="getTableList(clickNodeVal.value)"></el-input>
+ @keyup.enter="getTableList()"></el-input>
</el-form-item>
<el-form-item>
- <el-button size="small" type="primary" @click="getTableList(clickNodeVal.value)">鏌ヨ</el-button>
+ <el-button size="small" type="primary" @click="getTableList()">鏌ヨ</el-button>
<el-button size="small" @click="resetSearch">閲嶇疆</el-button>
</el-form-item>
</el-form>
<div>
- <el-button v-if="isMenuList !== 1" size="small" type="primary" @click="dialogVisible = true, openAdd()">鏂� 寤�</el-button>
<el-button :loading="outLoading" size="small" type="primary" @click="openHandleOut">瀵� 鍑�</el-button>
</div>
</div>
<div>
- <el-table ref="Recordtable" :data="formParamList" height="calc(100vh - 20em)"
- v-loading="tableLoading"
- border>
- <!-- 琛ㄦ牸鍒� -->
- <el-table-column label="搴忓彿" type="index" width="70" align="center">
- <template v-slot="scope">
+ <el-table ref="Recordtable" :data="formParamList" height="calc(100vh - 25em)"
+ v-loading="tableLoading" border>
+ <el-table-column label="搴忓彿" type="index" width="60" align="center">
+ <template #default="scope">
<span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
</template>
</el-table-column>
- <el-table-column label="鏍峰搧缂栧彿" min-width="180" prop="sampleCode" />
- <el-table-column label="璁惧鍚嶇О" min-width="150" prop="deviceName" />
- <el-table-column label="绠$悊缂栧彿" min-width="150" prop="managementNumber" />
- <el-table-column label="浣跨敤鍓�" min-width="120" prop="useBefore">
- <template v-slot="scope">
- {{ scope.row.useBefore === 1 ? '鑹ソ' : '寮傚父' }}
+ <el-table-column label="璁惧鍚嶇О" min-width="140" prop="deviceName" show-overflow-tooltip />
+ <el-table-column label="璁惧鍨嬪彿" min-width="120" prop="specificationModel" show-overflow-tooltip />
+ <el-table-column label="璁惧缂栧彿" min-width="130" prop="managementNumber" />
+ <el-table-column label="浣跨敤鏃ユ湡" width="110" align="center">
+ <template #default="scope">
+ {{ formatDateCell(scope.row.useStartDate) }}
</template>
</el-table-column>
- <el-table-column label="浣跨敤鍚�" min-width="120" prop="useAfter">
- <template v-slot="scope">
- {{ scope.row.useAfter === 1 ? '鑹ソ' : '寮傚父' }}
+ <el-table-column label="鏍峰搧缂栧彿" min-width="150" prop="sampleCode">
+ <template #default="scope">
+ <span>{{ scope.row.sampleCode }}</span>
+ <el-tooltip v-if="scope.row.orderCode" :content="'鍏宠仈鍘熷璁板綍锛�' + scope.row.orderCode" placement="top">
+ <lims-icon class="link-icon" name="el-icon-link"></lims-icon>
+ </el-tooltip>
</template>
</el-table-column>
- <!-- <el-table-column label="寮傚父鎯呭喌" min-width="120" prop="abnormal" />-->
- <el-table-column label="浣跨敤寮�濮嬫棩鏈�" min-width="170" prop="useStartDate" :formatter="formatDateCell" />
- <el-table-column label="浣跨敤缁撴潫鏃ユ湡" min-width="170" prop="useEndDate" :formatter="formatDateCell" />
- <el-table-column label="浣跨敤浜�" min-width="120" prop="usePerson" />
- <el-table-column label="澶囨敞" min-width="120" prop="remark" />
- <!-- 鎿嶄綔鎸夐挳 -->
+ <el-table-column label="鏃堕棿锛�24灏忔椂鍒讹級" align="center">
+ <el-table-column label="寮�濮�" width="90" align="center">
+ <template #default="scope">{{ formatTimeCell(scope.row.useStartDate) }}</template>
+ </el-table-column>
+ <el-table-column label="缁撴潫" width="90" align="center">
+ <template #default="scope">{{ formatTimeCell(scope.row.useEndDate) }}</template>
+ </el-table-column>
+ </el-table-column>
+ <el-table-column label="璁惧鐘跺喌" align="center">
+ <el-table-column label="浣跨敤鍓�" width="80" align="center">
+ <template #default="scope">{{ formatStatus(scope.row.useBefore) }}</template>
+ </el-table-column>
+ <el-table-column label="浣跨敤鍚�" width="80" align="center">
+ <template #default="scope">{{ formatStatus(scope.row.useAfter) }}</template>
+ </el-table-column>
+ </el-table-column>
+ <el-table-column label="鐜鏉′欢" align="center">
+ <el-table-column label="鈩�" width="80" align="center" prop="temperature" />
+ <el-table-column label="%RH" width="80" align="center" prop="humidity" />
+ </el-table-column>
+ <el-table-column label="浣跨敤浜�" width="100" prop="usePerson" />
+ <el-table-column label="澶囨敞" min-width="140" prop="remark" show-overflow-tooltip />
<el-table-column fixed="right" label="鎿嶄綔" width="150" align="center">
<template #default="scope">
<el-button size="small" link type="primary" @click="showDetailsDialog('edit', scope.row)">缂栬緫</el-button>
@@ -63,30 +79,57 @@
@current-change="handleCurrentChange" background>
</el-pagination>
</div>
- <el-dialog v-model="dialogVisible" title="浠櫒璁惧浣跨敤璁板綍琛�" top="5vh" width="55%">
- <el-form ref="form" :model="form" label-width="130px">
- <el-row>
- <el-col :span="24">
- <el-form-item :rules="[{ required: true, message: '鏍峰搧缂栧彿', trigger: 'blur' }]" label="鏍峰搧缂栧彿:"
+ <el-dialog v-model="dialogVisible" title="浠櫒璁惧杩愯璁板綍" top="5vh" width="70%">
+ <el-form ref="form" :model="form" label-width="105px">
+ <el-row :gutter="16">
+ <el-col :span="8">
+ <el-form-item label="璁惧鍚嶇О:">
+ <el-input v-model="form.deviceName" disabled size="small"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="璁惧鍨嬪彿:">
+ <el-input v-model="form.specificationModel" disabled size="small"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="璁惧缂栧彿:">
+ <el-input v-model="form.managementNumber" disabled size="small"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item :rules="[{ required: true, message: '璇烽�夋嫨浣跨敤鏃ユ湡', trigger: 'change' }]" label="浣跨敤鏃ユ湡:"
+ prop="useDate">
+ <el-date-picker v-model="form.useDate" :disabled="operationType === 'view'" format="YYYY-MM-DD"
+ placeholder="閫夋嫨浣跨敤鏃ユ湡" size="small" style="width: 100%" type="date" value-format="YYYY-MM-DD"
+ :disabled-date="disabledDate">
+ </el-date-picker>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ユ牱鍝佺紪鍙�', trigger: 'blur' }]" label="鏍峰搧缂栧彿:"
prop="sampleCode">
- <el-input v-model="form.sampleCode" :disabled="operationType === 'view'" size="small"
- style="width: 100%;"></el-input>
+ <el-input v-model="form.sampleCode" :disabled="operationType === 'view'" size="small"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="璁惧鍚嶇О:" required>
- <el-input v-model="form.deviceName" :disabled="operationType === 'view'" size="small"
- style="width: 100%;"></el-input>
+ <el-form-item :rules="[{ required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change' }]" label="寮�濮嬫椂闂�:"
+ prop="useStartTime">
+ <el-time-picker v-model="form.useStartTime" :disabled="operationType === 'view'" format="HH:mm"
+ placeholder="閫夋嫨寮�濮嬫椂闂�" size="small" style="width: 100%" value-format="HH:mm:ss">
+ </el-time-picker>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="绠$悊缂栧彿:" required>
- <el-input v-model="form.managementNumber" :disabled="operationType === 'view'" size="small"
- style="width: 100%;"></el-input>
+ <el-form-item :rules="[{ required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change' }]" label="缁撴潫鏃堕棿:"
+ prop="useEndTime">
+ <el-time-picker v-model="form.useEndTime" :disabled="operationType === 'view'" format="HH:mm"
+ placeholder="閫夋嫨缁撴潫鏃堕棿" size="small" style="width: 100%" value-format="HH:mm:ss">
+ </el-time-picker>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item :rules="[{ required: true, message: '璇烽�夋嫨浣跨敤鍓�', trigger: 'change' }]" label="浣跨敤鍓�:"
+ <el-form-item :rules="[{ required: true, message: '璇烽�夋嫨浣跨敤鍓嶇姸鎬�', trigger: 'change' }]" label="浣跨敤鍓�:"
prop="useBefore">
<el-radio-group v-model="form.useBefore" :disabled="operationType === 'view'">
<el-radio :value="1">鑹ソ</el-radio>
@@ -95,7 +138,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item :rules="[{ required: true, message: '璇烽�夋嫨浣跨敤鍚�', trigger: 'change' }]" label="浣跨敤鍚�:"
+ <el-form-item :rules="[{ required: true, message: '璇烽�夋嫨浣跨敤鍚庣姸鎬�', trigger: 'change' }]" label="浣跨敤鍚�:"
prop="useAfter">
<el-radio-group v-model="form.useAfter" :disabled="operationType === 'view'">
<el-radio :value="1">鑹ソ</el-radio>
@@ -104,22 +147,31 @@
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ヤ娇鐢ㄦ棩鏈�', trigger: 'blur' }]" label="浣跨敤鏃ユ湡:"
- prop="useDateList">
- <el-date-picker v-model="form.useDateList" :disabled="operationType === 'view'" end-placeholder="缁撴潫鏃ユ湡"
- format="YYYY-MM-DD HH:mm:ss" size="small" start-placeholder="寮�濮嬫棩鏈�" style="width:100%"
- type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss"
- :disabled-date="disabledDate">
- </el-date-picker>
+ <el-form-item label="鐜娓╁害:">
+ <el-input v-model="form.temperature" :disabled="operationType === 'view'" placeholder="璇疯緭鍏ユ俯搴�" size="small">
+ <template #append>鈩�</template>
+ </el-input>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ヤ娇鐢ㄤ汉', trigger: 'change' }]" label="浣跨敤浜�:"
+ <el-form-item label="鐜婀垮害:">
+ <el-input v-model="form.humidity" :disabled="operationType === 'view'" placeholder="璇疯緭鍏ユ箍搴�" size="small">
+ <template #append>%RH</template>
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item :rules="[{ required: true, message: '璇烽�夋嫨浣跨敤浜�', trigger: 'change' }]" label="浣跨敤浜�:"
prop="usePersonId">
<el-select @change="usePersonName" v-model="form.usePersonId" :disabled="operationType === 'view'"
placeholder="璇烽�夋嫨" size="small" style="width: 100%">
<el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12" v-if="form.orderCode">
+ <el-form-item label="鍏宠仈鍘熷璁板綍:">
+ <el-input v-model="form.orderCode" disabled size="small"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
@@ -129,7 +181,7 @@
</el-col>
</el-row>
</el-form>
- <template #footer><span class="dialog-footer">
+ <template #footer><span class="dialog-footer">
<el-button @click="dialogVisible = false">鍙� 娑�</el-button>
<el-button v-if="operationType !== 'view'" type="primary" @click="saveRecord">纭� 瀹�</el-button>
</span></template>
@@ -140,7 +192,7 @@
type="month" value-format="YYYY-MM">
</el-date-picker>
</span>
- <template #footer><span class="dialog-footer">
+ <template #footer><span class="dialog-footer">
<el-button @click="ratifyDialog = false, exportDate = ''">鍙� 娑�</el-button>
<el-button :loading="outLoading" type="primary" @click="handleDown">瀵� 鍑�</el-button>
</span></template>
@@ -151,28 +203,41 @@
import {
deviceRecordPage,
exportUseRecord,
- selectDeviceByCode,
- saveDeviceRecord,
updateDeviceRecord,
deleteDeviceRecord,
} from '@/api/cnas/resourceDemand/device.js'
import { selectUserCondition } from "@/api/business/inspectionTask";
-import { formatListDate } from './dateFormat';
+import { formatDateOnly as toDateOnly } from './dateFormat';
import { saveBlobOrShowError } from '@/utils/saveBlob'
+import dayjs from 'dayjs'
+
+const today = () => {
+ const now = new Date()
+ return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`
+}
+
+const defaultForm = () => ({
+ id: null,
+ deviceId: '',
+ deviceName: '',
+ specificationModel: '',
+ managementNumber: '',
+ insOrderId: null,
+ orderCode: '',
+ sampleCode: '',
+ useDate: today(),
+ useStartTime: '',
+ useEndTime: '',
+ temperature: '',
+ humidity: '',
+ useBefore: 1,
+ useAfter: 1,
+ abnormal: '',
+ usePersonId: '',
+ usePerson: '',
+ remark: '',
+})
export default {
- props: {
- clickNodeVal: {
- type: Object,
- default: () => {
- return {};
- }
- },
- // 鍒ゆ柇鏄惁鏄閮ㄥ垎绂�
- isMenuList: {
- type: Number,
- default: 0
- }
- },
data() {
return {
search: {
@@ -182,37 +247,11 @@
sampleCode: '',
managementNumber: ''
},
- responsiblePersonList: {},
- isShow: false,
outLoading: false,
ratifyDialog: false,
exportDate: '',
userList: [],
- form: {
- // deviceId:'',
- processNumber: '',
- deviceName: '',
- managementNumber: '',
- //娓╁害
- temperature: '',
- //婀垮害
- humidity: '',
- //浣跨敤鍓�
- useBefore: 1,
- //浣跨敤鍚�
- useAfter: 1,
- //寮傚父鎯呭喌
- abnormal: '',
- useDateList: [],
- //浣跨敤鏃ユ湡
- useStartDate: null,
- useEndDate: null,
- //浣跨敤浜�
- usePerson: '',
- usePersonId: '',
- //澶囨敞
- remark: '',
- },
+ form: defaultForm(),
dialogVisible: false,
operationType: '',
formParamList: [],
@@ -220,11 +259,21 @@
}
},
mounted() {
- this.getTableList(this.clickNodeVal.value);
+ this.getTableList();
},
methods: {
- formatDateCell(row, column, cellValue) {
- return formatListDate(cellValue)
+ formatDateCell(value) {
+ return toDateOnly(value)
+ },
+ formatTimeCell(value) {
+ if (!value) return ''
+ const date = dayjs(String(value).replace('T', ' '))
+ return date.isValid() ? date.format('HH:mm') : ''
+ },
+ formatStatus(value) {
+ if (value === 1) return '鑹ソ'
+ if (value === 0) return '寮傚父'
+ return ''
},
// element-plus 鐨� el-date-picker 娌℃湁 picker-options锛屾敼鎴� :disabled-date
disabledDate(time) {
@@ -232,11 +281,11 @@
},
handleSizeChange(val) {
this.search.size = val
- this.getTableList(this.clickNodeVal.value);
+ this.getTableList();
},
handleCurrentChange(val) {
this.search.current = val
- this.getTableList(this.clickNodeVal.value);
+ this.getTableList();
},
resetSearch() {
this.search = {
@@ -246,15 +295,11 @@
sampleCode: '',
managementNumber: ''
}
- this.getTableList(this.clickNodeVal.value);
+ this.getTableList();
},
- async getTableList(deviceId) {
- if (deviceId === undefined) {
- deviceId = ''
- }
+ async getTableList() {
this.tableLoading = true
await deviceRecordPage({
- deviceId: deviceId,
...this.search
}).then(res => {
this.tableLoading = false
@@ -274,28 +319,18 @@
handleDown() {
this.outLoading = true
exportUseRecord({
- deviceId: this.clickNodeVal.value,
sampleCode: this.search.sampleCode,
managementNumber: this.search.managementNumber,
exportDate: this.exportDate
}).then(res => {
this.outLoading = false
- saveBlobOrShowError(res, '璁惧浣跨敤璁板綍.doc', 'application/msword')
+ saveBlobOrShowError(res, '浠櫒璁惧杩愯璁板綍.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')
}).catch(() => {
this.outLoading = false
})
},
- //鏂板缓
- openAdd() {
- this.operationType = 'add'
- this.getUserList()
- selectDeviceByCode({ id: this.clickNodeVal.value }).then(res => {
- this.form.deviceName = res.data.deviceName
- this.form.managementNumber = res.data.managementNumber
- this.$nextTick(() => {
- this.$refs['form'].clearValidate()
- })
- });
+ resetForm() {
+ this.form = defaultForm()
},
usePersonName(value) {
const index = this.userList.findIndex(item => item.id === value)
@@ -303,31 +338,39 @@
this.form.usePerson = this.userList[index].name
}
},
- //纭娣诲姞璁板綍
+ //淇濆瓨淇敼
saveRecord() {
this.$refs.form.validate((valid) => {
- if (valid) {
- this.form.useStartDate = this.form.useDateList[0]
- this.form.useEndDate = this.form.useDateList[1]
- this.form.deviceId = this.clickNodeVal.value
- if (this.operationType === 'add') {
- saveDeviceRecord(this.form).then(res => {
- if (res.code == 200) {
- this.$message.success('鏂板鎴愬姛')
- this.getTableList(this.clickNodeVal.value)
- this.dialogVisible = false
- }
- })
- } else {
- updateDeviceRecord(this.form).then(res => {
- if (res.code == 200) {
- this.$message.success('淇敼鎴愬姛')
- this.getTableList(this.clickNodeVal.value)
- this.dialogVisible = false
- }
- })
- }
+ if (!valid) {
+ return
}
+ if (this.form.useStartTime >= this.form.useEndTime) {
+ this.$message.error('缁撴潫鏃堕棿蹇呴』鏅氫簬寮�濮嬫椂闂�')
+ return
+ }
+ const payload = {
+ id: this.form.id || undefined,
+ deviceId: this.form.deviceId,
+ insOrderId: this.form.insOrderId || undefined,
+ sampleCode: this.form.sampleCode,
+ temperature: this.form.temperature,
+ humidity: this.form.humidity,
+ useBefore: this.form.useBefore,
+ useAfter: this.form.useAfter,
+ abnormal: this.form.abnormal,
+ usePersonId: this.form.usePersonId,
+ usePerson: this.form.usePerson,
+ remark: this.form.remark,
+ useStartDate: `${this.form.useDate} ${this.form.useStartTime}`,
+ useEndDate: `${this.form.useDate} ${this.form.useEndTime}`,
+ }
+ updateDeviceRecord(payload).then(res => {
+ if (res.code == 200) {
+ this.$message.success('淇敼鎴愬姛')
+ this.getTableList()
+ this.dialogVisible = false
+ }
+ })
});
},
//鏌ョ湅璇︽儏
@@ -336,13 +379,23 @@
this.dialogVisible = true;
this.getUserList()
// 澶嶅埗涓�浠藉啀缂栬緫锛岄伩鍏嶇洿鎺ユ敼鍔ㄨ〃鏍奸噷鐨勬暟鎹�
- const useStartDate = row.useStartDate || ''
- const useEndDate = row.useEndDate || ''
+ const start = row.useStartDate ? String(row.useStartDate).replace('T', ' ') : ''
+ const end = row.useEndDate ? String(row.useEndDate).replace('T', ' ') : ''
this.form = {
+ ...defaultForm(),
...row,
- useStartDate,
- useEndDate,
- useDateList: useStartDate && useEndDate ? [useStartDate, useEndDate] : []
+ deviceId: row.deviceId,
+ deviceName: row.deviceName || '',
+ specificationModel: row.specificationModel || '',
+ managementNumber: row.managementNumber || '',
+ orderCode: row.orderCode || '',
+ useDate: start ? start.slice(0, 10) : '',
+ useStartTime: start.length >= 19 ? start.slice(11, 19) : '',
+ useEndTime: end.length >= 19 ? end.slice(11, 19) : '',
+ temperature: row.temperature || '',
+ humidity: row.humidity || '',
+ usePersonId: row.usePersonId || '',
+ usePerson: row.usePerson || '',
}
},
handleDeleteClick(index, row) {
@@ -372,37 +425,12 @@
},
},
watch: {
- // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
- clickNodeVal(newVal) {
- if (newVal.value) {
- this.getTableList(newVal.value);
- }
- },
dialogVisible(newVal) {
if (newVal === false) {
- this.form = {
- // deviceId:'',
- sampleCode: '',
- deviceName: '',
- managementNumber: '',
- //娓╁害
- temperature: '',
- //婀垮害
- humidity: '',
- //浣跨敤鍓�
- useBefore: 1,
- //浣跨敤鍚�
- useAfter: 1,
- //寮傚父鎯呭喌
- abnormal: '',
- //浣跨敤鏃ユ湡
- useDateList: [],
- //浣跨敤浜�
- usePersonId: '',
- //澶囨敞
- remark: '',
- }
- this.$refs.form.clearValidate()
+ this.resetForm()
+ this.$nextTick(() => {
+ this.$refs.form && this.$refs.form.clearValidate()
+ })
}
}
}
@@ -414,6 +442,13 @@
height: 46px;
display: flex;
justify-content: space-between;
- margin-top: 10px;
+ margin-top: 4px;
+}
+
+.link-icon {
+ margin-left: 4px;
+ color: #409eff;
+ font-size: 14px;
+ vertical-align: middle;
}
</style>
--
Gitblit v1.9.3