<template>
|
<el-dialog v-model="visible" title="质量控制评价记录" width="min(960px, 94vw)" @closed="$emit('close')">
|
<div class="record-code">记录编号:LMSY-CX30-JL03</div>
|
<el-alert v-if="row"
|
:title="`监控任务 ${row.inspectionTaskCode || row.entrustCode || ''} · ${row.monitorProject || ''}`"
|
type="info"
|
:closable="false"/>
|
<el-alert v-if="!canEdit" :title="editNotice" :type="loaded ? 'warning' : 'info'"
|
:closable="false" style="margin-top:8px"/>
|
<el-form :model="form" label-width="110px" style="margin-top: 16px">
|
<el-row :gutter="12">
|
<el-col :span="12">
|
<el-form-item label="检测项目">
|
<el-input :model-value="row?.monitorProject" disabled/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="检测时间">
|
<el-input :model-value="inspectionDateDisplay" readonly placeholder="原始记录复核后自动带入"/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="检测样品">
|
<el-input :model-value="row?.sampleName || row?.sample" disabled/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="所用设备">
|
<el-input :model-value="form.rawEquipmentDescription || ''" type="textarea"
|
:autosize="{ minRows: 1, maxRows: 6 }" readonly placeholder="原始记录复核后自动带入"/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="设备规格">
|
<el-input :model-value="form.rawEquipmentSpec || ''" type="textarea" :autosize="{ minRows: 1, maxRows: 6 }"
|
readonly/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="设备编号">
|
<el-input :model-value="form.rawEquipmentCode || ''" type="textarea" :autosize="{ minRows: 1, maxRows: 6 }"
|
readonly/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="监督员">
|
<el-select v-model="form.supervisorUserId" filterable style="width: 100%" :disabled="!canEdit">
|
<el-option v-for="person in supervisorOptions" :key="person.id" :value="person.id" :label="person.name"/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="被监督人员">
|
<el-input :model-value="supervisedPersonName" disabled/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-form-item label="检测情况及评价">
|
<el-input v-model="form.evaluationConclusion" type="textarea" :rows="4" :disabled="!canEdit"/>
|
</el-form-item>
|
<el-table :data="form.resultRows" border style="width:100%">
|
<el-table-column label="人员姓名" min-width="120">
|
<template #default>{{ supervisedPersonName }}</template>
|
</el-table-column>
|
<el-table-column label="当日检测数据" min-width="180">
|
<template #default="{ row: item }"><span :title="item.itemName || ''">{{
|
item.measuredValue
|
}} {{ item.unit === '/' ? '' : item.unit }}</span></template>
|
</el-table-column>
|
<el-table-column label="盲样值" min-width="180">
|
<template #default="{ row: item }">
|
<el-input v-model="item.referenceValue" :disabled="!canEdit" placeholder="评价人填写"/>
|
</template>
|
</el-table-column>
|
</el-table>
|
<el-checkbox v-if="canEdit" v-model="form.measurementConfirmed" style="margin:12px 0">
|
已核对当日检测数据与已复核原始记录一致
|
</el-checkbox>
|
<el-form-item label="评价人员签字">
|
<el-input
|
:model-value="form.reviewUser ? `${form.reviewUser} ${form.reviewTime || ''}` : '提交后记录评价人及日期'"
|
disabled/>
|
</el-form-item>
|
<el-form-item label="纠正措施及预防措施">
|
<el-input v-model="form.correctiveAction" type="textarea" :rows="2" :disabled="!canEdit"/>
|
</el-form-item>
|
<el-row :gutter="12">
|
<el-col :span="12">
|
<el-form-item label="纠正责任人">
|
<el-select v-model="form.correctiveResponsibleUserId" filterable clearable style="width:100%"
|
:disabled="!canEdit">
|
<el-option v-for="person in people" :key="person.id" :value="person.id" :label="person.name"/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="完成日期">
|
<el-date-picker v-model="form.correctiveDueDate" type="date" value-format="YYYY-MM-DD" style="width:100%"
|
:disabled="!canEdit"/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-form-item label="验证情况">
|
<el-input v-model="form.verificationResult" type="textarea" :rows="2" :disabled="!canEdit"/>
|
</el-form-item>
|
<el-row :gutter="12">
|
<el-col :span="12">
|
<el-form-item label="验证责任人">
|
<el-select v-model="form.verificationResponsibleUserId" filterable clearable style="width:100%"
|
:disabled="!canEdit">
|
<el-option v-for="person in people" :key="person.id" :value="person.id" :label="person.name"/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="验证日期">
|
<el-date-picker v-model="form.verificationDate" type="date" value-format="YYYY-MM-DD" style="width:100%"
|
:disabled="!canEdit"/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-form-item v-if="form.ratifyOpinion" label="批准意见">
|
<el-input :model-value="form.ratifyOpinion" disabled/>
|
</el-form-item>
|
</el-form>
|
<template #footer>
|
<el-button @click="visible = false">关闭</el-button>
|
<el-button v-if="canEdit" type="primary" :loading="loading" @click="save">提交评价</el-button>
|
<template v-if="canApprove">
|
<el-button :loading="loading" @click="approve(false)">退回评价</el-button>
|
<el-button type="primary" :loading="loading" @click="approve(true)">批准归档</el-button>
|
</template>
|
</template>
|
</el-dialog>
|
</template>
|
|
<script>
|
import {mapGetters} from '@/utils/store-compat';
|
import {selectUserCondition} from '@/api/performance/class';
|
import {
|
getInspectionEvaluation,
|
submitInspectionEvaluation,
|
approveInspectionEvaluation
|
} from '@/api/cnas/process/ensureResults/qualityMonitor';
|
|
export default {
|
name: 'InspectionEvaluationDialog',
|
emits: ['close'],
|
data() {
|
return {visible: false, loading: false, loaded: false, loadError: '', row: null, people: [], form: {resultRows: []}}
|
},
|
computed: {
|
...mapGetters(['userId']),
|
canEdit() {
|
return this.loaded && this.form.evaluationEditable === true
|
},
|
inspectionDateDisplay() {
|
const dates = this.form.rawInspectionDates || []
|
if (!dates.length) return ''
|
return dates.length === 1 ? dates[0] : `${dates[0]} ~ ${dates[dates.length - 1]}`
|
},
|
editNotice() {
|
if (!this.loaded) return '正在读取评价记录和编辑权限…'
|
return this.loadError || this.form.evaluationEditReason || '当前账号只能查看评价记录'
|
},
|
canApprove() {
|
return !!this.form.detailsEvaluateId && this.form.isFinish !== 1 && Number(this.userId) === Number(this.row?.planRatifyUserId)
|
},
|
supervisedPersonName() {
|
const id = this.form.inspectorUserId || this.row?.inspectorUserId
|
return this.people.find(person => Number(person.id) === Number(id))?.name || ''
|
},
|
supervisorOptions() {
|
const inspectorId = Number(this.form.inspectorUserId || this.row?.inspectorUserId)
|
const evaluatorId = Number(this.row?.evaluatorUserId)
|
return this.people.filter(person => Number(person.id) !== inspectorId && Number(person.id) !== evaluatorId)
|
}
|
},
|
methods: {
|
open(row) {
|
this.row = row
|
this.loaded = false
|
this.loadError = ''
|
this.form = {
|
qualityMonitorDetailsId: row.qualityMonitorDetailsId,
|
inspectorUserId: row.inspectorUserId,
|
resultRows: [],
|
measurementConfirmed: false
|
}
|
this.visible = true
|
selectUserCondition({type: 1}).then(res => {
|
this.people = res.data || []
|
})
|
getInspectionEvaluation(row.qualityMonitorDetailsId).then(res => {
|
if (res.data) this.form = {...res.data, resultRows: res.data.resultRows || [], measurementConfirmed: false}
|
}).catch(() => {
|
this.loadError = '评价记录读取失败,请刷新后重试'
|
}).finally(() => {
|
this.loaded = true
|
})
|
},
|
save() {
|
if (!this.form.supervisorUserId || !this.form.evaluationConclusion?.trim() || !this.form.resultRows?.length || this.form.resultRows.some(item => !item.measuredValue || !item.referenceValue?.trim()) || !this.form.measurementConfirmed) {
|
this.$message.warning('请选择监督员,填写检测情况及评价、盲样值,并核对原始记录检测数据')
|
return
|
}
|
this.loading = true
|
submitInspectionEvaluation(this.form).then(() => {
|
this.$message.success('评价已提交')
|
this.visible = false
|
}).finally(() => {
|
this.loading = false
|
})
|
},
|
approve(approved) {
|
this.$prompt('请输入批准或退回意见', approved ? '批准评价' : '退回评价', {inputValue: this.form.ratifyOpinion || ''}).then(({value}) => {
|
this.loading = true
|
approveInspectionEvaluation({
|
qualityMonitorDetailsId: this.row.qualityMonitorDetailsId,
|
approved,
|
opinion: value
|
}).then(() => {
|
this.$message.success(approved ? '评价已归档' : '评价已退回')
|
this.visible = false
|
}).finally(() => {
|
this.loading = false
|
})
|
}).catch(() => {
|
})
|
}
|
}
|
}
|
</script>
|