| | |
| | | <div> |
| | | <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="add()">添加校准记录</el-button> |
| | | </div> |
| | | <div class="tables" style="margin-top: 10px;"> |
| | | <el-table :data="tableData" height="calc(100vh - 20em)" border> |
| | |
| | | </el-table-column> |
| | | <el-table-column label="校准证书编号" min-width="150" prop="certificateSerialNumber"></el-table-column> |
| | | <el-table-column label="说明" min-width="150" prop="remark" show-overflow-tooltip></el-table-column> |
| | | <el-table-column label="校准日期" min-width="150" prop="calibrationDate"></el-table-column> |
| | | <el-table-column label="下次校准日期" min-width="150" prop="nextCalibrationDate"></el-table-column> |
| | | <el-table-column label="确认日期" min-width="150" prop="confirmDate"></el-table-column> |
| | | <el-table-column label="校准日期" min-width="150" prop="calibrationDate" |
| | | :formatter="formatDateCell"></el-table-column> |
| | | <el-table-column label="下次校准日期" min-width="150" prop="nextCalibrationDate" |
| | | :formatter="formatDateCell"></el-table-column> |
| | | <el-table-column label="确认日期" min-width="150" prop="confirmDate" |
| | | :formatter="formatDateCell"></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 label="登记日期" min-width="150" prop="createTime" |
| | | :formatter="formatDateCell"></el-table-column> |
| | | <el-table-column fixed="right" label="操作" min-width="180" align="center"> |
| | | <template #default="{ row }"> |
| | | <el-button size="small" link type="primary" @click="handleAttachmentClick(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]" |
| | | <el-pagination :current-page="search.current" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]" |
| | | :total="search.total" layout="->,total, sizes, prev, pager, next, jumper" |
| | | @size-change="handleSizeChange" @current-change="handleCurrentChange" background> |
| | | </el-pagination> |
| | |
| | | <el-table-column label="最大允许误差" prop="maxPermissibleError"></el-table-column> |
| | | <el-table-column label="判定标准" prop="judgmentCriteria"></el-table-column> |
| | | <el-table-column label="创建人" prop="createdBy"></el-table-column> |
| | | <el-table-column label="创建时间" prop="creationTime"></el-table-column> |
| | | <el-table-column label="创建时间" prop="creationTime" :formatter="formatDateCell"></el-table-column> |
| | | <el-table-column fixed="right" label="操作"> |
| | | <template #default="scope"> |
| | | <el-button size="small" link type="primary" @click="handleDelete(scope.row)">删除</el-button> |
| | |
| | | </el-table> |
| | | </el-dialog> |
| | | |
| | | <!-- 添加校准记录 --> |
| | | <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" v-model="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 class="line"></span> |
| | | <span>添加设备校准记录</span> |
| | | </div> |
| | | </h4> |
| | | <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-select v-model="calibrationRecord.unitOfMeasure" :disabled="operationType === 'view'" clearable filterable |
| | | size="small" style="width: 100%"> |
| | | <el-option v-for="name in calibrationServiceOptions" :key="name" :label="name" :value="name"></el-option> |
| | | </el-select> |
| | | </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"> |
| | | </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> |
| | | </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> |
| | | </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> |
| | | </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-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> |
| | | </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-form-item> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-form-item label="状态:" label-width="140px" prop="status" required> |
| | | <el-radio-group v-model="calibrationRecord.status" :disabled="operationType === 'view'"> |
| | | <el-radio value="0yes">合格</el-radio> |
| | | <el-radio value="1no">不合格</el-radio> |
| | | <el-radio value="2other">其他</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <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"> |
| | | </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"> |
| | | <template #append><el-button v-if="operationType === 'add'" :icon="$icon('el-icon-delete-solid')" |
| | | @click="deleteFile"></el-button></template> |
| | | </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-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <h4> |
| | | <span style="display: flex;align-items: center;"> |
| | | <span class="line"></span><span>校准条目确认结果</span> |
| | | </span> |
| | | </h4> |
| | | <el-table ref="calibrateTable" :data="calibrateParams" border> |
| | | <el-table-column label="编号" type="index" width="60"></el-table-column> |
| | | <el-table-column label="计量参数" prop="measurementParameter"></el-table-column> |
| | | <el-table-column label="量程范围" prop="rangeOfMeasurement"></el-table-column> |
| | | <el-table-column label="最大允许误差" prop="maxPermissibleError"></el-table-column> |
| | | <el-table-column label="判定标准" prop="judgmentCriteria"></el-table-column> |
| | | <el-table-column label="是否校准" prop="isCalibration"> |
| | | <template #header="scope"> |
| | | <span class="required-span">* </span>是否校准 |
| | | </template> |
| | | <template #default="scope"> |
| | | <el-radio-group v-model="scope.row.isCalibration" :disabled="operationType === 'view'"> |
| | | <el-radio value="0yes">是</el-radio> |
| | | <el-radio value="1no">否</el-radio> |
| | | </el-radio-group> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="判定结果" min-width="140" prop="result"> |
| | | <template #header="scope"> |
| | | <span class="required-span">* </span>判定结果 |
| | | </template> |
| | | <template #default="scope"> |
| | | <el-radio-group v-model="scope.row.result" :disabled="operationType === 'view'" @change="checkRadio()"> |
| | | <el-radio value="0yes">合格</el-radio> |
| | | <el-radio value="1no">不合格</el-radio> |
| | | <el-radio value="2other">其他</el-radio> |
| | | </el-radio-group> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="单项结果说明" prop="singleResultStatement"> |
| | | <template #default="scope"> |
| | | <el-input v-model="scope.row.singleResultStatement" :disabled="operationType === 'view'" |
| | | size="small"></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | <template #footer><span 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> |
| | | </span></template> |
| | | </el-dialog> |
| | | <!-- 添加/查看校准记录弹窗 --> |
| | | <calibration-record-dia ref="calibrationRecordDia" |
| | | @success="getTableList(clickNodeVal.value)"></calibration-record-dia> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | deviceMetricRecordPage, |
| | | showDeviceMetricsCopy, |
| | | deleteDeviceMetricRecord, |
| | | deleteCNASFile, |
| | | selectDeviceMetric, |
| | | deleteDeviceMetrics, |
| | | addOrUpdateDeviceMetricRecord, |
| | | saveOrUpdateDeviceMetric |
| | | } from '@/api/cnas/resourceDemand/device.js' |
| | | import { selectQualifiedSupplierManagementPage } from '@/api/cnas/externalService/supplierManage/supplierManage' |
| | | import CalibrationRecordDia from './calibrationRecordDia.vue' |
| | | import { formatListDate } from './dateFormat' |
| | | import { mapGetters } from "@/utils/store-compat"; |
| | | export default { |
| | | components: { CalibrationRecordDia }, |
| | | props: { |
| | | clickNodeVal: { |
| | | type: Object, |
| | |
| | | calibrateParams: [], |
| | | calibrateParamsLoading: false, |
| | | addCalibrateLoading: false, |
| | | calibrationRecord: { |
| | | unitOfMeasure: '', // 计量单位 |
| | | calibrationDate: null, // 校准日期 |
| | | nextCalibrationDate: null, // 下次校准日期 |
| | | calculatingApparatus: '', // 计算器具 |
| | | confirmDate: null, // 确认日期 |
| | | standardRange: '', // 计算标准量程 |
| | | calibrationStandardUncertainty: '', // 计量标准不确定度 |
| | | byDocument: '', // 依据文件 |
| | | certificateSerialNumber: '', // 证书编号 |
| | | status: '', // 状态 |
| | | remark: '', // 备注 |
| | | systemFileName: '', // |
| | | fileName: '', // |
| | | }, |
| | | formRules: { |
| | | unitOfMeasure: [{ required: true, message: '请选择校准服务机构', trigger: 'change' }], |
| | | calibrationDate: [{ required: true, message: '请选择校准日期', trigger: 'change' }], |
| | | calculatingApparatus: [{ required: true, message: '请输入计算器具', trigger: 'blur' }], |
| | | standardRange: [{ required: true, message: '请输入计算标准量程', trigger: 'blur' }], |
| | | calibrationStandardUncertainty: [{ required: true, message: '请输入计量标准不确定度', trigger: 'blur' }], |
| | | byDocument: [{ required: true, message: '请输入所依据文件', trigger: 'blur' }], |
| | | status: [{ required: true, message: '请选择状态', trigger: 'change' }], |
| | | }, |
| | | tableData: [], |
| | | dialogVisible0: false, |
| | | dialogVisible1: false, |
| | | form0: { |
| | | measurementParameter: '', // 计量参数 |
| | | rangeOfMeasurement: '', |
| | |
| | | { required: true, message: '请输入判定标准', trigger: 'blur' } |
| | | ], |
| | | }, |
| | | addRecordLoading: false, |
| | | upLoading: false, |
| | | operationType: '', |
| | | qualifiedSupplierNames: [], |
| | | search: { |
| | | size: 20, |
| | | current: 1, |
| | |
| | | }, |
| | | // 用于上传文件的信息 |
| | | computed: { |
| | | // 校准服务机构下拉选项(合格供应商 + 当前值兜底) |
| | | calibrationServiceOptions() { |
| | | const list = this.qualifiedSupplierNames.slice(); |
| | | const value = this.calibrationRecord.unitOfMeasure; |
| | | if (value && list.indexOf(value) === -1) list.push(value); |
| | | return list; |
| | | }, |
| | | ...mapGetters(["nickName"]), |
| | | action() { |
| | | return this.javaApi + '/personBasicInfo/saveCNASFile' |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.obtainQualifiedSupplierList() |
| | | //获取操作记录信息 |
| | | this.getTableList(this.clickNodeVal.value) // 获取设备校准列表数据 |
| | | }, |
| | | methods: { |
| | | // 拉取合格供应商列表(校准服务机构下拉选项) |
| | | obtainQualifiedSupplierList() { |
| | | selectQualifiedSupplierManagementPage({ current: 1, size: 999 }).then(res => { |
| | | if (res.code === 200) { |
| | | const rows = (res.data && res.data.records) || []; |
| | | this.qualifiedSupplierNames = [...new Set(rows.map(r => r.supplierName).filter(Boolean))]; |
| | | } |
| | | }); |
| | | }, |
| | | //状态判定 |
| | | checkRadio() { |
| | | let resultList = this.calibrateParams.map(ele => ele.result) |
| | | if (resultList && resultList.filter(ele => ele == '1no').length > 0) { |
| | | this.calibrationRecord.status = '1no' |
| | | } else if (resultList && resultList.filter(ele => ele == '2other').length == resultList.length) { |
| | | this.calibrationRecord.status = '2other' |
| | | } else if (resultList && resultList.filter(ele => ele == '0yes').length == resultList.length) { |
| | | this.calibrationRecord.status = '0yes' |
| | | } |
| | | }, |
| | | getNextCalibrationDate(val) { |
| | | let oneYearLaterDate = new Date(val) |
| | | oneYearLaterDate.setFullYear(oneYearLaterDate.getFullYear() + 1); |
| | | oneYearLaterDate.setDate(oneYearLaterDate.getDate() - 1); |
| | | // let obj = oneYearLaterDate.toISOString().split('T')[0]; |
| | | this.calibrationRecord.nextCalibrationDate = oneYearLaterDate |
| | | formatDateCell(row, column, cellValue) { |
| | | return formatListDate(cellValue) |
| | | }, |
| | | handleSizeChange(val) { |
| | | this.search.size = val |
| | |
| | | this.search.total = res.data.total |
| | | }) |
| | | }, |
| | | // 添加核查记录 |
| | | add(type) { |
| | | this.operationType = type |
| | | this.dialogVisible1 = true |
| | | this.getXmsg() |
| | | // 添加校准记录 |
| | | add() { |
| | | this.$refs.calibrationRecordDia.open(this.clickNodeVal.value, 'add') |
| | | }, |
| | | // 查看详情 |
| | | handleViewClick(type, row) { |
| | | showDeviceMetricsCopy({ id: row.id, type: 'calibrate' }).then(res => { |
| | | this.calibrateParams = res.data |
| | | }) |
| | | this.calibrationRecord = { ...row } |
| | | this.operationType = type |
| | | this.dialogVisible1 = true |
| | | this.$refs.calibrationRecordDia.open(this.clickNodeVal.value, type, row) |
| | | }, |
| | | // 表格删除操作 |
| | | handleDeleteClick(row) { |
| | |
| | | }) |
| | | }, |
| | | handleAttachmentClick(row) { |
| | | this.$download.saveAs(row.systemFileName, row.systemFileName) |
| | | }, |
| | | 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('删除成功!') |
| | | if (!row.systemFileName) { |
| | | this.$message.warning('未上传文件!') |
| | | return |
| | | } |
| | | }) |
| | | }).catch((err) => { |
| | | console.log('err----', err) |
| | | this.$message({ |
| | | type: 'info', |
| | | message: '已取消删除' |
| | | }); |
| | | }); |
| | | // 图片存 /img/,其他文档存 /word/ |
| | | const isImage = /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(row.systemFileName) |
| | | const url = this.javaApi + (isImage ? '/img/' : '/word/') + row.systemFileName |
| | | this.$download.saveAs(url, row.fileName || row.systemFileName) |
| | | }, |
| | | // 校准项目维护 |
| | | calibrationMaintenance() { |
| | |
| | | } |
| | | }) |
| | | }, |
| | | addRecord() { |
| | | this.$refs['calibrationRecord'].validate((valid) => { |
| | | if (valid) { |
| | | try { |
| | | if (this.calibrateParams.some(m => m.isCalibration === undefined)) { |
| | | this.$message.error('请选择是否校准') |
| | | return |
| | | } |
| | | if (!this.calibrateParams.every(m => m.result !== undefined)) { |
| | | this.$message.error('请选择判定结果') |
| | | return |
| | | } |
| | | this.addRecordLoading = true |
| | | this.calibrationRecord.deviceId = this.clickNodeVal.value; |
| | | this.calibrationRecord.createUser = this.nickName |
| | | this.calibrationRecord.type = 'calibrate' |
| | | this.calibrationRecord.deviceMetricsCopyList = this.calibrateParams |
| | | addOrUpdateDeviceMetricRecord(this.calibrationRecord).then(res => { |
| | | if (res.code == 200) { |
| | | this.$message.success('添加成功') |
| | | this.dialogVisible1 = false |
| | | this.getTableList(this.clickNodeVal.value) |
| | | } |
| | | this.addRecordLoading = false |
| | | }) |
| | | } catch (e) { |
| | | console.log('addRecord---', e) |
| | | this.addRecordLoading = false |
| | | } |
| | | } else { |
| | | this.$message.warning('有必填项未填'); |
| | | } |
| | | }) |
| | | }, |
| | | resetCalibrationRecord() { |
| | | this.$refs.calibrationRecord.resetFields() |
| | | }, |
| | | // 上传附件 |
| | | handleSuccessUp(response, file) { |
| | | if (response.code == 200) { |
| | | // 在保存赋值新文件 |
| | | this.calibrationRecord.fileName = file.name |
| | | this.calibrationRecord.systemFileName = response.data |
| | | this.upLoading = false; |
| | | } else { |
| | | this.upLoading = false; |
| | | this.$message.error(response.message) |
| | | } |
| | | }, |
| | | beforeUpload(file) { |
| | | if (file.size > 1024 * 1024 * 10) { |
| | | this.$message.error('上传文件不超过10M'); |
| | | this.$refs.upload.clearFiles() |
| | | return false; |
| | | } else { |
| | | this.upLoading = true; |
| | | return true; |
| | | } |
| | | }, |
| | | onError(err, file, fileList) { |
| | | this.$message.error('上传失败') |
| | | this.$refs.upload.clearFiles() |
| | | }, |
| | | // end |
| | | }, |
| | | watch: { |
| | |
| | | clickNodeVal(newVal) { |
| | | if (newVal.value) { |
| | | this.getTableList(newVal.value); |
| | | } |
| | | }, |
| | | dialogVisible1(newVal) { |
| | | if (newVal === false) { |
| | | this.calibrateParams = [] |
| | | this.calibrationRecord = { |
| | | unitOfMeasure: '', // 计量单位 |
| | | calibrationDate: null, // 校准日期 |
| | | nextCalibrationDate: null, // 下次校准日期 |
| | | calculatingApparatus: '', // 计算器具 |
| | | standardRange: '', // 计算标准量程 |
| | | calibrationStandardUncertainty: '', // 计量标准不确定度 |
| | | byDocument: '', // 依据文件 |
| | | certificateSerialNumber: '', // 证书编号 |
| | | status: '', // 状态 |
| | | remark: '', // 备注 |
| | | } |
| | | } |
| | | } |
| | | } |