| | |
| | | <div class="btnS"> |
| | | <el-button size="small" type="primary" @click="calibrationMaintenance()">校准项目维护</el-button> |
| | | <el-button size="small" type="primary" @click="add('add')">添加校准记录</el-button> |
| | | <!-- <el-button size="small" type="primary" @click="handleDown">导出Excel</el-button> --> |
| | | <el-button size="small" type="primary" @click="handleDown">导出Excel</el-button> |
| | | </div> |
| | | <div class="tables" style="margin-top: 10px;"> |
| | | <div class="tables" style="margin-top: 16px;"> |
| | | <el-table :data="tableData" height="calc(100vh - 20em)"> |
| | | <el-table-column label="序号" type="index" width="120"> |
| | | <template v-slot="scope"> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="记录编号" min-width="150" prop="processNumber"></el-table-column> |
| | | <el-table-column label="校准机构" min-width="150" prop="unitOfMeasure" show-overflow-tooltip></el-table-column> |
| | | <el-table-column label="校准机构" min-width="150" prop="unitOfMeasure" |
| | | show-overflow-tooltip></el-table-column> |
| | | <el-table-column label="校准结论" min-width="150" prop="status"> |
| | | <template v-slot="scope"> |
| | | {{ scope.row.status === '0yes' ? '合格' : scope.row.status === '1no' ? '不合格' : '其他' }} |
| | |
| | | <el-table-column label="确认日期" min-width="150" prop="confirmDate"></el-table-column> |
| | | <el-table-column label="登记人" min-width="150" prop="createUser"></el-table-column> |
| | | <el-table-column label="登记日期" min-width="150" prop="createTime"></el-table-column> |
| | | <el-table-column fixed="right" label="操作" min-width="180" align="center"> |
| | | <el-table-column fixed="right" label="操作" min-width="150"> |
| | | <template #default="{ row }"> |
| | | <el-button size="small" type="text" @click="handleAttachmentClick(row)">下载附件</el-button> |
| | | <el-button size="small" type="text" @click="handleViewClick('view', row)">查看</el-button> |
| | | <el-button size="small" type="text" @click="handleAttachmentClick(row)">附件</el-button> |
| | | <!-- <el-button size="small" type="text" @click="handleViewClick('view', row)">查看</el-button> --> |
| | | <el-button size="small" type="text" @click="handleViewClick('add', row)">编辑</el-button> |
| | | <el-button size="small" type="text" @click="handleDeleteClick(row)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]" |
| | | :total="search.total" layout="->,total, sizes, prev, pager, next, jumper" style="margin-right: 5%;" |
| | | @size-change="handleSizeChange" @current-change="handleCurrentChange"> |
| | | :total="search.total" layout="->,total, sizes, prev, pager, next, jumper" style="margin-right: 5%;" |
| | | @size-change="handleSizeChange" @current-change="handleCurrentChange"> |
| | | </el-pagination> |
| | | </div> |
| | | <!-- 文件预览 --> |
| | | <el-dialog |
| | | :visible.sync="lookDialogVisible" |
| | | fullscreen |
| | | title="查看附件" width="800px"> |
| | | <filePreview v-if="lookDialogVisible" :currentFile="{}" |
| | | :fileUrl="previewFile" style="height: 90vh;overflow-y: auto;top: 0"/> |
| | | </el-dialog> |
| | | <!-- 附件弹框 --> |
| | | <el-dialog |
| | | title="附件" |
| | | :visible.sync="dialogVisibleFile" |
| | | width="60%" |
| | | > |
| | | <el-upload |
| | | ref="upload" |
| | | style="margin-top: 5px;margin-bottom: 10px;" |
| | | :action="action" |
| | | :data="uploadData" |
| | | :headers="uploadHeader" |
| | | :before-upload="beforeUpload" |
| | | :on-success="onSuccess" |
| | | > |
| | | <el-button type="primary" size="small" :loading="upLoading">上传附件</el-button> |
| | | </el-upload> |
| | | <el-table |
| | | :data="fileData" |
| | | border |
| | | height="400px" |
| | | style="width: 100%"> |
| | | <el-table-column label="序号" type="index" width="240px"> |
| | | </el-table-column> |
| | | <el-table-column label="文件名称" prop="fileName"> |
| | | </el-table-column> |
| | | <el-table-column label="操作"> |
| | | <template slot-scope="scope"> |
| | | <el-button type="text" @click="preview(scope.row)">预览</el-button> |
| | | <el-button type="text" @click="download(scope.row)">下载</el-button> |
| | | <el-button type="text" @click="delFile(scope.row)" style="color: red;">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="dialogVisibleFile = false">关 闭</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | |
| | | |
| | | |
| | | <!-- 校准项目维护 --> |
| | | <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="dialogVisible0" |
| | | title="校准项目维护" top="5vh" width="70%"> |
| | | <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="dialogVisible0" title="校准项目维护" |
| | | top="5vh" width="70%"> |
| | | <h4> |
| | | <span style="display: flex;align-items: center;"><span class="line"></span><span>设备校准参数维护</span></span> |
| | | <el-button :loading="addCalibrateLoading" size="small" type="primary" @click="addCalibrate">添 加</el-button> |
| | | </h4> |
| | | <div> |
| | | <el-form ref="form0" :model="form0" :rules="form0Rules" label-position="right" label-width="120px"> |
| | | <el-form ref="form0" :model="form0" :rules="form0Rules" |
| | | label-position="right" label-width="120px"> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="计量参数:" prop="measurementParameter"> |
| | |
| | | <span style="display: flex;align-items: center;"><span class="line"></span><span>设备校准参数</span></span> |
| | | </h4> |
| | | <!-- 设备校准参数表格 --> |
| | | <el-table ref="calibrateTable" v-loading="calibrateParamsLoading" :data="calibrateParams" max-height="450" stripe |
| | | style="width: 100%"> |
| | | <el-table ref="calibrateTable" v-loading="calibrateParamsLoading" :data="calibrateParams" |
| | | max-height="450" |
| | | stripe style="width: 100%"> |
| | | <el-table-column label="编号" type="index" width="80"></el-table-column> |
| | | <el-table-column label="计量参数" prop="measurementParameter"></el-table-column> |
| | | <el-table-column label="量程范围" prop="rangeOfMeasurement"></el-table-column> |
| | |
| | | </el-dialog> |
| | | |
| | | <!-- 添加校准记录 --> |
| | | <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="dialogVisible1" |
| | | title="添加校准记录" top="5vh" width="80%" @close="resetCalibrationRecord"> |
| | | <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="dialogVisible1" title="校准记录" |
| | | top="5vh" |
| | | width="80%" @close="resetCalibrationRecord"> |
| | | <div style="height: 70vh;overflow-y: auto;overflow-x: hidden;"> |
| | | <h4> |
| | | <div style="display: flex;align-items: center;"> |
| | |
| | | <span>添加设备校准记录</span> |
| | | </div> |
| | | </h4> |
| | | <el-form ref="calibrationRecord" :model="calibrationRecord" :rules="formRules" label-position="right" |
| | | label-width="120px"> |
| | | <el-form ref="calibrationRecord" :model="calibrationRecord" |
| | | :rules="formRules" label-position="right" label-width="120px"> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="校准服务机构:" prop="unitOfMeasure"> |
| | | <el-input v-model="calibrationRecord.unitOfMeasure" :disabled="operationType === 'view'" |
| | | size="small"></el-input> |
| | | size="small"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="校准日期:" prop="calibrationDate"> |
| | | <el-date-picker v-model="calibrationRecord.calibrationDate" :disabled="operationType === 'view'" |
| | | format="yyyy-MM-dd" placeholder="选择日期" size="small" style="width: 90%" type="date" |
| | | value-format="yyyy-MM-dd" @change="getNextCalibrationDate"> |
| | | format="yyyy-MM-dd" |
| | | placeholder="选择日期" |
| | | size="small" |
| | | style="width: 90%" type="date" |
| | | value-format="yyyy-MM-dd" @change="getNextCalibrationDate"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-form-item label="下次校准日期:" label-width="140px"> |
| | | <el-date-picker v-model="calibrationRecord.nextCalibrationDate" disabled format="yyyy-MM-dd" |
| | | placeholder="选择日期" size="small" style="width: 90%" type="date" value-format="yyyy-MM-dd"> |
| | | <el-date-picker v-model="calibrationRecord.nextCalibrationDate" disabled |
| | | format="yyyy-MM-dd" placeholder="选择日期" size="small" style="width: 90%" |
| | | type="date" value-format="yyyy-MM-dd"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="计算器具:" prop="calculatingApparatus"> |
| | | <el-input v-model="calibrationRecord.calculatingApparatus" :disabled="operationType === 'view'" |
| | | size="small"></el-input> |
| | | size="small"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="计算标准量程:" prop="standardRange"> |
| | | <el-input v-model="calibrationRecord.standardRange" :disabled="operationType === 'view'" size="small" |
| | | style="width: 90%"></el-input> |
| | | style="width: 90%"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-form-item label="计量标准不确定度:" label-width="140px" prop="calibrationStandardUncertainty"> |
| | | <el-input v-model="calibrationRecord.calibrationStandardUncertainty" |
| | | :disabled="operationType === 'view'" size="small" style="width: 90%"></el-input> |
| | | <el-input v-model="calibrationRecord.calibrationStandardUncertainty" :disabled="operationType === 'view'" size="small" |
| | | style="width: 90%"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="所依据文件:" prop="byDocument"> |
| | | <el-input v-model="calibrationRecord.byDocument" :disabled="operationType === 'view'" |
| | | size="small"></el-input> |
| | | size="small"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="证书编号:" prop="certificateSerialNumber"> |
| | | <el-input v-model="calibrationRecord.certificateSerialNumber" :disabled="operationType === 'view'" |
| | | size="small" style="width: 90%"></el-input> |
| | | <el-input v-model="calibrationRecord.certificateSerialNumber" :disabled="operationType === 'view'" size="small" |
| | | style="width: 90%"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | |
| | | <el-col :span="6"> |
| | | <el-form-item label="确认日期:"> |
| | | <el-date-picker v-model="calibrationRecord.confirmDate" :disabled="operationType === 'view'" |
| | | format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期" size="small" style="width: 100%" type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss"> |
| | | format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期" size="small" style="width: 100%" |
| | | type="datetime" value-format="yyyy-MM-dd HH:mm:ss"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="17"> |
| | | <el-form-item label="附件:" prop="fileName"> |
| | | <el-input v-model="calibrationRecord.fileName" |
| | | :style="`width: ${operationType === 'add' ? '85%' : '100%'};}`" disabled size="small"> |
| | | <el-button v-if="operationType === 'add'" slot="append" icon="el-icon-delete-solid" |
| | | @click="deleteFile"></el-button> |
| | | </el-input> |
| | | <el-upload v-if="operationType === 'add'" ref="upload" :action="action" :before-upload="beforeUpload" |
| | | :headers="uploadHeader" :limit="1" :on-error="onError" :on-success="handleSuccessUp" |
| | | :show-file-list="false" style="float: right;"> |
| | | <el-button :loading="upLoading" size="small" style="position: relative; top: -4px;" |
| | | type="primary">附件上传 |
| | | </el-button> |
| | | </el-upload> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="备注:"> |
| | | <el-input v-model="calibrationRecord.remark" :disabled="operationType === 'view'" :rows="3" size="small" |
| | | style="width: 96%" type="textarea"></el-input> |
| | | <el-input v-model="calibrationRecord.remark" :disabled="operationType === 'view'" :rows="3" size="small" style="width: 96%" |
| | | type="textarea"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <el-table-column label="单项结果说明" prop="singleResultStatement"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.singleResultStatement" :disabled="operationType === 'view'" |
| | | size="small"></el-input> |
| | | size="small"></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button v-if="operationType === 'add'" @click="dialogVisible1 = false">取 消</el-button> |
| | | <el-button v-if="operationType === 'add'" :loading="addRecordLoading" type="primary" @click="addRecord">确 |
| | | 定</el-button> |
| | | <el-button v-if="operationType === 'add'" :loading="addRecordLoading" type="primary" |
| | | @click="addRecord">确 定</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | |
| | | selectDeviceMetric, |
| | | deleteDeviceMetrics, |
| | | addOrUpdateDeviceMetricRecord, |
| | | saveOrUpdateDeviceMetric |
| | | saveOrUpdateDeviceMetric, downLoadDeviceCalibrationFile, getDeviceCalibrationFile, delDeviceCalibrationFile |
| | | } from '@/api/cnas/resourceDemand/device.js' |
| | | import { mapGetters } from "vuex"; |
| | | import filePreview from "@/components/Preview/filePreview.vue"; |
| | | export default { |
| | | components: {filePreview}, |
| | | props: { |
| | | clickNodeVal: { |
| | | type: Object, |
| | |
| | | calibrateParams: [], |
| | | calibrateParamsLoading: false, |
| | | addCalibrateLoading: false, |
| | | previewFile: '', |
| | | lookDialogVisible: false, |
| | | recordId: null, |
| | | uploadData: {}, |
| | | fileData: [], |
| | | dialogVisibleFile: false, |
| | | calibrationRecord: { |
| | | unitOfMeasure: '', // 计量单位 |
| | | calibrationDate: null, // 校准日期 |
| | |
| | | computed: { |
| | | ...mapGetters(["nickName"]), |
| | | action() { |
| | | return this.javaApi + '/personBasicInfo/saveCNASFile' |
| | | return this.javaApi + '/personBasicInfo/saveDeviceCalibrationFile' |
| | | } |
| | | }, |
| | | mounted() { |
| | |
| | | this.getTableList(this.clickNodeVal.value) // 获取设备校准列表数据 |
| | | }, |
| | | methods: { |
| | | preview(row) { |
| | | let list = row.fileUrl.split('.') |
| | | let suffix = list[list.length - 1] |
| | | if(suffix.toLowerCase().includes("pdf")) { |
| | | let link = document.createElement('a') |
| | | let url = this.javaApi + 'word' + row.fileUrl |
| | | console.log(url); |
| | | link.href = url |
| | | link.target= '_blank' |
| | | document.body.appendChild(link) |
| | | link.click() |
| | | document.body.removeChild(link) |
| | | }else{ |
| | | let url = '' |
| | | if(suffix.toLowerCase().includes('docx')) { |
| | | url = this.javaApi + 'word' + row.fileUrl |
| | | }else if(suffix.toLowerCase().includes('xls')) { |
| | | url = this.javaApi + 'excel' + row.fileUrl |
| | | }else{ |
| | | url = this.javaApi + 'img' + row.fileUrl |
| | | } |
| | | this.previewFile = url |
| | | this.$nextTick(() => { |
| | | this.lookDialogVisible = true |
| | | }) |
| | | } |
| | | }, |
| | | download(row) { |
| | | downLoadDeviceCalibrationFile({id: row.id}).then(res => { |
| | | const blob = new Blob([res],{type: row.mime}) |
| | | this.$download.saveAs(blob, row.fileName) |
| | | }) |
| | | }, |
| | | delFile(row) { |
| | | this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | delDeviceCalibrationFile({id: row.id}).then(res => { |
| | | this.$message({ |
| | | type: 'success', |
| | | message: '删除成功!' |
| | | }); |
| | | this.getFileData(this.recordId); |
| | | }) |
| | | }) |
| | | }, |
| | | handleAttachmentClick(row) { |
| | | // 模拟下载附件 |
| | | // const imageUrl = this.javaApi + '/img/' + row.systemFileName; // 图片 URL |
| | | // file.downloadIamge(imageUrl,row.fileName) |
| | | this.recordId = row.id |
| | | this.dialogVisibleFile = true |
| | | this.getFileData(row.id) |
| | | }, |
| | | getFileData(id) { |
| | | getDeviceCalibrationFile({id: id}).then(res =>{ |
| | | this.fileData = res.data |
| | | }) |
| | | }, |
| | | //状态判定 |
| | | checkRadio() { |
| | | let resultList = this.calibrateParams.map(ele => ele.result) |
| | |
| | | this.dialogVisible1 = true |
| | | this.getXmsg() |
| | | }, |
| | | // 查看详情 |
| | | // 查看编辑详情 |
| | | handleViewClick(type, row) { |
| | | showDeviceMetricsCopy({ id: row.id, type: 'calibrate' }).then(res => { |
| | | this.calibrateParams = res.data |
| | |
| | | }); |
| | | }) |
| | | }, |
| | | handleAttachmentClick(row) { |
| | | this.$download.saveAs(row.systemFileName, row.systemFileName) |
| | | }, |
| | | //导出 |
| | | handleDown() { |
| | | this.outLoading = true |
| | |
| | | const blob = new Blob([res], { type: 'application/octet-stream' }); |
| | | this.$download.saveAs(blob, '设备校准.xlsx') |
| | | }) |
| | | }, |
| | | deleteFile() { |
| | | this.$confirm('此操作将永久删除文件, 是否继续?', '提示', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | deleteCNASFile({ fileName: this.calibrationRecord.systemFileName }).then(res => { |
| | | this.calibrationRecord.fileName = '' |
| | | this.$refs.upload.clearFiles() |
| | | if (res.code == 200) { |
| | | this.$message.success('删除成功!') |
| | | } |
| | | }) |
| | | }).catch((err) => { |
| | | console.log('err----', err) |
| | | this.$message({ |
| | | type: 'info', |
| | | message: '已取消删除' |
| | | }); |
| | | }); |
| | | }, |
| | | // 校准项目维护 |
| | | calibrationMaintenance() { |
| | |
| | | this.$message.info('已取消删除'); |
| | | }) |
| | | }, |
| | | // 提交项目校准维护 |
| | | addCalibrate() { |
| | | this.$refs['form0'].validate((valid) => { |
| | | if (valid) { |
| | |
| | | } |
| | | this.calibrateParamsLoading = false |
| | | this.addCalibrateLoading = false |
| | | }).catch(() => { |
| | | this.addCalibrateLoading = false |
| | | }) |
| | | } else { |
| | | this.addCalibrateLoading = false |
| | |
| | | } |
| | | }) |
| | | }, |
| | | // 提交校准记录 |
| | | addRecord() { |
| | | this.$refs['calibrationRecord'].validate((valid) => { |
| | | if (valid) { |
| | |
| | | this.calibrationRecord.createUser = this.nickName |
| | | this.calibrationRecord.type = 'calibrate' |
| | | this.calibrationRecord.deviceMetricsCopyList = this.calibrateParams |
| | | this.calibrationRecord.deviceMetricsCopyList.forEach(m => { |
| | | delete m.creationTime |
| | | }) |
| | | delete this.calibrationRecord.createTime |
| | | addOrUpdateDeviceMetricRecord(this.calibrationRecord).then(res => { |
| | | if (res.code == 200) { |
| | | this.$message.success('添加成功') |
| | | this.dialogVisible1 = false |
| | | this.getTableList(this.clickNodeVal.value) |
| | | } |
| | | this.addRecordLoading = false |
| | | }).catch((err) => { |
| | | this.addRecordLoading = false |
| | | }) |
| | | } catch (e) { |
| | |
| | | } |
| | | }, |
| | | beforeUpload(file) { |
| | | let list = file.name.split('.') |
| | | let suffix = list[list.length - 1] |
| | | |
| | | console.log(suffix); |
| | | if (file.size > 1024 * 1024 * 10) { |
| | | this.$message.error('上传文件不超过10M'); |
| | | this.$refs.upload.clearFiles() |
| | | return false; |
| | | } else { |
| | | this.upLoading = true; |
| | | this.$set(this.uploadData,'id',this.recordId) |
| | | this.$set(this.uploadData,'suffix',suffix) |
| | | return true; |
| | | } |
| | | }, |
| | | onSuccess(response,file,fileList) { |
| | | if(response.code == 200) { |
| | | this.$message.success("上传成功") |
| | | this.upLoading = false |
| | | this.$refs.upload.clearFiles() |
| | | this.getFileData(this.recordId) |
| | | } else { |
| | | this.$message.error(response.msg) |
| | | } |
| | | }, |
| | | onError(err, file, fileList) { |
| | | this.$message.error('上传失败') |
| | | this.$refs.upload.clearFiles() |