From d4d34a9b730ac328068f936598d4138ac2635e57 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期四, 15 十月 2026 11:21:08 +0800
Subject: [PATCH] 质量监督计划:新增计划下发(列表下发状态列与下发按钮,仅已批准未下发的可下发),导出弹窗改卡片式并拦截导出错误响应避免下载损坏文件,日常监督检查记录单按纸质表重做(受监督人多选、监督员下拉、监督内容多选、监督记录、存在问题、整改意见),各表单人员列表改为全实验室不按部门筛选;方法验证:表单新增数据处理、质量控制方法、方法结果验证、验证结论及评审、审批意见字段并新增详情入口,迁移原标准方法变更的设备、检测记录、校准文件、工作证等查看组件,标准方法变更模块下线;设备档案、设备管理编辑弹窗改版为图片与基本信息左右布局、表单行式排列
---
src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue | 242 +++++++++++++++++------------------------------
1 files changed, 88 insertions(+), 154 deletions(-)
diff --git a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue
index e24000f..39e3be1 100644
--- a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue
+++ b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue
@@ -2,7 +2,7 @@
<div>
<el-dialog :close-on-click-modal="false" :close-on-press-escape="false"
v-model="formDia"
- title="妫�娴嬪伐浣滅洃鐫h褰曡〃"
+ title="鏃ュ父鐩戠潱妫�鏌ヨ褰曡〃"
width="70%" @close="closeRecordsDia">
<el-steps :active="currentStep" align-center finish-status="success">
<el-step title="瀹炴柦"></el-step>
@@ -12,30 +12,9 @@
<table border="1" cellspacing="10" class="tables">
<tr>
<td class="td-title">
- <p><span class="required-span">* </span>妫�娴嬩汉鍛橈細</p>
+ <p><span class="required-span">* </span>鐩戠潱妫�娴嬮」鐩細</p>
</td>
<td colspan="2">
- <el-input v-if="currentStep === 0" v-model="form.testMember"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.testMember }}</span>
- </td>
- <td class="td-title">
- <p><span class="required-span">* </span>鐩戠潱鍛橈細</p>
- </td>
- <td colspan="2">
- <el-select v-if="currentStep === 0" @change="usePersonName" v-model="form.supervisor" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
- <el-option v-for="item in recordUserList" :key="item.userName" :label="item.userName" :value="item.userName"></el-option>
- </el-select>
- <span v-else class="td-info"> {{ form.supervisor }}</span>
- </td>
- </tr>
- <tr>
- <td class="td-title">
- <p><span class="required-span">* </span>妫�娴嬮」鐩細</p>
- </td>
- <td>
<el-input v-if="currentStep === 0" v-model="form.testItem"
placeholder="璇疯緭鍏ュ唴瀹�"
size="small">
@@ -43,19 +22,9 @@
<span v-else class="td-info"> {{ form.testItem }}</span>
</td>
<td class="td-title">
- <p><span class="required-span">* </span>鏍峰搧缂栧彿锛�</p>
+ <p><span class="required-span">* </span>鐩戠潱妫�娴嬫棩鏈燂細</p>
</td>
- <td>
- <el-input v-if="currentStep === 0" v-model="form.sampleNumber"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.sampleNumber }}</span>
- </td>
- <td class="td-title">
- <p><span class="required-span">* </span>妫�娴嬫棩鏈燂細</p>
- </td>
- <td>
+ <td colspan="2">
<el-input v-if="currentStep === 0" v-model="form.testDate"
placeholder="璇疯緭鍏ュ唴瀹�"
size="small">
@@ -65,126 +34,80 @@
</tr>
<tr>
<td class="td-title">
- <p><span class="required-span">* </span>浜哄憳锛�</p>
+ <p><span class="required-span">* </span>鍙楃洃鐫d汉锛�</p>
</td>
- <td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.personnel"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.personnel }}</span>
+ <td colspan="2">
+ <el-select v-if="currentStep === 0" v-model="superviseeList" multiple filterable collapse-tags
+ placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+ <el-option v-for="item in personList" :key="item.value" :label="item.label"
+ :value="item.label"></el-option>
+ </el-select>
+ <span v-else class="td-info"> {{ form.testMember }}</span>
+ </td>
+ <td class="td-title">
+ <p><span class="required-span">* </span>鐩戠潱鍛橈細</p>
+ </td>
+ <td colspan="2">
+ <el-select v-if="currentStep === 0" v-model="form.supervisor" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+ <el-option v-for="item in recordUserList" :key="item.userId" :label="item.userName" :value="item.userName"></el-option>
+ </el-select>
+ <span v-else class="td-info"> {{ form.supervisor }}</span>
</td>
</tr>
<tr>
<td class="td-title">
- <p><span class="required-span">* </span>浠櫒璁惧锛�</p>
+ <p>鐩戠潱鍐呭锛�</p>
</td>
<td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.device"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.device }}</span>
+ <template v-if="currentStep === 0">
+ <div v-for="(rowItems, rowIndex) in contentRows" :key="rowIndex" style="display: flex;">
+ <el-checkbox v-for="item in rowItems" :key="item" v-model="superviseContentList"
+ :value="item" style="flex: 1;">{{ item }}</el-checkbox>
+ </div>
+ </template>
+ <span v-else class="td-info"> {{ form.superviseContent }}</span>
</td>
</tr>
<tr>
<td class="td-title">
- <p><span class="required-span">* </span>宸ヤ綔鐜锛�</p>
+ <p><span class="required-span">* </span>鐩戠潱璁板綍锛�</p>
</td>
<td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.environment"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.environment }}</span>
- </td>
- </tr>
- <tr>
- <td class="td-title">
- <p><span class="required-span">* </span>鏍峰搧閲囬泦锛�</p>
- </td>
- <td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.sampleCollection"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.sampleCollection }}</span>
- </td>
- </tr>
- <tr>
- <td class="td-title">
- <p><span class="required-span">* </span>鏍峰搧鐨勫噯澶囷細</p>
- </td>
- <td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.samplePreparation"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.samplePreparation }}</span>
- </td>
- </tr>
- <tr>
- <td class="td-title">
- <p><span class="required-span">* </span>妫�娴嬫柟娉曪細</p>
- </td>
- <td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.detectionMethod"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.detectionMethod }}</span>
- </td>
- </tr>
- <tr>
- <td class="td-title">
- <p><span class="required-span">* </span>妫�娴嬭褰曪細</p>
- </td>
- <td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.inspectionRecord"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.inspectionRecord }}</span>
- </td>
- </tr>
- <tr>
- <td class="td-title">
- <p><span class="required-span">* </span>妫�娴嬫姤鍛婏細</p>
- </td>
- <td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.examiningReport"
- placeholder="璇疯緭鍏ュ唴瀹�"
- size="small">
- </el-input>
- <span v-else class="td-info"> {{ form.examiningReport }}</span>
- </td>
- </tr>
- <tr>
- <td class="td-title">
- <p><span class="required-span">* </span>鐩戠潱鎯呭喌璇勪环锛�</p>
- </td>
- <td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.supervisionEvaluation"
+ <el-input v-if="currentStep === 0" v-model="form.superviseRecord"
:rows="4"
placeholder="璇疯緭鍏ュ唴瀹�"
size="small"
type="textarea">
</el-input>
- <span v-else class="td-info"> {{ form.supervisionEvaluation }}</span>
+ <span v-else class="td-info"> {{ form.superviseRecord }}</span>
</td>
</tr>
<tr>
<td class="td-title">
- <p><span class="required-span">* </span>涓嶇鍚堝鐞嗘剰瑙侊細</p>
+ <p>瀛樺湪闂锛�</p>
</td>
<td colspan="5">
- <el-input v-if="currentStep === 0" v-model="form.handlingAdvice"
- :rows="4"
+ <el-input v-if="currentStep === 0" v-model="form.problemDesc"
+ :rows="3"
+ placeholder="涓嶇鍚堥棶棰樻弿杩帮紝鏃犲垯濉�滄棤鈥�"
+ size="small"
+ type="textarea">
+ </el-input>
+ <span v-else class="td-info"> {{ form.problemDesc }}</span>
+ </td>
+ </tr>
+ <tr>
+ <td class="td-title">
+ <p>鏁存敼鎰忚锛�</p>
+ </td>
+ <td colspan="5">
+ <el-input v-if="currentStep === 0" v-model="form.rectifyAdvice"
+ :rows="3"
placeholder="璇疯緭鍏ュ唴瀹�"
size="small"
type="textarea">
</el-input>
- <span v-else class="td-info"> {{ form.handlingAdvice }}</span>
+ <span v-else class="td-info"> {{ form.rectifyAdvice }}</span>
</td>
</tr>
<tr>
@@ -235,7 +158,7 @@
</div>
<template #footer><span class="dialog-footer">
<el-button @click="closeRecordsDia">鍙� 娑�</el-button>
- <el-button v-if="currentStep === 0 && userId == supervisedUserId" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+ <el-button v-if="currentStep === 0 && canSubmitRecord" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
<el-button v-if="currentStep === 1 && userId == ratifyUserId" :loading="editLoad" @click="handleEdit(0)">涓嶉�氳繃</el-button>
<el-button v-if="currentStep === 1 && userId == ratifyUserId" :loading="editLoad" type="primary" @click="handleEdit(1)">閫�
杩�</el-button>
@@ -266,24 +189,17 @@
superviseDetailsRecordId: '',
testMember: '',
supervisor: '',
- supervisorId: '',
+ superviseContent: '',
+ superviseRecord: '',
+ problemDesc: '',
+ rectifyAdvice: '',
testItem: '',
- sampleNumber: '',
testDate: '',
- personnel: '',
- device: '',
- environment: '',
- sampleCollection: '',
- samplePreparation: '',
- detectionMethod: '',
- inspectionRecord: '',
- examiningReport: '',
- supervisionEvaluation: '',
- handlingAdvice: '',
ratifyUserId: '',
ratifyUserName: '',
ratifyOpinion: '',
isAccording: '',
+ isFinish: '',
},
currentStep: 0,
editLoad: false,
@@ -291,10 +207,26 @@
recordUserList: [],
supervisedUserId: '',
ratifyUserId: '',
+ superviseeList: [],
+ superviseContentList: [],
+ superviseContentItems: ['浜哄憳鎸佽瘉鍙婂煿璁�', '璁炬柦鍙婄幆澧冩潯浠�', '妫�娴嬫柟娉�', '浠櫒璁惧绠$悊', '娴嬮噺婧簮鎬�', '鏍囧噯鐗╄川绠$悊', '鏍峰搧鍒跺鍜屽缃�', '妫�娴嬫暟鎹鐞�', '缁撴灉鎶ュ憡缁撴灉'],
};
},
computed: {
...mapGetters(["userId"]),
+ contentRows() {
+ const rows = []
+ for (let i = 0; i < this.superviseContentItems.length; i += 3) {
+ rows.push(this.superviseContentItems.slice(i, i + 3))
+ }
+ return rows
+ },
+ canSubmitRecord() {
+ if (this.userId == this.supervisedUserId) {
+ return true
+ }
+ return this.recordUserList.some(item => item.userId == this.userId)
+ },
},
// 鏂规硶闆嗗悎
methods: {
@@ -303,12 +235,6 @@
this.supervisedUserId = row.supervisedUserId
this.searchInfo(row)
this.getAuthorizedPerson()
- },
- usePersonName (value) {
- const index = this.recordUserList.findIndex(item => item.userId === value)
- if (index > -1) {
- this.form.supervisor = this.recordUserList[index].userName
- }
},
// 鏌ヨ鐩戠潱璁″垝璇︽儏璁板綍娴佺▼淇℃伅
searchInfo (row) {
@@ -327,6 +253,8 @@
this.form = res.data
this.form.superviseDetailsId = row.superviseDetailsId
this.ratifyUserId = res.data.ratifyUserId
+ this.superviseeList = this.form.testMember ? this.form.testMember.split('銆�').filter(i => i) : []
+ this.superviseContentList = this.form.superviseContent ? this.form.superviseContent.split('銆�').filter(i => i) : []
this.getRecordUser()
}).catch(err => {
console.log('err---', err);
@@ -334,12 +262,17 @@
},
// 鎻愪氦娴佺▼
handleEdit (isFinish) {
- if (!this.form.testMember || !this.form.supervisor || !this.form.testItem || !this.form.sampleNumber
- || !this.form.testDate) {
- this.$message.warning('璇峰~鍐欏畬鏁�')
- return
- }
if (this.currentStep === 0) {
+ if (!this.form.testItem || !this.form.testDate || this.superviseeList.length === 0 || !this.form.supervisor) {
+ this.$message.warning('璇峰~鍐欏畬鏁�')
+ return
+ }
+ if (!this.form.superviseRecord) {
+ this.$message.warning('璇峰~鍐欑洃鐫h褰�')
+ return
+ }
+ this.form.testMember = this.superviseeList.join('銆�')
+ this.form.superviseContent = this.superviseContentList.join('銆�')
this.addInfo()
} else {
this.editInfo(isFinish)
@@ -363,7 +296,7 @@
this.$message.warning('璇峰~鍐欏鎵规剰瑙�')
return
}
- if (this.form.isAccording === null) {
+ if (this.form.isAccording !== 0 && this.form.isAccording !== 1) {
this.$message.warning('璇烽�夋嫨鏄惁绗﹀悎')
return
}
@@ -384,9 +317,10 @@
this.$emit('closeRecordsDia')
},
getAuthorizedPerson() {
- selectUserCondition({ type: 2 }).then((res) => {
+ // 璐ㄩ噺鐩戠潱闈㈠悜鍏ㄥ疄楠屽, 浜哄憳鍒楄〃涓嶆寜閮ㄩ棬绛涢��
+ selectUserCondition({ type: 1 }).then((res) => {
let data = [];
- res.data.forEach((a) => {
+ (res.data || []).forEach((a) => {
data.push({
label: a.name,
value: a.id,
--
Gitblit v1.9.3