src/api/cnas/process/ensureResults/qualitySupervise.js
@@ -17,6 +17,14 @@ data: query }) } // çç£è®¡åä¸å export function issueQualitySupervise(query) { return request({ url: '/qualitySupervise/issueQualitySupervise', method: 'post', data: query }) } // è´¨éçç£å¹´è®¡åå表 export function exportQualitySupervise(query) { return request({ src/api/cnas/process/method/methodVerification.js
@@ -64,3 +64,39 @@ params: query }) } //è·åç¨æ·å表 export function selectUserCondition(query) { return request({ url: "/system/newUser/selectUserCondition", method: "get", params: query, }); } // éè¿è®¾å¤åç±»è·å设å¤å表 export function deviceScopeSearch(query) { return request({ url: '/deviceScope/search', method: 'get', params: query }) } // åå§è®°å½å表 export function getVerifyMethodFileList(query) { return request({ url: '/processMethodVerify/getVerifyMethodFileList', method: 'get', params: query }) } // å é¤éªè¯åå§è®°å½å表 export function delVerifyMethodFileList(query) { return request({ url: '/processMethodVerify/delVerifyMethodFileList', method: 'delete', params: query }) } src/api/cnas/process/method/standardMethodsChange.js
ÎļþÒÑɾ³ý src/views/CNAS/process/ensureResults/qualityControlPlan/components/detailFormDialog.vue
@@ -162,8 +162,9 @@ this.$emit('closeDia') }, getUserList(){ selectUserCondition({ type: 2 }).then((res) => { this.userList = res.data; // è´¨éçç£é¢åå ¨å®éªå®¤, 人ååè¡¨ä¸æé¨é¨çé selectUserCondition({ type: 1 }).then((res) => { this.userList = res.data || []; }) }, } src/views/CNAS/process/ensureResults/qualityControlPlan/components/processingSheet.vue
@@ -450,9 +450,10 @@ this.$emit('closeProcessingDia') }, 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, 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="æ£æµå·¥ä½çç£è®°å½è¡¨" 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>åçç£äººï¼</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('请填åçç£è®°å½') 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, src/views/CNAS/process/ensureResults/qualityControlPlan/components/rectifyDialogNew.vue
@@ -389,9 +389,10 @@ this.showStep = step }, 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, src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue
@@ -74,12 +74,43 @@ <el-button :loading="ratifyLoading" type="primary" @click="handleRatify(1)">æ¹ å</el-button> </span></template> </el-dialog> <el-dialog v-model="downloadDialog" title="导åº" width="600px"> <span> <el-button plain type="primary" :disabled="download.recordStatus !== 3" @click="controlDown">è®°å½å导åº</el-button> <el-button plain type="primary" :disabled="download.accordingStatus !== 3" @click="processingDown">å¤çå导åº</el-button> <el-button plain type="primary" :disabled="download.correctStatus !== 3" @click="supervisoryDown">çº æ£å导åº</el-button> </span> <el-dialog v-model="downloadDialog" title="导åº" width="640px"> <div class="doc-card"> <div class="doc-card-head"> <span class="doc-card-name">æ¥å¸¸çç£æ£æ¥è®°å½è¡¨ï¼è®°å½åï¼</span> <el-tag :type="download.recordStatus === 3 ? 'success' : 'info'" size="small"> {{ download.recordStatus === 3 ? 'å·²æ¹å' : 'æªæ¹å' }} </el-tag> </div> <div class="doc-card-foot"> <el-button type="primary" :disabled="download.recordStatus !== 3" @click="controlDown">导 åº</el-button> </div> </div> <div class="doc-card"> <div class="doc-card-head"> <span class="doc-card-name">ä¸ç¬¦å工使§å¶åï¼å¤çåï¼</span> <el-tag :type="download.accordingStatus === 3 ? 'success' : 'info'" size="small"> {{ download.accordingStatus === 3 ? 'å·²æ¹å' : 'æªæ¹å' }} </el-tag> </div> <div class="doc-card-foot"> <el-button type="primary" :disabled="download.accordingStatus !== 3" @click="processingDown">导 åº</el-button> </div> </div> <div class="doc-card"> <div class="doc-card-head"> <span class="doc-card-name">çº æ£æªæ½å¤çåï¼çº æ£åï¼</span> <el-tag :type="download.correctStatus === 3 ? 'success' : 'info'" size="small"> {{ download.correctStatus === 3 ? 'å·²æ¹å' : 'æªæ¹å' }} </el-tag> </div> <div class="doc-card-foot"> <el-button type="primary" :disabled="download.correctStatus !== 3" @click="supervisoryDown">导 åº</el-button> </div> </div> <div class="down-tip"> ä» "å·²æ¹å"ç表åå¯å¯¼åºï¼ç°è²è¡¨ç¤ºå¯¹åºè¡¨åå°æªæ¹åæææ æ°æ® </div> <template #footer><span class="dialog-footer"> <el-button @click="downloadDialog = false">å æ¶</el-button> </span></template> @@ -131,7 +162,7 @@ import limsTable from "@/components/Table/lims-table.vue"; import { delQualitySupervise, delQualitySuperviseDetail, exportQualitySupervise, exportSuperviseDetailRecord, exportQualitySupervise, exportSuperviseDetailRecord, issueQualitySupervise, pageQualitySupervise, pageQualitySuperviseDetail, ratifyQualitySupervise, superviseDetailAccordingExport, exportSuperviseDetaillCorrect @@ -200,6 +231,25 @@ prop: 'ratifyTime', width: '160' }, { dataType: 'tag', label: 'ä¸åç¶æ', prop: 'issueStatus', width: '100', formatData: (params) => { if (params === 1) { return 'å·²ä¸å'; } else { return 'æªä¸å'; } }, formatType: (params) => { if (params === 1) { return 'success'; } else { return 'info'; } } }, { dataType: 'action', label: 'æä½', operation: [ @@ -215,6 +265,20 @@ }, clickFun: (row) => { this.approvalPlan(row) } }, { name: 'ä¸å', type: 'text', disabled: (row) => { if (row.ratifyStatus !== 1 || row.issueStatus === 1) { return true } else { return false } }, clickFun: (row) => { this.issuePlan(row) } }, { @@ -389,6 +453,13 @@ type: 'text', clickFun: (row) => { this.records(row) }, disabled: () => { if (this.currentPlan.issueStatus !== 1) { return true } else { return false } } }, { @@ -446,6 +517,7 @@ }, currentScrollPosition: 0, superviseId: '', currentPlan: {}, formDia: false, recordsDia: false, processingDia: false, @@ -562,8 +634,9 @@ this.getUserList() }, getUserList() { selectUserCondition({ type: 2 }).then((res) => { this.userList = res.data; // è´¨éçç£é¢åå ¨å®éªå®¤, 人ååè¡¨ä¸æé¨é¨çé selectUserCondition({ type: 1 }).then((res) => { this.userList = res.data || []; }) }, // æ¹å @@ -592,14 +665,29 @@ // å¯¼åº handleDown(row) { exportQualitySupervise({ superviseId: row.superviseId }).then(res => { try { this.outLoading = false const blob = new Blob([res], { type: 'application/msword' }); this.$download.saveAs(blob, row.superviseName + '.docx') } catch (error) { console.error('å建Blob对象æ¶åºé:', error); } this.outLoading = false this.saveDocx(res, row.superviseName + '.docx') }).catch(err => { console.log('err---', err); }) }, // ä¿åå¯¼åºæä»¶: å端导åºå¤±è´¥æ¶ä¼è¿åé误JSON, æ¤æ¶å¼¹æç¤ºè䏿¯åææåçdocx saveDocx(res, filename) { const reader = new FileReader(); reader.readAsText(res, 'utf-8'); reader.onload = () => { const text = (reader.result || '').trim(); if (text.startsWith('{') || text.startsWith('[')) { let msg = '导åºå¤±è´¥'; try { msg = JSON.parse(text).msg || msg; } catch (e) { } this.$message.error(msg); } else { this.$download.saveAs(new Blob([res], { type: 'application/msword' }), filename); } }; reader.onerror = () => { this.$download.saveAs(new Blob([res], { type: 'application/msword' }), filename); }; }, // å é¤è¿åº¦è®¡å表 delPlan(row) { @@ -627,7 +715,31 @@ // 年度计åè¡¨æ ¼ï¼ç¹å»è¡æ°æ®åå·æ°è¯¦æ rowClick(row) { this.superviseId = row.superviseId this.currentPlan = row this.getYearDetailPlan() }, // ä¸å计å issuePlan(row) { this.$confirm('ä¸ååçç£åä¸ç¸å ³æ£æµäººåå°æ¶å°éç¥, æ¯å¦ç»§ç»?', 'æç¤º', { confirmButtonText: 'ç¡®å®', cancelButtonText: 'åæ¶', type: 'warning' }).then(() => { this.yearLoading = true issueQualitySupervise({ superviseId: row.superviseId }).then(res => { this.yearLoading = false this.$message.success('ä¸åæå') this.getYearPlanList() }).catch(err => { this.yearLoading = false console.log('err---', err); }) }).catch(() => { this.$message({ type: 'info', message: '已忶ä¸å' }); }); }, getYearDetailPlan () { this.yearDetailPage.current = 1 @@ -715,8 +827,7 @@ // 导åºè®°å½ controlDown() { exportSuperviseDetailRecord({ superviseDetailsId: this.download.superviseDetailsId }).then(res => { const blob = new Blob([res], { type: 'application/msword' }); this.$download.saveAs(blob, 'è®°å½å¯¼åº.docx') this.saveDocx(res, 'è®°å½å¯¼åº.docx') }).catch(err => { console.log('err---', err); }) @@ -724,8 +835,7 @@ // å¤çåå¯¼åº processingDown() { superviseDetailAccordingExport({ superviseDetailsId: this.download.superviseDetailsId }).then(res => { const blob = new Blob([res], { type: 'application/msword' }); this.$download.saveAs(blob, 'ä¸ç¬¦å项导åº.docx') this.saveDocx(res, 'ä¸ç¬¦å项导åº.docx') }).catch(err => { console.log('err---', err); }) @@ -733,8 +843,9 @@ // çº æ£åå¯¼åº supervisoryDown() { exportSuperviseDetaillCorrect({ superviseDetailsCorrectId: this.download.superviseDetailsCorrectId }).then(res => { const blob = new Blob([res], { type: 'application/msword' }); this.$download.saveAs(blob, 'çç£çº æ£æªæ½.docx') this.saveDocx(res, 'çç£çº æ£æªæ½.docx') }).catch(err => { console.log('err---', err); }) }, // å é¤å¹´åº¦è¯¦æ å表 @@ -793,6 +904,37 @@ margin: 0 5px; } .doc-card { padding: 12px 16px; margin-bottom: 12px; background-color: #f7f8fa; border: 1px solid #ebeef5; border-radius: 6px; } .doc-card-head { display: flex; align-items: center; justify-content: space-between; } .doc-card-name { font-size: 14px; color: var(--lims-text-2, #303133); } .doc-card-foot { display: flex; justify-content: flex-end; margin-top: 10px; } .down-tip { margin-top: 10px; color: #909399; font-size: 12px; } .search { width: 150px; padding: 0 16px; src/views/CNAS/process/method/methodVerification/component/ViewDeviceDialog.vue
ÎļþÃû´Ó src/views/CNAS/process/method/standardMethodsChange/component/ViewDeviceDialog.vue ÐÞ¸Ä @@ -60,7 +60,7 @@ </template> <script> import { deviceScopeSearch } from '@/api/cnas/process/method/standardMethodsChange' import { deviceScopeSearch } from '@/api/cnas/process/method/methodVerification' export default { name: 'ViewDeviceDialog', src/views/CNAS/process/method/methodVerification/component/ViewTestRecord.vue
ÎļþÃû´Ó src/views/CNAS/process/method/standardMethodsChange/component/ViewTestRecord.vue ÐÞ¸Ä @@ -32,7 +32,7 @@ <script> import limsTable from '@/components/Table/lims-table.vue' import file from "@/utils/file"; import { delVerifyMethodFileList, getVerifyMethodFileList } from '@/api/cnas/process/method/standardMethodsChange' import { delVerifyMethodFileList, getVerifyMethodFileList } from '@/api/cnas/process/method/methodVerification' export default { name: 'ViewTestRecord', src/views/CNAS/process/method/methodVerification/component/calibrationsFileDia.vue
src/views/CNAS/process/method/methodVerification/component/formDIa.vue
@@ -1,12 +1,13 @@ <template> <div> <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="operationType === 'edit' ? 'ç¼è¾' : 'æ°å¢'" :title="operationType === 'edit' ? 'ç¼è¾' : operationType === 'view' ? '详æ ' : 'æ°å¢'" v-model="formDia" width="90%" @close="closeDia"> <div v-if="operationType === 'edit'" style="text-align: right"> <el-button :disabled="form.confirmDate" size="small" type="primary" @click="validation">éªè¯ç¡®è®¤</el-button> </div> <fieldset :disabled="operationType === 'view'" class="view-fieldset"> <table border="1" cellspacing="10" class="tables"> <tr> <td> @@ -202,6 +203,72 @@ </td> </tr> <tr> <td>æ°æ®å¤ç</td> <td colspan="7"> <el-input v-model="form.dataProcessing" :rows="2" placeholder="请è¾å ¥å 容" size="small" type="textarea"></el-input> </td> </tr> <tr> <td>è´¨éæ§å¶æ¹æ³</td> <td colspan="7"> <el-input v-model="form.qualityControlMethod" :rows="2" placeholder="请è¾å ¥å 容" size="small" type="textarea"></el-input> </td> </tr> <tr> <td>æ¹æ³ç»æéªè¯</td> <td colspan="7"> <el-input v-model="form.methodResultVerification" :rows="2" placeholder="请è¾å ¥å 容" size="small" type="textarea"></el-input> </td> </tr> <tr> <td>éªè¯ç»è®º</td> <td colspan="7"> <el-input v-model="form.verificationConclusion" :rows="2" placeholder="请è¾å ¥å 容" size="small" type="textarea"></el-input> </td> </tr> <tr> <td>è¯å®¡æè§</td> <td colspan="7"> <div class="opinion-box"> <div class="opinion-checks"> <el-checkbox :model-value="form.reviewResult === 'åæä½¿ç¨'" @change="toggleReview('åæä½¿ç¨', $event)">åæä½¿ç¨</el-checkbox> <el-checkbox :model-value="form.reviewResult === 'ä¸è½ä½¿ç¨'" @change="toggleReview('ä¸è½ä½¿ç¨', $event)">ä¸è½ä½¿ç¨</el-checkbox> <el-checkbox :model-value="form.reviewResult === 'éå¶ä½¿ç¨'" @change="toggleReview('éå¶ä½¿ç¨', $event)">éå¶ä½¿ç¨</el-checkbox> </div> <div class="opinion-sign"> <span>è¯å®¡äººåï¼</span> <el-input v-model="form.reviewPerson" placeholder="请è¾å ¥" size="small" style="width: 160px"></el-input> <el-date-picker v-model="form.reviewDate" format="YYYYå¹´MMæDDæ¥" placeholder="éæ©æ¥æ" size="small" type="date" value-format="YYYY-MM-DD" style="width: 170px"></el-date-picker> </div> </div> </td> </tr> <tr> <td>å®¡æ¹æè§</td> <td colspan="7"> <div class="opinion-box"> <div class="opinion-checks"> <el-checkbox :model-value="form.approvalResult === 'åæä½¿ç¨'" @change="toggleApproval('åæä½¿ç¨', $event)">åæä½¿ç¨</el-checkbox> <el-checkbox :model-value="form.approvalResult === 'ä¸è½ä½¿ç¨'" @change="toggleApproval('ä¸è½ä½¿ç¨', $event)">ä¸è½ä½¿ç¨</el-checkbox> <el-checkbox :model-value="form.approvalResult === 'éå¶ä½¿ç¨'" @change="toggleApproval('éå¶ä½¿ç¨', $event)">éå¶ä½¿ç¨</el-checkbox> </div> <div class="opinion-sign"> <span>ææ¯è´è´£äººï¼</span> <el-input v-model="form.approvalPerson" placeholder="请è¾å ¥" size="small" style="width: 160px"></el-input> <el-date-picker v-model="form.approvalDate" format="YYYYå¹´MMæDDæ¥" placeholder="éæ©æ¥æ" size="small" type="date" value-format="YYYY-MM-DD" style="width: 170px"></el-date-picker> </div> </div> </td> </tr> <tr> <td colspan="3"> <p>æ¯å¦å¼ç¨æ¤æ åå¼å±æ£æµ:</p> </td> @@ -216,15 +283,16 @@ <p>åå 确认人ç¾å:</p> </td> <td colspan="5"> <el-select v-model="form.confirmUser" multiple placeholder="è¯·éæ©" size="small" style="width: 100%" :multiple-limit="5"> <el-select v-model="form.confirmUser" :disabled="operationType === 'view'" multiple placeholder="è¯·éæ©" size="small" style="width: 100%" :multiple-limit="5"> <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option> </el-select> </td> </tr> </table> </fieldset> <template #footer><span class="dialog-footer"> <el-button @click="closeDia">å æ¶</el-button> <el-button :loading="editLoad" type="primary" @click="handleEdit">æ 交</el-button> <el-button v-if="operationType !== 'view'" :loading="editLoad" type="primary" @click="handleEdit">æ 交</el-button> </span></template> </el-dialog> <ViewDeviceDialog v-if="viewDeviceDialog" ref="viewDeviceDialog" @closDeviceDia="closDeviceDia" @handleDeviceInfo="handleDeviceInfo"></ViewDeviceDialog> @@ -236,17 +304,17 @@ <script> import { dateFormat } from '@/utils/date' import ViewDeviceDialog from '../../standardMethodsChange/component/ViewDeviceDialog.vue'; import ViewTestRecord from '../../standardMethodsChange/component/ViewTestRecord.vue'; import ViewWorkPermitDia from '../../standardMethodsChange/component/viewWorkPermitDia.vue'; import CalibrationsFileDia from '../../standardMethodsChange/component/calibrationsFileDia.vue'; import ViewDeviceDialog from './ViewDeviceDialog.vue'; import ViewTestRecord from './ViewTestRecord.vue'; import ViewWorkPermitDia from './viewWorkPermitDia.vue'; import CalibrationsFileDia from './calibrationsFileDia.vue'; import { addMethodVerify, getMethodVerifyOne, methodVerifyAffirm, updateMethodVerify } from '@/api/cnas/process/method/methodVerification' import { selectUserCondition } from '@/api/cnas/process/method/standardMethodsChange' import { selectUserCondition } from '@/api/cnas/process/method/methodVerification' export default { name: 'formDIa', // import å¼å ¥çç»ä»¶éè¦æ³¨å ¥å°å¯¹è±¡ä¸æè½ä½¿ç¨ @@ -294,6 +362,16 @@ otherReadiness: '', otherIsSatisfied: '', otherRemark: '', dataProcessing: '', qualityControlMethod: '', methodResultVerification: '', verificationConclusion: '', reviewResult: '', reviewPerson: '', reviewDate: '', approvalResult: '', approvalPerson: '', approvalDate: '', machineAttachmentList: [] }, editLoad: false, @@ -313,7 +391,7 @@ this.formDia = true this.info = row this.getUserList() if (this.operationType === 'edit') { if (this.operationType === 'edit' || this.operationType === 'view') { this.searchInfo(row) } }, @@ -341,6 +419,14 @@ } else { this.addInfo(processMethodSearchNews) } }, // è¯å®¡æè§å¾éï¼ä¸éä¸ï¼åç¹ä¸æ¬¡åæ¶ï¼ toggleReview (value, checked) { this.form.reviewResult = checked ? value : '' }, // å®¡æ¹æè§å¾éï¼ä¸éä¸ï¼åç¹ä¸æ¬¡åæ¶ï¼ toggleApproval (value, checked) { this.form.approvalResult = checked ? value : '' }, // æ¥çä¸å²è¯ viewWorkPermit () { @@ -445,6 +531,12 @@ width: 100%; margin-top: 10px; } .view-fieldset { border: none; margin: 0; padding: 0; min-width: 0; } .tables td { height: 34px; width: 100px; @@ -454,4 +546,25 @@ white-space: normal; padding: 4px; } .opinion-box { border: 1px solid var(--el-border-color); border-radius: 4px; min-height: 72px; padding: 8px 10px; display: flex; flex-direction: column; justify-content: space-between; gap: 8px; } .opinion-checks { display: flex; justify-content: flex-start; } .opinion-sign { display: flex; align-items: center; justify-content: flex-end; gap: 8px; font-size: 14px; } </style> src/views/CNAS/process/method/methodVerification/component/viewWorkPermitDia.vue
src/views/CNAS/process/method/methodVerification/index.vue
@@ -68,6 +68,13 @@ label: 'æä½', operation: [ { name: '详æ ', type: 'text', clickFun: (row) => { this.openFormDia('view', row); }, }, { name: 'ç¼è¾', type: 'text', clickFun: (row) => { src/views/CNAS/process/method/standardMethodsChange/component/formDIaChange.vue
ÎļþÒÑɾ³ý src/views/CNAS/process/method/standardMethodsChange/index.vue
ÎļþÒÑɾ³ý src/views/CNAS/resourceDemand/device/component/files.vue
@@ -180,176 +180,199 @@ <!-- 修订 --> <el-dialog title="æ¡£æ¡ä¿®è®¢" top="5vh" v-model="dialogVisible" width="70%" @open="openFileRevisionDialog" :before-close="handleClose"> <el-row style="display:flex;justify-content: space-around;max-height: 75vh;overflow-y: auto;"> <!-- 左边å¸å± --> <el-col :span="7"> <el-col> <!-- å¾ç --> <el-image class="img" style="width:100%;height: 320px;margin-bottom:16px" :src="javaApi + '/img/' + editData.imageUpload"> <template #error><div class="image-error" style="width: calc(100% - 2px); <div style="max-height: 75vh;overflow-y: auto;"> <!-- é¡¶é¨ï¼å¾ç + åºæ¬ä¿¡æ¯ --> <el-row> <el-col :span="7" style="padding-right: 20px;"> <!-- å¾ç --> <el-image class="img" style="width:100%;height: 320px;" :src="javaApi + '/img/' + editData.imageUpload"> <template #error><div class="image-error" style="width: calc(100% - 2px); height: 318px; border-radius: 16px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--lims-divider);"> <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon> </div></template> </el-image> <!-- 表å --> <el-form :model="editData" label-width="120px" ref="rules1" :rules="rules1"> <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon> </div></template> </el-image> <!-- å¾çä¸ä¼ --> <div style="margin-top: 12px;text-align: center;"> <div v-show="editData.imageName" class="picName">{{ editData.imageName }}</div> <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload" :on-error="onError" ref='upload' class="avatar-uploader"> <img v-if="editData.imageUpload" :src="javaApi + '/img/' + editData.imageUpload" class="avatar"> <lims-icon name="el-icon-plus" v-else class="avatar-uploader-icon"></lims-icon> </el-upload> </div> </el-col> <el-col :span="17"> <!-- åºæ¬ä¿¡æ¯ --> <div class="section-title" style="margin-top: 0;">åºæ¬ä¿¡æ¯</div> <el-form :model="editData" label-width="120px" ref="rules1" :rules="rules1"> <div class="form-row"> <el-form-item label="仪å¨åç§°:" prop="deviceName"> <el-input v-model="editData.deviceName" size="small"></el-input> </el-form-item> <el-form-item label="仪å¨åç§°EN:" prop="enDeviceName"> <el-input v-model="editData.enDeviceName" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="è§æ ¼åå·:" prop="specificationModel"> <el-input v-model="editData.specificationModel" size="small"></el-input> </el-form-item> <el-form-item label="ç产åå®¶:"> <el-input v-model="editData.manufacturer" size="small"></el-input> </el-form-item> </el-form> </el-col> </el-col> <!-- ä¸é´å¸å± --> <el-col :span="7"> <el-form :model="editData" label-width="116px" ref="rules2" :rules="rules1"> <el-form-item label="æ ¡åæå¡æºæ:"> <el-select v-model="editData.calibrationServices" 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-form-item label="èµäº§ç¼ç :"> <el-input v-model="editData.assetCode" size="small"></el-input> </el-form-item> <el-form-item label="产å°:"> <el-input v-model="editData.origin" size="small"></el-input> </el-form-item> <el-form-item label="åºåç¼å·:"> <el-input v-model="editData.factoryNo" size="small"></el-input> </el-form-item> <el-form-item label="管çç¼å·:" prop="managementNumber"> <el-input v-model="editData.managementNumber" size="small"></el-input> </el-form-item> <el-form-item label="è´ç½®æ¥æ:"> <el-date-picker style="width:100%" v-model="editData.acquisitionDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¡åæææ:" prop="activationDate"> <el-date-picker style="width:100%" v-model="editData.activationDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="è´è´£äºº:"> <el-select v-model="editData.equipmentManager" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in responsiblePersonList" :key="item.name" :label="item.name" :value="item.id"> </el-option> </el-select> </el-form-item> <el-form-item label="åæ¾ç¹:"> <el-input v-model="editData.storagePoint" size="small"></el-input> </el-form-item> <el-form-item label="ææ¯ææ :"> <el-input v-model="editData.technicalIndicators" :rows="7" type="textarea" size="small"></el-input> </el-form-item> </el-form> </el-col> <!-- å³è¾¹å¸å± --> <el-col :span="7"> <el-form :model="editData" label-width="140px" ref="ruleForm" :rules="rules1"> <el-form-item label="æ£æµé¡¹ç®:"> <el-cascader v-model="editData.insProductIds" :options="options" :show-all-levels="false" :props="props" placeholder="è¯·éæ©" size="small" style="width:100%;" :collapse-tags="true" separator="," filterable clearable></el-cascader> </el-form-item> <el-form-item label="æè¿æ ¡åæ¥æ:"> <el-date-picker style="width:100%" v-model="editData.lastCalibrationDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¡åæ¥æ:"> <el-date-picker style="width:100%" v-model="editData.nextCalibrationDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="设å¤ç±»å:"> <el-select v-model="editData.largeCategory" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="åä»·(ä¸å ):"> <el-input v-model="editData.unitPrice" size="small"></el-input> </el-form-item> <el-form-item label="å½åç¶æ:" prop="deviceStatus"> <el-select v-model="editData.deviceStatus" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="æ ¡åå¨æï¼æï¼:" prop="calibrationDate"> <el-input v-model="editData.calibrationDate" size="small"></el-input> </el-form-item> <el-form-item label="æè¿ä¿å »æ¥æ:"> <el-date-picker style="width:100%" v-model="editData.lastMaintenanceDate" @change="calcNextDate(editData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡ä¿å »æ¥æ:"> <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextMaintenanceDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="ä¿å »å¨æï¼æï¼:"> <el-input v-model="editData.maintenanceCycle" size="small" @change="calcNextDate(editData)"></el-input> </el-form-item> <el-form-item label="æè¿æ ¸æ¥æ¥æ:"> <el-date-picker style="width:100%" v-model="editData.lastExamineDate" @change="calcNextDate(editData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¸æ¥æ¥æ:"> <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextExamineDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¸æ¥å¨æï¼æï¼:"> <el-input v-model="editData.examineCycle" size="small" @change="calcNextDate(editData)"></el-input> </el-form-item> <el-form-item label="被ææäºº:"> <el-select v-model="editData.authorizedPerson" multiple placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in inspectorList" :key="item.name" :label="item.name" :value="item.id"> </el-option> </el-select> </el-form-item> <el-form-item label="å¾ç:"> <!-- <div style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;lineHeight:32px;display:flex;justify-content: space-around;font-size: 13px;"> <div v-show="Mdata.imageName" class="picName">{{ Mdata.imageName }}</div> <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" accept='image/jpg,image/jpeg,image/png' :headers="headers" :on-change="beforeUpload" :on-error="onError" ref='upload'> <el-button type="text" style="height:30px;padding-top:8px"><span v-if="Mdata.imageName"></span></el-button> </el-upload> </div> --> <div> <div v-show="editData.imageName" class="picName">{{ editData.imageName }}</div> <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload" :on-error="onError" ref='upload' class="avatar-uploader"> <img v-if="editData.imageUpload" :src="javaApi + '/img/' + editData.imageUpload" class="avatar"> <lims-icon name="el-icon-plus" v-else class="avatar-uploader-icon"></lims-icon> </el-upload> </div> </el-form-item> </div> <div class="form-row"> <el-form-item label="产å°:"> <el-input v-model="editData.origin" size="small"></el-input> </el-form-item> <el-form-item label="åºåç¼å·:"> <el-input v-model="editData.factoryNo" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="èµäº§ç¼ç :"> <el-input v-model="editData.assetCode" size="small"></el-input> </el-form-item> <el-form-item label="管çç¼å·:" prop="managementNumber"> <el-input v-model="editData.managementNumber" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="è´ç½®æ¥æ:"> <el-date-picker style="width:100%" v-model="editData.acquisitionDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¡åæææ:" prop="activationDate"> <el-date-picker style="width:100%" v-model="editData.activationDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> </div> <div class="form-row"> <el-form-item label="æ ¡åæå¡æºæ:"> <el-select v-model="editData.calibrationServices" 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> <div style="flex: 1;"></div> </div> </el-form> </el-col> </el-row> <!-- 设å¤ç®¡ç --> <div class="section-title">设å¤ç®¡ç</div> <el-form :model="editData" label-width="120px" ref="rules2" :rules="rules1"> <div class="form-row"> <el-form-item label="æ£æµé¡¹ç®:"> <el-cascader v-model="editData.insProductIds" :options="options" :show-all-levels="false" :props="props" placeholder="è¯·éæ©" size="small" style="width:100%;" :collapse-tags="true" separator="," filterable clearable></el-cascader> </el-form-item> <el-form-item label="设å¤ç±»å:"> <el-select v-model="editData.largeCategory" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="åä»·(ä¸å ):"> <el-input v-model="editData.unitPrice" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="å½åç¶æ:" prop="deviceStatus"> <el-select v-model="editData.deviceStatus" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="è´è´£äºº:"> <el-select v-model="editData.equipmentManager" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in responsiblePersonList" :key="item.name" :label="item.name" :value="item.id"> </el-option> </el-select> </el-form-item> <el-form-item label="被ææäºº:"> <el-select v-model="editData.authorizedPerson" multiple placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in inspectorList" :key="item.name" :label="item.name" :value="item.id"> </el-option> </el-select> </el-form-item> </div> <div class="form-row"> <el-form-item label="åæ¾ç¹:"> <el-input v-model="editData.storagePoint" size="small"></el-input> </el-form-item> <div style="flex: 1;"></div> </div> </el-form> <!-- æ ¡å/ä¿å »/æ ¸æ¥ å¨æä¿¡æ¯ --> <el-form :model="editData" :rules="rules1" ref="cycleForm" label-width="140px" style="margin-top: 12px;border-top: 1px solid var(--lims-divider);padding-top: 4px;"> <div class="cycle-row"> <span class="cycle-title">æ ¡åä¿¡æ¯</span> <el-form-item label="æè¿æ ¡åæ¥æ:" class="cycle-item"> <el-date-picker style="width:100%" v-model="editData.lastCalibrationDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¡åæ¥æ:" class="cycle-item"> <el-date-picker style="width:100%" v-model="editData.nextCalibrationDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¡åå¨æï¼æï¼:" prop="calibrationDate" class="cycle-item"> <el-input v-model="editData.calibrationDate" size="small"></el-input> </el-form-item> </div> <div class="cycle-row"> <span class="cycle-title">ä¿å »ä¿¡æ¯</span> <el-form-item label="æè¿ä¿å »æ¥æ:" class="cycle-item"> <el-date-picker style="width:100%" v-model="editData.lastMaintenanceDate" @change="calcNextDate(editData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡ä¿å »æ¥æ:" class="cycle-item"> <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextMaintenanceDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="ä¿å »å¨æï¼æï¼:" class="cycle-item"> <el-input v-model="editData.maintenanceCycle" size="small" @change="calcNextDate(editData)"></el-input> </el-form-item> </div> <div class="cycle-row"> <span class="cycle-title">æ ¸æ¥ä¿¡æ¯</span> <el-form-item label="æè¿æ ¸æ¥æ¥æ:" class="cycle-item"> <el-date-picker style="width:100%" v-model="editData.lastExamineDate" @change="calcNextDate(editData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¸æ¥æ¥æ:" class="cycle-item"> <el-date-picker :disabled="true" style="width:100%" v-model="editData.nextExamineDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¸æ¥å¨æï¼æï¼:" class="cycle-item"> <el-input v-model="editData.examineCycle" size="small" @change="calcNextDate(editData)"></el-input> </el-form-item> </div> </el-form> <!-- ææ¯ææ --> <div class="section-title">ææ¯ææ </div> <el-form :model="editData" ref="ruleForm" :rules="rules1"> <el-form-item> <el-input v-model="editData.technicalIndicators" :rows="7" type="textarea" size="small"></el-input> </el-form-item> </el-form> </div> <template #footer><span class="dialog-footer"> <el-row> <el-button @click="handleClose">å æ¶</el-button> @@ -734,6 +757,27 @@ this.tableDataA = res.data }) }, // 被ææäººåå²å¼å¯è½æ¯è¢«åå¤è½¬ä¹çå¤å± JSON å符串ï¼éå±è§£æè¿åææ°ç» normalizeAuthorizedPerson(val) { let v = val for (let i = 0; i < 10; i++) { if (typeof v !== 'string') break if (v === '') { v = [] break } try { v = JSON.parse(v) } catch (e) { v = [] break } } if (!Array.isArray(v)) { v = v === '' || v === null || v === undefined ? [] : [v] } return v.filter(x => x !== '' && x !== null && x !== undefined) }, // æ¶éæ°æ® getList(id) { selectDeviceByCode({ id }).then(res => { @@ -741,9 +785,7 @@ if (res.code == 200) { this.Mdata = res.data; this.Mdata.insProductIds = this.Mdata.insProductIds.split(',') if (this.Mdata.authorizedPerson) { this.Mdata.authorizedPerson = JSON.parse(this.Mdata.authorizedPerson) } this.Mdata.authorizedPerson = this.normalizeAuthorizedPerson(this.Mdata.authorizedPerson) } }); }, @@ -809,6 +851,12 @@ return false; } }); this.$refs['cycleForm'].validate((valid) => { if (!valid) { flag = false; return false; } }); if (!flag) { return; } @@ -820,11 +868,9 @@ const formData = this.HaveJson(this.editData) formData.userAllow = this.equipmentManager.toString(); formData.insProductIds = Array.isArray(formData.insProductIds) ? formData.insProductIds.join(',') : ''; if (formData.authorizedPerson.length === 0) { formData.authorizedPerson = '' } else { formData.authorizedPerson = JSON.stringify(formData.authorizedPerson) } formData.authorizedPerson = Array.isArray(formData.authorizedPerson) && formData.authorizedPerson.length ? JSON.stringify(formData.authorizedPerson) : '' this.upLoad = true; upDeviceParameter(formData).then(res => { this.$message.success('ä¿®æ¹æå') @@ -974,6 +1020,57 @@ width: 100%; } .cycle-row { display: flex; align-items: center; } .cycle-title { width: 68px; flex-shrink: 0; font-size: 13px; color: var(--lims-text-2, #909399); } .cycle-item { flex: 1; margin-bottom: 6px; margin-right: 10px; } .cycle-item:last-child { margin-right: 0; } .form-row { display: flex; gap: 16px; } .form-row > .el-form-item { flex: 1; } .section-title { position: relative; padding-left: 10px; margin: 14px 0 12px; font-size: 13px; font-weight: 600; color: var(--lims-text-1, #303133); } .section-title::before { content: ""; position: absolute; left: 0; top: 3px; bottom: 3px; width: 3px; border-radius: 2px; background: var(--el-color-primary, #409eff); } .el-image { position: relative; } src/views/CNAS/resourceDemand/device/component/management.vue
@@ -37,173 +37,201 @@ </div> <el-dialog :title="isUp ? '设å¤è¯¦æ ' : 'æ¡£æ¡ä¿®è®¢'" v-model="dialogVisible" width="70%" top="5vh" :before-close="handleClose"> <el-row style="display:flex;justify-content: space-around;max-height: 75vh;overflow-y: auto;"> <!-- 左边å¸å± --> <el-col :span="7"> <el-col> <!-- å¾ç --> <el-image class="img" style="width:100%;height: 320px;marginBottom:16px" :src="javaApi + '/img/' + formData.imageUpload"> <template #error><div class="image-error" style="width: calc(100% -2px); <div style="max-height: 75vh;overflow-y: auto;"> <!-- é¡¶é¨ï¼å¾ç + åºæ¬ä¿¡æ¯ --> <el-row> <el-col :span="7" style="padding-right: 20px;"> <!-- å¾ç --> <el-image class="img" style="width:100%;height: 320px" :src="javaApi + '/img/' + formData.imageUpload"> <template #error><div class="image-error" style="width: calc(100% -2px); height: 318px; border-radius: 16px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--lims-divider);"> <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon> </div></template> </el-image> <!-- 表å --> <el-form :label-position="labelPosition" :model="formData" label-width="120px"> <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon> </div></template> </el-image> <!-- å¾çä¸ä¼ --> <div style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;lineHeight:32px;display:flex;justify-content: space-around;font-size: 13px;margin-top:12px;"> <div v-show="formData.imageName" class="picName">{{ formData.imageName }}</div> <el-upload :disabled="isUp" :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload" :on-error="onError" ref='upload'> <el-button link type="primary" style="height:30px;padding-top:8px">ä¸ä¼ </el-button> </el-upload> </div> </el-col> <el-col :span="17"> <!-- åºæ¬ä¿¡æ¯ --> <div class="section-title" style="margin-top: 0;">åºæ¬ä¿¡æ¯</div> <el-form :label-position="labelPosition" :model="formData" label-width="120px"> <div class="form-row"> <el-form-item label="仪å¨åç§°:" required prop="deviceName"> <el-input :disabled="isUp" v-model="formData.deviceName" size="small"></el-input> </el-form-item> <el-form-item label="仪å¨åç§°EN:"> <el-input :disabled="isUp" v-model="formData.enDeviceName" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="è§æ ¼åå·:" required> <el-input :disabled="isUp" v-model="formData.specificationModel" size="small"></el-input> </el-form-item> <el-form-item label="ç产åå®¶:"> <el-input :disabled="isUp" v-model="formData.manufacturer" size="small"></el-input> </el-form-item> </el-form> </el-col> </el-col> <!-- ä¸é´å¸å± --> <el-col :span="7"> <el-form :label-position="labelPosition" :model="formData" label-width="116px"> <el-form-item label="æ ¡åæå¡æºæ:"> <el-select :disabled="isUp" v-model="formData.calibrationServices" 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-form-item label="èµäº§ç¼ç :"> <el-input v-model="formData.assetCode" :disabled="isUp" size="small"></el-input> </el-form-item> <el-form-item label="产å°:"> <el-input v-model="formData.origin" :disabled="isUp" size="small"></el-input> </el-form-item> <el-form-item label="åºåç¼å·:"> <el-input :disabled="isUp" v-model="formData.factoryNo" size="small"></el-input> </el-form-item> <el-form-item label="管çç¼å·:" required> <el-input :disabled="isUp" v-model="formData.managementNumber" size="small"></el-input> </el-form-item> <el-form-item label="è´ç½®æ¥æ:"> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.acquisitionDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¡åæææ:" required> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.activationDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="è´è´£äºº:"> <el-select v-model="formData.equipmentManager" placeholder="è¯·éæ©" size="small" :disabled="isUp" style="width:100%"> <el-option v-for="item in responsiblePersonList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="åæ¾ç¹:"> <el-input :disabled="isUp" v-model="formData.storagePoint" size="small"></el-input> </el-form-item> <el-form-item label="ææ¯ææ :"> <el-input :disabled="isUp" v-model="formData.technicalIndicators" :rows="7" type="textarea" size="small"></el-input> </el-form-item> </el-form> </el-col> <!-- å³è¾¹å¸å± --> <el-col :span="7"> <el-form :label-position="labelPosition" :model="formData" label-width="140px" ref="ruleForm"> <el-form-item label="æ£æµé¡¹ç®:"> <el-cascader :disabled="isUp" v-model="formData.insProductIds" :options="options" :show-all-levels="false" :props="props" placeholder="è¯·éæ©" size="small" style="width:100%;" :collapse-tags="!isUp" separator="," filterable clearable></el-cascader> </el-form-item> <el-form-item label="æè¿æ ¡åæ¥æ:"> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastCalibrationDate" @change="calcNextDate(formData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¡åæ¥æ:"> <el-date-picker :disabled="true" style="width:100%" v-model="formData.nextCalibrationDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="设å¤ç±»å:"> <el-select :disabled="isUp" v-model="formData.largeCategory" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="åä»·(ä¸å ):"> <el-input :disabled="isUp" v-model="formData.unitPrice" size="small"></el-input> </el-form-item> <el-form-item label="å½åç¶æ:" required> <el-select :disabled="isUp" v-model="formData.deviceStatus" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="æ ¡åå¨æï¼æï¼:" required> <el-input :disabled="isUp" v-model="formData.calibrationDate" size="small" @change="calcNextDate(formData)"></el-input> </el-form-item> <el-form-item label="æè¿ä¿å »æ¥æ:"> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastMaintenanceDate" @change="calcNextDate(formData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡ä¿å »æ¥æ:"> <el-date-picker :disabled="true" style="width:100%" v-model="formData.nextMaintenanceDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="ä¿å »å¨æï¼æï¼:"> <el-input :disabled="isUp" v-model="formData.maintenanceCycle" size="small" @change="calcNextDate(formData)"></el-input> </el-form-item> <el-form-item label="æè¿æ ¸æ¥æ¥æ:"> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastExamineDate" @change="calcNextDate(formData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¸æ¥æ¥æ:"> <el-date-picker :disabled="true" style="width:100%" v-model="formData.nextExamineDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¸æ¥å¨æï¼æï¼:"> <el-input :disabled="isUp" v-model="formData.examineCycle" size="small" @change="calcNextDate(formData)"></el-input> </el-form-item> <el-form-item label="被ææäºº:"> <el-select v-model="formData.authorizedPerson" multiple :disabled="isUp" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in inspectorList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="å¾ç:"> <div style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;lineHeight:32px;display:flex;justify-content: space-around;font-size: 13px;"> <div v-show="formData.imageName" class="picName">{{ formData.imageName }}</div> <el-upload :disabled="isUp" :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload" :on-error="onError" ref='upload'> <el-button link type="primary" style="height:30px;padding-top:8px">ä¸ä¼ </el-button> </el-upload> </div> </el-form-item> </div> <div class="form-row"> <el-form-item label="产å°:"> <el-input v-model="formData.origin" :disabled="isUp" size="small"></el-input> </el-form-item> <el-form-item label="åºåç¼å·:"> <el-input :disabled="isUp" v-model="formData.factoryNo" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="èµäº§ç¼ç :"> <el-input v-model="formData.assetCode" :disabled="isUp" size="small"></el-input> </el-form-item> <el-form-item label="管çç¼å·:" required> <el-input :disabled="isUp" v-model="formData.managementNumber" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="è´ç½®æ¥æ:"> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.acquisitionDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¡åæææ:" required> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.activationDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> </div> <div class="form-row"> <el-form-item label="æ ¡åæå¡æºæ:"> <el-select :disabled="isUp" v-model="formData.calibrationServices" 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> <div style="flex: 1;"></div> </div> </el-form> </el-col> </el-row> <!-- 设å¤ç®¡ç --> <div class="section-title">设å¤ç®¡ç</div> <el-form :label-position="labelPosition" :model="formData" label-width="120px"> <div class="form-row"> <el-form-item label="æ£æµé¡¹ç®:"> <el-cascader :disabled="isUp" v-model="formData.insProductIds" :options="options" :show-all-levels="false" :props="props" placeholder="è¯·éæ©" size="small" style="width:100%;" :collapse-tags="!isUp" separator="," filterable clearable></el-cascader> </el-form-item> <el-form-item label="设å¤ç±»å:"> <el-select :disabled="isUp" v-model="formData.largeCategory" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="åä»·(ä¸å ):"> <el-input :disabled="isUp" v-model="formData.unitPrice" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="å½åç¶æ:" required> <el-select :disabled="isUp" v-model="formData.deviceStatus" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="è´è´£äºº:"> <el-select v-model="formData.equipmentManager" placeholder="è¯·éæ©" size="small" :disabled="isUp" style="width:100%"> <el-option v-for="item in responsiblePersonList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="被ææäºº:"> <el-select v-model="formData.authorizedPerson" multiple :disabled="isUp" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in inspectorList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> </div> <div class="form-row"> <el-form-item label="åæ¾ç¹:"> <el-input :disabled="isUp" v-model="formData.storagePoint" size="small"></el-input> </el-form-item> <div style="flex: 1;"></div> </div> </el-form> <!-- æ ¡å/ä¿å »/æ ¸æ¥ å¨æä¿¡æ¯ --> <el-form :label-position="labelPosition" :model="formData" label-width="140px" style="margin-top: 12px;border-top: 1px solid var(--lims-divider);padding-top: 4px;"> <div class="cycle-row"> <span class="cycle-title">æ ¡åä¿¡æ¯</span> <el-form-item label="æè¿æ ¡åæ¥æ:" class="cycle-item"> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastCalibrationDate" @change="calcNextDate(formData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¡åæ¥æ:" class="cycle-item"> <el-date-picker :disabled="true" style="width:100%" v-model="formData.nextCalibrationDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¡åå¨æï¼æï¼:" class="cycle-item" required> <el-input :disabled="isUp" v-model="formData.calibrationDate" size="small" @change="calcNextDate(formData)"></el-input> </el-form-item> </div> <div class="cycle-row"> <span class="cycle-title">ä¿å »ä¿¡æ¯</span> <el-form-item label="æè¿ä¿å »æ¥æ:" class="cycle-item"> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastMaintenanceDate" @change="calcNextDate(formData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡ä¿å »æ¥æ:" class="cycle-item"> <el-date-picker :disabled="true" style="width:100%" v-model="formData.nextMaintenanceDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="ä¿å »å¨æï¼æï¼:" class="cycle-item"> <el-input :disabled="isUp" v-model="formData.maintenanceCycle" size="small" @change="calcNextDate(formData)"></el-input> </el-form-item> </div> <div class="cycle-row"> <span class="cycle-title">æ ¸æ¥ä¿¡æ¯</span> <el-form-item label="æè¿æ ¸æ¥æ¥æ:" class="cycle-item"> <el-date-picker :disabled="isUp" style="width:100%" v-model="formData.lastExamineDate" @change="calcNextDate(formData)" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¸æ¥æ¥æ:" class="cycle-item"> <el-date-picker :disabled="true" style="width:100%" v-model="formData.nextExamineDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¸æ¥å¨æï¼æï¼:" class="cycle-item"> <el-input :disabled="isUp" v-model="formData.examineCycle" size="small" @change="calcNextDate(formData)"></el-input> </el-form-item> </div> </el-form> <!-- ææ¯ææ --> <div class="section-title">ææ¯ææ </div> <el-input :disabled="isUp" v-model="formData.technicalIndicators" :rows="7" type="textarea" size="small"></el-input> </div> <template #footer><span class="dialog-footer"> <el-row v-if="!isUp" justify="end"> <el-button @click="handleClose">å æ¶</el-button> @@ -213,146 +241,166 @@ </el-dialog> <!-- æ°å¢--> <el-dialog title="æ°å¢è®¾å¤" top="5vh" v-model="dialogVisible2" width="70%" :before-close="handleClose2"> <el-row style="display:flex;justify-content: space-around;"> <!-- 左边å¸å± --> <el-col :span="7"> <el-col> <!-- å¾ç --> <el-image class="img" style="width:100%;height: 320px;margin-bottom:16px" :src="javaApi + '/img/' + formData2.imageUpload"> <template #error><div class="image-error" style="width: calc(100% -2px); height: 318px; border-radius: 16px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--lims-divider);"> <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon> </div></template> </el-image> <!-- 表å --> <el-form :label-position="labelPosition" :model="formData2" label-width="120px"> <div style="max-height: 75vh;overflow-y: auto;"> <!-- é¡¶é¨ï¼å¾ç + åºæ¬ä¿¡æ¯ --> <el-row> <el-col :span="7" style="padding-right: 20px;"> <!-- å¾ç --> <el-image class="img" style="width:100%;height: 320px" :src="javaApi + '/img/' + formData2.imageUpload"> <template #error><div class="image-error" style="width: calc(100% -2px); height: 318px; border-radius: 16px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--lims-divider);"> <lims-icon name="el-icon-picture-outline" style="font-size:60px;color:var(--lims-text-2);"></lims-icon> </div></template> </el-image> <!-- å¾çä¸ä¼ --> <div style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;line-height:32px;display:flex;justify-content: space-around;font-size: 13px;margin-top:12px;"> <div v-show="formData2.imageName" class="picName">{{ formData2.imageName }}</div> <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload" :on-error="onError" ref='upload'> <el-button link type="primary" style="height:30px;padding-top:8px">ä¸ä¼ </el-button> </el-upload> </div> </el-col> <el-col :span="17"> <!-- åºæ¬ä¿¡æ¯ --> <div class="section-title" style="margin-top: 0;">åºæ¬ä¿¡æ¯</div> <el-form :label-position="labelPosition" :model="formData2" label-width="120px"> <div class="form-row"> <el-form-item label="仪å¨åç§°:" required> <el-input v-model="formData2.deviceName" size="small"></el-input> </el-form-item> <el-form-item label="仪å¨åç§°EN:"> <el-input v-model="formData2.enDeviceName" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="è§æ ¼åå·:" required> <el-input v-model="formData2.specificationModel" size="small"></el-input> </el-form-item> <el-form-item label="ç产åå®¶:"> <el-input v-model="formData2.manufacturer" size="small"></el-input> </el-form-item> </el-form> </el-col> </el-col> <!-- ä¸é´å¸å± --> <el-col :span="7"> <el-form :label-position="labelPosition" :model="formData2" label-width="110px"> <!-- <el-form-item label="ç产åå®¶EN:"> <el-input v-model="formData2.factoryNo" size="small"></el-input> </el-form-item> --> <el-form-item label="æ ¡åæå¡æºæ:"> <el-select v-model="formData2.calibrationServices" clearable filterable size="small" style="width: 100%"> <el-option v-for="name in calibrationServiceOptions2" :key="name" :label="name" :value="name"></el-option> </el-select> </el-form-item> <el-form-item label="èµäº§ç¼ç :"> <el-input v-model="formData2.assetCode" size="small"></el-input> </el-form-item> <el-form-item label="产å°:"> <el-input v-model="formData2.origin" size="small"></el-input> </el-form-item> <el-form-item label="åºåç¼å·:"> <el-input v-model="formData2.factoryNo" size="small"></el-input> </el-form-item> <el-form-item label="管çç¼å·:" required> <el-input v-model="formData2.managementNumber" size="small"></el-input> </el-form-item> <el-form-item label="è´ç½®æ¥æ:"> <el-date-picker style="width:100%" v-model="formData2.acquisitionDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¡åæææ:" required> <el-date-picker style="width:100%" v-model="formData2.activationDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="è´è´£äºº:"> <el-select v-model="formData2.equipmentManager" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in responsiblePersonList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="åæ¾ç¹:"> <el-input v-model="formData2.storagePoint" size="small"></el-input> </el-form-item> <el-form-item label="ææ¯ææ :"> <el-input v-model="formData2.technicalIndicators" :rows="7" type="textarea" size="small"></el-input> </el-form-item> </el-form> </el-col> <!-- å³è¾¹å¸å± --> <el-col :span="7"> <el-form :label-position="labelPosition" :model="formData2" label-width="120px" ref="ruleForm"> <el-form-item label="æ£æµé¡¹ç®:"> <el-cascader v-model="formData2.insProductIds" :options="options" :show-all-levels="false" :props="props" placeholder="è¯·éæ©" size="small" style="width:100%" collapse-tags separator="," filterable clearable></el-cascader> </el-form-item> <el-form-item label="æè¿æ ¡åæ¥æ:"> <el-date-picker style="width:100%" v-model="formData2.lastCalibrationDate" format="YYYY-MM-DD" @change="calcNextDate(formData2)" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¡åæ¥æ:"> <el-date-picker :disabled="true" style="width:100%" v-model="formData2.nextCalibrationDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="设å¤ç±»å:"> <el-select v-model="formData2.largeCategory" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="åä»·(ä¸å ):"> <el-input v-model="formData2.unitPrice" size="small"></el-input> </el-form-item> <el-form-item label="å½åç¶æ:" required> <el-select v-model="formData2.deviceStatus" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="æ ¡åå¨æï¼æï¼:" required> <el-input v-model="formData2.calibrationDate" size="small" @change="calcNextDate(formData2)"></el-input> </el-form-item> <el-form-item label="被ææäºº:"> <el-select v-model="formData2.authorizedPerson" multiple placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in inspectorList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="å¾ç:"> <div style="border: 1px solid var(--el-border-color);border-radius:4px;height:32px;line-height:32px;display:flex;justify-content: space-around;font-size: 13px;"> <div v-show="formData2.imageName" class="picName">{{ formData2.imageName }}</div> <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" accept='image/jpg,image/jpeg,image/png' :headers="uploadHeader" :on-change="beforeUpload" :on-error="onError" ref='upload'> <el-button link type="primary" style="height:30px;padding-top:8px">ä¸ä¼ </el-button> </el-upload> </div> </el-form-item> </div> <div class="form-row"> <el-form-item label="产å°:"> <el-input v-model="formData2.origin" size="small"></el-input> </el-form-item> <el-form-item label="åºåç¼å·:"> <el-input v-model="formData2.factoryNo" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="èµäº§ç¼ç :"> <el-input v-model="formData2.assetCode" size="small"></el-input> </el-form-item> <el-form-item label="管çç¼å·:" required> <el-input v-model="formData2.managementNumber" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="è´ç½®æ¥æ:"> <el-date-picker style="width:100%" v-model="formData2.acquisitionDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¡åæææ:" required> <el-date-picker style="width:100%" v-model="formData2.activationDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> </div> <div class="form-row"> <el-form-item label="æ ¡åæå¡æºæ:"> <el-select v-model="formData2.calibrationServices" clearable filterable size="small" style="width: 100%"> <el-option v-for="name in calibrationServiceOptions2" :key="name" :label="name" :value="name"></el-option> </el-select> </el-form-item> <div style="flex: 1;"></div> </div> </el-form> </el-col> </el-row> <!-- 设å¤ç®¡ç --> <div class="section-title">设å¤ç®¡ç</div> <el-form :label-position="labelPosition" :model="formData2" label-width="120px"> <div class="form-row"> <el-form-item label="æ£æµé¡¹ç®:"> <el-cascader v-model="formData2.insProductIds" :options="options" :show-all-levels="false" :props="props" placeholder="è¯·éæ©" size="small" style="width:100%" collapse-tags separator="," filterable clearable></el-cascader> </el-form-item> <el-form-item label="设å¤ç±»å:"> <el-select v-model="formData2.largeCategory" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in equipmentList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="åä»·(ä¸å ):"> <el-input v-model="formData2.unitPrice" size="small"></el-input> </el-form-item> </div> <div class="form-row"> <el-form-item label="å½åç¶æ:" required> <el-select v-model="formData2.deviceStatus" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in deviceStatusList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="è´è´£äºº:"> <el-select v-model="formData2.equipmentManager" placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in responsiblePersonList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="被ææäºº:"> <el-select v-model="formData2.authorizedPerson" multiple placeholder="è¯·éæ©" size="small" style="width:100%"> <el-option v-for="item in inspectorList" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> </div> <div class="form-row"> <el-form-item label="åæ¾ç¹:"> <el-input v-model="formData2.storagePoint" size="small"></el-input> </el-form-item> <div style="flex: 1;"></div> </div> </el-form> <!-- æ ¡åä¿¡æ¯ --> <el-form :label-position="labelPosition" :model="formData2" label-width="140px" style="margin-top: 12px;border-top: 1px solid var(--lims-divider);padding-top: 4px;"> <div class="cycle-row"> <span class="cycle-title">æ ¡åä¿¡æ¯</span> <el-form-item label="æè¿æ ¡åæ¥æ:" class="cycle-item"> <el-date-picker style="width:100%" v-model="formData2.lastCalibrationDate" format="YYYY-MM-DD" @change="calcNextDate(formData2)" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="䏿¬¡æ ¡åæ¥æ:" class="cycle-item"> <el-date-picker :disabled="true" style="width:100%" v-model="formData2.nextCalibrationDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" type="date" size="small" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ ¡åå¨æï¼æï¼:" class="cycle-item" required> <el-input v-model="formData2.calibrationDate" size="small" @change="calcNextDate(formData2)"></el-input> </el-form-item> </div> </el-form> <!-- ææ¯ææ --> <div class="section-title">ææ¯ææ </div> <el-input v-model="formData2.technicalIndicators" :rows="7" type="textarea" size="small"></el-input> </div> <template #footer><span class="dialog-footer"> <el-row justify="end"> <el-button @click="handleClose2">å æ¶</el-button> @@ -613,6 +661,27 @@ handleNotification(cate) { this.queryParams.largeCategory = cate }, // 被ææäººåå²å¼å¯è½æ¯è¢«åå¤è½¬ä¹çå¤å± JSON å符串ï¼éå±è§£æè¿åææ°ç» normalizeAuthorizedPerson(val) { let v = val for (let i = 0; i < 10; i++) { if (typeof v !== 'string') break if (v === '') { v = [] break } try { v = JSON.parse(v) } catch (e) { v = [] break } } if (!Array.isArray(v)) { v = v === '' || v === null || v === undefined ? [] : [v] } return v.filter(x => x !== '' && x !== null && x !== undefined) }, getList() { this.tableLoading = true; let param = { ...this.queryParams, ...this.page }; @@ -770,6 +839,7 @@ //row = ç¹å»å¯¹åºè¡å¼ //å¤å¶ç»formData this.formData = this.HaveJson(row); this.formData.authorizedPerson = this.normalizeAuthorizedPerson(row.authorizedPerson); console.log(row.insProductIds + 'valll'); this.formData.insProductIds = row.insProductIds ? row.insProductIds.split(',') : []; }, @@ -781,6 +851,7 @@ //row = ç¹å»å¯¹åºè¡å¼ä¸è¡å¼ //å¤å¶ç»formData this.formData = this.HaveJson(row); this.formData.authorizedPerson = this.normalizeAuthorizedPerson(row.authorizedPerson); if (typeof (row.insProductIds) === 'number') { row.insProductIds = row.insProductIds + '' } @@ -879,11 +950,9 @@ delete this.formData.updateUser const formData = this.HaveJson(this.formData) formData.insProductIds = formData.insProductIds ? formData.insProductIds.join() : '' if (formData.authorizedPerson && formData.authorizedPerson.length === 0) { formData.authorizedPerson = '' } else { formData.authorizedPerson = JSON.stringify(formData.authorizedPerson) } formData.authorizedPerson = Array.isArray(formData.authorizedPerson) && formData.authorizedPerson.length ? JSON.stringify(formData.authorizedPerson) : '' this.upLoad = true; upDeviceParameter(formData).then(res => { this.$message.success('ä¿®æ¹æå') @@ -924,11 +993,9 @@ } const formData = this.HaveJson(this.formData2) formData.insProductIds = formData.insProductIds ? formData.insProductIds.join() : '' if (formData.authorizedPerson.length === 0) { formData.authorizedPerson = '' } else { formData.authorizedPerson = JSON.stringify(formData.authorizedPerson) } formData.authorizedPerson = Array.isArray(formData.authorizedPerson) && formData.authorizedPerson.length ? JSON.stringify(formData.authorizedPerson) : '' this.upLoad2 = true; addDeviceParameter(formData).then(res => { this.$message.success('æäº¤æå') @@ -1075,4 +1142,54 @@ .form-item :deep(.el-form-item__content) { width: 120px; } .cycle-row { display: flex; align-items: center; } .cycle-title { width: 68px; flex-shrink: 0; font-size: 13px; color: var(--lims-text-2, #909399); } .cycle-item { flex: 1; margin-bottom: 6px; margin-right: 10px; } .cycle-item:last-child { margin-right: 0; } .form-row { display: flex; gap: 16px; } .form-row > .el-form-item { flex: 1; } .section-title { position: relative; padding-left: 10px; margin: 14px 0 12px; font-size: 13px; font-weight: 600; color: var(--lims-text-1, #303133); } .section-title::before { content: ""; position: absolute; left: 0; top: 3px; bottom: 3px; width: 3px; border-radius: 2px; background: var(--el-color-primary, #409eff); } </style>