| | |
| | | import request from '@/utils/request' |
| | | |
| | | // 䏿¥æ¡ä¾æ°å¢ |
| | | export function relativesAdd(data) { |
| | | return request({ |
| | | url: '/project/relativesconfirmation/add', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // 䏿¥æ¡ä¾ä¿®æ¹ |
| | | export function relativesEdit(data) { |
| | | return request({ |
| | | url: '/project/relativesconfirmation/edit', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | // 䏿¥æ¡ä¾å表 |
| | | export function relativesList(data) { |
| | | return request({ |
| | | url: '/project/relativesconfirmation/confirmationBaseInfoList', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ¡ä¾è¯¦æ
|
| | | export function relativesInfo(id) { |
| | | return request({ |
| | | url: '/project/relativesconfirmation/getInfo/' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // å é¤ |
| | | export function relativesDel(id) { |
| | | return request({ |
| | | url: '/project/relativesconfirmation/remove/' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | |
| | | // 䏿¥æ¡ä¾æ°å¢ |
| | | export function assessAdd(data) { |
| | | return request({ |
| | | url: '/project/assessbaseinforeport/add', |
| | | url: '/project/medicalevaluation/add', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | // 䏿¥æ¡ä¾æ°å¢ |
| | | export function assessedit(data) { |
| | | return request({ |
| | | url: '/project/medicalevaluation/edit', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | |
| | | // æ¡ä¾å表å详æ
|
| | | export function evaluateBaseInfolist(data) { |
| | | return request({ |
| | | url: '/project/medicalevaluation/evaluateBaseInfolist', |
| | | url: '/project/medicalevaluation/medevaluateBaseInfolist', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // æ¥è¯¢æç®åºç¡å表 |
| | | export function listDonatebaseinfo(query) { |
| | | export function listDonatebaseinfo(data) { |
| | | return request({ |
| | | url: '/project/donatebaseinfo/list', |
| | | method: 'get', |
| | | params: query |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | export function listDonationProcess(query) { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <!-- ç»æ¢ç¡®è®¤å¼¹æ¡ --> |
| | | <el-dialog |
| | | :title="terminateTitle" |
| | | :visible.sync="terminateVisible" |
| | | width="800px" |
| | | append-to-body |
| | | :close-on-click-modal="false" |
| | | @close="handleTerminateClose" |
| | | > |
| | | <div class="patient-info"> |
| | | <el-alert |
| | | :title=" |
| | | `å½åæä½æ£è
ï¼${currentRecord.name} (${currentRecord.idcardno || |
| | | 'æ è¯ä»¶å·'})` |
| | | " |
| | | type="info" |
| | | :closable="false" |
| | | show-icon |
| | | /> |
| | | </div> |
| | | |
| | | <el-form |
| | | :model="terminateForm" |
| | | :rules="terminateRules" |
| | | ref="terminateFormRef" |
| | | label-width="100px" |
| | | class="terminate-form" |
| | | > |
| | | <el-form-item label="ç»æ¢ç±»å" prop="terminationType"> |
| | | <el-select |
| | | v-model="terminateForm.terminationType" |
| | | placeholder="è¯·éæ©ç»æ¢ç±»å" |
| | | style="width: 100%;" |
| | | > |
| | | <el-option |
| | | v-for="item in terminationTypes" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="详ç»åå " prop="terminationResult"> |
| | | <el-input |
| | | v-model="terminateForm.terminationResult" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥ç»æ¢ç详ç»åå " |
| | | maxlength="200" |
| | | show-word-limit |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="äºæ¬¡ç¡®è®¤" prop="confirmText"> |
| | | <el-input |
| | | v-model="terminateForm.confirmText" |
| | | placeholder="请è¾å
¥'ç¡®è®¤ç»æ¢'以宿æä½" |
| | | @input="handleConfirmTextChange" |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <div slot="footer"> |
| | | <el-button @click="handleTerminateClose" :disabled="terminateLoading" |
| | | >åæ¶</el-button |
| | | > |
| | | <el-button |
| | | type="danger" |
| | | :disabled="!canSubmitTerminate" |
| | | @click="handleTerminateSubmit" |
| | | :loading="terminateLoading" |
| | | > |
| | | ç¡®è®¤ç»æ¢ |
| | | </el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- æ¢å¤ç¡®è®¤å¼¹æ¡ --> |
| | | <el-dialog |
| | | :title="restoreTitle" |
| | | :visible.sync="restoreVisible" |
| | | width="600px" |
| | | append-to-body |
| | | :close-on-click-modal="false" |
| | | > |
| | | <div class="patient-info"> |
| | | <el-alert |
| | | :title=" |
| | | `å½åæä½æ£è
ï¼${currentRecord.name} (${currentRecord.idcardno || |
| | | 'æ è¯ä»¶å·'})` |
| | | " |
| | | type="info" |
| | | :closable="false" |
| | | show-icon |
| | | /> |
| | | </div> |
| | | |
| | | <div style="margin: 20px 0;"> |
| | | <p> |
| | | ç¡®å®è¦æ¢å¤æç®è
|
| | | <strong>{{ currentRecord.name }}</strong> çæç®è¿ç¨åï¼ |
| | | </p> |
| | | <p style="color: #67c23a; font-size: 12px; margin-top: 10px;"> |
| | | æ¢å¤åï¼è¯¥æ¡ä¾å°éæ°è¿å
¥æç®æµç¨ |
| | | </p> |
| | | </div> |
| | | <div slot="footer"> |
| | | <el-button @click="restoreVisible = false" :disabled="restoreLoading" |
| | | >åæ¶</el-button |
| | | > |
| | | <el-button |
| | | type="success" |
| | | @click="handleRestoreSubmit" |
| | | :loading="restoreLoading" |
| | | > |
| | | 确认æ¢å¤ |
| | | </el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { updateDonatebaseinfo } from "@/api/project/donatebaseinfo"; |
| | | |
| | | export default { |
| | | name: "TerminateRestoreModal", |
| | | props: { |
| | | // å½åæä½è®°å½ |
| | | currentRecord: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | // å¼¹æ¡æ¾ç¤ºç¶æ |
| | | visible: { |
| | | type: Object, |
| | | default: () => ({ |
| | | terminate: false, |
| | | restore: false |
| | | }) |
| | | }, |
| | | // èªå®ä¹æ é¢ |
| | | titles: { |
| | | type: Object, |
| | | default: () => ({ |
| | | terminate: "ç»æ¢æç®è¿ç¨", |
| | | restore: "æ¢å¤æç®è¿ç¨" |
| | | }) |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | // ç»æ¢è¡¨å |
| | | terminateForm: { |
| | | terminationType: "", |
| | | terminationResult: "", |
| | | confirmText: "" |
| | | }, |
| | | // ç»æ¢ç±»åé项 |
| | | terminationTypes: [ |
| | | { label: "好转", value: "1" }, |
| | | { label: "æ»äº¡", value: "2" }, |
| | | { label: "ä¸ç¬¦åæç®è¿ç¨", value: "3" }, |
| | | { label: "家屿¾å¼æç®", value: "4" }, |
| | | { label: "å
¶ä»", value: "5" } |
| | | ], |
| | | // éªè¯è§å |
| | | terminateRules: { |
| | | terminationType: [ |
| | | { required: true, message: "è¯·éæ©ç»æ¢ç±»å", trigger: "change" } |
| | | ], |
| | | terminationResult: [ |
| | | { required: true, message: "请è¾å
¥ç»æ¢åå ", trigger: "blur" }, |
| | | { min: 5, message: "ç»æ¢åå è³å°5个å符", trigger: "blur" } |
| | | ] |
| | | }, |
| | | // å è½½ç¶æ |
| | | terminateLoading: false, |
| | | restoreLoading: false, |
| | | // æ§å¶æäº¤ |
| | | canSubmitTerminate: false |
| | | }; |
| | | }, |
| | | computed: { |
| | | terminateVisible: { |
| | | get() { |
| | | return this.visible.terminate; |
| | | }, |
| | | set(value) { |
| | | this.$emit("update:visible", { ...this.visible, terminate: value }); |
| | | } |
| | | }, |
| | | restoreVisible: { |
| | | get() { |
| | | return this.visible.restore; |
| | | }, |
| | | set(value) { |
| | | this.$emit("update:visible", { ...this.visible, restore: value }); |
| | | } |
| | | }, |
| | | terminateTitle() { |
| | | return this.titles.terminate; |
| | | }, |
| | | restoreTitle() { |
| | | return this.titles.restore; |
| | | }, |
| | | // æ£è
ä¿¡æ¯æ¾ç¤º |
| | | patientInfo() { |
| | | return `${this.currentRecord.name} (${this.currentRecord.idcardno || |
| | | "æ è¯ä»¶å·"})`; |
| | | } |
| | | }, |
| | | watch: { |
| | | "visible.terminate": { |
| | | handler(newVal) { |
| | | if (newVal) { |
| | | this.resetTerminateForm(); |
| | | } |
| | | }, |
| | | immediate: true |
| | | } |
| | | }, |
| | | methods: { |
| | | /** éç½®ç»æ¢è¡¨å */ |
| | | resetTerminateForm() { |
| | | this.terminateForm = { |
| | | terminationType: "", |
| | | terminationResult: "", |
| | | confirmText: "" |
| | | }; |
| | | this.canSubmitTerminate = false; |
| | | this.terminateLoading = false; |
| | | |
| | | // é置表åéªè¯ |
| | | this.$nextTick(() => { |
| | | if (this.$refs.terminateFormRef) { |
| | | this.$refs.terminateFormRef.clearValidate(); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | /** ç¡®è®¤ææ¬ååå¤ç */ |
| | | handleConfirmTextChange(value) { |
| | | this.canSubmitTerminate = value === "ç¡®è®¤ç»æ¢"; |
| | | }, |
| | | |
| | | /** ç»æ¢å¼¹æ¡å
³éå¤ç */ |
| | | handleTerminateClose() { |
| | | this.terminateVisible = false; |
| | | this.resetTerminateForm(); |
| | | }, |
| | | |
| | | /** ç»æ¢åçäºæ¬¡ç¡®è®¤ */ |
| | | async confirmTermination() { |
| | | try { |
| | | await this.$confirm( |
| | | `æ¯å¦ç¡®è®¤ç»æ¢æ£è
${this.patientInfo} çæç®æ¡ä¾ï¼æ¤æä½å°ç»æ¢è¯¥æ£è
çæç®è¿ç¨ã`, |
| | | "è¦å", |
| | | { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | closeOnClickModal: false, |
| | | closeOnPressEscape: false |
| | | } |
| | | ); |
| | | return true; |
| | | } catch (error) { |
| | | console.log("ç¨æ·åæ¶ç»æ¢æä½"); |
| | | return false; |
| | | } |
| | | }, |
| | | |
| | | /** æ¢å¤åçäºæ¬¡ç¡®è®¤ */ |
| | | async confirmRestoration() { |
| | | try { |
| | | await this.$confirm( |
| | | `æ¯å¦ç¡®è®¤æ¢å¤æ£è
${this.patientInfo} çæç®æ¡ä¾ï¼æ¢å¤å该æ¡ä¾å°éæ°è¿å
¥æç®æµç¨ã`, |
| | | "确认æ¢å¤", |
| | | { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "info", |
| | | closeOnClickModal: false, |
| | | closeOnPressEscape: false |
| | | } |
| | | ); |
| | | return true; |
| | | } catch (error) { |
| | | console.log("ç¨æ·åæ¶æ¢å¤æä½"); |
| | | return false; |
| | | } |
| | | }, |
| | | |
| | | /** æäº¤ç»æ¢ */ |
| | | async handleTerminateSubmit() { |
| | | try { |
| | | // 表åéªè¯ |
| | | await this.$refs.terminateFormRef.validate(); |
| | | |
| | | if (!this.canSubmitTerminate) { |
| | | this.$message.warning('请è¾å
¥"ç¡®è®¤ç»æ¢"宿éªè¯'); |
| | | return; |
| | | } |
| | | console.log(66); |
| | | |
| | | // äºæ¬¡ç¡®è®¤ |
| | | const userConfirmed = await this.confirmTermination(); |
| | | if (!userConfirmed) { |
| | | return; |
| | | } |
| | | |
| | | this.terminateLoading = true; |
| | | |
| | | // è°ç¨ç»æ¢æ¥å£ |
| | | await updateDonatebaseinfo({ |
| | | id: this.currentRecord.id, |
| | | caseNo: this.currentRecord.caseNo, |
| | | terminationType: this.terminateForm.terminationType, |
| | | terminationResult: this.terminateForm.terminationResult, |
| | | terminationCase: 1 |
| | | }); |
| | | |
| | | this.$message.success("ç»æ¢æå"); |
| | | this.terminateVisible = false; |
| | | |
| | | // éç¥ç¶ç»ä»¶æä½å®æï¼éè¦å·æ°æ°æ® |
| | | this.$emit("operation-success", { |
| | | type: "terminate", |
| | | record: this.currentRecord, |
| | | terminationType: this.terminateForm.terminationType |
| | | }); |
| | | } catch (error) { |
| | | if (error instanceof Error) { |
| | | this.$message.error("ç»æ¢å¤±è´¥"); |
| | | console.error("ç»æ¢é误:", error); |
| | | } |
| | | // éªè¯å¤±è´¥ä¸æ¾ç¤ºéè¯¯æ¶æ¯ |
| | | } finally { |
| | | this.terminateLoading = false; |
| | | } |
| | | }, |
| | | |
| | | /** æäº¤æ¢å¤ */ |
| | | async handleRestoreSubmit() { |
| | | try { |
| | | // äºæ¬¡ç¡®è®¤ |
| | | const userConfirmed = await this.confirmRestoration(); |
| | | if (!userConfirmed) { |
| | | return; |
| | | } |
| | | |
| | | this.restoreLoading = true; |
| | | |
| | | // è°ç¨æ¢å¤æ¥å£ |
| | | await updateDonatebaseinfo({ |
| | | id: this.currentRecord.id, |
| | | caseNo: this.currentRecord.caseNo, |
| | | terminationCase: 0 |
| | | }); |
| | | |
| | | this.$message.success("æ¢å¤æå"); |
| | | this.restoreVisible = false; |
| | | |
| | | // éç¥ç¶ç»ä»¶æä½å®æï¼éè¦å·æ°æ°æ® |
| | | this.$emit("operation-success", { |
| | | type: "restore", |
| | | record: this.currentRecord |
| | | }); |
| | | } catch (error) { |
| | | this.$message.error("æ¢å¤å¤±è´¥"); |
| | | console.error("æ¢å¤é误:", error); |
| | | } finally { |
| | | this.restoreLoading = false; |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .patient-info { |
| | | margin-bottom: 20px; |
| | | font-size: 18px; |
| | | } |
| | | |
| | | .terminate-form { |
| | | margin-top: 15px; |
| | | } |
| | | |
| | | /* ååºå¼è°æ´ */ |
| | | @media (max-width: 768px) { |
| | | .patient-info ::v-deep .el-alert { |
| | | padding: 8px 16px; |
| | | } |
| | | |
| | | .terminate-form ::v-deep .el-form-item__label { |
| | | width: 80px !important; |
| | | } |
| | | |
| | | .terminate-form ::v-deep .el-form-item__content { |
| | | margin-left: 80px !important; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">æç®ç¡®è®¤åºæ¬ä¿¡æ¯</span> |
| | | <el-button |
| | | v-if="$route.query.confirm" |
| | | type="primary" |
| | | style="float: right; padding: 3px 0" |
| | | type="success" |
| | | style="float: right;" |
| | | @click="handleSave" |
| | | :loading="saveLoading" |
| | | > |
| | | ä¿åç¡®è®¤ä¿¡æ¯ |
| | | </el-button> |
| | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä½é¢å·" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" :readonly="!isEdit" /> |
| | | <el-input v-model="form.caseNo" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-input v-model="form.donorName" :readonly="!isEdit" /> |
| | | <el-form-item label="æç®è
å§å" prop="name"> |
| | | <el-input v-model="form.name" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ§å«" prop="gender"> |
| | | <el-select |
| | | v-model="form.gender" |
| | | :disabled="!isEdit" |
| | | style="width: 100%" |
| | | > |
| | | <el-option label="ç·" value="0" /> |
| | | <el-option label="女" value="1" /> |
| | | <el-form-item label="æ§å«" prop="sex"> |
| | | <el-select v-model="form.sex" style="width: 100%"> |
| | | <el-option label="ç·" value="1" /> |
| | | <el-option label="女" value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å¹´é¾" prop="age"> |
| | | <el-input v-model="form.age" :readonly="!isEdit" /> |
| | | <el-input v-model="form.age" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosis"> |
| | | <el-input v-model="form.diagnosis" :readonly="!isEdit" /> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosisname"> |
| | | <el-input v-model="form.diagnosisname" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æå¨å»çæºæ" prop="hospitalName"> |
| | | <el-input v-model="form.hospitalName" :readonly="!isEdit" /> |
| | | <el-form-item label="æå¨å»çæºæ" prop="treatmenthospitalname"> |
| | | <el-input v-model="form.treatmenthospitalname" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="åè°å1" prop="coordinator1"> |
| | | <el-input v-model="form.coordinator1" :readonly="!isEdit" /> |
| | | <el-form-item label="åè°å1" prop="coordinatedusernameo"> |
| | | <el-input v-model="form.coordinatedusernameo" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="åè°å2" prop="coordinator2"> |
| | | <el-input v-model="form.coordinator2" :readonly="!isEdit" /> |
| | | <el-form-item label="åè°å2" prop="coordinatedusernamet"> |
| | | <el-input v-model="form.coordinatedusernamet" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä¸å¡äººå" prop="assignee"> |
| | | <el-input v-model="form.assignee" :readonly="!isEdit" /> |
| | | <el-form-item label="ä¸å¡äººå" prop="responsibleusername"> |
| | | <el-input v-model="form.responsibleusername" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç¡®è®¤ç¶æ" prop="confirmationStatus"> |
| | | <!-- <el-col :span="8"> |
| | | <el-form-item label="ç¡®è®¤ç¶æ" prop="relativeconfirmationsign"> |
| | | <el-select |
| | | v-model="form.confirmationStatus" |
| | | |
| | | v-model="form.relativeconfirmationsign" |
| | | style="width: 100%" |
| | | |
| | | > |
| | | <el-option label="æªç¡®è®¤" value="0" /> |
| | | <el-option label="å®¶å±ç¡®è®¤" value="1" /> |
| | | <el-option label="ä¸åææç®" value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-col> --> |
| | | <el-col :span="8"> |
| | | <el-form-item label="确认æ¶é´" prop="confirmationTime"> |
| | | <el-form-item label="ç¾åæ¶é´" prop="signdate"> |
| | | <el-date-picker |
| | | v-model="form.confirmationTime" |
| | | v-model="form.signdate" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | value-format="yyyy-MM-dd" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <!-- <el-col :span="8"> |
| | | <el-form-item label="è¡å" prop="bloodtype"> |
| | | <el-input v-model="form.bloodtype" /> |
| | | </el-form-item> |
| | | </el-col> --> |
| | | </el-row> |
| | | |
| | | <!-- <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è¯ä»¶å·ç " prop="idcardno"> |
| | | <el-input v-model="form.idcardno" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> --> |
| | | |
| | | <!-- 亲å±ä¿¡æ¯ --> |
| | | <!-- 亲å±ä¿¡æ¯ --> |
| | | <el-divider content-position="left">亲å±ç¡®è®¤ä¿¡æ¯</el-divider> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <el-form-item label="亲å±å§å" prop="relativeconfirmationsignname"> |
| | | <el-input |
| | | v-model="form.relativeconfirmationsignname" |
| | | placeholder="请è¾å
¥äº²å±å§å" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="ä¸æèµ è
å
³ç³»" prop="familyrelations"> |
| | | <el-select |
| | | v-model="form.familyrelations" |
| | | placeholder="è¯·éæ©ä¸æèµ è
å
³ç³»" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_FamilyRelation || []" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="亲å±èº«ä»½è¯" prop="relativeidcardno"> |
| | | <el-input |
| | | v-model="form.relativeidcardno" |
| | | placeholder="请è¾å
¥äº²å±è¯ä»¶å·ç " |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="亲å±çµè¯" prop="relativephone"> |
| | | <el-input |
| | | v-model="form.relativephone" |
| | | placeholder="请è¾å
¥äº²å±èç³»çµè¯" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-form-item label="家屿è§å¤æ³¨" prop="familyRemark"> |
| | | <el-row> |
| | | <el-form-item label-width="100px" label="æç®å³å®"> |
| | | <el-checkbox-group v-model="organdecision"> |
| | | <el-checkbox |
| | | v-for="item in organselection" |
| | | :key="item" |
| | | :label="item" |
| | | >{{ item }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | <el-input |
| | | v-if="organdecision.includes('å
¶ä»')" |
| | | v-model="organdecisionOther" |
| | | placeholder="请è¾å
¥å
¶ä»æç®å³å®çå
·ä½å
容" |
| | | style="margin-top: 10px; width: 300px;" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-row> |
| | | |
| | | <el-form-item label="家屿è§å¤æ³¨" prop="relativeRemark"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="3" |
| | | v-model="form.familyRemark" |
| | | :readonly="!isEdit" |
| | | v-model="form.relativeRemark" |
| | | placeholder="è®°å½å®¶å±çæè§åæ²éæ
åµ" |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <!-- éä»¶å表 --> |
| | | <!-- éä»¶ä¿¡æ¯ - æç±»ååç±» --> |
| | | <el-card class="attachment-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">ç¸å
³éä»¶ä¸ä¼ </span> |
| | | <el-button |
| | | v-if="isEdit" |
| | | type="primary" |
| | | size="mini" |
| | | @click="handleSaveAll" |
| | | :loading="saveLoading" |
| | | > |
| | | ä¿åææéä»¶ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <!-- éä»¶ç±»åéé¡¹å¡ --> |
| | |
| | | :label="type.label" |
| | | :name="type.value" |
| | | > |
| | | <div class="attachment-upload-section"> |
| | | <div class="upload-header"> |
| | | <div class="attachment-section"> |
| | | <div class="attachment-header"> |
| | | <span class="upload-title">{{ type.label }}</span> |
| | | <el-tooltip content="ç¹å»ä¸ä¼ 该类åéä»¶" placement="top"> |
| | | <el-button |
| | |
| | | type="primary" |
| | | icon="el-icon-plus" |
| | | @click="openUploadDialog(type.value)" |
| | | :disabled="!isEdit" |
| | | > |
| | | æ·»å éä»¶ |
| | | </el-button> |
| | | </el-tooltip> |
| | | </div> |
| | | |
| | | <!-- éä»¶å表 --> |
| | | <el-table |
| | | :data="getAttachmentsByType(type.value)" |
| | | v-loading="attachmentLoading" |
| | | style="width: 100%; margin-top: 15px;" |
| | | > |
| | | <el-table-column label="æä»¶åç§°" min-width="200"> |
| | | <template slot-scope="scope"> |
| | | <div class="file-info"> |
| | | <!-- å½åç±»åçéä»¶å表 --> |
| | | <div class="attachment-list"> |
| | | <el-table |
| | | :data="getAttachmentsByType(type.value)" |
| | | size="small" |
| | | v-loading="attachmentLoading" |
| | | style="width: 100%;" |
| | | > |
| | | <el-table-column label="æä»¶å" min-width="200"> |
| | | <template slot-scope="scope"> |
| | | <i |
| | | class="el-icon-document" |
| | | style="margin-right: 8px; color: #409EFF;" |
| | | style="color: #409EFF; margin-right: 8px;" |
| | | ></i> |
| | | <span>{{ scope.row.fileName }}</span> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <span class="file-name">{{ scope.row.fileName }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="æä»¶å¤§å°" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatFileSize(scope.row.fileSize) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä»¶ç±»å" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-tag size="small">{{ |
| | | getFileType(scope.row.fileName) |
| | | }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="ä¸ä¼ æ¶é´" width="160" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.uploadTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä»¶å¤§å°" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatFileSize(scope.row.fileSize) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="ä¸ä¼ 人" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.uploader }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ä¸ä¼ æ¶é´" width="160" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatDateTime(scope.row.uploadTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æä½" |
| | | width="120" |
| | | align="center" |
| | | v-if="isEdit" |
| | | <el-table-column label="æä½" width="150" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="primary" |
| | | @click="handlePreview(scope.row)" |
| | | > |
| | | é¢è§ |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="danger" |
| | | @click="handleRemoveAttachment(type.value, scope.$index)" |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- ç©ºç¶ææç¤º --> |
| | | <div |
| | | v-if="getAttachmentsByType(type.value).length === 0" |
| | | class="empty-attachment" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handlePreview(scope.row)" |
| | | >é¢è§</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-delete" |
| | | style="color: #F56C6C;" |
| | | @click="handleRemoveAttachment(scope.row, type.value)" |
| | | >å é¤</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="æä½" width="80" align="center" v-else> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handlePreview(scope.row)" |
| | | >é¢è§</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <div |
| | | v-if="getAttachmentsByType(type.value).length === 0" |
| | | class="empty-attachment" |
| | | > |
| | | <el-empty description="ææ éä»¶" :image-size="80"></el-empty> |
| | | <el-empty |
| | | :description="`ææ ${type.label}éä»¶`" |
| | | :image-size="80" |
| | | ></el-empty> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </el-card> |
| | | |
| | | <!-- ä¸ä¼ å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | :title="`ä¸ä¼ ${getCurrentTypeLabel}éä»¶`" |
| | | :visible.sync="uploadDialogVisible" |
| | |
| | | </el-button> |
| | | </span> |
| | | </el-dialog> |
| | | |
| | | <!-- æä»¶é¢è§å¼¹çª --> |
| | | <FilePreviewDialog |
| | | :visible="previewVisible" |
| | | :file="currentPreviewFile" |
| | | @close="previewVisible = false" |
| | | @download="handleDownload" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | getConfirmationDetail, |
| | | updateConfirmation |
| | | } from "./mockConfirmationApi"; |
| | | import { relativesList, relativesEdit } from "@/api/businessApi"; |
| | | import FilePreviewDialog from "@/components/FilePreviewDialog"; |
| | | |
| | | export default { |
| | | name: "ConfirmationDetail", |
| | | components: { |
| | | FilePreviewDialog |
| | | }, |
| | | dicts: ["sys_FamilyRelation"], |
| | | data() { |
| | | return { |
| | | // æ¯å¦ç¼è¾æ¨¡å¼ |
| | |
| | | // è¡¨åæ°æ® |
| | | form: { |
| | | id: undefined, |
| | | infoid: undefined, |
| | | caseNo: "", |
| | | donorName: "", |
| | | gender: "", |
| | | name: "", |
| | | sex: "", |
| | | age: "", |
| | | diagnosis: "", |
| | | hospitalName: "", |
| | | coordinator1: "", |
| | | coordinator2: "", |
| | | assignee: "", |
| | | confirmationStatus: "0", |
| | | confirmationTime: "", |
| | | familyRemark: "" |
| | | diagnosisname: "", |
| | | treatmenthospitalname: "", |
| | | coordinatedusernameo: "", |
| | | coordinatedusernamet: "", |
| | | responsibleusername: "", |
| | | relativeconfirmationsign: "0", |
| | | signdate: "", |
| | | relativeconfirmationsignname: "", |
| | | familyrelations: "", |
| | | relativeidcardno: "", |
| | | relativephone: "", |
| | | relativeRemark: "", |
| | | assessannex: "" // JSONå符串å卿æéä»¶ |
| | | }, |
| | | // éä»¶å表 |
| | | organdecision: [], |
| | | organdecisionOther: "", |
| | | organselection: [ |
| | | "èè", |
| | | "åè¾", |
| | | "å·¦è¾", |
| | | "å³è¾", |
| | | "å¿è", |
| | | "èºè", |
| | | "è°è
º", |
| | | "å°è ", |
| | | "åç¼ç»ç»", |
| | | "éä½", |
| | | "å
¶ä»" |
| | | ], |
| | | // å è½½ç¶æ |
| | | loading: false, |
| | | saveLoading: false, |
| | | // éä»¶ç¸å
³æ°æ® |
| | | activeAttachmentType: "1", |
| | | attachmentLoading: false, |
| | | uploadDialogVisible: false, |
| | | uploadLoading: false, |
| | | saveLoading: false, |
| | | tempFileList: [], |
| | | currentUploadType: "", |
| | | // é¢è§ç¸å
³ |
| | | previewVisible: false, |
| | | currentPreviewFile: null, |
| | | |
| | | // éä»¶ç±»åå®ä¹ |
| | | attachmentTypes: [ |
| | |
| | | { value: "6", label: "å¿æ»äº¡å¤å®ç¥æ
åæä¹¦" } |
| | | ], |
| | | |
| | | // éä»¶åè¡¨æ°æ® |
| | | attachmentList: [ |
| | | // æ¨¡ææ°æ® - å®é
项ç®ä¸ä»æ¥å£è·å |
| | | { |
| | | id: 1, |
| | | type: "1", |
| | | typeName: "人ä½å¨å®æ½å¨æç®è
ç»è®°è¡¨", |
| | | fileName: "æ½å¨æç®è
ç»è®°è¡¨_202512001.pdf", |
| | | fileSize: 2548321, |
| | | uploadTime: "2025-12-01 10:30:00", |
| | | uploader: "å¼ ä¸", |
| | | fileUrl: "/attachments/1.pdf" |
| | | }, |
| | | { |
| | | id: 2, |
| | | type: "1", |
| | | typeName: "人ä½å¨å®æ½å¨æç®è
ç»è®°è¡¨", |
| | | fileName: "è¡¥å
说æ.docx", |
| | | fileSize: 512345, |
| | | uploadTime: "2025-12-01 14:20:00", |
| | | uploader: "æå", |
| | | fileUrl: "/attachments/2.docx" |
| | | } |
| | | ] |
| | | // éä»¶æ°æ®ç»æ - æç±»ååå¼åå¨ |
| | | attachmentData: { |
| | | "1": [], // ç±»å1çéä»¶å表 |
| | | "2": [], |
| | | "3": [], |
| | | "4": [], |
| | | "5": [], |
| | | "6": [] |
| | | } |
| | | }; |
| | | }, |
| | | computed: { |
| | | isEdit() { |
| | | return this.$route.query.confirm === "true"; |
| | | }, |
| | | getCurrentTypeLabel() { |
| | | const type = this.attachmentTypes.find( |
| | | t => t.value === this.currentUploadType |
| | |
| | | } |
| | | }, |
| | | created() { |
| | | const id = this.$route.query.id; |
| | | const infoid = this.$route.query.infoid; |
| | | this.isEdit = this.$route.query.confirm === "true"; |
| | | if (id) { |
| | | this.getDetail(id); |
| | | if (infoid) { |
| | | this.getDetail(infoid); |
| | | } |
| | | this.getAttachmentList(); |
| | | }, |
| | | methods: { |
| | | // è·å详æ
|
| | | getDetail(id) { |
| | | getConfirmationDetail(id).then(response => { |
| | | async getDetail(infoid) { |
| | | this.loading = true; |
| | | try { |
| | | const response = await relativesList({ infoid }); |
| | | |
| | | if (response.code === 200) { |
| | | this.form = response.data; |
| | | this.handleDetailData(response); |
| | | } else { |
| | | this.$message.error("è·å详æ
失败ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | }); |
| | | } catch (error) { |
| | | console.error("è·åæç®ç¡®è®¤è¯¦æ
失败:", error); |
| | | this.$message.error("è·å详æ
失败"); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | // è·åéä»¶å表 |
| | | getAttachmentList() { |
| | | this.attachmentLoading = true; |
| | | // 模æéä»¶æ°æ® |
| | | this.attachmentList = [ |
| | | { |
| | | id: 1, |
| | | type: "1", |
| | | typeName: "人ä½å¨å®æ½å¨æç®è
ç»è®°è¡¨", |
| | | fileName: "æ½å¨æç®è
ç»è®°è¡¨_202512001.pdf", |
| | | uploadTime: "2025-12-01 10:30:00", |
| | | uploader: "å¼ ä¸", |
| | | fileSize: "2.5MB", |
| | | fileUrl: "/attachments/1.pdf" |
| | | }, |
| | | { |
| | | id: 2, |
| | | type: "2", |
| | | typeName: "人ä½å¨å®æç®äº²å±ç¡®è®¤ç»è®°è¡¨", |
| | | fileName: "亲å±ç¡®è®¤ç»è®°è¡¨_202512001.pdf", |
| | | uploadTime: "2025-12-01 14:20:00", |
| | | uploader: "æå", |
| | | fileSize: "1.8MB", |
| | | fileUrl: "/attachments/2.pdf" |
| | | }, |
| | | { |
| | | id: 3, |
| | | type: "3", |
| | | typeName: "æç®è
åç´ç³»äº²å±èº«ä»½è¯ãæ·å£ç°¿ç¸å
³è¯æ", |
| | | fileName: "èº«ä»½è¯æ_202512001.zip", |
| | | uploadTime: "2025-12-01 16:45:00", |
| | | uploader: "çäº", |
| | | fileSize: "5.2MB", |
| | | fileUrl: "/attachments/3.zip" |
| | | }, |
| | | { |
| | | id: 4, |
| | | type: "4", |
| | | typeName: "å
¬æ°èº«æ
å人ä½å¨å®ï¼è§èï¼é使ç®åç¥ä¹¦", |
| | | fileName: "æç®åç¥ä¹¦_202512001.pdf", |
| | | uploadTime: "2025-12-02 09:15:00", |
| | | uploader: "å¼ ä¸", |
| | | fileSize: "1.2MB", |
| | | fileUrl: "/attachments/4.pdf" |
| | | }, |
| | | { |
| | | id: 5, |
| | | type: "5", |
| | | typeName: "èæ»äº¡å¤å®ç¥æ
åæä¹¦", |
| | | fileName: "èæ»äº¡å¤å®åæä¹¦_202512001.pdf", |
| | | uploadTime: "2025-12-02 11:30:00", |
| | | uploader: "æå", |
| | | fileSize: "0.8MB", |
| | | fileUrl: "/attachments/5.pdf" |
| | | }, |
| | | { |
| | | id: 6, |
| | | type: "6", |
| | | typeName: "å¿æ»äº¡å¤å®ç¥æ
åæä¹¦", |
| | | fileName: "å¿æ»äº¡å¤å®åæä¹¦_202512001.pdf", |
| | | uploadTime: "2025-12-02 13:20:00", |
| | | uploader: "çäº", |
| | | fileSize: "0.9MB", |
| | | fileUrl: "/attachments/6.pdf" |
| | | |
| | | // å¤ç详æ
æ°æ® |
| | | handleDetailData(response) { |
| | | let detailData = null; |
| | | |
| | | // æ ¹æ®æ¥å£å®é
è¿åçæ°æ®ç»æè¿è¡è°æ´ |
| | | if (response.data) { |
| | | if (Array.isArray(response.data)) { |
| | | detailData = response.data[0] || {}; |
| | | } else if (response.data.rows && Array.isArray(response.data.rows)) { |
| | | detailData = response.data.rows[0] || {}; |
| | | } else if (Array.isArray(response.data.list)) { |
| | | detailData = response.data.list[0] || {}; |
| | | } else { |
| | | detailData = response.data; |
| | | } |
| | | ]; |
| | | this.attachmentLoading = false; |
| | | } else { |
| | | detailData = response; |
| | | } |
| | | |
| | | // æ å°å段å°è¡¨å |
| | | this.form = { |
| | | ...this.form, |
| | | id: detailData.id || this.$route.query.id, |
| | | infoid: detailData.infoid || infoid, |
| | | caseNo: detailData.caseNo || "", |
| | | name: detailData.name || "", |
| | | sex: detailData.sex || "", |
| | | age: detailData.age || "", |
| | | diagnosisname: detailData.diagnosisname || "", |
| | | treatmenthospitalname: detailData.treatmenthospitalname || "", |
| | | coordinatedusernameo: detailData.coordinatedusernameo || "", |
| | | coordinatedusernamet: detailData.coordinatedusernamet || "", |
| | | responsibleusername: detailData.responsibleusername || "", |
| | | relativeconfirmationsign: detailData.relativeconfirmationsign || "0", |
| | | signdate: detailData.signdate, |
| | | relativeconfirmationsignname: |
| | | detailData.relativeconfirmationsignname || "", |
| | | familyrelations: detailData.familyrelations || "", |
| | | relativeidcardno: detailData.relativeidcardno || "", |
| | | relativephone: detailData.relativephone || "", |
| | | relativeRemark: detailData.relativeRemark || "", |
| | | assessannex: detailData.assessannex || "" |
| | | }; |
| | | |
| | | // å¤çæç®å³å®æ°æ® |
| | | if (detailData.organdecision) { |
| | | this.organdecision = Array.isArray(detailData.organdecision) |
| | | ? detailData.organdecision |
| | | : detailData.organdecision.split(","); |
| | | } |
| | | |
| | | // å¤çéä»¶æ°æ® - ä»assessannexåæ®µè§£æJSONå¹¶æç±»ååç±» |
| | | this.processAssessannexData(); |
| | | }, |
| | | // ä¸è½½éä»¶ |
| | | handleDownload(row) { |
| | | // å®é
项ç®ä¸è¿éè°ç¨æä»¶ä¸è½½æ¥å£ |
| | | this.$message.success(`ä¸è½½æä»¶: ${row.fileName}`); |
| | | console.log("ä¸è½½æä»¶:", row.fileUrl); |
| | | }, |
| | | // ä¿åç¡®è®¤ä¿¡æ¯ |
| | | handleSave() { |
| | | this.$refs.form.validate(valid => { |
| | | if (valid) { |
| | | updateConfirmation(this.form).then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("ä¿åæå"); |
| | | this.isEdit = false; |
| | | this.$router.push("/case/confirmation"); |
| | | } |
| | | |
| | | // å¤çassessannexåæ®µæ°æ®å¹¶æç±»ååç±» |
| | | processAssessannexData() { |
| | | if (this.form.assessannex) { |
| | | try { |
| | | const annexData = |
| | | typeof this.form.assessannex === "string" |
| | | ? JSON.parse(this.form.assessannex) |
| | | : this.form.assessannex; |
| | | |
| | | // æ¸
ç©ºç°ææ°æ® |
| | | Object.keys(this.attachmentData).forEach(key => { |
| | | this.attachmentData[key] = []; |
| | | }); |
| | | |
| | | // æç±»ååç±»åå¨ |
| | | if (Array.isArray(annexData)) { |
| | | annexData.forEach(attachment => { |
| | | const type = attachment.type || "1"; // é»è®¤å°ç¬¬ä¸ç§ç±»å |
| | | if (this.attachmentData[type]) { |
| | | this.attachmentData[type].push(attachment); |
| | | } |
| | | }); |
| | | } |
| | | } catch (error) { |
| | | console.warn("assessannexæ°æ®è§£æå¤±è´¥:", error); |
| | | } |
| | | }); |
| | | } |
| | | }, |
| | | // æ ¹æ®ç±»åè·åéä»¶ |
| | | |
| | | // æ ¹æ®ç±»åè·åéä»¶å表 |
| | | getAttachmentsByType(type) { |
| | | return this.attachmentList.filter(item => item.type === type); |
| | | return this.attachmentData[type] || []; |
| | | }, |
| | | |
| | | // æå¼ä¸ä¼ å¯¹è¯æ¡ |
| | |
| | | }); |
| | | }, |
| | | |
| | | // ä¸ä¼ åæ ¡éª |
| | | // ä¸ä¼ åæ ¡éª[7](@ref) |
| | | beforeUpload(file) { |
| | | const allowedTypes = [ |
| | | 'application/pdf', |
| | | 'image/jpeg', |
| | | 'image/png', |
| | | 'application/msword', |
| | | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' |
| | | "application/pdf", |
| | | "image/jpeg", |
| | | "image/png", |
| | | "application/msword", |
| | | "application/vnd.openxmlformats-officedocument.wordprocessingml.document" |
| | | ]; |
| | | |
| | | const maxSize = 10 * 1024 * 1024; // 10MB |
| | | |
| | | // æ ¡éªæä»¶ç±»å |
| | | const isTypeOk = allowedTypes.includes(file.type) || |
| | | file.name.endsWith('.pdf') || |
| | | file.name.endsWith('.jpg') || |
| | | file.name.endsWith('.jpeg') || |
| | | file.name.endsWith('.png') || |
| | | file.name.endsWith('.doc') || |
| | | file.name.endsWith('.docx'); |
| | | const isTypeOk = |
| | | allowedTypes.includes(file.type) || |
| | | file.name.endsWith(".pdf") || |
| | | file.name.endsWith(".jpg") || |
| | | file.name.endsWith(".jpeg") || |
| | | file.name.endsWith(".png") || |
| | | file.name.endsWith(".doc") || |
| | | file.name.endsWith(".docx"); |
| | | |
| | | if (!isTypeOk) { |
| | | this.$message.error('æä»¶æ ¼å¼ä¸æ¯æï¼è¯·ä¸ä¼ pdfãjpgãpngãdocædocxæ ¼å¼æä»¶'); |
| | | this.$message.error( |
| | | "æä»¶æ ¼å¼ä¸æ¯æï¼è¯·ä¸ä¼ pdfãjpgãpngãdocædocxæ ¼å¼æä»¶" |
| | | ); |
| | | return false; |
| | | } |
| | | |
| | | // æ ¡éªæä»¶å¤§å° |
| | | if (file.size > maxSize) { |
| | | this.$message.error('æä»¶å¤§å°ä¸è½è¶
è¿10MB'); |
| | | this.$message.error("æä»¶å¤§å°ä¸è½è¶
è¿10MB"); |
| | | return false; |
| | | } |
| | | |
| | |
| | | |
| | | // èªå®ä¹ä¸ä¼ è¯·æ± |
| | | handleHttpRequest(options) { |
| | | // 模æä¸ä¼ è¿ç¨ |
| | | return new Promise((resolve, reject) => { |
| | | this.uploadLoading = true; |
| | | |
| | | // 模æä¸ä¼ å»¶è¿ |
| | | // 模æä¸ä¼ è¿ç¨ |
| | | setTimeout(() => { |
| | | const newAttachment = { |
| | | id: Date.now(), |
| | | type: this.currentUploadType, |
| | | typeName: this.getCurrentTypeLabel, |
| | | fileName: options.file.name, |
| | | fileUrl: URL.createObjectURL(options.file), |
| | | fileSize: options.file.size, |
| | | fileType: this.getFileExtension(options.file.name), |
| | | type: this.currentUploadType, // è®°å½éä»¶ç±»å |
| | | uploadTime: new Date().toISOString(), |
| | | uploader: 'å½åç¨æ·', // å®é
项ç®ä¸ä»ç¨æ·ä¿¡æ¯è·å |
| | | fileUrl: URL.createObjectURL(options.file) // 临æ¶URLï¼å®é
项ç®ä¸ä¸ºæå¡å¨è¿åçURL |
| | | uploader: "å½åç¨æ·" |
| | | }; |
| | | |
| | | this.attachmentList.push(newAttachment); |
| | | // æ·»å å°å¯¹åºç±»åçéä»¶å表 |
| | | if (this.attachmentData[this.currentUploadType]) { |
| | | this.attachmentData[this.currentUploadType].push(newAttachment); |
| | | } |
| | | |
| | | this.uploadLoading = false; |
| | | this.updateAssessannexField(); // æ´æ°åå¨å段 |
| | | resolve({ code: 200, data: newAttachment }); |
| | | }, 1500); |
| | | }); |
| | |
| | | // æäº¤ä¸ä¼ |
| | | async submitUpload() { |
| | | if (this.tempFileList.length === 0) { |
| | | this.$message.warning('请å
éæ©è¦ä¸ä¼ çæä»¶'); |
| | | this.$message.warning("请å
éæ©è¦ä¸ä¼ çæä»¶"); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | // 便¬¡ä¸ä¼ æææä»¶ |
| | | for (const file of this.tempFileList) { |
| | | await this.$refs.uploadRef.submit(); |
| | | } |
| | | |
| | | this.$message.success('æä»¶ä¸ä¼ æå'); |
| | | this.$message.success("æä»¶ä¸ä¼ æå"); |
| | | this.uploadDialogVisible = false; |
| | | this.tempFileList = []; |
| | | } catch (error) { |
| | | this.$message.error('æä»¶ä¸ä¼ 失败'); |
| | | console.error('ä¸ä¼ 失败:', error); |
| | | this.$message.error("æä»¶ä¸ä¼ 失败"); |
| | | console.error("ä¸ä¼ 失败:", error); |
| | | } |
| | | }, |
| | | |
| | | // å é¤éä»¶ |
| | | handleRemoveAttachment(attachment, type) { |
| | | this.$confirm('ç¡®å®è¦å é¤è¿ä¸ªéä»¶åï¼', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | const index = this.attachmentList.findIndex(item => item.id === attachment.id); |
| | | if (index !== -1) { |
| | | this.attachmentList.splice(index, 1); |
| | | this.$message.success('éä»¶å 餿å'); |
| | | |
| | | // å®é
项ç®ä¸è°ç¨å 餿¥å£ |
| | | // this.deleteAttachment(attachment.id); |
| | | } |
| | | }).catch(() => {}); |
| | | handleRemoveAttachment(type, index) { |
| | | this.$confirm("ç¡®å®è¦å é¤è¿ä¸ªéä»¶åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | if (this.attachmentData[type] && this.attachmentData[type][index]) { |
| | | this.attachmentData[type].splice(index, 1); |
| | | this.$message.success("éä»¶å 餿å"); |
| | | this.updateAssessannexField(); // æ´æ°åå¨å段 |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // é¢è§éä»¶ |
| | | handlePreview(attachment) { |
| | | // å®é
项ç®ä¸æ ¹æ®æä»¶ç±»åè°ç¨ä¸åçé¢è§æ¹å¼ |
| | | if (attachment.fileName.endsWith('.pdf')) { |
| | | // PDFé¢è§ |
| | | window.open(attachment.fileUrl, '_blank'); |
| | | } else if (attachment.fileName.match(/\.(jpg|jpeg|png)$/i)) { |
| | | // å¾çé¢è§ |
| | | this.$alert(`<img src="${attachment.fileUrl}" style="max-width: 100%;" alt="${attachment.fileName}">`, |
| | | 'å¾çé¢è§', { |
| | | dangerouslyUseHTMLString: true, |
| | | customClass: 'image-preview-dialog' |
| | | }); |
| | | // æ´æ°assessannexåå¨å段 |
| | | updateAssessannexField() { |
| | | // å°ææç±»åçéä»¶å并为ä¸ä¸ªæ°ç» |
| | | const allAttachments = []; |
| | | Object.values(this.attachmentData).forEach(attachments => { |
| | | allAttachments.push(...attachments); |
| | | }); |
| | | |
| | | // æ´æ°å°è¡¨ååæ®µ |
| | | this.form.assessannex = JSON.stringify(allAttachments); |
| | | }, |
| | | |
| | | // æä»¶é¢è§ |
| | | handlePreview(file) { |
| | | this.currentPreviewFile = { |
| | | fileName: file.fileName, |
| | | fileUrl: file.fileUrl, |
| | | fileType: this.getFileType(file.fileName) |
| | | }; |
| | | this.previewVisible = true; |
| | | }, |
| | | |
| | | // æä»¶ä¸è½½ |
| | | handleDownload(file) { |
| | | const fileUrl = file.fileUrl; |
| | | const fileName = file.fileName; |
| | | |
| | | if (fileUrl) { |
| | | const link = document.createElement("a"); |
| | | link.href = fileUrl; |
| | | link.download = fileName; |
| | | link.style.display = "none"; |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | this.$message.success("å¼å§ä¸è½½æä»¶"); |
| | | } else { |
| | | // å
¶ä»æä»¶ç±»åæç¤ºä¸è½½ |
| | | this.$message.info('该æä»¶ç±»åæä¸æ¯æå¨çº¿é¢è§ï¼è¯·ä¸è½½åæ¥ç'); |
| | | this.$message.warning("æä»¶è·¯å¾ä¸åå¨ï¼æ æ³ä¸è½½"); |
| | | } |
| | | }, |
| | | |
| | | // ä¿åææéä»¶ä¿¡æ¯ |
| | | handleSaveAll() { |
| | | this.saveLoading = true; |
| | | // è·åæä»¶ç±»å |
| | | getFileType(fileName) { |
| | | if (!fileName) return "other"; |
| | | const extension = this.getFileExtension(fileName); |
| | | const imageTypes = ["jpg", "jpeg", "png"]; |
| | | const pdfTypes = ["pdf"]; |
| | | const officeTypes = ["doc", "docx"]; |
| | | |
| | | // 模æä¿åè¿ç¨ |
| | | setTimeout(() => { |
| | | this.$message.success('éä»¶ä¿¡æ¯ä¿åæå'); |
| | | this.saveLoading = false; |
| | | if (imageTypes.includes(extension)) return "image"; |
| | | if (pdfTypes.includes(extension)) return "pdf"; |
| | | if (officeTypes.includes(extension)) return "office"; |
| | | return "other"; |
| | | }, |
| | | |
| | | // å®é
项ç®ä¸è°ç¨ä¿åæ¥å£ |
| | | // this.saveAttachments(); |
| | | }, 1000); |
| | | // è·åæä»¶æ©å±å |
| | | getFileExtension(filename) { |
| | | return filename |
| | | .split(".") |
| | | .pop() |
| | | .toLowerCase(); |
| | | }, |
| | | |
| | | // æä»¶å¤§å°æ ¼å¼å |
| | | formatFileSize(size) { |
| | | if (size === 0) return '0 B'; |
| | | if (!size) return "0 B"; |
| | | const k = 1024; |
| | | const sizes = ['B', 'KB', 'MB', 'GB']; |
| | | const sizes = ["B", "KB", "MB", "GB"]; |
| | | const i = Math.floor(Math.log(size) / Math.log(k)); |
| | | return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; |
| | | return parseFloat((size / Math.pow(k, i)).toFixed(2)) + " " + sizes[i]; |
| | | }, |
| | | |
| | | // æ¶é´æ ¼å¼å |
| | | parseTime(time) { |
| | | if (!time) return ''; |
| | | const date = new Date(time); |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`; |
| | | // æ¥ææ¶é´æ ¼å¼å |
| | | formatDateTime(dateTime) { |
| | | if (!dateTime) return ""; |
| | | try { |
| | | const date = new Date(dateTime); |
| | | if (isNaN(date.getTime())) return dateTime; |
| | | |
| | | const year = date.getFullYear(); |
| | | const month = String(date.getMonth() + 1).padStart(2, "0"); |
| | | const day = String(date.getDate()).padStart(2, "0"); |
| | | const hours = String(date.getHours()).padStart(2, "0"); |
| | | const minutes = String(date.getMinutes()).padStart(2, "0"); |
| | | |
| | | return `${year}-${month}-${day} ${hours}:${minutes}`; |
| | | } catch (error) { |
| | | return dateTime; |
| | | } |
| | | }, |
| | | |
| | | // è·åå½åæ¶é´ |
| | | getCurrentTime() { |
| | | const now = new Date(); |
| | | return `${now.getFullYear()}-${(now.getMonth() + 1) |
| | | .toString() |
| | | .padStart(2, "0")}-${now |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0")} ${now |
| | | .getHours() |
| | | .toString() |
| | | .padStart(2, "0")}:${now |
| | | .getMinutes() |
| | | .toString() |
| | | .padStart(2, "0")}:${now |
| | | .getSeconds() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | }, |
| | | |
| | | // ä¿åç¡®è®¤ä¿¡æ¯ |
| | | async handleSave() { |
| | | try { |
| | | await this.$refs.form.validate(); |
| | | this.saveLoading = true; |
| | | |
| | | // ç¡®ä¿éä»¶æ°æ®æ¯ææ°ç |
| | | this.updateAssessannexField(); |
| | | |
| | | const saveData = { |
| | | ...this.form, |
| | | organdecision: this.organdecision.join(","), |
| | | organdecisionOther: this.organdecisionOther |
| | | // assessannexåæ®µå·²å¨updateAssessannexField䏿´æ° |
| | | }; |
| | | |
| | | const response = await relativesEdit(saveData); |
| | | |
| | | if (response.code === 200) { |
| | | this.$message.success("ä¿åæå"); |
| | | this.$router.push("/case/confirmation"); |
| | | } else { |
| | | this.$message.error("ä¿å失败ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | console.error("ä¿å失败:", error); |
| | | this.$message.error("ä¿å失败"); |
| | | } |
| | | } finally { |
| | | this.saveLoading = false; |
| | | } |
| | | } |
| | | } |
| | | }; |
| | |
| | | .detail-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | margin-right: 20px; |
| | | } |
| | | |
| | | .fixed-width .el-button { |
| | | margin: 0 5px; |
| | | } |
| | | .confirmation-detail { |
| | | padding: 20px; |
| | | .attachment-section { |
| | | padding: 15px; |
| | | } |
| | | |
| | | .detail-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .attachment-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .detail-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .attachment-upload-section { |
| | | padding: 10px; |
| | | } |
| | | |
| | | .upload-header { |
| | | .attachment-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 15px; |
| | | padding-bottom: 10px; |
| | | border-bottom: 1px solid #ebeef5; |
| | | } |
| | | |
| | | .upload-title { |
| | |
| | | color: #303133; |
| | | } |
| | | |
| | | .file-info { |
| | | display: flex; |
| | | align-items: center; |
| | | .attachment-list { |
| | | margin-top: 15px; |
| | | } |
| | | |
| | | .empty-attachment { |
| | |
| | | color: #909399; |
| | | } |
| | | |
| | | /* å¾çé¢è§å¯¹è¯æ¡æ ·å¼ */ |
| | | :deep(.image-preview-dialog) { |
| | | width: auto; |
| | | max-width: 90vw; |
| | | } |
| | | |
| | | :deep(.image-preview-dialog .el-message-box__content) { |
| | | text-align: center; |
| | | .file-name { |
| | | font-size: 13px; |
| | | color: #606266; |
| | | } |
| | | </style> |
| | |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¡®è®¤ç¶æ" prop="confirmationStatus"> |
| | | <!-- <el-form-item label="ç¡®è®¤ç¶æ" prop="confirmationStatus"> |
| | | <el-select |
| | | v-model="queryParams.confirmationStatus" |
| | | placeholder="è¯·éæ©ç¡®è®¤ç¶æ" |
| | |
| | | <el-option label="å®¶å±ç¡®è®¤" value="1" /> |
| | | <el-option label="ä¸åææç®" value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form-item> --> |
| | | <el-form-item label="确认æ¶é´" prop="confirmationTimeRange"> |
| | | <el-date-picker |
| | | v-model="queryParams.confirmationTimeRange" |
| | |
| | | <el-table-column |
| | | label="æ½å¨æç®è
å§å" |
| | | align="center" |
| | | prop="donorName" |
| | | prop="name" |
| | | width="120" |
| | | /> |
| | | <el-table-column label="æ§å«" align="center" prop="gender" width="80"> |
| | | <el-table-column label="æ§å«" align="center" prop="sex" width="80"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="parseInt(scope.row.gender)" |
| | | :value="scope.row.sex" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column |
| | | label="ç¾ç
è¯æ" |
| | | align="center" |
| | | prop="diagnosis" |
| | | prop="diagnosisname" |
| | | min-width="180" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="æå¨å»çæºæ" |
| | | align="center" |
| | | prop="hospitalName" |
| | | prop="treatmenthospitalname" |
| | | width="150" |
| | | show-overflow-tooltip |
| | | /> |
| | | <!-- <el-table-column |
| | | label="ç¡®è®¤ç¶æ" |
| | | align="center" |
| | | prop="relativeconfirmationsign" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="statusFilter(scope.row.relativeconfirmationsign)"> |
| | | {{ statusTextFilter(scope.row.relativeconfirmationsign) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> --> |
| | | |
| | | <el-table-column |
| | | label="家屿è§" |
| | | align="center" |
| | | prop="relativeRemark" |
| | | width="150" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="ç¡®è®¤ç¶æ" |
| | | align="center" |
| | | prop="confirmationStatus" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="statusFilter(scope.row.confirmationStatus)"> |
| | | {{ statusTextFilter(scope.row.confirmationStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="确认æ¶é´" |
| | | align="center" |
| | | prop="confirmationTime" |
| | | prop="signdate" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.confirmationTime |
| | | ? parseTime(scope.row.confirmationTime, "{y}-{m}-{d}") |
| | | scope.row.signdate |
| | | ? parseTime(scope.row.signdate, "{y}-{m}-{d}") |
| | | : "-" |
| | | }}</span> |
| | | </template> |
| | |
| | | <el-table-column |
| | | label="ä¸å¡äººå" |
| | | align="center" |
| | | prop="assignee" |
| | | prop="responsibleusername" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | label="åè°å1" |
| | | align="center" |
| | | prop="coordinator1" |
| | | prop="coordinatedusernameo" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | label="åè°å2" |
| | | align="center" |
| | | prop="coordinator2" |
| | | prop="coordinatedusernamet" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | |
| | | @click.stop="handleView(scope.row)" |
| | | >详æ
</el-button |
| | | > |
| | | <el-button |
| | | v-if="scope.row.confirmationStatus === '0'" |
| | | <!-- <el-button |
| | | v-if="scope.row.relativeconfirmationsign === '0'" |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click.stop="handleConfirm(scope.row)" |
| | | >确认</el-button |
| | | > |
| | | > --> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { listConfirmation, delConfirmation, exportConfirmation } from "./mockConfirmationApi"; |
| | | import { relativesList } from "@/api/businessApi"; |
| | | import Pagination from "@/components/Pagination"; |
| | | |
| | | export default { |
| | |
| | | return statusMap[status] || "æªç¥"; |
| | | }, |
| | | // æ¥è¯¢æç®ç¡®è®¤å表 |
| | | getList() { |
| | | async getList() { |
| | | this.loading = true; |
| | | listConfirmation(this.queryParams) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.confirmationList = response.data.rows; |
| | | this.total = response.data.total; |
| | | } else { |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | } |
| | | this.loading = false; |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·åæç®ç¡®è®¤å表失败:", error); |
| | | this.loading = false; |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | }); |
| | | try { |
| | | // æå»ºæ¥è¯¢åæ°ï¼æ å°å°æ¥å£å段 |
| | | const requestParams = this.buildRequestParams(); |
| | | |
| | | const response = await relativesList(requestParams); |
| | | |
| | | if (response.code === 200) { |
| | | // å¤çæ¥å£è¿åçæ°æ®ç»æ |
| | | this.handleResponseData(response); |
| | | } else { |
| | | this.$message.error("è·åæ°æ®å¤±è´¥ï¼" + (response.msg || "æªç¥é误")); |
| | | this.confirmationList = []; |
| | | this.total = 0; |
| | | } |
| | | } catch (error) { |
| | | console.error("è·åæç®ç¡®è®¤å表失败:", error); |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | this.confirmationList = []; |
| | | this.total = 0; |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | // æå»ºè¯·æ±åæ° |
| | | buildRequestParams() { |
| | | const params = { |
| | | pageNum: this.queryParams.pageNum, |
| | | pageSize: this.queryParams.pageSize |
| | | }; |
| | | |
| | | // æ å°æ¥è¯¢æ¡ä»¶å°æ¥å£å段 |
| | | if (this.queryParams.donorName) { |
| | | params.name = this.queryParams.donorName; |
| | | } |
| | | if (this.queryParams.hospitalName) { |
| | | params.treatmenthospitalname = this.queryParams.hospitalName; |
| | | } |
| | | if (this.queryParams.assignee) { |
| | | params.responsibleusername = this.queryParams.assignee; |
| | | } |
| | | // if (this.queryParams.confirmationStatus) { |
| | | // params.relativeconfirmationsign = this.queryParams.confirmationStatus; |
| | | // } |
| | | |
| | | // å¤çæ¶é´èå´æ¥è¯¢ |
| | | if ( |
| | | this.queryParams.confirmationTimeRange && |
| | | this.queryParams.confirmationTimeRange.length === 2 |
| | | ) { |
| | | params.startSignDate = this.queryParams.confirmationTimeRange[0]; |
| | | params.endSignDate = this.queryParams.confirmationTimeRange[1]; |
| | | } |
| | | |
| | | return params; |
| | | }, |
| | | // å¤çæ¥å£ååºæ°æ® |
| | | handleResponseData(response) { |
| | | // æ ¹æ®æ¥å£å®é
è¿åçæ°æ®ç»æè¿è¡è°æ´ |
| | | if (response.data) { |
| | | if (Array.isArray(response.data)) { |
| | | // 妿è¿åçæ¯æ°ç» |
| | | this.confirmationList = response.data; |
| | | this.total = response.data.length; |
| | | } else if (response.data.rows) { |
| | | // 妿è¿åçæ¯åé¡µæ°æ®ç»æ |
| | | this.confirmationList = response.data.rows; |
| | | this.total = response.data.total; |
| | | } else if (Array.isArray(response.data.list)) { |
| | | // 妿è¿åçæ¯liståæ®µ |
| | | this.confirmationList = response.data.list; |
| | | this.total = response.data.total || response.data.list.length; |
| | | } else { |
| | | // å
¶ä»æ°æ®ç»æï¼å°è¯ç´æ¥ä½¿ç¨data |
| | | this.confirmationList = response.data; |
| | | this.total = response.total || response.data.length; |
| | | } |
| | | } else { |
| | | // 妿data为空ï¼ä½¿ç¨æ ¹çº§å«çrowsælist |
| | | if (Array.isArray(response.rows)) { |
| | | this.confirmationList = response.rows; |
| | | this.total = response.total; |
| | | } else if (Array.isArray(response.list)) { |
| | | this.confirmationList = response.list; |
| | | this.total = response.total; |
| | | } else { |
| | | this.confirmationList = []; |
| | | this.total = 0; |
| | | } |
| | | } |
| | | |
| | | // ç¡®ä¿confirmationListæ¯æ°ç» |
| | | if (!Array.isArray(this.confirmationList)) { |
| | | this.confirmationList = []; |
| | | } |
| | | }, |
| | | // æç´¢æé®æä½ |
| | | handleQuery() { |
| | |
| | | // éç½®æé®æä½ |
| | | resetQuery() { |
| | | this.$refs.queryForm.resetFields(); |
| | | this.handleQuery(); |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | |
| | | handleRowClick(row) { |
| | | this.$router.push({ |
| | | path: "/case/affirmInfo", |
| | | query: { id: row.id } |
| | | query: { id: row.id, infoid: row.infoid } |
| | | }); |
| | | }, |
| | | // æ¥ç详æ
|
| | | handleView(row) { |
| | | this.$router.push({ |
| | | path: "/case/affirmInfo", |
| | | query: { id: row.id } |
| | | query: { id: row.id, infoid: row.infoid } |
| | | }); |
| | | }, |
| | | // 确认æä½ |
| | |
| | | }, |
| | | // ä¿®æ¹æé®æä½ |
| | | handleUpdate() { |
| | | if (this.ids.length === 0) return; |
| | | |
| | | const id = this.ids[0]; |
| | | this.$router.push({ |
| | | path: "/case/confirmation/edit", |
| | |
| | | }); |
| | | }, |
| | | // å é¤æé®æä½ |
| | | handleDelete() { |
| | | const ids = this.ids; |
| | | this.$confirm("æ¯å¦ç¡®è®¤å é¤éä¸çæ°æ®é¡¹ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | return delConfirmation(ids); |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("å 餿å"); |
| | | this.getList(); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | async handleDelete() { |
| | | if (this.ids.length === 0) return; |
| | | |
| | | try { |
| | | await this.$confirm("æ¯å¦ç¡®è®¤å é¤éä¸çæ°æ®é¡¹ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }); |
| | | |
| | | // è¿ééè¦è°ç¨å 餿¥å£ï¼ç±äºæ¨åªæä¾äºrelativesListæ¥å£ï¼è¿éææ¶æ³¨é |
| | | // å®é
ä½¿ç¨æ¶éè¦è°ç¨å¯¹åºçå 餿¥å£ |
| | | // const response = await delConfirmation(this.ids); |
| | | |
| | | // 模æå 餿å |
| | | this.$message.success("å 餿å"); |
| | | this.getList(); // éæ°å è½½æ°æ® |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | console.error("å é¤å¤±è´¥:", error); |
| | | this.$message.error("å é¤å¤±è´¥"); |
| | | } |
| | | } |
| | | }, |
| | | // å¯¼åºæé®æä½ |
| | | handleExport() { |
| | | const queryParams = this.queryParams; |
| | | this.$confirm("æ¯å¦ç¡®è®¤å¯¼åºææç¡®è®¤æ°æ®ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | this.loading = true; |
| | | return exportConfirmation(queryParams); |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("å¯¼åºæå"); |
| | | // å®é
项ç®ä¸è¿éå¤çæä»¶ä¸è½½ |
| | | } |
| | | this.loading = false; |
| | | }) |
| | | .catch(() => { |
| | | this.loading = false; |
| | | async handleExport() { |
| | | try { |
| | | await this.$confirm("æ¯å¦ç¡®è®¤å¯¼åºææç¡®è®¤æ°æ®ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }); |
| | | |
| | | this.loading = true; |
| | | |
| | | // æå»ºå¯¼åºåæ° |
| | | const exportParams = this.buildRequestParams(); |
| | | exportParams.pageSize = 10000; // å¯¼åºæææ°æ® |
| | | |
| | | // è·åå¯¼åºæ°æ® |
| | | const response = await relativesList(exportParams); |
| | | |
| | | if (response.code === 200) { |
| | | // å¤çå¯¼åºæ°æ® |
| | | this.exportDataToExcel(response.data); |
| | | this.$message.success("å¯¼åºæå"); |
| | | } else { |
| | | this.$message.error("导åºå¤±è´¥ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | console.error("导åºå¤±è´¥:", error); |
| | | this.$message.error("导åºå¤±è´¥"); |
| | | } |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | // å¯¼åºæ°æ®å°Excel |
| | | exportDataToExcel(data) { |
| | | // è¿éå®ç°å¯¼åºé»è¾ï¼å¯ä»¥ä½¿ç¨xlsxçåº |
| | | // ç±äºæ¯å端导åºï¼è¿éç®åæ¼ç¤º |
| | | console.log("å¯¼åºæ°æ®:", data); |
| | | // å®é
项ç®ä¸éè¦å®ç°å®æ´çExcel导åºåè½ |
| | | }, |
| | | // æ¶é´æ ¼å¼å |
| | | parseTime(time, pattern) { |
| | | if (!time) return ""; |
| | | const date = new Date(time); |
| | | if (pattern) { |
| | | // ç®åçæ¨¡å¼å¹é
|
| | | if (pattern === "{y}-{m}-{d}") { |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1) |
| | | .toString() |
| | | .padStart(2, "0")}-${date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | } |
| | | } |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1) |
| | | .toString() |
| | | .padStart(2, "0")}-${date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0")} ${date |
| | | .getHours() |
| | | .toString() |
| | | .padStart(2, "0")}:${date |
| | | .getMinutes() |
| | | .toString() |
| | | .padStart(2, "0")}:${date |
| | | .getSeconds() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | } |
| | | } |
| | |
| | | assessmentData.caseNo |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ½å¨æç®è
å§å">{{ |
| | | assessmentData.donorName |
| | | assessmentData.name || assessmentData.donorName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ§å«"> |
| | | <dict-tag :options="genderOptions" :value="assessmentData.gender" /> |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="assessmentData.sex" |
| | | /> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å¹´é¾" |
| | | >{{ assessmentData.age }}å²</el-descriptions-item |
| | | > |
| | | <el-descriptions-item label="è¡å"> |
| | | <dict-tag |
| | | :options="bloodTypeOptions" |
| | | :value="assessmentData.bloodType" |
| | | /> |
| | | {{ assessmentData.bloodtype }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä»¶å·ç ">{{ |
| | | assessmentData.idCardNo |
| | | assessmentData.idcardno |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç¾ç
è¯æ">{{ |
| | | assessmentData.diagnosis |
| | | assessmentData.diagnosisname |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æå¨å»çæºæ">{{ |
| | | assessmentData.hospitalName |
| | | assessmentData.treatmenthospitalname |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="主治å»ç">{{ |
| | | assessmentData.doctorName |
| | | <el-descriptions-item label="åè°å">{{ |
| | | assessmentData.coordinatorName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç³è¯·è¯ä¼°æ¶é´">{{ |
| | | assessmentData.applyTime |
| | | <el-descriptions-item label="è¯ä¼°æ¶é´">{{ |
| | | assessmentData.assessTime |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°ç±»å"> |
| | | <dict-tag |
| | | :options="assessmentTypeOptions" |
| | | :value="assessmentData.assessmentType" |
| | | /> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°ç¶æ"> |
| | | <el-tag :type="statusFilter(assessmentData.assessmentStatus)"> |
| | | {{ statusTextFilter(assessmentData.assessmentStatus) }} |
| | | <el-tag :type="statusFilter(assessmentData.assessState)"> |
| | | {{ statusTextFilter(assessmentData.assessState) }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | |
| | | type="primary" |
| | | size="mini" |
| | | @click="handleCompleteAssessment" |
| | | :loading="saveLoading" |
| | | > |
| | | ç¡®è®¤å®æè¯ä¼° |
| | | </el-button> |
| | |
| | | å½åè§è²ï¼{{ currentDepartment }}è¯ä¼°äººå |
| | | </span> |
| | | </div> |
| | | <el-row> |
| | | <el-form-item label-width="100px" label="è¯ä¼°å¨å®"> |
| | | <el-checkbox-group v-model="organdecision"> |
| | | |
| | | <!-- æç®å³å®è¡¨å --> |
| | | <el-form> |
| | | <el-form-item label-width="100px" label="æç®å³å®"> |
| | | <el-checkbox-group |
| | | v-model="organdecision" |
| | | @change="handleOrganDecisionChange" |
| | | :disabled="!isEdit" |
| | | > |
| | | <el-checkbox |
| | | v-for="item in organselection" |
| | | :key="item" |
| | |
| | | </el-checkbox-group> |
| | | <el-input |
| | | v-if="organdecision.includes('å
¶ä»')" |
| | | v-model="assessmentData.organdecisionOther" |
| | | v-model="organdecisionOther" |
| | | placeholder="请è¾å
¥å
¶ä»æç®å³å®çå
·ä½å
容" |
| | | style="margin-top: 10px; width: 300px;" |
| | | :readonly="!isEdit" |
| | | @input="handleOtherDecisionInput" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-row> |
| | | </el-form> |
| | | |
| | | <!-- å¨å®è¯ä¼°è¡¨æ ¼ --> |
| | | <el-table |
| | | :data="organAssessmentList" |
| | | :data="filteredOrganAssessmentList" |
| | | v-loading="assessmentLoading" |
| | | style="width: 100%" |
| | | :row-class-name="getRowClassName" |
| | | :expand-row-keys="expandedRowKeys" |
| | | @expand-change="handleExpandChange" |
| | | row-key="organType" |
| | | row-key="organno" |
| | | empty-text="å½åæç®å³å®ä¸ææ éè¦è¯ä¼°çå¨å®" |
| | | > |
| | | <el-table-column type="expand" width="60"> |
| | | <el-table-column type="expand"> |
| | | <template slot-scope="scope"> |
| | | <div class="organ-expand-content" v-if="scope.row.expanded"> |
| | | <el-tabs |
| | |
| | | :assessment-data="assessment" |
| | | :assessment-index="index" |
| | | :readonly="!canAssessOrgan(scope.row)" |
| | | @save="handleSaveOrganAssessment" |
| | | @add-assessment="handleAddAssessment" |
| | | /> |
| | | </el-tab-pane> |
| | | |
| | | <!-- æ·»å è¯ä¼°æé® --> |
| | | <el-tab-pane name="add" v-if="canAssessOrgan(scope.row)"> |
| | | <el-tab-pane |
| | | name="add" |
| | | v-if="canAssessOrgan(scope.row) && isEdit" |
| | | > |
| | | <template slot="label"> |
| | | <el-button |
| | | type="text" |
| | |
| | | <div class="assessment-summary"> |
| | | <el-descriptions title="è¯ä¼°ç»ææ±æ»" :column="2" border> |
| | | <el-descriptions-item label="å¨å®ç±»å">{{ |
| | | scope.row.organName |
| | | scope.row.organname |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°ç§å®¤">{{ |
| | | scope.row.department |
| | | <el-descriptions-item label="è·åæºæ">{{ |
| | | scope.row.gainhospitalname |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°æ¬¡æ°" :span="2"> |
| | | <el-tag type="info" |
| | |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <!-- éä»¶æ±æ» --> |
| | | <el-card header="ææè¯ä¼°éä»¶" style="margin-top: 20px;"> |
| | | <el-table |
| | | :data="getAllAttachments(scope.row)" |
| | | size="small" |
| | | empty-text="ææ éä»¶" |
| | | > |
| | | <el-table-column label="éä»¶åç§°" prop="fileName" /> |
| | | <el-table-column label="è¯ä¼°é¶æ®µ" width="120"> |
| | | <template slot-scope="{ row }"> |
| | | 第{{ row.assessmentIndex + 1 }}次è¯ä¼° |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ä¸ä¼ æ¶é´" |
| | | prop="uploadTime" |
| | | width="180" |
| | | /> |
| | | <el-table-column label="æä½" width="120"> |
| | | <template slot-scope="{ row }"> |
| | | <el-button |
| | | type="text" |
| | | @click="handlePreviewAttachment(row)" |
| | | >é¢è§</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <!-- è¯ä¼°è¯¦æ
æ±æ» --> |
| | | <el-card header="è¯ä¼°è¯¦æ
" style="margin-top: 20px;"> |
| | | <el-descriptions :column="1" border> |
| | | <el-descriptions-item label="è·ååæ´»æ£"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.isbiopsybefore === '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " |
| | | > |
| | | {{ scope.row.isbiopsybefore === "1" ? "æ¯" : "å¦" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è·ååæ´»æ£"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.isbiopsyafter === '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " |
| | | > |
| | | {{ scope.row.isbiopsyafter === "1" ? "æ¯" : "å¦" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¾¹ç¼å¨å®"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.ismarginalorgan === '1' |
| | | ? 'warning' |
| | | : 'info' |
| | | " |
| | | > |
| | | {{ |
| | | scope.row.ismarginalorgan === "1" ? "æ¯" : "å¦" |
| | | }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ç
åè鳿§"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.ispathogenpositive === '1' |
| | | ? 'danger' |
| | | : 'info' |
| | | " |
| | | > |
| | | {{ |
| | | scope.row.ispathogenpositive === "1" ? "æ¯" : "å¦" |
| | | }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="å¨å®ç±»å" |
| | | align="center" |
| | | prop="organType" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="organTypeOptions" |
| | | :value="scope.row.organType" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¨å®ç±»å" align="center" prop="organname" /> |
| | | |
| | | <el-table-column label="å¨å®ç¼å·" align="center" prop="organnumber" /> |
| | | |
| | | <el-table-column |
| | | label="è¯ä¼°ç§å®¤" |
| | | label="è·åæºæ" |
| | | align="center" |
| | | prop="department" |
| | | width="120" |
| | | prop="gainhospitalname" |
| | | show-overflow-tooltip |
| | | /> |
| | | |
| | | <el-table-column label="è¯ä¼°äººå" align="center" prop="assessor" /> |
| | | |
| | | <!-- 卿æ¾ç¤ºè¯ä¼°ç¶æå --> |
| | | <el-table-column |
| | |
| | | <el-table-column label="æ´ä½ç¶æ" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="scope.row.assessmentStatus === '1' ? 'success' : 'primary'" |
| | | :type=" |
| | | getOrganOverallStatus(scope.row) === 'completed' |
| | | ? 'success' |
| | | : getOrganOverallStatus(scope.row) === 'assessing' |
| | | ? 'primary' |
| | | : 'warning' |
| | | " |
| | | size="small" |
| | | > |
| | | {{ scope.row.assessmentStatus === "1" ? "已宿" : "è¯ä¼°ä¸" }} |
| | | {{ getOrganOverallStatusText(scope.row) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | v-if="canAssessOrgan(scope.row)" |
| | | v-if="canAssessOrgan(scope.row) && isEdit" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleToggleExpand(scope.row)" |
| | | > |
| | | {{ |
| | | expandedRowKeys.includes(scope.row.organType) ? "æ¶èµ·" : "详æ
" |
| | | expandedRowKeys.includes(scope.row.organno) ? "æ¶èµ·" : "详æ
" |
| | | }} |
| | | </el-button> |
| | | <el-button |
| | | v-else-if="!isEdit" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleToggleExpand(scope.row)" |
| | | > |
| | | {{ |
| | | expandedRowKeys.includes(scope.row.organno) ? "æ¶èµ·" : "æ¥ç" |
| | | }} |
| | | </el-button> |
| | | <el-button v-else size="mini" type="text" disabled |
| | |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <!-- æ´ä½ä¿åæé® --> |
| | | <div class="footer-actions" v-if="isEdit"> |
| | | <el-button type="primary" @click="handleSaveAll" :loading="saveLoading">ä¿åè¯ä¼°è¡¨</el-button> |
| | | <el-button @click="handleCancel">åæ¶</el-button> |
| | | </div> |
| | | |
| | | <!-- æä»¶é¢è§å¼¹çª --> |
| | | <FilePreviewDialog |
| | |
| | | |
| | | <script> |
| | | import { |
| | | getAssessment, |
| | | updateOrganAssessment, |
| | | completeAssessment |
| | | } from "./mockAssessmentApi"; |
| | | evaluateBaseInfolist, |
| | | assessedit, |
| | | assessAdd |
| | | } from "@/api/businessApi/index"; |
| | | import FilePreviewDialog from "@/components/FilePreviewDialog"; |
| | | import OrganAssessmentForm from "./components/OrganAssessmentForm.vue"; |
| | | |
| | | export default { |
| | | name: "AssessmentDetail", |
| | | components: { OrganAssessmentForm, FilePreviewDialog }, |
| | | dicts: ["sys_user_sex", "sys_Organ", "sys_0_1"], |
| | | data() { |
| | | return { |
| | | assessmentId: undefined, |
| | | assessmentData: {}, |
| | | organAssessmentList: [], |
| | | attachmentList: [], |
| | | // æ¯å¦ç¼è¾æ¨¡å¼ |
| | | isEdit: false, |
| | | // å è½½ç¶æ |
| | | assessmentLoading: false, |
| | | organdecision: [], |
| | | saveLoading: false, |
| | | // æ°æ®ID |
| | | infoid: undefined, |
| | | assessmentId: undefined, |
| | | // ä¸»è¦æ°æ® |
| | | assessmentData: {}, |
| | | organAssessmentList: [], // ææå¨å®æ°æ® |
| | | // å±å¼è¡ç¸å
³ |
| | | expandedRowKeys: [], |
| | | // éä»¶ç¸å
³ |
| | | currentPreviewFile: null, |
| | | attachmentVisible: false, |
| | | |
| | | currentUser: { |
| | | id: "001", |
| | | name: "å¼ å»ç", |
| | | department: "åè°å", |
| | | role: "coordinator" |
| | | }, |
| | | //departmentï¼å¿èãcoordinatorï¼åè°å |
| | | // åå
¸é项 |
| | | genderOptions: [ |
| | | { value: "0", label: "ç·" }, |
| | | { value: "1", label: "女" } |
| | | ], |
| | | bloodTypeOptions: [ |
| | | { value: "A", label: "Aå" }, |
| | | { value: "B", label: "Bå" }, |
| | | { value: "O", label: "Oå" }, |
| | | { value: "AB", label: "ABå" } |
| | | ], |
| | | assessmentTypeOptions: [ |
| | | { value: "1", label: "忬¡è¯ä¼°" }, |
| | | { value: "2", label: "æç»è¯ä¼°" } |
| | | ], |
| | | organTypeOptions: [ |
| | | { value: "heart", label: "å¿è" }, |
| | | { value: "liver", label: "èè" }, |
| | | { value: "kidney", label: "è¾è" }, |
| | | { value: "lung", label: "èºè" }, |
| | | { value: "pancreas", label: "è°è
º" }, |
| | | { value: "intestine", label: "è é" }, |
| | | { value: "cornea", label: "è§è" }, |
| | | { value: "skin", label: "ç®è¤" } |
| | | ], |
| | | // æç®å³å®ç¸å
³ |
| | | organdecision: [], |
| | | organdecisionOther: "", |
| | | organselection: [ |
| | | "èè", |
| | | "åè¾", |
| | |
| | | "åç¼ç»ç»", |
| | | "éä½", |
| | | "å
¶ä»" |
| | | ] |
| | | ], |
| | | // å¨å®ç±»åæ å°å
³ç³» |
| | | organDecisionMapping: { |
| | | èè: ["èè"], |
| | | åè¾: ["å·¦è¾", "å³è¾"], |
| | | å·¦è¾: ["å·¦è¾"], |
| | | å³è¾: ["å³è¾"], |
| | | å¿è: ["å¿è"], |
| | | èºè: ["èºè"], |
| | | è°è
º: ["è°è
º"], |
| | | å°è : ["å°è "], |
| | | åç¼ç»ç»: ["è§è"], |
| | | éä½: ["ç®è¤", "骨骼", "å
¶ä»ç»ç»"], |
| | | å
¶ä»: [] // å
¶ä»ç±»å䏿 å°å
·ä½å¨å® |
| | | }, |
| | | // ç¨æ·ä¿¡æ¯ |
| | | currentUser: { |
| | | id: "001", |
| | | name: "å¼ å»ç", |
| | | department: "å¿èç§", |
| | | role: "doctor" // coordinator, doctor |
| | | } |
| | | }; |
| | | }, |
| | | computed: { |
| | |
| | | currentDepartment() { |
| | | return this.currentUser.department; |
| | | }, |
| | | // æ ¹æ®æç®å³å®è¿æ»¤åçå¨å®å表 |
| | | filteredOrganAssessmentList() { |
| | | if (!this.organdecision || this.organdecision.length === 0) { |
| | | return []; |
| | | } |
| | | |
| | | // è·åææéä¸çå¨å®ç±»å |
| | | const selectedOrgans = new Set(); |
| | | this.organdecision.forEach(decision => { |
| | | const organs = this.organDecisionMapping[decision] || []; |
| | | organs.forEach(organ => selectedOrgans.add(organ)); |
| | | }); |
| | | |
| | | // è¿æ»¤å¨å®è¯ä¼°å表 |
| | | return this.organAssessmentList.filter(organ => |
| | | selectedOrgans.has(organ.organname) |
| | | ); |
| | | }, |
| | | // æ£æ¥ææè¿æ»¤åçå¨å®æ¯å¦é½å·²è¯ä¼° |
| | | allOrgansAssessed() { |
| | | return this.organAssessmentList.every( |
| | | return this.filteredOrganAssessmentList.every( |
| | | organ => |
| | | organ.assessments && |
| | | organ.assessments.length > 0 && |
| | |
| | | ); |
| | | } |
| | | }, |
| | | watch: { |
| | | // ç嬿ç®å³å®ååï¼ç¨äºå¤æé»è¾å¤ç |
| | | organdecision: { |
| | | handler(newVal, oldVal) { |
| | | this.handleComplexDecisionChange(newVal, oldVal); |
| | | }, |
| | | deep: true |
| | | } |
| | | }, |
| | | created() { |
| | | this.infoid = this.$route.query.infoid; |
| | | this.assessmentId = this.$route.query.id; |
| | | this.isEdit = this.$route.query.assess === "true"; |
| | | this.getAssessmentDetail(); |
| | | }, |
| | | methods: { |
| | | // æ´ä½ä¿åæ¹æ³ |
| | | async handleSaveAll() { |
| | | this.saveLoading = true; |
| | | try { |
| | | // 1. åå¤ä¸»è¯ä¼°è¡¨æ°æ® |
| | | const saveData = { |
| | | // æ ¹æ® id æ¯å¦åå¨å³å®æ¯æ´æ°è¿æ¯æ°å¢ |
| | | id: this.assessmentData.id || undefined, |
| | | infoid: this.infoid, |
| | | caseNo: this.assessmentData.caseNo, |
| | | donorno: this.assessmentData.donorno, |
| | | treatmenthospitalname: this.assessmentData.treatmenthospitalname, |
| | | treatmenthospitalno: this.assessmentData.treatmenthospitalno, |
| | | sex: this.assessmentData.sex, |
| | | age: this.assessmentData.age, |
| | | bloodtype: this.assessmentData.bloodtype, |
| | | idcardno: this.assessmentData.idcardno, |
| | | diagnosisname: this.assessmentData.diagnosisname, |
| | | coordinatorName: this.assessmentData.coordinatorName, |
| | | assessTime: this.assessmentData.assessTime || new Date().toISOString(), |
| | | assessState: this.assessmentData.assessState, |
| | | assessannex: this.assessmentData.assessannex, |
| | | // æç®å³å®ä¿¡æ¯ |
| | | organdecision: this.organdecision.join(','), |
| | | organdecisionOther: this.organdecisionOther, |
| | | // å¨å®è¯ä¼°å表 |
| | | serviceMedicalevaluationorgans: this.organAssessmentList.map(organ => ({ |
| | | id: organ.id, |
| | | infoid: organ.infoid, |
| | | donorno: organ.donorno, |
| | | organno: organ.organno, |
| | | organname: organ.organname, |
| | | organnumber: organ.organnumber, |
| | | gainhospitalno: organ.gainhospitalno, |
| | | gainhospitalname: organ.gainhospitalname, |
| | | isbiopsybefore: organ.isbiopsybefore, |
| | | isbiopsyafter: organ.isbiopsyafter, |
| | | ismarginalorgan: organ.ismarginalorgan, |
| | | ispathogenpositive: organ.ispathogenpositive, |
| | | ispnf: organ.ispnf, |
| | | isdgf: organ.isdgf, |
| | | // å° assessments æ°ç»åºååå° assesscontent åæ®µ |
| | | assesscontent: JSON.stringify(organ.assessments) |
| | | })) |
| | | }; |
| | | |
| | | // 2. æ ¹æ® id 夿è°ç¨åªä¸ª API |
| | | const saveMethod = this.assessmentData.id ? assessedit : assessAdd; |
| | | const response = await saveMethod(saveData); |
| | | |
| | | if (response.code === 200) { |
| | | this.$message.success('è¯ä¼°è¡¨ä¿åæåï¼'); |
| | | // ä¿åæååï¼æ´æ°æ¬å°ç assessmentData.idï¼å¯¹äºæ°å¢æ
åµï¼ |
| | | if (!this.assessmentData.id && response.data && response.data.id) { |
| | | this.assessmentData.id = response.data.id; |
| | | } |
| | | } else { |
| | | this.$message.error('ä¿å失败ï¼' + (response.msg || 'æªç¥é误')); |
| | | } |
| | | } catch (error) { |
| | | console.error('ä¿åè¯ä¼°è¡¨å¤±è´¥:', error); |
| | | this.$message.error('ä¿å失败ï¼è¯·éè¯'); |
| | | } finally { |
| | | this.saveLoading = false; |
| | | } |
| | | }, |
| | | |
| | | // åæ¶æé®äºä»¶ |
| | | handleCancel() { |
| | | this.$router.go(-1); |
| | | }, |
| | | |
| | | // æç®å³å®åæ´å¤ç |
| | | handleOrganDecisionChange(newDecision) { |
| | | // èªå¨å¤çç¸å
³é»è¾ |
| | | this.autoHandleDecisionChange(newDecision); |
| | | // 强å¶éæ°æ¸²æ |
| | | this.$forceUpdate(); |
| | | // 妿仿鿩å为æ éæ©ï¼æ¸
空å±å¼ç¶æ |
| | | if (newDecision.length === 0) { |
| | | this.expandedRowKeys = []; |
| | | } |
| | | }, |
| | | |
| | | // å
¶ä»æç®å³å®è¾å
¥å¤ç |
| | | handleOtherDecisionInput(value) { |
| | | // è¾å
¥æ¶ä¸ååç¬ä¿åï¼çå¾
æ´ä½ä¿å |
| | | }, |
| | | |
| | | // èªå¨å¤çå³å®åæ´é»è¾ |
| | | autoHandleDecisionChange(newDecision) { |
| | | // 妿鿩äº"åè¾"ï¼èªå¨åæ¶åç¬ç"å·¦è¾"å"å³è¾"éæ© |
| | | if (newDecision.includes("åè¾")) { |
| | | this.organdecision = newDecision.filter( |
| | | item => item !== "å·¦è¾" && item !== "å³è¾" |
| | | ); |
| | | } |
| | | // 妿鿩äº"å·¦è¾"æ"å³è¾"ï¼åæ¶"åè¾"éæ© |
| | | else if (newDecision.includes("å·¦è¾") || newDecision.includes("å³è¾")) { |
| | | this.organdecision = newDecision.filter(item => item !== "åè¾"); |
| | | } |
| | | |
| | | // å¤çäºæ¥é»è¾ |
| | | this.handleExclusiveDecisions(); |
| | | }, |
| | | |
| | | // å¤çäºæ¥çæç®å³å® |
| | | handleExclusiveDecisions() { |
| | | // é使ç®ä¸å
¶ä»å¨å®æç®äºæ¥ï¼æ ¹æ®ä¸å¡éæ±è°æ´ï¼ |
| | | if (this.organdecision.includes("éä½")) { |
| | | // å¯ä»¥è®¾ç½®åªä¿çé使ç®ï¼æè
æ ¹æ®ä¸å¡éæ±å¤ç |
| | | } |
| | | }, |
| | | |
| | | // 夿å³çååå¤ç |
| | | handleComplexDecisionChange(newVal, oldVal) { |
| | | // å¤çæ°å¢çéæ© |
| | | const addedDecisions = newVal.filter(item => !oldVal.includes(item)); |
| | | const removedDecisions = oldVal.filter(item => !newVal.includes(item)); |
| | | |
| | | // 对æ°å¢å çéæ©è¿è¡ç¹æ®å¤ç |
| | | addedDecisions.forEach(decision => { |
| | | this.handleNewDecision(decision); |
| | | }); |
| | | |
| | | // 对移é¤çéæ©è¿è¡æ¸
ç |
| | | removedDecisions.forEach(decision => { |
| | | this.handleRemovedDecision(decision); |
| | | }); |
| | | }, |
| | | |
| | | // å¤çæ°å¢çæç®å³å® |
| | | handleNewDecision(decision) { |
| | | // æ ¹æ®æ å°å
³ç³»èªå¨å建对åºçå¨å®è¯ä¼°é¡¹ |
| | | this.autoCreateOrganAssessments(decision); |
| | | }, |
| | | |
| | | // èªå¨å建å¨å®è¯ä¼°é¡¹ |
| | | autoCreateOrganAssessments(decision) { |
| | | const organsToCreate = this.organDecisionMapping[decision]; |
| | | |
| | | if (organsToCreate && organsToCreate.length > 0) { |
| | | organsToCreate.forEach(organName => { |
| | | this.ensureOrganExists(organName); |
| | | }); |
| | | |
| | | // æ¾ç¤ºå建æç¤º |
| | | if (organsToCreate.length > 0) { |
| | | this.$message.success( |
| | | `已为ã${decision}ãå建${organsToCreate.length}个è¯ä¼°é¡¹` |
| | | ); |
| | | } |
| | | } else { |
| | | console.warn(`æç®å³å®ã${decision}ãæ²¡æé
ç½®å¨å®æ å°å
³ç³»`); |
| | | } |
| | | }, |
| | | |
| | | // å¤çç§»é¤çæç®å³å® |
| | | handleRemovedDecision(decision) { |
| | | // æ ¹æ®ä¸å¡éæ±æ·»å æ¸
çé»è¾ |
| | | const relatedOrgans = this.organDecisionMapping[decision] || []; |
| | | relatedOrgans.forEach(organ => { |
| | | // å¯ä»¥å¨è¿éæ·»å æ¸
çç¸å
³å¨å®è¯ä¼°çé»è¾ |
| | | }); |
| | | }, |
| | | |
| | | // ç¡®ä¿å¨å®åå¨ï¼å¸¦é夿£æ¥ï¼ |
| | | ensureOrganExists(organName) { |
| | | // æ£æ¥æ¯å¦å·²åå¨ååå¨å®è¯ä¼°é¡¹ |
| | | const exists = this.organAssessmentList.some( |
| | | organ => organ.organname === organName |
| | | ); |
| | | |
| | | if (!exists) { |
| | | // å建æ°çå¨å®è¯ä¼°é¡¹ |
| | | const newOrgan = { |
| | | id: `organ_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, |
| | | organno: `ORG${Date.now()}`, |
| | | organname: organName, |
| | | gainhospitalname: "å¾
åé
æºæ", |
| | | isbiopsybefore: "0", |
| | | isbiopsyafter: "0", |
| | | ismarginalorgan: "0", |
| | | ispathogenpositive: "0", |
| | | assessments: [this.getDefaultAssessment(0)], |
| | | activeAssessmentTab: "assessment_0", |
| | | expanded: false, |
| | | createTime: new Date().toISOString() |
| | | }; |
| | | |
| | | this.organAssessmentList = [...this.organAssessmentList, newOrgan]; |
| | | return true; |
| | | } |
| | | return false; |
| | | }, |
| | | |
| | | // è·åè¯ä¼°è¯¦æ
|
| | | async getAssessmentDetail() { |
| | | this.assessmentLoading = true; |
| | | try { |
| | | const response = await evaluateBaseInfolist({ infoid: this.infoid }); |
| | | |
| | | if (response.code === 200) { |
| | | this.handleResponseData(response); |
| | | } else { |
| | | this.$message.error("è·å详æ
失败ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | } catch (error) { |
| | | console.error("è·åè¯ä¼°è¯¦æ
失败:", error); |
| | | this.$message.error("è·å详æ
失败"); |
| | | } finally { |
| | | this.assessmentLoading = false; |
| | | } |
| | | }, |
| | | |
| | | // å¤çæ¥å£ååºæ°æ® |
| | | handleResponseData(response) { |
| | | let detailData = null; |
| | | |
| | | // æ ¹æ®æ¥å£å®é
è¿åçæ°æ®ç»æè¿è¡è°æ´ |
| | | if (response.data) { |
| | | if (Array.isArray(response.data)) { |
| | | detailData = response.data[0] || {}; |
| | | } else if (response.data.rows && Array.isArray(response.data.rows)) { |
| | | detailData = response.data.rows[0] || {}; |
| | | } else if (Array.isArray(response.data.list)) { |
| | | detailData = response.data.list[0] || {}; |
| | | } else { |
| | | detailData = response.data; |
| | | } |
| | | } else { |
| | | detailData = response; |
| | | } |
| | | |
| | | // æ å°å段å°è¯ä¼°æ°æ® |
| | | this.assessmentData = { |
| | | id: detailData.id || this.assessmentId, |
| | | infoid: detailData.infoid || this.infoid, |
| | | caseNo: detailData.caseNo || "", |
| | | name: detailData.name || detailData.donorName || "", |
| | | sex: detailData.sex || "", |
| | | age: detailData.age || "", |
| | | bloodtype: detailData.bloodtype || "", |
| | | idcardno: detailData.idcardno || "", |
| | | diagnosisname: detailData.diagnosisname || "", |
| | | treatmenthospitalname: detailData.treatmenthospitalname || "", |
| | | coordinatorName: detailData.coordinatorName || "", |
| | | assessTime: detailData.assessTime || "", |
| | | assessState: detailData.assessState || "1", |
| | | assessannex: detailData.assessannex || "" |
| | | }; |
| | | |
| | | // å¤çæç®å³å®æ°æ® |
| | | if (detailData.organdecision) { |
| | | this.organdecision = Array.isArray(detailData.organdecision) |
| | | ? detailData.organdecision |
| | | : (detailData.organdecision || "").split(","); |
| | | this.organdecisionOther = detailData.organdecisionOther || ""; |
| | | } |
| | | |
| | | // å¤çå¨å®è¯ä¼°æ°æ® |
| | | this.processOrganAssessmentData(detailData); |
| | | }, |
| | | |
| | | // å¤çå¨å®è¯ä¼°æ°æ® |
| | | processOrganAssessmentData(detailData) { |
| | | let organList = []; |
| | | |
| | | // 仿¥å£æ°æ®ä¸è·åå¨å®è¯ä¼°å表 |
| | | if (detailData.serviceMedicalevaluationorgans) { |
| | | if (Array.isArray(detailData.serviceMedicalevaluationorgans)) { |
| | | organList = detailData.serviceMedicalevaluationorgans; |
| | | } |
| | | } |
| | | |
| | | // 转æ¢å¨å®æ°æ®æ ¼å¼ï¼æ¯æå¤æ¬¡è¯ä¼° |
| | | this.organAssessmentList = organList.map(organ => { |
| | | const assessments = []; |
| | | |
| | | // è§£æassesscontentåæ®µä¸ç夿¬¡è¯ä¼°æ°æ® |
| | | if (organ.assesscontent) { |
| | | try { |
| | | const assessData = typeof organ.assesscontent === "string" |
| | | ? JSON.parse(organ.assesscontent) |
| | | : organ.assesscontent; |
| | | |
| | | if (Array.isArray(assessData)) { |
| | | assessments.push( |
| | | ...assessData.map((item, index) => ({ |
| | | ...item, |
| | | index: index, |
| | | status: item.status || "assessed" |
| | | })) |
| | | ); |
| | | } |
| | | } catch (error) { |
| | | console.warn("è§£æè¯ä¼°å
容失败:", error); |
| | | assessments.push(this.getDefaultAssessment(0)); |
| | | } |
| | | } else { |
| | | assessments.push(this.getDefaultAssessment(0)); |
| | | } |
| | | |
| | | return { |
| | | ...organ, |
| | | assessments: assessments, |
| | | activeAssessmentTab: assessments.length > 0 ? "assessment_0" : "summary", |
| | | expanded: false |
| | | }; |
| | | }); |
| | | }, |
| | | |
| | | // è·åé»è®¤è¯ä¼°æ°æ®ç»æ |
| | | getDefaultAssessment() { |
| | | getDefaultAssessment(index) { |
| | | return { |
| | | index: index, |
| | | status: "pending", |
| | | assessmentTime: "", |
| | | assessor: "", |
| | | functionStatus: "", |
| | | assessmentOpinion: "", |
| | | attachments: [], |
| | | clinicalData: {}, |
| | | labResults: {} |
| | | labResults: {}, |
| | | createTime: new Date().toISOString() |
| | | }; |
| | | }, |
| | | |
| | | // è·åè¯ä¼°è¯¦æ
|
| | | getAssessmentDetail() { |
| | | this.assessmentLoading = true; |
| | | getAssessment(this.assessmentId) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.assessmentData = response.data.caseInfo; |
| | | this.organAssessmentList = this.transformOrganData( |
| | | response.data.organAssessments || [] |
| | | ); |
| | | } |
| | | this.assessmentLoading = false; |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·åè¯ä¼°è¯¦æ
失败:", error); |
| | | this.assessmentLoading = false; |
| | | }); |
| | | }, |
| | | |
| | | // 转æ¢å¨å®æ°æ®æ ¼å¼ï¼æ¯æå¤æ¬¡è¯ä¼° |
| | | transformOrganData(organList) { |
| | | return organList.map(organ => { |
| | | const organName = this.getOrganName(organ.organType); |
| | | |
| | | // 转æ¢ä¸ºå¤æ¬¡è¯ä¼°çæ°æ®ç»æ |
| | | const assessments = []; |
| | | if (organ.firstAssessment) { |
| | | assessments.push({ ...organ.firstAssessment, index: 0 }); |
| | | } |
| | | if (organ.secondAssessment) { |
| | | assessments.push({ ...organ.secondAssessment, index: 1 }); |
| | | } |
| | | // å¯ä»¥ç»§ç»æ·»å æ´å¤è¯ä¼°... |
| | | |
| | | // 设置å¨å®åç§°åè¯ä¼°æ°æ® |
| | | organ.organName = organName; |
| | | organ.assessments = assessments; |
| | | organ.activeAssessmentTab = |
| | | assessments.length > 0 ? "assessment_0" : "summary"; |
| | | organ.expanded = false; |
| | | |
| | | // è®¡ç®æ´ä½è¯ä¼°ç¶æ |
| | | organ.assessmentStatus = this.calculateOverallStatus(organ); |
| | | |
| | | return organ; |
| | | }); |
| | | }, |
| | | |
| | | // è®¡ç®æå¤§è¯ä¼°æ¬¡æ°ï¼ç¨äºè¡¨å¤´æ¾ç¤ºï¼ |
| | | // è®¡ç®æå¤§è¯ä¼°æ¬¡æ° |
| | | getMaxAssessmentCount() { |
| | | const maxCount = Math.max( |
| | | ...this.organAssessmentList.map(organ => |
| | | organ.assessments ? organ.assessments.length : 0 |
| | | ) |
| | | ); |
| | | return Math.max(maxCount, 2); // è³å°æ¾ç¤º2å |
| | | return Math.max(maxCount, 1); |
| | | }, |
| | | |
| | | // è®¡ç®æ´ä½è¯ä¼°ç¶æ |
| | | calculateOverallStatus(organ) { |
| | | if (!organ.assessments || organ.assessments.length === 0) return "0"; |
| | | // è·åå¨å®æ´ä½ç¶æ |
| | | getOrganOverallStatus(organ) { |
| | | if (!organ.assessments || organ.assessments.length === 0) { |
| | | return "pending"; |
| | | } |
| | | |
| | | const allAssessed = organ.assessments.every( |
| | | assessment => assessment.status === "assessed" |
| | |
| | | assessment => assessment.status === "assessed" |
| | | ); |
| | | |
| | | if (allAssessed) return "1"; |
| | | if (someAssessed) return "2"; |
| | | return "0"; |
| | | if (allAssessed) return "completed"; |
| | | if (someAssessed) return "assessing"; |
| | | return "pending"; |
| | | }, |
| | | |
| | | getOrganOverallStatusText(organ) { |
| | | const status = this.getOrganOverallStatus(organ); |
| | | const statusMap = { |
| | | pending: "å¾
è¯ä¼°", |
| | | assessing: "è¯ä¼°ä¸", |
| | | completed: "已宿" |
| | | }; |
| | | return statusMap[status] || "æªç¥"; |
| | | }, |
| | | |
| | | // 忢å±å¼è¡ |
| | | handleToggleExpand(row) { |
| | | const key = row.organType; |
| | | const key = row.organno; |
| | | const index = this.expandedRowKeys.indexOf(key); |
| | | |
| | | if (index > -1) { |
| | |
| | | } else { |
| | | this.expandedRowKeys = [key]; |
| | | this.organAssessmentList.forEach(item => { |
| | | item.expanded = item.organType === key; |
| | | item.expanded = item.organno === key; |
| | | }); |
| | | } |
| | | }, |
| | | |
| | | // å±å¼è¡åå |
| | | handleExpandChange(row, expandedRows) { |
| | | this.expandedRowKeys = expandedRows.map(item => item.organType); |
| | | this.expandedRowKeys = expandedRows.map(item => item.organno); |
| | | this.organAssessmentList.forEach(item => { |
| | | item.expanded = this.expandedRowKeys.includes(item.organType); |
| | | item.expanded = this.expandedRowKeys.includes(item.organno); |
| | | }); |
| | | }, |
| | | |
| | | // æ·»å æ°è¯ä¼° |
| | | handleAddNewAssessment(organ) { |
| | | const newAssessment = { |
| | | ...this.getDefaultAssessment(), |
| | | index: organ.assessments.length |
| | | ...this.getDefaultAssessment(organ.assessments.length), |
| | | assessor: this.currentUser.name |
| | | }; |
| | | |
| | | organ.assessments.push(newAssessment); |
| | | organ.activeAssessmentTab = `assessment_${organ.assessments.length - 1}`; |
| | | |
| | | // æ´æ°æ´ä½ç¶æ |
| | | organ.assessmentStatus = this.calculateOverallStatus(organ); |
| | | |
| | | this.$message.success("å·²æ·»å æ°çè¯ä¼°"); |
| | | }, |
| | | |
| | | // å¤çæ·»å è¯ä¼°äºä»¶ |
| | | handleAddAssessment(data) { |
| | | const { organData, currentIndex } = data; |
| | | const { organData } = data; |
| | | this.handleAddNewAssessment(organData); |
| | | }, |
| | | |
| | | // ä¿åè¯ä¼° |
| | | handleSaveOrganAssessment(saveData) { |
| | | const { organData, assessmentData, assessmentIndex } = saveData; |
| | | |
| | | const organToUpdate = { |
| | | ...organData, |
| | | assessments: organData.assessments.map((assessment, index) => |
| | | index === assessmentIndex |
| | | ? { |
| | | ...assessmentData, |
| | | status: "assessed", |
| | | assessmentTime: new Date().toISOString(), |
| | | assessor: this.currentUser.name |
| | | } |
| | | : assessment |
| | | ) |
| | | }; |
| | | |
| | | // æ´æ°æ´ä½ç¶æ |
| | | organToUpdate.assessmentStatus = this.calculateOverallStatus( |
| | | organToUpdate |
| | | ); |
| | | |
| | | updateOrganAssessment(organToUpdate) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success(`第${assessmentIndex + 1}次è¯ä¼°ä¿åæå`); |
| | | this.getAssessmentDetail(); |
| | | |
| | | // æ´æ°å½åå±å¼è¡çæ°æ® |
| | | const index = this.organAssessmentList.findIndex( |
| | | item => item.organType === organData.organType |
| | | ); |
| | | if (index !== -1) { |
| | | this.organAssessmentList.splice(index, 1, organToUpdate); |
| | | } |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("ä¿åè¯ä¼°å¤±è´¥:", error); |
| | | this.$message.error("ä¿å失败"); |
| | | }); |
| | | }, |
| | | |
| | | // è·åææ°è¯ä¼°æ¶é´ |
| | |
| | | return assessed.sort( |
| | | (a, b) => new Date(b.assessmentTime) - new Date(a.assessmentTime) |
| | | )[0].assessmentTime; |
| | | }, |
| | | |
| | | // è·åææéä»¶ |
| | | getAllAttachments(organ) { |
| | | const attachments = []; |
| | | |
| | | if (organ.assessments) { |
| | | organ.assessments.forEach((assessment, index) => { |
| | | if (assessment.attachments) { |
| | | assessment.attachments.forEach(att => { |
| | | attachments.push({ |
| | | ...att, |
| | | assessmentIndex: index, |
| | | assessmentNumber: index + 1 |
| | | }); |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | return attachments; |
| | | }, |
| | | |
| | | // é¢è§éä»¶ |
| | | handlePreviewAttachment(attachment) { |
| | | this.currentPreviewFile = { |
| | | fileName: attachment.fileName, |
| | | fileUrl: attachment.path || attachment.fileUrl, |
| | | fileType: this.getFileType(attachment.fileName) |
| | | }; |
| | | this.attachmentVisible = true; |
| | | }, |
| | | |
| | | // è·åæä»¶ç±»å |
| | | getFileType(fileName) { |
| | | if (!fileName) return "other"; |
| | | |
| | | const extension = fileName |
| | | .split(".") |
| | | .pop() |
| | | .toLowerCase(); |
| | | const imageTypes = ["jpg", "jpeg", "png", "gif", "bmp", "webp"]; |
| | | const pdfTypes = ["pdf"]; |
| | | const officeTypes = ["doc", "docx", "xls", "xlsx", "ppt", "pptx"]; |
| | | |
| | | if (imageTypes.includes(extension)) return "image"; |
| | | if (pdfTypes.includes(extension)) return "pdf"; |
| | | if (officeTypes.includes(extension)) return "office"; |
| | | return "other"; |
| | | }, |
| | | |
| | | // è·åè¯ä¼°ç¶ææ ç¾ç±»å |
| | |
| | | return textMap[status] || "æªç¥"; |
| | | }, |
| | | |
| | | // è·åå¨å®åç§° |
| | | getOrganName(organType) { |
| | | const organ = this.organTypeOptions.find(opt => opt.value === organType); |
| | | return organ ? organ.label : organType; |
| | | }, |
| | | |
| | | // æ£æ¥è¯ä¼°æé |
| | | canAssessOrgan(organ) { |
| | | console.log(organ,'organ'); |
| | | |
| | | if (this.isCoordinator) return true; |
| | | return organ.department === this.currentDepartment; |
| | | if (!this.isEdit) return false; |
| | | return ( |
| | | organ.gainhospitalname && |
| | | organ.gainhospitalname.includes(this.currentDepartment) |
| | | ); |
| | | }, |
| | | |
| | | // è·åè¡ç±»å |
| | |
| | | // ç¶æè¿æ»¤å¨ |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | | "0": "warning", |
| | | "1": "primary", |
| | | "2": "success", |
| | | "3": "danger" |
| | | "1": "warning", |
| | | "2": "primary", |
| | | "3": "success" |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | |
| | | statusTextFilter(status) { |
| | | const statusMap = { |
| | | "0": "å¾
è¯ä¼°", |
| | | "1": "è¯ä¼°ä¸", |
| | | "2": "已宿", |
| | | "3": "å·²å
³é" |
| | | "1": "å¾
è¯ä¼°", |
| | | "2": "è¯ä¼°ä¸", |
| | | "3": "已宿" |
| | | }; |
| | | return statusMap[status] || "æªç¥"; |
| | | }, |
| | | |
| | | // æ¥çéä»¶ |
| | | handleAttachmentPreview() { |
| | | this.attachmentVisible = true; |
| | | if (this.assessmentData.assessannex) { |
| | | try { |
| | | const annexData = typeof this.assessmentData.assessannex === "string" |
| | | ? JSON.parse(this.assessmentData.assessannex) |
| | | : this.assessmentData.assessannex; |
| | | |
| | | if (Array.isArray(annexData) && annexData.length > 0) { |
| | | this.currentPreviewFile = annexData[0]; |
| | | this.attachmentVisible = true; |
| | | } else { |
| | | this.$message.info("ææ éä»¶å¯é¢è§"); |
| | | } |
| | | } catch (error) { |
| | | this.$message.info("éä»¶æ°æ®æ ¼å¼é误"); |
| | | } |
| | | } else { |
| | | this.$message.info("ææ éä»¶"); |
| | | } |
| | | }, |
| | | |
| | | handleCompleteAssessment() { |
| | | this.$confirm("ç¡®è®¤å®æææå¨å®è¯ä¼°åï¼å®æåå°æ æ³ä¿®æ¹", "确认æä½", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(() => { |
| | | completeAssessment(this.assessmentId) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("è¯ä¼°å®æç¡®è®¤æå"); |
| | | this.getAssessmentDetail(); |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("宿è¯ä¼°å¤±è´¥:", error); |
| | | this.$message.error("æä½å¤±è´¥"); |
| | | }); |
| | | }); |
| | | // 宿è¯ä¼° |
| | | async handleCompleteAssessment() { |
| | | try { |
| | | await this.$confirm( |
| | | "ç¡®è®¤å®æææå¨å®è¯ä¼°åï¼å®æåå°æ æ³ä¿®æ¹", |
| | | "确认æä½", |
| | | { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | } |
| | | ); |
| | | |
| | | // æ´æ°è¯ä¼°ç¶æä¸ºå·²å®æ |
| | | const updateData = { |
| | | ...this.assessmentData, |
| | | assessState: "3", |
| | | assessTime: new Date().toISOString() |
| | | }; |
| | | |
| | | const response = await assessedit(updateData); |
| | | |
| | | if (response.code === 200) { |
| | | this.$message.success("è¯ä¼°å®æç¡®è®¤æå"); |
| | | this.assessmentData.assessState = "3"; |
| | | this.isEdit = false; |
| | | } else { |
| | | this.$message.error("æä½å¤±è´¥ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | console.error("宿è¯ä¼°å¤±è´¥:", error); |
| | | this.$message.error("æä½å¤±è´¥"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }; |
| | |
| | | |
| | | .assessment-summary { |
| | | padding: 10px; |
| | | } |
| | | |
| | | /* åºé¨ä¿åæé®æ ·å¼ */ |
| | | .footer-actions { |
| | | margin-top: 20px; |
| | | text-align: center; |
| | | padding: 20px; |
| | | border-top: 1px solid #eaeaea; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | |
| | | .fixed-width .el-button { |
| | | margin: 0 2px; |
| | | } |
| | | |
| | | /* æç®å³å®æ ·å¼ä¼å */ |
| | | .organ-decision-info { |
| | | margin: 10px 0; |
| | | padding: 10px; |
| | | background-color: #f8f9fa; |
| | | border-radius: 4px; |
| | | border-left: 4px solid #409eff; |
| | | } |
| | | |
| | | .decision-tag { |
| | | margin: 2px 5px; |
| | | } |
| | | </style> |
| | |
| | | <div class="organ-assessment-form"> |
| | | <el-form :model="assessmentData" label-width="120px"> |
| | | <el-form-item label="åè½ç¶æ"> |
| | | <el-select v-model="assessmentData.functionStatus" :disabled="readonly"> |
| | | <el-select v-model="assessmentData.functionStatus"> |
| | | <el-option label="æ£å¸¸" value="1" /> |
| | | <el-option label="轻度å¼å¸¸" value="2" /> |
| | | <el-option label="é度å¼å¸¸" value="3" /> |
| | |
| | | type="textarea" |
| | | v-model="assessmentData.assessmentOpinion" |
| | | :rows="4" |
| | | :disabled="readonly" |
| | | placeholder="请è¾å
¥è¯ä¼°æè§" |
| | | /> |
| | | </el-form-item> |
| | |
| | | |
| | | /** ä¸ä¼ æåå¤ç */ |
| | | handleUploadSuccess({ file, fileList, response }) { |
| | | if (response.code === 200) { |
| | | console.log(response); |
| | | |
| | | if (response.code == 200) { |
| | | console.log(1); |
| | | |
| | | const attachmentObj = { |
| | | id: |
| | | response.data.fileId || |
| | | Math.random() |
| | | .toString(36) |
| | | .substr(2), |
| | | // id: |
| | | // response.data.fileId || |
| | | // Math.random() |
| | | // .toString(36) |
| | | // .substr(2), |
| | | fileName: file.name, |
| | | path: response.data.fileUrl || file.url, |
| | | fileUrl: response.data.fileUrl || file.url, |
| | |
| | | assessmentType: this.assessmentType, |
| | | organType: this.organData.organType |
| | | }; |
| | | console.log(2,attachmentObj); |
| | | |
| | | this.assessmentData.attachments.push(attachmentObj); |
| | | this.$message.success("æä»¶ä¸ä¼ æå"); |
| | |
| | | :inline="true" |
| | | label-width="100px" |
| | | > |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-form-item label="æç®è
å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.donorName" |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | style="width: 200px" |
| | |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="è¯ä¼°ç¶æ" prop="firstAssessState"> |
| | | <el-form-item label="è¯ä¼°ç¶æ" prop="assessState"> |
| | | <el-select |
| | | v-model="queryParams.firstAssessState" |
| | | v-model="queryParams.assessState" |
| | | placeholder="è¯·éæ©è¯ä¼°ç¶æ" |
| | | clearable |
| | | style="width: 200px" |
| | | > |
| | | <el-option label="å¾
è¯ä¼°" value="0" /> |
| | | <el-option label="è¯ä¼°ä¸" value="1" /> |
| | | <el-option label="已宿" value="2" /> |
| | | <el-option label="å·²å
³é" value="3" /> |
| | | <el-option label="å¾
è¯ä¼°" value="1" /> |
| | | <el-option label="è¯ä¼°ä¸" value="2" /> |
| | | <el-option label="已宿" value="3" /> |
| | | <el-option label="å·²å
³é" value="4" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç³è¯·æ¶é´" prop="applyTimeRange"> |
| | | <el-date-picker |
| | | v-model="applyTimeRange" |
| | | v-model="queryParams.applyTimeRange" |
| | | type="daterange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | |
| | | style="width: 240px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="è¯ä¼°æ¶é´" prop="assessmentTimeRange"> |
| | | <el-form-item label="è¯ä¼°æ¶é´" prop="assessTimeRange"> |
| | | <el-date-picker |
| | | v-model="assessmentTimeRange" |
| | | v-model="queryParams.assessTimeRange" |
| | | type="daterange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | |
| | | <el-table-column |
| | | label="æ½å¨æç®è
å§å" |
| | | align="center" |
| | | prop="donorName" |
| | | prop="name" |
| | | width="120" |
| | | /> |
| | | <el-table-column label="æ§å«" align="center" prop="gender" width="80"> |
| | | <el-table-column label="æ§å«" align="center" prop="sex" width="80"> |
| | | <template slot-scope="scope"> |
| | | <!-- <dict-tag :options="genderOptions" :value="scope.row.gender" /> --> |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="parseInt(scope.row.gender)" |
| | | :value="scope.row.sex" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column |
| | | label="ç¾ç
è¯æ" |
| | | align="center" |
| | | prop="diagnosis" |
| | | prop="diagnosisname" |
| | | min-width="180" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="æå¨å»çæºæ" |
| | | align="center" |
| | | prop="hospitalName" |
| | | prop="treatmenthospitalname" |
| | | width="150" |
| | | show-overflow-tooltip |
| | | /> |
| | |
| | | <el-table-column |
| | | label="è¯ä¼°æ¶é´" |
| | | align="center" |
| | | prop="assessmentTime" |
| | | prop="assessTime" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.assessmentTime |
| | | ? parseTime(scope.row.assessmentTime, "{y}-{m}-{d}") |
| | | scope.row.assessTime |
| | | ? parseTime(scope.row.assessTime, "{y}-{m}-{d}") |
| | | : "-" |
| | | }}</span> |
| | | </template> |
| | |
| | | <el-table-column |
| | | label="è¯ä¼°ç¶æ" |
| | | align="center" |
| | | prop="firstAssessState" |
| | | prop="assessState" |
| | | width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="statusFilter(scope.row.firstAssessState)"> |
| | | {{ statusTextFilter(scope.row.firstAssessState) }} |
| | | <el-tag :type="statusFilter(scope.row.assessState)"> |
| | | {{ statusTextFilter(scope.row.assessState) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | prop="coordinatorName" |
| | | width="100" |
| | | /> |
| | | <!-- <el-table-column |
| | | label="è¯ä¼°ç±»å" |
| | | align="center" |
| | | prop="assessmentType" |
| | | width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.assessment_Type" |
| | | :value="parseInt(scope.row.assessmentType)" |
| | | /> |
| | | </template> |
| | | </el-table-column> --> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | |
| | | > |
| | | <el-button |
| | | v-if=" |
| | | scope.row.firstAssessState === '0' || |
| | | scope.row.firstAssessState === '1' |
| | | scope.row.assessState === '1' || |
| | | scope.row.assessState === '2' |
| | | " |
| | | size="mini" |
| | | type="text" |
| | |
| | | >è¯ä¼°</el-button |
| | | > |
| | | <el-button |
| | | v-if="scope.row.firstAssessState === '2'" |
| | | v-if="scope.row.assessState === '3'" |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-check" |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | // import { listAssessment, delAssessment, exportAssessment } from "@/api/case/assessment"; |
| | | import { |
| | | listAssessment, |
| | | delAssessment, |
| | | exportAssessment |
| | | } from "./mockAssessmentApi"; |
| | | import { evaluateBaseInfolist } from "@/api/businessApi/index"; |
| | | import Pagination from "@/components/Pagination"; |
| | | |
| | | export default { |
| | | name: "AssessmentList", |
| | | components: { Pagination }, |
| | | dicts: ["sys_user_sex", "assessment_Type"], |
| | | dicts: ["sys_user_sex"], |
| | | data() { |
| | | return { |
| | | // é®ç½©å± |
| | |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | donorName: undefined, |
| | | name: undefined, |
| | | hospitalName: undefined, |
| | | coordinatorName: undefined, |
| | | firstAssessState: undefined, |
| | | |
| | | }, |
| | | applyTimeRange: [], |
| | | assessmentTimeRange: [], |
| | | // æ§å«é项 |
| | | genderOptions: [ |
| | | { value: "0", label: "ç·" }, |
| | | { value: "1", label: "女" } |
| | | ], |
| | | // è¯ä¼°ç±»åé项 |
| | | assessmentTypeOptions: [ |
| | | { value: "1", label: "忬¡è¯ä¼°" }, |
| | | { value: "2", label: "æç»è¯ä¼°" } |
| | | ] |
| | | assessState: undefined, |
| | | applyTimeRange: [], |
| | | assessTimeRange: [] |
| | | } |
| | | }; |
| | | }, |
| | | created() { |
| | |
| | | // ç¶æè¿æ»¤å¨ |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | | "0": "warning", // å¾
è¯ä¼° |
| | | "1": "primary", // è¯ä¼°ä¸ |
| | | "2": "success", // 已宿 |
| | | "3": "danger" // å·²å
³é |
| | | "1": "warning", // å¾
è¯ä¼° |
| | | "2": "primary", // è¯ä¼°ä¸ |
| | | "3": "success", // 已宿 |
| | | "4": "danger" // å·²å
³é |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | statusTextFilter(status) { |
| | | const statusMap = { |
| | | "0": "å¾
è¯ä¼°", |
| | | "1": "è¯ä¼°ä¸", |
| | | "2": "已宿", |
| | | "3": "å·²å
³é" |
| | | "1": "å¾
è¯ä¼°", |
| | | "2": "è¯ä¼°ä¸", |
| | | "3": "已宿", |
| | | "4": "å·²å
³é" |
| | | }; |
| | | return statusMap[status] || "æªç¥"; |
| | | }, |
| | | // æ¥è¯¢è¯ä¼°å表 |
| | | getList() { |
| | | async getList() { |
| | | this.loading = true; |
| | | evaluateBaseInfolist(this.queryParams); |
| | | listAssessment(this.queryParams) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.assessmentList = response.data.rows; |
| | | this.total = response.data.total; |
| | | } else { |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | } |
| | | this.loading = false; |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·åè¯ä¼°å表失败:", error); |
| | | this.loading = false; |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | }); |
| | | try { |
| | | // æå»ºæ¥è¯¢åæ°ï¼æ å°å°æ¥å£å段 |
| | | const requestParams = this.buildRequestParams(); |
| | | |
| | | const response = await evaluateBaseInfolist(requestParams); |
| | | |
| | | if (response.code === 200) { |
| | | // å¤çæ¥å£è¿åçæ°æ®ç»æ |
| | | this.handleResponseData(response); |
| | | } else { |
| | | this.$message.error("è·åæ°æ®å¤±è´¥ï¼" + (response.msg || "æªç¥é误")); |
| | | this.assessmentList = []; |
| | | this.total = 0; |
| | | } |
| | | } catch (error) { |
| | | console.error("è·åè¯ä¼°å表失败:", error); |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | this.assessmentList = []; |
| | | this.total = 0; |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | // æå»ºè¯·æ±åæ° |
| | | buildRequestParams() { |
| | | const params = { |
| | | pageNum: this.queryParams.pageNum, |
| | | pageSize: this.queryParams.pageSize |
| | | }; |
| | | |
| | | // æ å°æ¥è¯¢æ¡ä»¶å°æ¥å£å段 |
| | | if (this.queryParams.name) { |
| | | params.name = this.queryParams.name; |
| | | } |
| | | if (this.queryParams.hospitalName) { |
| | | params.treatmenthospitalname = this.queryParams.hospitalName; |
| | | } |
| | | if (this.queryParams.coordinatorName) { |
| | | params.coordinatorName = this.queryParams.coordinatorName; |
| | | } |
| | | if (this.queryParams.assessState) { |
| | | params.assessState = this.queryParams.assessState; |
| | | } |
| | | |
| | | // å¤çæ¶é´èå´æ¥è¯¢ |
| | | if (this.queryParams.applyTimeRange && this.queryParams.applyTimeRange.length === 2) { |
| | | params.startApplyTime = this.queryParams.applyTimeRange[0]; |
| | | params.endApplyTime = this.queryParams.applyTimeRange[1]; |
| | | } |
| | | |
| | | if (this.queryParams.assessTimeRange && this.queryParams.assessTimeRange.length === 2) { |
| | | params.startAssessTime = this.queryParams.assessTimeRange[0]; |
| | | params.endAssessTime = this.queryParams.assessTimeRange[1]; |
| | | } |
| | | |
| | | return params; |
| | | }, |
| | | // å¤çæ¥å£ååºæ°æ® |
| | | handleResponseData(response) { |
| | | // æ ¹æ®æ¥å£å®é
è¿åçæ°æ®ç»æè¿è¡è°æ´ |
| | | if (response.data) { |
| | | if (Array.isArray(response.data)) { |
| | | // 妿è¿åçæ¯æ°ç» |
| | | this.assessmentList = response.data; |
| | | this.total = response.data.length; |
| | | } else if (response.data.rows) { |
| | | // 妿è¿åçæ¯åé¡µæ°æ®ç»æ |
| | | this.assessmentList = response.data.rows; |
| | | this.total = response.data.total; |
| | | } else if (Array.isArray(response.data.list)) { |
| | | // 妿è¿åçæ¯liståæ®µ |
| | | this.assessmentList = response.data.list; |
| | | this.total = response.data.total || response.data.list.length; |
| | | } else { |
| | | // å
¶ä»æ°æ®ç»æï¼å°è¯ç´æ¥ä½¿ç¨data |
| | | this.assessmentList = response.data; |
| | | this.total = response.total || response.data.length; |
| | | } |
| | | } else { |
| | | // 妿data为空ï¼ä½¿ç¨æ ¹çº§å«çrowsælist |
| | | if (Array.isArray(response.rows)) { |
| | | this.assessmentList = response.rows; |
| | | this.total = response.total; |
| | | } else if (Array.isArray(response.list)) { |
| | | this.assessmentList = response.list; |
| | | this.total = response.total; |
| | | } else { |
| | | this.assessmentList = []; |
| | | this.total = 0; |
| | | } |
| | | } |
| | | |
| | | // ç¡®ä¿assessmentListæ¯æ°ç» |
| | | if (!Array.isArray(this.assessmentList)) { |
| | | this.assessmentList = []; |
| | | } |
| | | }, |
| | | // æç´¢æé®æä½ |
| | | handleQuery() { |
| | |
| | | // éç½®æé®æä½ |
| | | resetQuery() { |
| | | this.$refs.queryForm.resetFields(); |
| | | this.handleQuery(); |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | |
| | | handleRowClick(row) { |
| | | this.$router.push({ |
| | | path: "/case/assessInfo", |
| | | query: { id: row.id } |
| | | query: { id: row.id, infoid: row.infoid } |
| | | }); |
| | | }, |
| | | // æ¥ç详æ
|
| | | handleView(row) { |
| | | this.$router.push({ path: "/case/assessInfo", query: { id: row.id } }); |
| | | this.$router.push({ |
| | | path: "/case/assessInfo", |
| | | query: { id: row.id, infoid: row.infoid } |
| | | }); |
| | | }, |
| | | // è¿è¡è¯ä¼° |
| | | handleAssess(row) { |
| | | this.$router.push({ |
| | | path: "/case/assessInfo", |
| | | query: { id: row.id, assess: true } |
| | | query: { id: row.id, infoid: row.infoid, assess: true } |
| | | }); |
| | | }, |
| | | // 确认è¯ä¼° |
| | | handleConfirm(row) { |
| | | this.$confirm("ç¡®è®¤å®æè¯¥æ¡ä¾çè¯ä¼°åï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | // è°ç¨Mock确认API |
| | | this.$message.success("确认æå"); |
| | | // å·æ°å表 |
| | | this.getList(); |
| | | }) |
| | | .catch(() => {}); |
| | | async handleConfirm(row) { |
| | | try { |
| | | await this.$confirm("ç¡®è®¤å®æè¯¥æ¡ä¾çè¯ä¼°åï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }); |
| | | |
| | | // è¿ééè¦è°ç¨ç¡®è®¤è¯ä¼°æ¥å£ï¼ææ¶æ¨¡ææå |
| | | this.$message.success("确认æå"); |
| | | // å·æ°å表 |
| | | this.getList(); |
| | | } catch (error) { |
| | | if (error !== 'cancel') { |
| | | console.error("确认失败:", error); |
| | | } |
| | | } |
| | | }, |
| | | // æ°å¢æé®æä½ |
| | | handleCreate() { |
| | |
| | | }, |
| | | // ä¿®æ¹æé®æä½ |
| | | handleUpdate() { |
| | | if (this.ids.length === 0) return; |
| | | |
| | | const id = this.ids[0]; |
| | | this.$router.push({ path: "/case/assessment/edit", query: { id: id } }); |
| | | this.$router.push({ |
| | | path: "/case/assessment/edit", |
| | | query: { id: id } |
| | | }); |
| | | }, |
| | | // å é¤æé®æä½ - 使ç¨Mock API |
| | | handleDelete() { |
| | | const ids = this.ids; |
| | | this.$confirm("æ¯å¦ç¡®è®¤å é¤éä¸çæ°æ®é¡¹ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | return delAssessment(ids); |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("å 餿å"); |
| | | this.getList(); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // å¯¼åºæé®æä½ - 使ç¨Mock API |
| | | handleExport() { |
| | | const queryParams = this.queryParams; |
| | | this.$confirm("æ¯å¦ç¡®è®¤å¯¼åºææè¯ä¼°æ°æ®ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | this.loading = true; |
| | | return exportAssessment(queryParams); |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("å¯¼åºæåï¼å¼å§ä¸è½½æä»¶"); |
| | | // 模ææä»¶ä¸è½½ |
| | | const link = document.createElement("a"); |
| | | link.href = response.data.downloadUrl; |
| | | link.download = "æ¡ä¾è¯ä¼°æ°æ®.xlsx"; |
| | | link.click(); |
| | | } |
| | | this.loading = false; |
| | | }) |
| | | .catch(() => { |
| | | this.loading = false; |
| | | // å é¤æé®æä½ |
| | | async handleDelete() { |
| | | if (this.ids.length === 0) return; |
| | | |
| | | try { |
| | | await this.$confirm("æ¯å¦ç¡®è®¤å é¤éä¸çæ°æ®é¡¹ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }); |
| | | |
| | | // è¿ééè¦è°ç¨å 餿¥å£ï¼ææ¶æ¨¡ææå |
| | | this.$message.success("å 餿å"); |
| | | this.getList(); |
| | | |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | console.error("å é¤å¤±è´¥:", error); |
| | | this.$message.error("å é¤å¤±è´¥"); |
| | | } |
| | | } |
| | | }, |
| | | // å¯¼åºæé®æä½ |
| | | async handleExport() { |
| | | try { |
| | | await this.$confirm("æ¯å¦ç¡®è®¤å¯¼åºææè¯ä¼°æ°æ®ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }); |
| | | |
| | | this.loading = true; |
| | | |
| | | // æå»ºå¯¼åºåæ° |
| | | const exportParams = this.buildRequestParams(); |
| | | exportParams.pageSize = 10000; // å¯¼åºæææ°æ® |
| | | |
| | | // è·åå¯¼åºæ°æ® |
| | | const response = await evaluateBaseInfolist(exportParams); |
| | | |
| | | if (response.code === 200) { |
| | | // å¤çå¯¼åºæ°æ® |
| | | this.exportDataToExcel(response.data); |
| | | this.$message.success("å¯¼åºæå"); |
| | | } else { |
| | | this.$message.error("导åºå¤±è´¥ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | console.error("导åºå¤±è´¥:", error); |
| | | this.$message.error("导åºå¤±è´¥"); |
| | | } |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | // å¯¼åºæ°æ®å°Excel |
| | | exportDataToExcel(data) { |
| | | // è¿éå®ç°å¯¼åºé»è¾ï¼å¯ä»¥ä½¿ç¨xlsxçåº |
| | | // ç±äºæ¯å端导åºï¼è¿éç®åæ¼ç¤º |
| | | console.log("å¯¼åºæ°æ®:", data); |
| | | // å®é
项ç®ä¸éè¦å®ç°å®æ´çExcel导åºåè½ |
| | | |
| | | // 模ææä»¶ä¸è½½ |
| | | const blob = new Blob([JSON.stringify(data, null, 2)], { |
| | | type: 'application/vnd.ms-excel' |
| | | }); |
| | | const link = document.createElement('a'); |
| | | link.href = URL.createObjectURL(blob); |
| | | link.download = 'å»å¦è¯ä¼°æ°æ®.xlsx'; |
| | | link.click(); |
| | | }, |
| | | // æ¶é´æ ¼å¼å |
| | | parseTime(time, pattern) { |
| | | if (!time) return ""; |
| | | // 使ç¨moment.jsæç®åæ ¼å¼å |
| | | if (this.$moment) { |
| | | return this.$moment(time).format(pattern || "{y}-{m}-{d} {h}:{i}:{s}"); |
| | | } else { |
| | | // ç®åæ ¼å¼å |
| | | const date = new Date(time); |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1) |
| | | .toString() |
| | | .padStart(2, "0")}-${date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | const date = new Date(time); |
| | | if (pattern) { |
| | | // ç®åçæ¨¡å¼å¹é
|
| | | if (pattern === "{y}-{m}-{d}") { |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1) |
| | | .toString() |
| | | .padStart(2, "0")}-${date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | } |
| | | } |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1) |
| | | .toString() |
| | | .padStart(2, "0")}-${date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0")} ${date |
| | | .getHours() |
| | | .toString() |
| | | .padStart(2, "0")}:${date |
| | | .getMinutes() |
| | | .toString() |
| | | .padStart(2, "0")}:${date |
| | | .getSeconds() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | } |
| | | } |
| | | }; |
| | |
| | | > |
| | | <template #default="scope"> |
| | | <div class="item-name-cell"> |
| | | <span :class="{'required-item': scope.row.required}"> |
| | | <span :class="{ 'required-item': scope.row.required }"> |
| | | {{ scope.row.itemName }} |
| | | </span> |
| | | <el-tooltip |
| | |
| | | /> |
| | | <div v-else class="value-display-container"> |
| | | <span class="value-text" :title="scope.row.values[index]"> |
| | | {{ scope.row.values[index] || '-' }} |
| | | {{ scope.row.values[index] || "-" }} |
| | | </span> |
| | | <span v-if="scope.row.values[index] && scope.row.unit" class="unit-text"> |
| | | <span |
| | | v-if="scope.row.values[index] && scope.row.unit" |
| | | class="unit-text" |
| | | > |
| | | {{ scope.row.unit }} |
| | | </span> |
| | | </div> |
| | | <div v-if="scope.row.reference && scope.row.values[index]" class="validation-indicator"> |
| | | <div |
| | | v-if="scope.row.reference && scope.row.values[index]" |
| | | class="validation-indicator" |
| | | > |
| | | <i |
| | | v-if="isValueValid(scope.row, scope.row.values[index])" |
| | | class="el-icon-success valid-icon" |
| | |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <!-- <el-table-column |
| | | v-if="isEditing" |
| | | label="æä½" |
| | | width="120" |
| | | fixed="right" |
| | | class-name="leave-alone" |
| | | > |
| | | <template #default> |
| | | <el-button link type="primary" @click="addColumn" size="small"> |
| | | æ°å¢å |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> --> |
| | | </el-table> |
| | | |
| | | <!-- ç»è®¡ä¿¡æ¯ --> |
| | |
| | | <el-card shadow="never"> |
| | | <div class="stats-content"> |
| | | <span class="stats-title">æ°æ®ç»è®¡:</span> |
| | | <span class="stats-item">æ»è®°å½æ°: {{ dynamicColumns.length }} 个æ¶é´ç¹</span> |
| | | <span class="stats-item" |
| | | >æ»è®°å½æ°: {{ dynamicColumns.length }} 个æ¶é´ç¹</span |
| | | > |
| | | <span class="stats-item">已填å: {{ filledCount }} 项</span> |
| | | <span class="stats-item">å®æåº¦: {{ completionRate }}%</span> |
| | | </div> |
| | |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | | <el-button type="primary" @click="confirmAddColumn" :loading="saveLoading"> |
| | | <el-button |
| | | type="primary" |
| | | @click="confirmAddColumn" |
| | | :loading="saveLoading" |
| | | > |
| | | ç¡®å® |
| | | </el-button> |
| | | </span> |
| | |
| | | import UploadAttachment from "@/components/UploadAttachment"; |
| | | |
| | | export default { |
| | | name: 'BloodRoutinePanel', |
| | | name: "BloodRoutinePanel", |
| | | components: { |
| | | UploadAttachment, |
| | | UploadAttachment |
| | | }, |
| | | props: { |
| | | isEditing: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // ä¿®æ¹ä¸º Object ç±»åï¼æ¯æå¤ææ°æ®ç»æ |
| | | initialData: { |
| | | type: Array, |
| | | default: () => [] |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | showStatistics: { |
| | | type: Boolean, |
| | |
| | | data() { |
| | | return { |
| | | tableData: [], |
| | | dynamicColumns: [ |
| | | { |
| | | label: '2024-12-27\n08:00', |
| | | key: 'time1', |
| | | date: '2024-12-27', |
| | | time: '08:00', |
| | | remark: 'æ¨èµ·æ£æµ' |
| | | } |
| | | ], |
| | | dynamicColumns: [], |
| | | attachments: [], |
| | | columnDialogVisible: false, |
| | | columnForm: { |
| | | date: '', |
| | | time: '', |
| | | remark: '' |
| | | date: "", |
| | | time: "", |
| | | remark: "" |
| | | }, |
| | | editingColumnIndex: null, |
| | | tableKey: 0, |
| | | tableLoading: false, |
| | | saveLoading: false, |
| | | // å
鍿°æ®ç¶æ |
| | | internalData: {}, |
| | | columnRules: { |
| | | date: [ |
| | | { required: true, message: 'è¯·éæ©æ¥æ', trigger: 'change' } |
| | | ], |
| | | time: [ |
| | | { required: true, message: 'è¯·éæ©æ¶é´', trigger: 'change' } |
| | | ] |
| | | date: [{ required: true, message: "è¯·éæ©æ¥æ", trigger: "change" }], |
| | | time: [{ required: true, message: "è¯·éæ©æ¶é´", trigger: "change" }] |
| | | } |
| | | }; |
| | | }, |
| | |
| | | let count = 0; |
| | | this.tableData.forEach(row => { |
| | | row.values.forEach(value => { |
| | | if (value && value.toString().trim() !== '') { |
| | | if (value && value.toString().trim() !== "") { |
| | | count++; |
| | | } |
| | | }); |
| | |
| | | } |
| | | }, |
| | | watch: { |
| | | // çå¬ initialData ååï¼ç¡®ä¿æ°æ®æ£ç¡®æ¥æ¶ |
| | | initialData: { |
| | | handler(newData) { |
| | | if (newData && Object.keys(newData).length > 0) { |
| | | this.internalData = { ...newData }; |
| | | this.initFromExternalData(); |
| | | } |
| | | }, |
| | | immediate: true, |
| | | deep: true |
| | | }, |
| | | isEditing(newVal) { |
| | | if (!newVal) { |
| | | this.$emit('data-change', { |
| | | type: 'blood_routine', |
| | | data: this.tableData, |
| | | columns: this.dynamicColumns, |
| | | attachments: this.attachments |
| | | }); |
| | | this.saveData(); |
| | | } |
| | | this.$nextTick(() => { |
| | | this.forceTableLayout(); |
| | |
| | | } |
| | | }, |
| | | methods: { |
| | | // ä»å¤é¨æ°æ®åå§åç»ä»¶ |
| | | initFromExternalData() { |
| | | if (this.internalData.data && this.internalData.columns) { |
| | | this.tableData = this.internalData.data.map(item => ({ |
| | | ...item, |
| | | values: |
| | | item.values || new Array(this.internalData.columns.length).fill("") |
| | | })); |
| | | this.dynamicColumns = [...this.internalData.columns]; |
| | | } else { |
| | | // å¦ææ²¡æå¤é¨æ°æ®ï¼ä½¿ç¨ç»ä»¶é»è®¤åå§å |
| | | this.initTableData(); |
| | | } |
| | | |
| | | // åå§åéä»¶ |
| | | if (this.internalData.attachments) { |
| | | this.attachments = [...this.internalData.attachments]; |
| | | } |
| | | }, |
| | | |
| | | // åå§åé»è®¤è¡¨æ ¼æ°æ® |
| | | initTableData() { |
| | | const medicalItems = [ |
| | | { |
| | | itemName: 'WBC', |
| | | unit: 'Ã10â¹/L', |
| | | required: true, |
| | | reference: '3.5-9.5', |
| | | min: 3.5, |
| | | max: 9.5, |
| | | type: 'number' |
| | | }, |
| | | { |
| | | itemName: 'NEUT%', |
| | | unit: '%', |
| | | required: true, |
| | | reference: '40-75', |
| | | min: 40, |
| | | max: 75, |
| | | type: 'number' |
| | | }, |
| | | { |
| | | itemName: 'Hb', |
| | | unit: 'g/L', |
| | | required: true, |
| | | reference: '130-175', |
| | | min: 130, |
| | | max: 175, |
| | | type: 'number' |
| | | }, |
| | | { |
| | | itemName: 'è¡å°æ¿', |
| | | unit: 'Ã10â¹/L', |
| | | required: true, |
| | | reference: '125-350', |
| | | min: 125, |
| | | max: 350, |
| | | type: 'number' |
| | | } |
| | | ]; |
| | | const medicalItems = this.getMedicalItems(); |
| | | |
| | | // å¦ææ²¡æå¨æåï¼åå§åé»è®¤å |
| | | if (this.dynamicColumns.length === 0) { |
| | | this.dynamicColumns = [ |
| | | { |
| | | label: `${new Date().toISOString().split("T")[0]}\n08:00`, |
| | | key: "time1", |
| | | date: new Date().toISOString().split("T")[0], |
| | | time: "08:00", |
| | | remark: "æ¨èµ·æ£æµ" |
| | | } |
| | | ]; |
| | | } |
| | | |
| | | this.tableData = medicalItems.map(item => ({ |
| | | ...item, |
| | | values: new Array(this.dynamicColumns.length).fill('') |
| | | values: new Array(this.dynamicColumns.length).fill("") |
| | | })); |
| | | }, |
| | | |
| | | // è¡å¸¸è§æ£æµé¡¹ç®å®ä¹ |
| | | getMedicalItems() { |
| | | return [ |
| | | { |
| | | itemName: "WBC", |
| | | unit: "Ã10â¹/L", |
| | | required: true, |
| | | reference: "3.5-9.5", |
| | | min: 3.5, |
| | | max: 9.5, |
| | | type: "number" |
| | | }, |
| | | { |
| | | itemName: "NEUT%", |
| | | unit: "%", |
| | | required: true, |
| | | reference: "40-75", |
| | | min: 40, |
| | | max: 75, |
| | | type: "number" |
| | | }, |
| | | { |
| | | itemName: "Hb", |
| | | unit: "g/L", |
| | | required: true, |
| | | reference: "130-175", |
| | | min: 130, |
| | | max: 175, |
| | | type: "number" |
| | | }, |
| | | { |
| | | itemName: "è¡å°æ¿", |
| | | unit: "Ã10â¹/L", |
| | | required: true, |
| | | reference: "125-350", |
| | | min: 125, |
| | | max: 350, |
| | | type: "number" |
| | | } |
| | | ]; |
| | | }, |
| | | |
| | | // ä¿åæ°æ®å°ç¶ç»ä»¶ |
| | | saveData() { |
| | | const dataToEmit = { |
| | | type: "blood_routine", |
| | | data: this.tableData, |
| | | columns: this.dynamicColumns, |
| | | attachments: this.attachments |
| | | }; |
| | | |
| | | this.$emit("data-change", dataToEmit); |
| | | }, |
| | | |
| | | getPlaceholder(row) { |
| | | return row.reference ? `åè: ${row.reference}` : '请è¾å
¥æ°å¼'; |
| | | return row.reference ? `åè: ${row.reference}` : "请è¾å
¥æ°å¼"; |
| | | }, |
| | | |
| | | isValueValid(row, value) { |
| | |
| | | addColumn() { |
| | | this.editingColumnIndex = null; |
| | | this.columnForm = { |
| | | date: new Date().toISOString().split('T')[0], |
| | | time: '08:00', |
| | | remark: '' |
| | | date: new Date().toISOString().split("T")[0], |
| | | time: "08:00", |
| | | remark: "" |
| | | }; |
| | | this.columnDialogVisible = true; |
| | | this.$nextTick(() => { |
| | |
| | | this.columnForm = { |
| | | date: column.date, |
| | | time: column.time, |
| | | remark: column.remark || '' |
| | | remark: column.remark || "" |
| | | }; |
| | | this.columnDialogVisible = true; |
| | | }, |
| | | |
| | | confirmAddColumn() { |
| | | this.$refs.columnFormB.validate((valid) => { |
| | | this.$refs.columnFormB.validate(valid => { |
| | | if (!valid) { |
| | | this.$message.warning('请å®åæ¶é´ç¹ä¿¡æ¯'); |
| | | this.$message.warning("请å®åæ¶é´ç¹ä¿¡æ¯"); |
| | | return; |
| | | } |
| | | |
| | |
| | | column.date = this.columnForm.date; |
| | | column.time = this.columnForm.time; |
| | | column.remark = this.columnForm.remark; |
| | | this.$message.success('æ¶é´ç¹ä¿®æ¹æå'); |
| | | this.$message.success("æ¶é´ç¹ä¿®æ¹æå"); |
| | | } else { |
| | | // æ°å¢å |
| | | const newIndex = this.dynamicColumns.length + 1; |
| | | const newColumn = { |
| | | label: `${this.columnForm.date}\n${this.columnForm.time}`, |
| | | key: `time${Date.now()}`, |
| | |
| | | remark: this.columnForm.remark |
| | | }; |
| | | |
| | | this.internalData.columns.push(newColumn); |
| | | this.dynamicColumns.push(newColumn); |
| | | this.tableData.forEach(row => { |
| | | row.values.push(''); |
| | | if (!row.values) row.values = []; |
| | | row.values.push(""); |
| | | }); |
| | | this.$message.success('æ¶é´ç¹æ·»å æå'); |
| | | this.$message.success("æ¶é´ç¹æ·»å æå"); |
| | | } |
| | | |
| | | this.columnDialogVisible = false; |
| | |
| | | |
| | | handleDeleteColumn() { |
| | | if (this.editingColumnIndex !== null) { |
| | | this.$confirm('ç¡®å®è¦å é¤è¿ä¸ªæ¶é´ç¹åï¼', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | this.$confirm("ç¡®å®è¦å é¤è¿ä¸ªæ¶é´ç¹åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(() => { |
| | | this.dynamicColumns.splice(this.editingColumnIndex, 1); |
| | | this.tableData.forEach(row => { |
| | |
| | | }); |
| | | this.columnDialogVisible = false; |
| | | this.tableKey += 1; |
| | | this.$message.success('æ¶é´ç¹å 餿å'); |
| | | this.$message.success("æ¶é´ç¹å 餿å"); |
| | | }); |
| | | } |
| | | }, |
| | |
| | | handleDialogClosed() { |
| | | this.editingColumnIndex = null; |
| | | this.columnForm = { |
| | | date: '', |
| | | time: '', |
| | | remark: '' |
| | | date: "", |
| | | time: "", |
| | | remark: "" |
| | | }; |
| | | this.$refs.columnFormB && this.$refs.columnFormB.clearValidate(); |
| | | }, |
| | |
| | | }, |
| | | |
| | | handleValueChange(row, columnIndex) { |
| | | this.$emit('data-change', { |
| | | type: 'blood_routine', |
| | | data: this.tableData, |
| | | columns: this.dynamicColumns |
| | | }); |
| | | this.saveData(); |
| | | }, |
| | | |
| | | handleAttachmentChange(fileList) { |
| | | this.attachments = fileList; |
| | | this.$emit('attachment-change', { |
| | | type: 'blood_routine', |
| | | this.$emit("attachment-change", { |
| | | type: "blood_routine", |
| | | attachments: fileList |
| | | }); |
| | | }, |
| | | |
| | | forceTableLayout() { |
| | | this.$nextTick(() => { |
| | | const table = this.$el.querySelector('.el-table'); |
| | | const table = this.$el.querySelector(".el-table"); |
| | | if (table) { |
| | | window.dispatchEvent(new Event('resize')); |
| | | window.dispatchEvent(new Event("resize")); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.initTableData(); |
| | | // ç¡®ä¿ç»ä»¶æ£ç¡®æè½½ååå§åæ°æ® |
| | | this.$nextTick(() => { |
| | | if (Object.keys(this.internalData).length === 0) { |
| | | this.initTableData(); |
| | | } |
| | | this.forceTableLayout(); |
| | | }); |
| | | } |
| | | }; |
| | | </script> |
| | |
| | | flex-direction: column; |
| | | gap: 4px; |
| | | } |
| | | } |
| | | |
| | | /* å¨ç»ææ */ |
| | | .fade-enter-active, .fade-leave-active { |
| | | transition: opacity 0.3s; |
| | | } |
| | | .fade-enter, .fade-leave-to { |
| | | opacity: 0; |
| | | } |
| | | </style> |
| | |
| | | class-name="leave-alone" |
| | | > |
| | | <template #default="scope"> |
| | | <span :class="{'required-item': scope.row.required}"> |
| | | <span :class="{ 'required-item': scope.row.required }"> |
| | | {{ scope.row.itemName }} |
| | | </span> |
| | | </template> |
| | |
| | | class="value-input" |
| | | /> |
| | | <span v-else class="value-display"> |
| | | {{ scope.row.values[index] || '-' }} |
| | | <span v-if="scope.row.values[index] && scope.row.unit" class="unit"> |
| | | {{ scope.row.values[index] || "-" }} |
| | | <span |
| | | v-if="scope.row.values[index] && scope.row.unit" |
| | | class="unit" |
| | | > |
| | | {{ scope.row.unit }} |
| | | </span> |
| | | </span> |
| | |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | |
| | | </el-table> |
| | | |
| | | <!-- éä»¶ä¸ä¼ åºå --> |
| | |
| | | <el-form-item |
| | | label="æ¥æ" |
| | | prop="date" |
| | | :rules="[{ required: true, message: 'è¯·éæ©æ¥æ', trigger: 'change' }]" |
| | | :rules="[ |
| | | { required: true, message: 'è¯·éæ©æ¥æ', trigger: 'change' } |
| | | ]" |
| | | > |
| | | <el-date-picker |
| | | v-model="columnForm.date" |
| | |
| | | <el-form-item |
| | | label="æ¶é´" |
| | | prop="time" |
| | | :rules="[{ required: true, message: 'è¯·éæ©æ¶é´', trigger: 'change' }]" |
| | | :rules="[ |
| | | { required: true, message: 'è¯·éæ©æ¶é´', trigger: 'change' } |
| | | ]" |
| | | > |
| | | <el-time-picker |
| | | v-model="columnForm.time" |
| | |
| | | import UploadAttachment from "@/components/UploadAttachment"; |
| | | |
| | | export default { |
| | | name: 'LiverKidneyPanel', |
| | | name: "LiverKidneyPanel", |
| | | components: { |
| | | UploadAttachment, |
| | | UploadAttachment |
| | | }, |
| | | props: { |
| | | isEditing: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // ä¿®æ¹ prop å®ä¹ï¼æ¯æå¯¹è±¡æ ¼å¼çåå§æ°æ® |
| | | initialData: { |
| | | type: Array, |
| | | default: () => [] |
| | | type: Object, |
| | | default: () => ({}) |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | tableData: [], |
| | | dynamicColumns: [ |
| | | { |
| | | label: '2024-12-27\n08:00', |
| | | key: 'time1', |
| | | date: '2024-12-27', |
| | | time: '08:00' |
| | | }, |
| | | { |
| | | label: '2024-12-27\n14:00', |
| | | key: 'time2', |
| | | date: '2024-12-27', |
| | | time: '14:00' |
| | | } |
| | | ], |
| | | dynamicColumns: [], |
| | | attachments: [], |
| | | columnDialogVisible: false, |
| | | columnForm: { |
| | | date: '', |
| | | time: '' |
| | | date: "", |
| | | time: "" |
| | | }, |
| | | tableKey: 0 // ç¨äºå¼ºå¶éæ°æ¸²æè¡¨æ ¼ |
| | | tableKey: 0, |
| | | // å
鍿°æ®ç¶æ |
| | | internalData: {} |
| | | }; |
| | | }, |
| | | watch: { |
| | | // çå¬ initialData ååï¼ç¡®ä¿æ°æ®æ£ç¡®æ¥æ¶ [5](@ref) |
| | | initialData: { |
| | | handler(newData) { |
| | | if (newData && Object.keys(newData).length > 0) { |
| | | this.internalData = { ...newData }; |
| | | this.initFromExternalData(); |
| | | } |
| | | }, |
| | | immediate: true, |
| | | deep: true |
| | | }, |
| | | isEditing(newVal) { |
| | | if (!newVal) { |
| | | // ä¿åæ°æ® |
| | | this.$emit('data-change', { |
| | | type: 'liver_kidney', |
| | | data: this.tableData, |
| | | columns: this.dynamicColumns, |
| | | attachments: this.attachments |
| | | }); |
| | | this.saveData(); |
| | | } |
| | | // ç¼è¾æ¨¡å¼åæ¢æ¶éæ°è®¡ç®å宽 |
| | | this.$nextTick(() => { |
| | | this.forceTableLayout(); |
| | | }); |
| | | }, |
| | | dynamicColumns: { |
| | | handler() { |
| | | // åååæ¶éæ°è®¡ç®å¸å± |
| | | this.$nextTick(() => { |
| | | this.forceTableLayout(); |
| | | }); |
| | |
| | | } |
| | | }, |
| | | methods: { |
| | | // ä»å¤é¨æ°æ®åå§åç»ä»¶ [9](@ref) |
| | | initFromExternalData() { |
| | | if (this.internalData.data && this.internalData.columns) { |
| | | // 使ç¨å¤é¨æ°æ®åå§åè¡¨æ ¼ |
| | | this.tableData = this.internalData.data.map(item => ({ |
| | | ...item, |
| | | values: |
| | | item.values || new Array(this.internalData.columns.length).fill("") |
| | | })); |
| | | this.dynamicColumns = [...this.internalData.columns]; |
| | | } else { |
| | | // å¦ææ²¡æå¤é¨æ°æ®ï¼ä½¿ç¨é»è®¤åå§å |
| | | this.initTableData(); |
| | | } |
| | | |
| | | // åå§åéä»¶ |
| | | if (this.internalData.attachments) { |
| | | this.attachments = [...this.internalData.attachments]; |
| | | } |
| | | }, |
| | | |
| | | // åå§åé»è®¤è¡¨æ ¼æ°æ® |
| | | initTableData() { |
| | | const medicalItems = [ |
| | | { |
| | | itemName: 'è¡é ', |
| | | unit: 'mmol/L', |
| | | itemName: "è¡é ", |
| | | unit: "mmol/L", |
| | | required: true, |
| | | reference: '135-145' |
| | | reference: "135-145" |
| | | }, |
| | | { |
| | | itemName: 'è¡é¾', |
| | | unit: 'mmol/L', |
| | | itemName: "è¡é¾", |
| | | unit: "mmol/L", |
| | | required: true, |
| | | reference: '3.5-5.5' |
| | | reference: "3.5-5.5" |
| | | }, |
| | | { itemName: "BUN", unit: "mg/dL", required: true, reference: "<20" }, |
| | | { itemName: "èé
", unit: "μmol/L", required: true, reference: "<100" }, |
| | | { |
| | | itemName: 'BUN', |
| | | unit: 'mg/dL', |
| | | itemName: "æ»èçº¢ç´ ", |
| | | unit: "μmol/L", |
| | | required: true, |
| | | reference: '<20' |
| | | reference: "<21" |
| | | }, |
| | | { |
| | | itemName: 'èé
', |
| | | unit: 'μmol/L', |
| | | required: true, |
| | | reference: '<100' |
| | | }, |
| | | { |
| | | itemName: 'æ»èçº¢ç´ ', |
| | | unit: 'μmol/L', |
| | | required: true, |
| | | reference: '<21' |
| | | }, |
| | | { |
| | | itemName: 'ALT', |
| | | unit: 'U/L', |
| | | required: true, |
| | | reference: '<50' |
| | | }, |
| | | { |
| | | itemName: 'AST', |
| | | unit: 'U/L', |
| | | required: true, |
| | | reference: '<40' |
| | | }, |
| | | { |
| | | itemName: 'GGT', |
| | | unit: 'U/L', |
| | | required: true, |
| | | reference: '<57' |
| | | }, |
| | | { |
| | | itemName: 'ALP', |
| | | unit: 'U/L', |
| | | required: true, |
| | | reference: '<120' |
| | | }, |
| | | { |
| | | itemName: 'PT', |
| | | unit: 'ç§', |
| | | required: true, |
| | | reference: '9.4-12.5' |
| | | }, |
| | | { |
| | | itemName: 'INR', |
| | | unit: '', |
| | | required: true, |
| | | reference: '0.85-1.15' |
| | | } |
| | | { itemName: "ALT", unit: "U/L", required: true, reference: "<50" }, |
| | | { itemName: "AST", unit: "U/L", required: true, reference: "<40" }, |
| | | { itemName: "GGT", unit: "U/L", required: true, reference: "<57" }, |
| | | { itemName: "ALP", unit: "U/L", required: true, reference: "<120" }, |
| | | { itemName: "PT", unit: "ç§", required: true, reference: "9.4-12.5" }, |
| | | { itemName: "INR", unit: "", required: true, reference: "0.85-1.15" } |
| | | ]; |
| | | |
| | | // å¦ææ²¡æå¨æåï¼åå§åé»è®¤å |
| | | if (this.dynamicColumns.length === 0) { |
| | | this.dynamicColumns = [ |
| | | { |
| | | label: `${new Date().toISOString().split("T")[0]}\n08:00`, |
| | | key: "time1", |
| | | date: new Date().toISOString().split("T")[0], |
| | | time: "08:00" |
| | | } |
| | | ]; |
| | | } |
| | | |
| | | this.tableData = medicalItems.map(item => ({ |
| | | ...item, |
| | | values: new Array(this.dynamicColumns.length).fill('') |
| | | values: new Array(this.dynamicColumns.length).fill("") |
| | | })); |
| | | }, |
| | | |
| | | // ä¿åæ°æ®å°ç¶ç»ä»¶ [2](@ref) |
| | | saveData() { |
| | | const dataToEmit = { |
| | | type: "liver_kidney", |
| | | data: this.tableData, |
| | | columns: this.dynamicColumns, |
| | | attachments: this.attachments |
| | | }; |
| | | this.$emit("data-change", dataToEmit); |
| | | }, |
| | | |
| | | addColumn() { |
| | | this.columnForm = { |
| | | date: new Date().toISOString().split('T')[0], |
| | | time: '08:00' |
| | | date: new Date().toISOString().split("T")[0], |
| | | time: "08:00" |
| | | }; |
| | | this.columnDialogVisible = true; |
| | | }, |
| | | |
| | | confirmAddColumn() { |
| | | this.$refs.columnForm.validate((valid) => { |
| | | this.$refs.columnForm.validate(valid => { |
| | | if (!valid) { |
| | | this.$message.warning('请å®åæ¶é´ç¹ä¿¡æ¯'); |
| | | this.$message.warning("请å®åæ¶é´ç¹ä¿¡æ¯"); |
| | | return; |
| | | } |
| | | |
| | |
| | | date: this.columnForm.date, |
| | | time: this.columnForm.time |
| | | }; |
| | | this.internalData.columns.push(newColumn); |
| | | |
| | | this.dynamicColumns.push(newColumn); |
| | | |
| | | // 为ææè¡æ°å¢ä¸ä¸ªç©ºå¼ |
| | | this.tableData.forEach(row => { |
| | | row.values.push(''); |
| | | if (!row.values) { |
| | | row.values = []; |
| | | } |
| | | row.values.push(""); |
| | | }); |
| | | |
| | | this.columnDialogVisible = false; |
| | | this.$message.success('æ¶é´ç¹æ·»å æå'); |
| | | |
| | | // 强å¶è¡¨æ ¼éæ°æ¸²æ |
| | | this.$message.success("æ¶é´ç¹æ·»å æå"); |
| | | this.tableKey += 1; |
| | | }); |
| | | }, |
| | | |
| | | handleDialogClosed() { |
| | | this.columnForm = { |
| | | date: '', |
| | | time: '' |
| | | date: "", |
| | | time: "" |
| | | }; |
| | | this.$refs.columnForm && this.$refs.columnForm.clearValidate(); |
| | | }, |
| | | |
| | | handleValueChange(row, columnIndex) { |
| | | this.$emit('data-change', { |
| | | type: 'liver_kidney', |
| | | data: this.tableData, |
| | | columns: this.dynamicColumns |
| | | }); |
| | | this.saveData(); |
| | | }, |
| | | |
| | | handleAttachmentChange(fileList) { |
| | | this.attachments = fileList; |
| | | this.$emit('attachment-change', { |
| | | type: 'liver_kidney', |
| | | this.$emit("attachment-change", { |
| | | type: "liver_kidney", |
| | | attachments: fileList |
| | | }); |
| | | }, |
| | | |
| | | // 强å¶è¡¨æ ¼éæ°å¸å±[1,3](@ref) |
| | | forceTableLayout() { |
| | | this.$nextTick(() => { |
| | | const table = this.$el.querySelector('.el-table'); |
| | | if (table && table.querySelector('colgroup')) { |
| | | // 触åè¡¨æ ¼éæ°è®¡ç®å¸å± |
| | | const table = this.$el.querySelector(".el-table"); |
| | | if (table && table.querySelector("colgroup")) { |
| | | this.$nextTick(() => { |
| | | window.dispatchEvent(new Event('resize')); |
| | | window.dispatchEvent(new Event("resize")); |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | handleHeaderDragEnd() { |
| | | // åå®½ææ½ç»æåéæ°è®¡ç®å¸å± |
| | | this.forceTableLayout(); |
| | | }, |
| | | |
| | | // æä¾æ°æ®å¯¼åºæ¹æ³ä¾ç¶ç»ä»¶è°ç¨ |
| | | exportData() { |
| | | return { |
| | | tableData: this.tableData, |
| | |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.initTableData(); |
| | | // åå§æ¸²æå计ç®å宽 |
| | | // ç¡®ä¿ç»ä»¶æ£ç¡®æè½½ååå§åæ°æ® [1](@ref) |
| | | this.$nextTick(() => { |
| | | if (Object.keys(this.internalData).length === 0) { |
| | | this.initTableData(); |
| | | } |
| | | this.forceTableLayout(); |
| | | }); |
| | | } |
| | |
| | | font-weight: normal; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .medical-panel { |
| | | padding: 10px; |
| | |
| | | > |
| | | <template #default="scope"> |
| | | <div class="item-name-cell"> |
| | | <span :class="{'required-item': scope.row.required}"> |
| | | <span :class="{ 'required-item': scope.row.required }"> |
| | | {{ scope.row.itemName }} |
| | | </span> |
| | | <el-tooltip |
| | |
| | | :value="option.value" |
| | | /> |
| | | </el-select> |
| | | <span v-else class="value-text" :title="getSelectLabel(scope.row, index)"> |
| | | {{ getSelectLabel(scope.row, index) || '-' }} |
| | | <span |
| | | v-else |
| | | class="value-text" |
| | | :title="getSelectLabel(scope.row, index)" |
| | | > |
| | | {{ getSelectLabel(scope.row, index) || "-" }} |
| | | </span> |
| | | </template> |
| | | |
| | |
| | | /> |
| | | <div v-else class="value-display-container"> |
| | | <span class="value-text" :title="scope.row.values[index]"> |
| | | {{ scope.row.values[index] || '-' }} |
| | | {{ scope.row.values[index] || "-" }} |
| | | </span> |
| | | <span v-if="scope.row.values[index] && scope.row.unit" class="unit-text"> |
| | | <span |
| | | v-if="scope.row.values[index] && scope.row.unit" |
| | | class="unit-text" |
| | | > |
| | | {{ scope.row.unit }} |
| | | </span> |
| | | </div> |
| | |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <!-- <el-table-column |
| | | v-if="isEditing" |
| | | label="æä½" |
| | | width="120" |
| | | fixed="right" |
| | | class-name="leave-alone" |
| | | > |
| | | <template #default> |
| | | <el-button link type="primary" @click="addColumn" size="small"> |
| | | æ°å¢å |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> --> |
| | | </el-table> |
| | | |
| | | <!-- ç»è®¡ä¿¡æ¯ --> |
| | |
| | | <el-card shadow="never"> |
| | | <div class="stats-content"> |
| | | <span class="stats-title">æ°æ®ç»è®¡:</span> |
| | | <span class="stats-item">æ»è®°å½æ°: {{ dynamicColumns.length }} 个æ¶é´ç¹</span> |
| | | <span class="stats-item" |
| | | >æ»è®°å½æ°: {{ dynamicColumns.length }} 个æ¶é´ç¹</span |
| | | > |
| | | <span class="stats-item">已填å: {{ filledCount }} 项</span> |
| | | <span class="stats-item">å®æåº¦: {{ completionRate }}%</span> |
| | | </div> |
| | |
| | | <div class="attachment-header"> |
| | | <i class="el-icon-paperclip"></i> |
| | | <span class="attachment-title">éä»¶ä¸ä¼ </span> |
| | | <span class="attachment-tip">æ¯æä¸ä¼ å°¿å¸¸è§æ£éªæ¥ååçæä»¶ (æå¤10个)</span> |
| | | <span class="attachment-tip" |
| | | >æ¯æä¸ä¼ å°¿å¸¸è§æ£éªæ¥ååçæä»¶ (æå¤10个)</span |
| | | > |
| | | </div> |
| | | <upload-attachment |
| | | :file-list="attachments" |
| | |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | | <el-button type="primary" @click="confirmAddColumn" :loading="saveLoading"> |
| | | <el-button |
| | | type="primary" |
| | | @click="confirmAddColumn" |
| | | :loading="saveLoading" |
| | | > |
| | | ç¡®å® |
| | | </el-button> |
| | | </span> |
| | |
| | | import UploadAttachment from "@/components/UploadAttachment"; |
| | | |
| | | export default { |
| | | name: 'UrineRoutinePanel', |
| | | name: "UrineRoutinePanel", |
| | | components: { |
| | | UploadAttachment, |
| | | UploadAttachment |
| | | }, |
| | | props: { |
| | | isEditing: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // ä¿®æ¹ä¸º Object ç±»åï¼æ¯æå¤ææ°æ®ç»æ |
| | | initialData: { |
| | | type: Array, |
| | | default: () => [] |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | showStatistics: { |
| | | type: Boolean, |
| | |
| | | data() { |
| | | return { |
| | | tableData: [], |
| | | dynamicColumns: [ |
| | | { |
| | | label: '2024-12-27\n08:00', |
| | | key: 'time1', |
| | | date: '2024-12-27', |
| | | time: '08:00', |
| | | remark: 'æ¨å°¿æ£æµ' |
| | | } |
| | | ], |
| | | dynamicColumns: [], |
| | | attachments: [], |
| | | columnDialogVisible: false, |
| | | columnForm: { |
| | | date: '', |
| | | time: '', |
| | | remark: '' |
| | | date: "", |
| | | time: "", |
| | | remark: "" |
| | | }, |
| | | editingColumnIndex: null, |
| | | tableKey: 0, |
| | | tableLoading: false, |
| | | saveLoading: false, |
| | | // å
鍿°æ®ç¶æ |
| | | internalData: {}, |
| | | columnRules: { |
| | | date: [ |
| | | { required: true, message: 'è¯·éæ©æ¥æ', trigger: 'change' } |
| | | ], |
| | | time: [ |
| | | { required: true, message: 'è¯·éæ©æ¶é´', trigger: 'change' } |
| | | ] |
| | | date: [{ required: true, message: "è¯·éæ©æ¥æ", trigger: "change" }], |
| | | time: [{ required: true, message: "è¯·éæ©æ¶é´", trigger: "change" }] |
| | | } |
| | | }; |
| | | }, |
| | |
| | | let count = 0; |
| | | this.tableData.forEach(row => { |
| | | row.values.forEach(value => { |
| | | if (value && value.toString().trim() !== '') { |
| | | if (value && value.toString().trim() !== "") { |
| | | count++; |
| | | } |
| | | }); |
| | |
| | | } |
| | | }, |
| | | watch: { |
| | | // çå¬ initialData ååï¼ç¡®ä¿æ°æ®æ£ç¡®æ¥æ¶ |
| | | initialData: { |
| | | handler(newData) { |
| | | console.log(newData); |
| | | |
| | | if (newData && Object.keys(newData).length > 0) { |
| | | this.internalData = { ...newData }; |
| | | this.initFromExternalData(); |
| | | } |
| | | }, |
| | | immediate: true, |
| | | deep: true |
| | | }, |
| | | isEditing(newVal) { |
| | | if (!newVal) { |
| | | this.$emit('data-change', { |
| | | type: 'urine_routine', |
| | | data: this.tableData, |
| | | columns: this.dynamicColumns, |
| | | attachments: this.attachments |
| | | }); |
| | | this.saveData(); |
| | | } |
| | | this.$nextTick(() => { |
| | | this.forceTableLayout(); |
| | |
| | | } |
| | | }, |
| | | methods: { |
| | | initTableData() { |
| | | const medicalItems = [ |
| | | // ä»å¤é¨æ°æ®åå§åç»ä»¶ |
| | | initFromExternalData() { |
| | | console.log(this.internalData,'this.internalData'); |
| | | |
| | | if (this.internalData.data && this.internalData.columns) { |
| | | this.tableData = this.internalData.data.map(item => ({ |
| | | ...item, |
| | | values: |
| | | item.values || new Array(this.internalData.columns.length).fill("") |
| | | })); |
| | | this.dynamicColumns = [...this.internalData.columns]; |
| | | } else { |
| | | // å¦ææ²¡æå¤é¨æ°æ®ï¼ä½¿ç¨ç»ä»¶é»è®¤åå§å |
| | | this.initTableData(); |
| | | } |
| | | |
| | | // åå§åéä»¶ |
| | | if (this.internalData.attachments) { |
| | | this.attachments = [...this.internalData.attachments]; |
| | | } |
| | | }, |
| | | |
| | | // åå§åé»è®¤è¡¨æ ¼æ°æ® |
| | | initTableData() { |
| | | const medicalItems = this.getMedicalItems(); |
| | | |
| | | // å¦ææ²¡æå¨æåï¼åå§åé»è®¤å |
| | | if (this.dynamicColumns.length === 0) { |
| | | this.dynamicColumns = [ |
| | | { |
| | | label: `${new Date().toISOString().split("T")[0]}\n08:00`, |
| | | key: "time1", |
| | | date: new Date().toISOString().split("T")[0], |
| | | time: "08:00", |
| | | remark: "æ¨å°¿æ£æµ" |
| | | } |
| | | ]; |
| | | } |
| | | |
| | | this.tableData = medicalItems.map(item => ({ |
| | | ...item, |
| | | values: new Array(this.dynamicColumns.length).fill("") |
| | | })); |
| | | }, |
| | | |
| | | // å°¿å¸¸è§æ£æµé¡¹ç®å®ä¹ |
| | | getMedicalItems() { |
| | | return [ |
| | | { |
| | | itemName: 'å°¿é', |
| | | type: 'number', |
| | | itemName: "å°¿é", |
| | | type: "number", |
| | | required: true, |
| | | unit: 'ml/h', |
| | | reference: 'æ£å¸¸èå´è§æ
åµèå®' |
| | | unit: "ml/h", |
| | | reference: "æ£å¸¸èå´è§æ
åµèå®" |
| | | }, |
| | | { |
| | | itemName: 'é¢è²', |
| | | type: 'select', |
| | | itemName: "é¢è²", |
| | | type: "select", |
| | | required: true, |
| | | options: [ |
| | | { value: 'æ·¡é»è²', label: 'æ·¡é»è²' }, |
| | | { value: 'é»è²', label: 'é»è²' }, |
| | | { value: 'æ·±é»è²', label: 'æ·±é»è²' }, |
| | | { value: '红è²', label: '红è²' }, |
| | | { value: 'ç½è²', label: 'ç½è²' }, |
| | | { value: 'å
¶ä»', label: 'å
¶ä»' } |
| | | { value: "æ·¡é»è²", label: "æ·¡é»è²" }, |
| | | { value: "é»è²", label: "é»è²" }, |
| | | { value: "æ·±é»è²", label: "æ·±é»è²" }, |
| | | { value: "红è²", label: "红è²" }, |
| | | { value: "ç½è²", label: "ç½è²" }, |
| | | { value: "å
¶ä»", label: "å
¶ä»" } |
| | | ] |
| | | }, |
| | | { |
| | | itemName: 'å¤è§', |
| | | type: 'select', |
| | | itemName: "å¤è§", |
| | | type: "select", |
| | | required: false, |
| | | options: [ |
| | | { value: 'æ¸
亮', label: 'æ¸
亮' }, |
| | | { value: 'å¾®æµ', label: 'å¾®æµ' }, |
| | | { value: 'æµæµ', label: 'æµæµ' }, |
| | | { value: 'æ²æ·', label: 'æ²æ·' }, |
| | | { value: 'å
¶ä»', label: 'å
¶ä»' } |
| | | { value: "æ¸
亮", label: "æ¸
亮" }, |
| | | { value: "å¾®æµ", label: "å¾®æµ" }, |
| | | { value: "æµæµ", label: "æµæµ" }, |
| | | { value: "æ²æ·", label: "æ²æ·" }, |
| | | { value: "å
¶ä»", label: "å
¶ä»" } |
| | | ] |
| | | }, |
| | | { |
| | | itemName: 'å°¿èç½', |
| | | type: 'select', |
| | | itemName: "å°¿èç½", |
| | | type: "select", |
| | | required: true, |
| | | options: [ |
| | | { value: '-', label: 'é´æ§(-)' }, |
| | | { value: '±', label: 'å¾®é(±)' }, |
| | | { value: '+', label: '鳿§(+)' }, |
| | | { value: '++', label: '鳿§(++)' }, |
| | | { value: '+++', label: '鳿§(+++)' } |
| | | { value: "-", label: "é´æ§(-)" }, |
| | | { value: "±", label: "å¾®é(±)" }, |
| | | { value: "+", label: "鳿§(+)" }, |
| | | { value: "++", label: "鳿§(++)" }, |
| | | { value: "+++", label: "鳿§(+++)" } |
| | | ], |
| | | reference: 'æ£å¸¸ä¸ºé´æ§(-)' |
| | | reference: "æ£å¸¸ä¸ºé´æ§(-)" |
| | | }, |
| | | { |
| | | itemName: 'pHå¼', |
| | | type: 'number', |
| | | itemName: "pHå¼", |
| | | type: "number", |
| | | required: true, |
| | | placeholder: '4.5-8.0', |
| | | unit: '', |
| | | reference: '4.5-8.0', |
| | | placeholder: "4.5-8.0", |
| | | unit: "", |
| | | reference: "4.5-8.0", |
| | | min: 4.5, |
| | | max: 8.0 |
| | | }, |
| | | { |
| | | itemName: 'ç½ç»è', |
| | | type: 'select', |
| | | itemName: "ç½ç»è", |
| | | type: "select", |
| | | required: true, |
| | | options: [ |
| | | { value: '-', label: 'é´æ§(-)' }, |
| | | { value: '+', label: '鳿§(+)' }, |
| | | { value: '++', label: '鳿§(++)' }, |
| | | { value: '+++', label: '鳿§(+++)' } |
| | | { value: "-", label: "é´æ§(-)" }, |
| | | { value: "+", label: "鳿§(+)" }, |
| | | { value: "++", label: "鳿§(++)" }, |
| | | { value: "+++", label: "鳿§(+++)" } |
| | | ], |
| | | reference: 'æ£å¸¸ä¸ºé´æ§(-)' |
| | | reference: "æ£å¸¸ä¸ºé´æ§(-)" |
| | | }, |
| | | { |
| | | itemName: '红ç»è', |
| | | type: 'number', |
| | | itemName: "红ç»è", |
| | | type: "number", |
| | | required: true, |
| | | unit: '/μL', |
| | | reference: '0-9.2', |
| | | unit: "/μL", |
| | | reference: "0-9.2", |
| | | min: 0, |
| | | max: 9.2 |
| | | }, |
| | | { |
| | | itemName: 'ç»è', |
| | | type: 'number', |
| | | itemName: "ç»è", |
| | | type: "number", |
| | | required: true, |
| | | unit: '/μL', |
| | | reference: '0-385', |
| | | unit: "/μL", |
| | | reference: "0-385", |
| | | min: 0, |
| | | max: 385 |
| | | } |
| | | ]; |
| | | }, |
| | | |
| | | this.tableData = medicalItems.map(item => ({ |
| | | ...item, |
| | | values: new Array(this.dynamicColumns.length).fill('') |
| | | })); |
| | | // ä¿åæ°æ®å°ç¶ç»ä»¶ |
| | | saveData() { |
| | | const dataToEmit = { |
| | | type: "urine_routine", |
| | | data: this.tableData, |
| | | columns: this.dynamicColumns, |
| | | attachments: this.attachments |
| | | }; |
| | | this.$emit("data-change", dataToEmit); |
| | | }, |
| | | |
| | | getSelectLabel(row, columnIndex) { |
| | | if (!row.options || !row.values[columnIndex]) return row.values[columnIndex]; |
| | | const option = row.options.find(opt => opt.value === row.values[columnIndex]); |
| | | if (!row.options || !row.values[columnIndex]) |
| | | return row.values[columnIndex]; |
| | | const option = row.options.find( |
| | | opt => opt.value === row.values[columnIndex] |
| | | ); |
| | | return option ? option.label : row.values[columnIndex]; |
| | | }, |
| | | |
| | | addColumn() { |
| | | this.editingColumnIndex = null; |
| | | this.columnForm = { |
| | | date: new Date().toISOString().split('T')[0], |
| | | time: '08:00', |
| | | remark: '' |
| | | date: new Date().toISOString().split("T")[0], |
| | | time: "08:00", |
| | | remark: "" |
| | | }; |
| | | this.columnDialogVisible = true; |
| | | this.$nextTick(() => { |
| | |
| | | this.columnForm = { |
| | | date: column.date, |
| | | time: column.time, |
| | | remark: column.remark || '' |
| | | remark: column.remark || "" |
| | | }; |
| | | this.columnDialogVisible = true; |
| | | }, |
| | | |
| | | confirmAddColumn() { |
| | | this.$refs.columnFormU.validate((valid) => { |
| | | this.$refs.columnFormU.validate(valid => { |
| | | if (!valid) { |
| | | this.$message.warning('请å®åæ¶é´ç¹ä¿¡æ¯'); |
| | | this.$message.warning("请å®åæ¶é´ç¹ä¿¡æ¯"); |
| | | return; |
| | | } |
| | | |
| | |
| | | column.date = this.columnForm.date; |
| | | column.time = this.columnForm.time; |
| | | column.remark = this.columnForm.remark; |
| | | this.$message.success('æ¶é´ç¹ä¿®æ¹æå'); |
| | | this.$message.success("æ¶é´ç¹ä¿®æ¹æå"); |
| | | } else { |
| | | // æ°å¢å |
| | | const newIndex = this.dynamicColumns.length + 1; |
| | | const newColumn = { |
| | | label: `${this.columnForm.date}\n${this.columnForm.time}`, |
| | | key: `time${Date.now()}`, |
| | |
| | | time: this.columnForm.time, |
| | | remark: this.columnForm.remark |
| | | }; |
| | | this.internalData.columns.push(newColumn); |
| | | |
| | | this.dynamicColumns.push(newColumn); |
| | | this.tableData.forEach(row => { |
| | | row.values.push(''); |
| | | if (!row.values) row.values = []; |
| | | row.values.push(""); |
| | | }); |
| | | this.$message.success('æ¶é´ç¹æ·»å æå'); |
| | | this.$message.success("æ¶é´ç¹æ·»å æå"); |
| | | } |
| | | |
| | | this.columnDialogVisible = false; |
| | |
| | | |
| | | handleDeleteColumn() { |
| | | if (this.editingColumnIndex !== null) { |
| | | this.$confirm('ç¡®å®è¦å é¤è¿ä¸ªæ¶é´ç¹åï¼', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | this.$confirm("ç¡®å®è¦å é¤è¿ä¸ªæ¶é´ç¹åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(() => { |
| | | this.dynamicColumns.splice(this.editingColumnIndex, 1); |
| | | this.tableData.forEach(row => { |
| | |
| | | }); |
| | | this.columnDialogVisible = false; |
| | | this.tableKey += 1; |
| | | this.$message.success('æ¶é´ç¹å 餿å'); |
| | | this.$message.success("æ¶é´ç¹å 餿å"); |
| | | }); |
| | | } |
| | | }, |
| | |
| | | handleDialogClosed() { |
| | | this.editingColumnIndex = null; |
| | | this.columnForm = { |
| | | date: '', |
| | | time: '', |
| | | remark: '' |
| | | date: "", |
| | | time: "", |
| | | remark: "" |
| | | }; |
| | | this.$refs.columnFormU && this.$refs.columnFormU.clearValidate(); |
| | | }, |
| | |
| | | }, |
| | | |
| | | handleValueChange(row, columnIndex) { |
| | | this.$emit('data-change', { |
| | | type: 'urine_routine', |
| | | data: this.tableData, |
| | | columns: this.dynamicColumns |
| | | }); |
| | | this.saveData(); |
| | | }, |
| | | |
| | | handleAttachmentChange(fileList) { |
| | | this.attachments = fileList; |
| | | this.$emit('attachment-change', { |
| | | type: 'urine_routine', |
| | | this.$emit("attachment-change", { |
| | | type: "urine_routine", |
| | | attachments: fileList |
| | | }); |
| | | }, |
| | | |
| | | forceTableLayout() { |
| | | this.$nextTick(() => { |
| | | const table = this.$el.querySelector('.el-table'); |
| | | const table = this.$el.querySelector(".el-table"); |
| | | if (table) { |
| | | window.dispatchEvent(new Event('resize')); |
| | | window.dispatchEvent(new Event("resize")); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.initTableData(); |
| | | // ç¡®ä¿ç»ä»¶æ£ç¡®æè½½ååå§åæ°æ® |
| | | this.$nextTick(() => { |
| | | if (Object.keys(this.internalData).length === 0) { |
| | | this.initTableData(); |
| | | } |
| | | this.forceTableLayout(); |
| | | }); |
| | | } |
| | | }; |
| | | </script> |
| | |
| | | flex-direction: column; |
| | | gap: 4px; |
| | | } |
| | | } |
| | | |
| | | /* å¨ç»ææ */ |
| | | .fade-enter-active, .fade-leave-active { |
| | | transition: opacity 0.3s; |
| | | } |
| | | .fade-enter, .fade-leave-to { |
| | | opacity: 0; |
| | | } |
| | | </style> |
| | |
| | | :inline="true" |
| | | label-width="100px" |
| | | > |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-form-item label="æç®è
å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.donorName" |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æå¨å»çæºæ" prop="hospitalName"> |
| | | <el-form-item label="æå¨å»çæºæ" prop="treatmenthospitalname"> |
| | | <el-input |
| | | v-model="queryParams.hospitalName" |
| | | v-model="queryParams.treatmenthospitalname" |
| | | placeholder="请è¾å
¥å»çæºæ" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="å»çç»äººå" prop="medicalStaff"> |
| | | <el-form-item label="åè°å" prop="coordinatorName"> |
| | | <el-input |
| | | v-model="queryParams.medicalStaff" |
| | | placeholder="请è¾å
¥å»çç»äººå" |
| | | v-model="queryParams.coordinatorName" |
| | | placeholder="请è¾å
¥åè°åå§å" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æ£è
ç¶æ" prop="patientStatus"> |
| | | <el-form-item label="æ£è
ç¶æ" prop="recordstate"> |
| | | <el-select |
| | | v-model="queryParams.patientStatus" |
| | | placeholder="è¯·éæ©æ£è
ç¶æ" |
| | | v-model="queryParams.recordstate" |
| | | placeholder="è¯·éæ©è®°å½ç¶æ" |
| | | clearable |
| | | style="width: 200px" |
| | | > |
| | |
| | | <el-option label="已宿æç®" value="4" /> |
| | | <el-option label="æªå®ææç®" value="5" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å¹´é¾èå´" prop="ageRange"> |
| | | <el-input |
| | | v-model="queryParams.startAge" |
| | | placeholder="æå°å¹´é¾" |
| | | clearable |
| | | style="width: 95px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | <span style="margin: 0 5px">-</span> |
| | | <el-input |
| | | v-model="queryParams.endAge" |
| | | placeholder="æå¤§å¹´é¾" |
| | | clearable |
| | | style="width: 95px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¡£æ¡å½å
¥æ¶é´" prop="recordTimeRange"> |
| | | <el-date-picker |
| | |
| | | <el-card class="tool-card"> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="16"> |
| | | <!-- <el-button type="primary" icon="el-icon-plus" @click="handleCreate" |
| | | >æ°å¢ç»´æ¤</el-button |
| | | > --> |
| | | <el-button |
| | | type="success" |
| | | icon="el-icon-edit" |
| | | :disabled="single" |
| | | @click="handleUpdate" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | <el-button |
| | | type="danger" |
| | | icon="el-icon-delete" |
| | | :disabled="multiple" |
| | | @click="handleDelete" |
| | | >å é¤</el-button |
| | | > |
| | | <el-button |
| | | type="warning" |
| | | icon="el-icon-download" |
| | |
| | | width="120" |
| | | /> |
| | | <el-table-column |
| | | label="æ½å¨æç®è
å§å" |
| | | label="æç®è
ç¼å·" |
| | | align="center" |
| | | prop="donorName" |
| | | prop="donorno" |
| | | width="120" |
| | | /> |
| | | <el-table-column label="æ§å«" align="center" prop="gender" width="80"> |
| | | <el-table-column |
| | | label="æ½å¨æç®è
å§å" |
| | | align="center" |
| | | prop="name" |
| | | width="120" |
| | | /> |
| | | <el-table-column label="æ§å«" align="center" prop="sex" width="80"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="parseInt(scope.row.gender)" |
| | | :value="scope.row.sex" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¹´é¾" align="center" prop="age" width="80" /> |
| | | <el-table-column |
| | | label="è¡å" |
| | | align="center" |
| | | prop="bloodtype" |
| | | width="80" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_BloodType" |
| | | :value="scope.row.bloodtype" |
| | | /> </template |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="ç¾ç
è¯æ" |
| | | align="center" |
| | | prop="diagnosis" |
| | | prop="diagnosisname" |
| | | min-width="180" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="æå¨å»çæºæ" |
| | | label="é¦è¯å»çæºæ" |
| | | align="center" |
| | | prop="hospitalName" |
| | | prop="treatmenthospitalname" |
| | | width="150" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="æ£è
ç¶æ" |
| | | label="ä½é¢å·" |
| | | align="center" |
| | | prop="patientStatus" |
| | | prop="inpatientno" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="statusFilter(scope.row.patientStatus)"> |
| | | {{ statusTextFilter(scope.row.patientStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å
¥é¢æ¶é´" |
| | | align="center" |
| | | prop="admissionTime" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.admissionTime |
| | | ? parseTime(scope.row.admissionTime, "{y}-{m}-{d}") |
| | | : "-" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="åºé¢æ¶é´" |
| | | align="center" |
| | | prop="dischargeTime" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.dischargeTime |
| | | ? parseTime(scope.row.dischargeTime, "{y}-{m}-{d}") |
| | | : "-" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | /> |
| | | <!-- <el-table-column |
| | | label="ææ°å¹å
ȍȾ" |
| | | label="è®°å½ç¶æ" |
| | | align="center" |
| | | prop="latestCultureResult" |
| | | prop="recordstate" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="scope.row.latestCultureResult === 'é´æ§' ? 'success' : 'danger'" |
| | | effect="plain" |
| | | > |
| | | {{ scope.row.latestCultureResult || 'æªæ£æµ' }} |
| | | <el-tag :type="statusFilter(scope.row.recordstate)"> |
| | | {{ statusTextFilter(scope.row.recordstate) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> --> |
| | | <!-- <el-table-column |
| | | label="æ¤çæ ¸æ¥è¡¨å½å
¥æ¶é´" |
| | | align="center" |
| | | prop="lastRecordTime" |
| | | width="140" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.lastRecordTime |
| | | ? parseTime(scope.row.lastRecordTime, "{y}-{m}-{d} {h}:{i}") |
| | | : "-" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> --> |
| | | <el-table-column |
| | | label="åè°å" |
| | | align="center" |
| | | prop="coordinator" |
| | | prop="coordinatorName" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | label="ç»´æ¤é¡¹ç®" |
| | | align="center" |
| | | prop="itemName" |
| | | width="120" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="ç»´æ¤æ¶é´" |
| | | align="center" |
| | | prop="itemTime" |
| | | width="140" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.itemTime |
| | | ? parseTime(scope.row.itemTime, "{y}-{m}-{d} {h}:{i}") |
| | | : "-" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | width="180" |
| | | width="120" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click.stop="handleView(scope.row)" |
| | | >详æ
</el-button |
| | | > |
| | | <!-- <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click.stop="handleRecord(scope.row)" |
| | | >å½å
¥æ ¸æ¥</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-document" |
| | | @click.stop="handleRecordList(scope.row)" |
| | | >è®°å½æ¥è¯¢</el-button |
| | | > --> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { listMaintenance, delMaintenance, exportMaintenance } from "./mockMaintenanceApi"; |
| | | import { maintainList } from "@/api/businessApi"; |
| | | import Pagination from "@/components/Pagination"; |
| | | |
| | | export default { |
| | | name: "MaintenanceList", |
| | | components: { Pagination }, |
| | | dicts: ["sys_user_sex"], |
| | | dicts: ["sys_user_sex",'sys_BloodType'], |
| | | data() { |
| | | return { |
| | | // é®ç½©å± |
| | |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | donorName: undefined, |
| | | hospitalName: undefined, |
| | | medicalStaff: undefined, |
| | | patientStatus: undefined, |
| | | recordTimeRange: [] |
| | | name: undefined, // æç®è
å§å |
| | | treatmenthospitalname: undefined, // å»çæºæåç§° |
| | | coordinatorName: undefined, // åè°åå§å |
| | | recordstate: undefined, // è®°å½ç¶æ |
| | | startAge: undefined, // å¼å§å¹´é¾ |
| | | endAge: undefined, // ç»æå¹´é¾ |
| | | caseNo: undefined, // æ¡ä¾ç¼å· |
| | | donorno: undefined, // æç®è
ç¼å· |
| | | sex: undefined, // æ§å« |
| | | bloodtype: undefined, // è¡å |
| | | diagnosisname: undefined, // ç¾ç
è¯æåç§° |
| | | inpatientno: undefined, // ä½é¢å· |
| | | recordTimeRange: [] // æ¶é´èå´ |
| | | } |
| | | }; |
| | | }, |
| | |
| | | // ç¶æè¿æ»¤å¨ |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | | "1": "primary", // DCD |
| | | "2": "warning", // DBD |
| | | "3": "info", // DBCD |
| | | "4": "success", // 已宿æç® |
| | | "5": "danger" // æªå®ææç® |
| | | "1": "primary", // DCD |
| | | "2": "warning", // DBD |
| | | "3": "info", // DBCD |
| | | "4": "success", // 已宿æç® |
| | | "5": "danger" // æªå®ææç® |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | |
| | | // æ¥è¯¢ä¾è
ç»´æ¤å表 |
| | | getList() { |
| | | this.loading = true; |
| | | listMaintenance(this.queryParams) |
| | | |
| | | // å¤çæ¥è¯¢åæ°ï¼è¿æ»¤æç©ºå¼ |
| | | const params = this.cleanObject(this.queryParams); |
| | | |
| | | // å¤çæ¶é´èå´åæ° |
| | | if (params.recordTimeRange && params.recordTimeRange.length === 2) { |
| | | params.startTime = params.recordTimeRange[0] + " 00:00:00"; |
| | | params.endTime = params.recordTimeRange[1] + " 23:59:59"; |
| | | delete params.recordTimeRange; |
| | | } |
| | | |
| | | // å é¤å页忰ä¸çç©ºå¼ |
| | | delete params.pageNum; |
| | | delete params.pageSize; |
| | | |
| | | maintainList({ |
| | | pageNum: this.queryParams.pageNum, |
| | | pageSize: this.queryParams.pageSize, |
| | | ...params |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.maintenanceList = response.data.rows; |
| | | this.total = response.data.total; |
| | | this.maintenanceList = response.data; |
| | | this.total = response.total || 0; |
| | | |
| | | // å¤ç年龿¾ç¤º |
| | | this.maintenanceList.forEach(item => { |
| | | if (item.startAge !== undefined && item.endAge !== undefined) { |
| | | item.age = `${item.startAge}-${item.endAge}`; |
| | | } else if (item.startAge !== undefined) { |
| | | item.age = `${item.startAge}+`; |
| | | } else if (item.endAge !== undefined) { |
| | | item.age = `0-${item.endAge}`; |
| | | } else { |
| | | item.age = "-"; |
| | | } |
| | | }); |
| | | } else { |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | this.$message.error(response.msg || "è·åæ°æ®å¤±è´¥"); |
| | | } |
| | | this.loading = false; |
| | | }) |
| | |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | }); |
| | | }, |
| | | // æ¸
ç对象ä¸çç©ºå¼ |
| | | cleanObject(obj) { |
| | | const cleaned = {}; |
| | | Object.keys(obj).forEach(key => { |
| | | if (obj[key] !== undefined && obj[key] !== null && obj[key] !== "") { |
| | | cleaned[key] = obj[key]; |
| | | } |
| | | }); |
| | | return cleaned; |
| | | }, |
| | | // æç´¢æé®æä½ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | |
| | | }, |
| | | // éç½®æé®æä½ |
| | | resetQuery() { |
| | | this.$refs.queryForm.resetFields(); |
| | | this.handleQuery(); |
| | | this.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | name: undefined, |
| | | treatmenthospitalname: undefined, |
| | | coordinatorName: undefined, |
| | | recordstate: undefined, |
| | | startAge: undefined, |
| | | endAge: undefined, |
| | | caseNo: undefined, |
| | | donorno: undefined, |
| | | sex: undefined, |
| | | bloodtype: undefined, |
| | | diagnosisname: undefined, |
| | | inpatientno: undefined, |
| | | recordTimeRange: [] |
| | | }; |
| | | this.$nextTick(() => { |
| | | this.getList(); |
| | | }); |
| | | }, |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | |
| | | handleRowClick(row) { |
| | | this.$router.push({ |
| | | path: "/case/maintainInfo", |
| | | query: { id: row.id } |
| | | query: { id: row.id, infoid: row.infoid } |
| | | }); |
| | | }, |
| | | // æ¥ç详æ
|
| | | handleView(row) { |
| | | this.$router.push({ |
| | | path: "/case/maintainInfo", |
| | | query: { id: row.id } |
| | | query: { id: row.id, infoid: row.infoid } |
| | | }); |
| | | }, |
| | | // å½å
¥æ¤çæ ¸æ¥ |
| | | handleRecord(row) { |
| | | this.$router.push({ |
| | | path: "/case/maintenance/record", |
| | | query: { id: row.id, maintenanceId: row.maintenanceId } |
| | | }); |
| | | }, |
| | | // æ¥çè®°å½å表 |
| | | handleRecordList(row) { |
| | | this.$router.push({ |
| | | path: "/case/maintenance/records", |
| | | query: { id: row.id, maintenanceId: row.maintenanceId } |
| | | }); |
| | | }, |
| | | // æ°å¢æé®æä½ |
| | | handleCreate() { |
| | | this.$router.push("/case/maintenance/add"); |
| | | }, |
| | | // ä¿®æ¹æé®æä½ |
| | | handleUpdate() { |
| | | const id = this.ids[0]; |
| | | this.$router.push({ |
| | | path: "/case/maintenance/edit", |
| | | query: { id: id } |
| | | }); |
| | | }, |
| | | // å é¤æé®æä½ |
| | | handleDelete() { |
| | | const ids = this.ids; |
| | | this.$confirm("æ¯å¦ç¡®è®¤å é¤éä¸çæ°æ®é¡¹ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | return delMaintenance(ids); |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("å 餿å"); |
| | | this.getList(); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // å¯¼åºæé®æä½ |
| | | handleExport() { |
| | | const queryParams = this.queryParams; |
| | | const queryParams = this.cleanObject(this.queryParams); |
| | | |
| | | this.$confirm("æ¯å¦ç¡®è®¤å¯¼åºææç»´æ¤æ°æ®ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | |
| | | }) |
| | | .then(() => { |
| | | this.loading = true; |
| | | return exportMaintenance(queryParams); |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | // è¿ééè¦è°ç¨å¯¼åºæ¥å£ï¼ææ¶ç¨æ¨¡ææå |
| | | setTimeout(() => { |
| | | this.$message.success("å¯¼åºæå"); |
| | | } |
| | | this.loading = false; |
| | | this.loading = false; |
| | | }, 1000); |
| | | }) |
| | | .catch(() => { |
| | | this.loading = false; |
| | |
| | | const date = new Date(time); |
| | | if (pattern) { |
| | | return pattern.replace(/{(\w+)}/g, (match, p) => { |
| | | switch(p) { |
| | | case 'y': return date.getFullYear(); |
| | | case 'm': return (date.getMonth() + 1).toString().padStart(2, '0'); |
| | | case 'd': return date.getDate().toString().padStart(2, '0'); |
| | | case 'h': return date.getHours().toString().padStart(2, '0'); |
| | | case 'i': return date.getMinutes().toString().padStart(2, '0'); |
| | | default: return match; |
| | | switch (p) { |
| | | case "y": |
| | | return date.getFullYear(); |
| | | case "m": |
| | | return (date.getMonth() + 1).toString().padStart(2, "0"); |
| | | case "d": |
| | | return date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0"); |
| | | case "h": |
| | | return date |
| | | .getHours() |
| | | .toString() |
| | | .padStart(2, "0"); |
| | | case "i": |
| | | return date |
| | | .getMinutes() |
| | | .toString() |
| | | .padStart(2, "0"); |
| | | default: |
| | | return match; |
| | | } |
| | | }); |
| | | } |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")}`; |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1) |
| | | .toString() |
| | | .padStart(2, "0")}-${date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | } |
| | | } |
| | | }; |
| | |
| | | <el-card class="detail-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">ä¾è
åºæ¬ä¿¡æ¯</span> |
| | | <el-button |
| | | v-if="isEdit" |
| | | type="primary" |
| | | style="float: right; padding: 3px 0" |
| | | @click="handleSave" |
| | | > |
| | | <el-button type="success" style="float: right;" @click="handleSave"> |
| | | ä¿åä¿¡æ¯ |
| | | </el-button> |
| | | </div> |
| | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä½é¢å·" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" :readonly="!isEdit" /> |
| | | <el-input v-model="form.caseNo" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-input v-model="form.donorName" :readonly="!isEdit" /> |
| | | <el-form-item label="æç®è
å§å" prop="name"> |
| | | <el-input v-model="form.name" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ§å«" prop="gender"> |
| | | <el-select |
| | | v-model="form.gender" |
| | | :disabled="!isEdit" |
| | | style="width: 100%" |
| | | > |
| | | <el-select v-model="form.sex" style="width: 100%"> |
| | | <el-option label="ç·" value="0" /> |
| | | <el-option label="女" value="1" /> |
| | | </el-select> |
| | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å¹´é¾" prop="age"> |
| | | <el-input v-model="form.age" :readonly="!isEdit" /> |
| | | <el-input v-model="form.age" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosis"> |
| | | <el-input v-model="form.diagnosis" :readonly="!isEdit" /> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosisname"> |
| | | <el-input v-model="form.diagnosisname" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æå¨å»çæºæ" prop="hospitalName"> |
| | | <el-input v-model="form.hospitalName" :readonly="!isEdit" /> |
| | | <el-form-item label="é¦è¯å»çæºæ" prop="treatmenthospitalname"> |
| | | <el-input v-model="form.treatmenthospitalname" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ£è
ç¶æ" prop="patientStatus"> |
| | | <el-select |
| | | v-model="form.patientStatus" |
| | | :disabled="!isEdit" |
| | | style="width: 100%" |
| | | > |
| | | <el-option label="DCD" value="1" /> |
| | | <el-form-item label="æ£è
ç¶æ" prop="recordstate"> |
| | | <el-select v-model="form.recordstate" style="width: 100%"> |
| | | <!-- <el-option label="DCD" value="1" /> |
| | | <el-option label="DBD" value="2" /> |
| | | <el-option label="DBCD" value="3" /> |
| | | <el-option label="已宿æç®" value="4" /> |
| | | <el-option label="æªå®ææç®" value="5" /> |
| | | <el-option label="æªå®ææç®" value="5" /> --> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_DonationCategory || []" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <!-- <el-form-item |
| | | align="left" |
| | | label="æ£è
æç®ç¶æ" |
| | | prop="donationcategory" |
| | | > |
| | | <el-radio-group v-model="form.recordstate"> |
| | | <el-radio |
| | | v-for="dict in dict.type.sys_DonationCategory || []" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | >{{ dict.label }}</el-radio |
| | | > |
| | | </el-radio-group> |
| | | </el-form-item> --> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item |
| | | label="æªå®æåå " |
| | | prop="incompleteReason" |
| | | v-if="form.patientStatus === '5'" |
| | | v-if="form.recordstate === '5'" |
| | | > |
| | | <el-input |
| | | v-model="form.incompleteReason" |
| | | :readonly="!isEdit" |
| | | placeholder="请è¾å
¥æªå®ææç®çåå " |
| | | /> |
| | | </el-form-item> |
| | |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å
¥é¢æ¶é´" prop="admissionTime"> |
| | | <el-form-item label="䏿¥æ¶é´" prop="reporttime"> |
| | | <el-date-picker |
| | | v-model="form.admissionTime" |
| | | v-model="form.reporttime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | style="width: 100%" |
| | | :disabled="!isEdit" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="åºé¢æ¶é´" prop="dischargeTime"> |
| | | <el-form-item label="æ»äº¡æ¶é´" prop="deathTime"> |
| | | <el-date-picker |
| | | v-model="form.dischargeTime" |
| | | v-model="form.deathTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | style="width: 100%" |
| | | :disabled="!isEdit" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="åè°å" prop="coordinator"> |
| | | <el-input v-model="form.coordinator" :readonly="!isEdit" /> |
| | | <el-form-item label="åè°å" prop="coordinatorName"> |
| | | <el-input v-model="form.coordinatorName" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è¡å" prop="bloodType"> |
| | | <el-select |
| | | v-model="form.bloodType" |
| | | :disabled="!isEdit" |
| | | style="width: 100%" |
| | | > |
| | | <el-option label="Aå" value="A" /> |
| | | <el-form-item label="è¡å" prop="bloodtype"> |
| | | <el-select v-model="form.bloodtype" style="width: 100%"> |
| | | <!-- <el-option label="Aå" value="A" /> |
| | | <el-option label="Bå" value="B" /> |
| | | <el-option label="Oå" value="O" /> |
| | | <el-option label="ABå" value="AB" /> |
| | | <el-option label="ABå" value="AB" /> --> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_BloodType" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="RHå å" prop="rhFactor"> |
| | | <el-select |
| | | v-model="form.rhFactor" |
| | | :disabled="!isEdit" |
| | | style="width: 100%" |
| | | > |
| | | <el-option label="鳿§" value="positive" /> |
| | | <el-option label="é´æ§" value="negative" /> |
| | | </el-select> |
| | | <el-form-item label="Rh(D)" prop="rhYin"> |
| | | <el-radio-group v-model="form.rhYin"> |
| | | <el-radio |
| | | v-for="dict in dict.type.sys_bloodtype_rhd || []" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | >{{ dict.label }}</el-radio |
| | | > |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | type="textarea" |
| | | :rows="3" |
| | | v-model="form.specialMedicalHistory" |
| | | :readonly="!isEdit" |
| | | placeholder="è®°å½ç¹æ®ç
å²ä¿¡æ¯" |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <el-card class="assessment-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">ä¾è
è¯ä¼°å项记å½</span> |
| | |
| | | label="å¹å
»ç±»å" |
| | | align="center" |
| | | prop="cultureType" |
| | | > |
| | | <!-- <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="cultureTypeOptions" |
| | | :value="scope.row.cultureType" |
| | | /> |
| | | </template> --> |
| | | </el-table-column> |
| | | /> |
| | | <el-table-column |
| | | label="éæ ·æ¶é´" |
| | | align="center" |
| | |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- éä»¶å --> |
| | | <el-table-column label="éä»¶" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="cultureTotal > 0" |
| | | :total="cultureTotal" |
| | | :page.sync="cultureQueryParams.pageNum" |
| | | :limit.sync="cultureQueryParams.pageSize" |
| | | @pagination="getCultureList" |
| | | /> |
| | | </el-card> |
| | | </el-tab-pane> |
| | | |
| | |
| | | <el-tab-pane label="èåè½è¾åè½" name="liverKidney"> |
| | | <liver-kidney-panel |
| | | ref="liverKidney" |
| | | :initial-data="assessmentData.liverKidney" |
| | | :is-editing="isEdit && activeTab === 'liverKidney'" |
| | | @data-change="handleLiverKidneyDataChange" |
| | | /> |
| | |
| | | <el-tab-pane label="è¡å¸¸è§" name="bloodRoutine"> |
| | | <blood-routine-panel |
| | | ref="bloodRoutine" |
| | | :initial-data="assessmentData.bloodRoutine" |
| | | :is-editing="isEdit && activeTab === 'bloodRoutine'" |
| | | @data-change="handleBloodRoutineDataChange" |
| | | /> |
| | |
| | | <el-tab-pane label="尿常è§" name="urineRoutine"> |
| | | <urine-routine-panel |
| | | ref="urineRoutine" |
| | | :initial-data="assessmentData.urineRoutine" |
| | | :is-editing="isEdit && activeTab === 'urineRoutine'" |
| | | @data-change="handleUrineRoutineDataChange" |
| | | /> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </el-card> |
| | | <!-- å¹å
»ç»æè®°å½ --> |
| | | |
| | | <!-- ç®ååçæ¤çæ ¸æ¥è®°å½ --> |
| | | <!-- æ¤çæ ¸æ¥è®°å½ --> |
| | | <el-card class="record-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">æ¤çæ ¸æ¥è®°å½</span> |
| | |
| | | min-width="200" |
| | | show-overflow-tooltip |
| | | /> |
| | | <!-- éä»¶å --> |
| | | <el-table-column label="éä»¶" align="center" width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | |
| | | width="180" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="handleEditRecord(scope.row)" |
| | | >ç¼è¾</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-delete" |
| | | style="color: #F56C6C;" |
| | | @click="handleDeleteRecord(scope.row)" |
| | | >å é¤</el-button |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="handleEditRecord(scope.row)" |
| | | >ç¼è¾</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-delete" |
| | | style="color: #F56C6C;" |
| | | @click="handleDeleteRecord(scope.row)" |
| | | >å é¤</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="recordTotal > 0" |
| | | :total="recordTotal" |
| | | :page.sync="recordQueryParams.pageNum" |
| | | :limit.sync="recordQueryParams.pageSize" |
| | | @pagination="getRecordList" |
| | | /> |
| | | </el-card> |
| | | |
| | | <!-- å¹å
»è®°å½ç¼è¾å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | :title="cultureDialogTitle" |
| | |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- éä»¶ä¸ä¼ --> |
| | | <el-form-item label="éä»¶"> |
| | | <upload-attachment |
| | | :file-list="cultureForm.attachments" |
| | |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <!-- éä»¶ä¸ä¼ --> |
| | | <el-form-item label="éä»¶"> |
| | | <upload-attachment |
| | | :file-list="recordForm.attachments" |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { getMaintenanceDetail, updateMaintenance } from "./mockMaintenanceApi"; |
| | | import { |
| | | listCultureResults, |
| | | addCultureResult, |
| | | updateCultureResult, |
| | | deleteCultureResult |
| | | } from "./mockMaintenanceApi"; |
| | | import { |
| | | listNursingRecords, |
| | | addNursingRecord, |
| | | updateNursingRecord, |
| | | deleteNursingRecord |
| | | } from "./mockMaintenanceApi"; |
| | | import { maintainList, maintainedit, maintainAdd } from "@/api/businessApi"; |
| | | import Pagination from "@/components/Pagination"; |
| | | import UploadAttachment from "@/components/UploadAttachment"; |
| | | import AttachmentPreview from "@/components/AttachmentPreview"; |
| | |
| | | BloodRoutinePanel, |
| | | UrineRoutinePanel |
| | | }, |
| | | dicts: [ |
| | | "sys_donornode", |
| | | "sys_BloodType", |
| | | "sys_EthicalReview", |
| | | "sys_BaseAssessConclusion", |
| | | "sys_bloodtype_rhd", |
| | | "sys_DonationCategory" |
| | | ], |
| | | |
| | | data() { |
| | | return { |
| | | isEdit: true, |
| | | isEdit: false, |
| | | currentMaintenanceId: null, |
| | | isEditMode: false, |
| | | form: { |
| | | id: undefined, |
| | | caseNo: "", |
| | | donorName: "", |
| | | name: "", |
| | | gender: "", |
| | | age: "", |
| | | diagnosis: "", |
| | | hospitalName: "", |
| | | patientStatus: "1", |
| | | admissionTime: "", |
| | | dischargeTime: "", |
| | | coordinator: "", |
| | | bloodType: "", |
| | | diagnosisname: "", |
| | | treatmenthospitalname: "", |
| | | recordstate: "1", |
| | | reporttime: "", |
| | | deathTime: "", |
| | | coordinatorName: "", |
| | | bloodtype: "", |
| | | rhFactor: "", |
| | | specialMedicalHistory: "", |
| | | incompleteReason: "" |
| | | }, |
| | | activeTab: "culture", |
| | | liverKidneyData: {}, // ä» maintainList æ¥å£è·åçæ°æ® |
| | | bloodRoutineData: {}, // ä» maintainList æ¥å£è·åçæ°æ® |
| | | liverKidneyData: {}, // ä» maintainList æ¥å£è·åçæ°æ® |
| | | // å¹å
»ç»æç¸å
³æ°æ® |
| | | // å¹å
»ç»æç¸å
³æ°æ® |
| | | cultureList: [ |
| | | { |
| | | id: 1, |
| | | cultureType: "è¡å¹å
»", |
| | | sampleTime: "2024-12-19 10:30:00", |
| | | result: "é´æ§", |
| | | bacteria: "", |
| | | drugSensitivity: "", |
| | | testingInstitution: "éå²å¤§å¦éå±å»é¢", |
| | | specimenType: "è¡æ¶²", |
| | | remarks: "å¸¸è§æ£æµ", |
| | | attachments: [ |
| | | { |
| | | id: 1, |
| | | fileName: "è¡å¹å
»æ¥å.pdf", |
| | | fileUrl: |
| | | "http://localhost:8080/profile/upload/2025/12/27/1.COPOä¾ä½è¯ä¼°è¡¨.pdf", |
| | | fileSize: 1024000, |
| | | uploadTime: "2024-12-19 11:00:00" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | id: 3, |
| | | cultureType: "è¡å¹å
»", |
| | | sampleTime: "2024-12-20 09:15:00", |
| | | result: "é´æ§", |
| | | bacteria: "", |
| | | drugSensitivity: "", |
| | | testingInstitution: "å¹¿å·æ£æµä¸å¿", |
| | | specimenType: "å°¿æ¶²", |
| | | remarks: "æ¸
æ´ä¸æ®µå°¿æ æ¬", |
| | | attachments: [] |
| | | }, |
| | | { |
| | | id: 2, |
| | | cultureType: "ç°å¹å
ȍȾ", |
| | | sampleTime: "2024-12-19 14:20:00", |
| | | result: "鳿§", |
| | | bacteria: "éé»è²è¡èçè", |
| | | drugSensitivity: "对ééç´ ææï¼å¯¹å¤´å¢ç±»ä¸ä»", |
| | | testingInstitution: "䏿µ·å»å¦æ£éªæ", |
| | | specimenType: "ç°æ¶²", |
| | | remarks: "è¯æè¯éªå®æ", |
| | | attachments: [ |
| | | { |
| | | id: 2, |
| | | fileName: "ç°å¹å
ȍȾ.jpg", |
| | | fileUrl: |
| | | "https://img95.699pic.com/photo/40142/8262.jpg_wh860.jpg", |
| | | fileSize: 512000, |
| | | uploadTime: "2024-12-19 15:30:00" |
| | | }, |
| | | { |
| | | id: 3, |
| | | fileName: "è¯ææ¥å.pdf", |
| | | fileUrl: |
| | | "http://localhost:8080/profile/upload/2025/12/27/(å´é¾8.7)æ¯æ¥å·¥ä½æ»ç».pdf", |
| | | fileSize: 768000, |
| | | uploadTime: "2024-12-19 16:00:00" |
| | | } |
| | | ] |
| | | }, |
| | | |
| | | { |
| | | id: 4, |
| | | cultureType: "çèå¹å
»", |
| | | sampleTime: "2024-12-20 11:45:00", |
| | | result: "鳿§", |
| | | bacteria: "å¤§è æè", |
| | | drugSensitivity: "å¯¹å·¦æ°§æ°æ²æææ", |
| | | testingInstitution: "æ·±å³äººæ°å»é¢", |
| | | specimenType: "伤å£åæ³ç©", |
| | | remarks: "æ¯å伤壿æçæµ", |
| | | attachments: [ |
| | | { |
| | | id: 4, |
| | | fileName: "çèå¹å
».pdf", |
| | | fileUrl: "/reports/culture4.pdf", |
| | | fileSize: 890000, |
| | | uploadTime: "2024-12-20 13:20:00" |
| | | } |
| | | ] |
| | | } |
| | | ], |
| | | cultureList: [], |
| | | cultureLoading: false, |
| | | cultureTotal: 5, |
| | | cultureQueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10 |
| | | }, |
| | | cultureDialogVisible: false, |
| | | cultureDialogTitle: "", |
| | | cultureSaveLoading: false, |
| | |
| | | cultureType: "", |
| | | sampleTime: "", |
| | | result: "é´æ§", |
| | | attachments: [] // æ°å¢éä»¶åæ®µ |
| | | attachments: [] |
| | | }, |
| | | cultureRules: { |
| | | cultureType: [ |
| | |
| | | ], |
| | | |
| | | // æ¤çæ ¸æ¥è®°å½ç¸å
³æ°æ® |
| | | recordList: [ |
| | | { |
| | | id: 1, |
| | | recordTime: "2024-12-19 08:30:00", |
| | | recorder: "å¼ æ¤å£«", |
| | | temperature: 36.8, |
| | | heartRate: 78, |
| | | bloodPressure: "120/80", |
| | | respirationRate: 18, |
| | | oxygenSaturation: 98, |
| | | urineOutput: 60, |
| | | cvp: 8, |
| | | checkRecord: "æ£è
çå½ä½å¾å¹³ç¨³ï¼æè¯æ¸
æ¥ï¼é
åæ²»ç", |
| | | remarks: "å¤é´ç¡ç è¯å¥½", |
| | | attachments: [ |
| | | { |
| | | id: 1, |
| | | fileName: "æ©çæ¤çè®°å½.jpg", |
| | | fileUrl: "/records/nursing1.jpg", |
| | | fileSize: 1024000, |
| | | uploadTime: "2024-12-19 09:00:00" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | id: 2, |
| | | recordTime: "2024-12-19 14:30:00", |
| | | recorder: "ææ¤å£«", |
| | | temperature: 37.2, |
| | | heartRate: 82, |
| | | bloodPressure: "118/76", |
| | | respirationRate: 16, |
| | | oxygenSaturation: 97, |
| | | urineOutput: 45, |
| | | cvp: 7.5, |
| | | checkRecord: "æ£è
åå使¸©ç¥æåé«ï¼è§å¯ä¸", |
| | | remarks: "建议å¢å æ°´åæå
¥", |
| | | attachments: [] |
| | | }, |
| | | { |
| | | id: 3, |
| | | recordTime: "2024-12-19 20:30:00", |
| | | recorder: "çæ¤å£«", |
| | | temperature: 36.9, |
| | | heartRate: 75, |
| | | bloodPressure: "122/78", |
| | | respirationRate: 17, |
| | | oxygenSaturation: 98, |
| | | urineOutput: 55, |
| | | cvp: 8.2, |
| | | checkRecord: "æé´çå½ä½å¾ç¨³å®ï¼æ£è
伿¯è¯å¥½", |
| | | remarks: "å¤é´çæµæ å¼å¸¸", |
| | | attachments: [ |
| | | { |
| | | id: 2, |
| | | fileName: "æçæ¤çè®°å½.pdf", |
| | | fileUrl: "/records/nursing3.pdf", |
| | | fileSize: 890000, |
| | | uploadTime: "2024-12-19 21:00:00" |
| | | }, |
| | | { |
| | | id: 3, |
| | | fileName: "ä½å¾çæµè¡¨.xlsx", |
| | | fileUrl: "/records/monitoring3.xlsx", |
| | | fileSize: 256000, |
| | | uploadTime: "2024-12-19 21:15:00" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | id: 4, |
| | | recordTime: "2024-12-20 08:30:00", |
| | | recorder: "èµµæ¤å£«", |
| | | temperature: 36.7, |
| | | heartRate: 80, |
| | | bloodPressure: "119/77", |
| | | respirationRate: 18, |
| | | oxygenSaturation: 99, |
| | | urineOutput: 65, |
| | | cvp: 7.8, |
| | | checkRecord: "æ¨é´çå½ä½å¾æ£å¸¸ï¼æ£è
ç²¾ç¥ç¶æè¯å¥½", |
| | | remarks: "åå¤ä»æ¥æ£æ¥", |
| | | attachments: [] |
| | | }, |
| | | { |
| | | id: 5, |
| | | recordTime: "2024-12-20 12:30:00", |
| | | recorder: "忤士", |
| | | temperature: 37.1, |
| | | heartRate: 85, |
| | | bloodPressure: "121/79", |
| | | respirationRate: 19, |
| | | oxygenSaturation: 96, |
| | | urineOutput: 40, |
| | | cvp: 8.5, |
| | | checkRecord: "åé´ä½æ¸©ç¥ææ³¢å¨ï¼ç»§ç»è§å¯", |
| | | remarks: "å·²éç¥å»ç", |
| | | attachments: [ |
| | | { |
| | | id: 4, |
| | | fileName: "åé´æ¤çè®°å½.jpg", |
| | | fileUrl: "/records/nursing5.jpg", |
| | | fileSize: 765000, |
| | | uploadTime: "2024-12-20 13:00:00" |
| | | } |
| | | ] |
| | | } |
| | | ], |
| | | recordList: [], |
| | | recordLoading: false, |
| | | recordTotal: 4, |
| | | recordQueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10 |
| | | }, |
| | | recordDialogVisible: false, |
| | | recordDialogTitle: "", |
| | | recordSaveLoading: false, |
| | |
| | | id: undefined, |
| | | recordTime: "", |
| | | recorder: "", |
| | | checkRecord: "", // æ¹ä¸ºååæ®µè®°å½ |
| | | attachments: [] // æ°å¢éä»¶åæ®µ |
| | | checkRecord: "", |
| | | attachments: [] |
| | | }, |
| | | recordRules: { |
| | | recordTime: [ |
| | |
| | | // éä»¶é¢è§ç¸å
³ |
| | | attachmentPreviewVisible: false, |
| | | currentAttachmentList: [], |
| | | attachmentPreviewTitle: "" |
| | | attachmentPreviewTitle: "", |
| | | |
| | | // è¯ä¼°æ°æ®åå¨ |
| | | assessmentData: { |
| | | liverKidney: {}, |
| | | bloodRoutine: {}, |
| | | urineRoutine: {}, |
| | | cultureResults: [], |
| | | nursingRecords: [] |
| | | } |
| | | }; |
| | | }, |
| | | created() { |
| | | const id = this.$route.query.id; |
| | | // this.isEdit = this.$route.query.edit === "true"; |
| | | if (id) { |
| | | this.getDetail(id); |
| | | this.getCultureList(); |
| | | this.getRecordList(); |
| | | this.loadMaintenanceData(); |
| | | }, |
| | | watch: { |
| | | $route(to, from) { |
| | | this.loadMaintenanceData(); |
| | | } |
| | | }, |
| | | methods: { |
| | | // è·å详æ
|
| | | getDetail(id) { |
| | | getMaintenanceDetail(id).then(response => { |
| | | // å è½½ç»´æ¤æ°æ®[1,3](@ref) |
| | | async loadMaintenanceData() { |
| | | try { |
| | | this.cultureLoading = true; |
| | | this.recordLoading = true; |
| | | |
| | | const { id, infoid } = this.$route.query; |
| | | const queryParams = {}; |
| | | |
| | | if (id) { |
| | | queryParams.id = id; |
| | | this.currentMaintenanceId = id; |
| | | this.isEditMode = true; |
| | | } else if (infoid) { |
| | | queryParams.infoid = infoid; |
| | | this.currentMaintenanceId = null; |
| | | this.isEditMode = false; |
| | | } else { |
| | | this.$message.error("缺å°å¿
è¦çè·¯ç±åæ°"); |
| | | return; |
| | | } |
| | | |
| | | const response = await maintainList(queryParams); |
| | | if (response.code === 200) { |
| | | this.form = response.data; |
| | | } |
| | | }); |
| | | }, |
| | | // å¹å
»è®°å½éä»¶åæ´ |
| | | handleCultureAttachmentChange(fileList) { |
| | | this.cultureForm.attachments = fileList; |
| | | }, |
| | | let maintenanceData = response.data[0]; |
| | | |
| | | // æ¤çè®°å½éä»¶åæ´ |
| | | handleRecordAttachmentChange(fileList) { |
| | | this.recordForm.attachments = fileList; |
| | | }, |
| | | |
| | | // æ¥çå¹å
»è®°å½éä»¶ |
| | | handleViewCultureAttachments(row) { |
| | | console.log(22, row.attachments); |
| | | |
| | | this.currentAttachmentList = row.attachments || []; |
| | | this.attachmentPreviewTitle = `å¹å
»è®°å½éä»¶ - ${row.cultureType}`; |
| | | this.attachmentPreviewVisible = true; |
| | | }, |
| | | handleTabClick(tab) { |
| | | this.$nextTick(() => { |
| | | console.log(tab.name, 88); |
| | | const tableRef=null; |
| | | if (tab.name == "liverKidney") { |
| | | tableRef = this.$refs.liverKidney; // è¯·æ¿æ¢ä¸ºæ¨çè¡¨æ ¼ ref |
| | | } else if (tab.name == "bloodRoutine") { |
| | | tableRef = this.$refs.bloodRoutine; // è¯·æ¿æ¢ä¸ºæ¨çè¡¨æ ¼ ref |
| | | } else if (tab.name == "bloodRoutine") { |
| | | tableRef = this.$refs.bloodRoutine; // è¯·æ¿æ¢ä¸ºæ¨çè¡¨æ ¼ ref |
| | | } |
| | | // å¦ææ¯ el-tableï¼å°è¯è°ç¨å
¶ doLayout æ¹æ³ |
| | | if (tableRef && tableRef.doLayout) { |
| | | tableRef.doLayout(); |
| | | } |
| | | |
| | | // æè
ï¼æ´éç¨ç强å¶éæ°æ¸²ææ¹å¼ |
| | | this.$forceUpdate(); // æ
ç¨ï¼å¯è½å¼åå
¶ä»é®é¢[1](@ref) |
| | | }); |
| | | }, |
| | | // æ¥çæ¤çè®°å½éä»¶ |
| | | handleViewRecordAttachments(row) { |
| | | this.currentAttachmentList = row.attachments || []; |
| | | this.attachmentPreviewTitle = `æ¤çæ ¸æ¥è®°å½éä»¶ - ${row.recorder}`; |
| | | this.attachmentPreviewVisible = true; |
| | | }, |
| | | // å¹å
»è®°å½ç¸å
³æ¹æ³ |
| | | getCultureList() { |
| | | this.cultureLoading = true; |
| | | listCultureResults(this.form.id, this.cultureQueryParams) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | // this.cultureList = response.data.rows; |
| | | // this.cultureTotal = response.data.total; |
| | | // å¤çæ°ç»ååº |
| | | if (Array.isArray(maintenanceData)) { |
| | | maintenanceData = maintenanceData[0] || {}; |
| | | } |
| | | this.cultureLoading = false; |
| | | }) |
| | | .catch(() => { |
| | | this.cultureLoading = false; |
| | | }); |
| | | |
| | | // è§£æitemDescåæ®µä¸çJSONæ°æ®[6,8](@ref) |
| | | if (maintenanceData.itemDesc) { |
| | | try { |
| | | const itemDescData = JSON.parse(maintenanceData.itemDesc); |
| | | this.assessmentData = { ...this.assessmentData, ...itemDescData }; |
| | | |
| | | // å¡«å
å个模åçæ°æ® |
| | | if (itemDescData.cultureResults) { |
| | | this.cultureList = itemDescData.cultureResults; |
| | | } |
| | | if (itemDescData.nursingRecords) { |
| | | this.recordList = itemDescData.nursingRecords; |
| | | } |
| | | if (itemDescData.liverKidney) { |
| | | this.assessmentData.liverKidney = itemDescData.liverKidney; |
| | | } |
| | | if (itemDescData.bloodRoutine) { |
| | | this.assessmentData.bloodRoutine = itemDescData.bloodRoutine; |
| | | } |
| | | if (itemDescData.urineRoutine) { |
| | | this.assessmentData.urineRoutine = itemDescData.urineRoutine; |
| | | } |
| | | } catch (error) { |
| | | console.error("è§£æitemDesc JSON失败:", error); |
| | | } |
| | | } |
| | | |
| | | // å¡«å
åºç¡è¡¨åæ°æ® |
| | | this.form = { ...this.form, ...maintenanceData }; |
| | | this.$message.success("æ°æ®å è½½æå"); |
| | | } else { |
| | | this.$message.error("æ°æ®å 载失败ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | } catch (error) { |
| | | console.error("å è½½ç»´æ¤æ°æ®å¤±è´¥:", error); |
| | | this.$message.error("æ°æ®å 载失败"); |
| | | } finally { |
| | | this.cultureLoading = false; |
| | | this.recordLoading = false; |
| | | } |
| | | }, |
| | | |
| | | // ä¿åæææ°æ®[1,2](@ref) |
| | | async handleSave() { |
| | | try { |
| | | // æå»ºä¿åæ°æ® |
| | | const saveData = { |
| | | ...this.form, |
| | | itemDesc: JSON.stringify({ |
| | | liverKidney: this.assessmentData.liverKidney, |
| | | bloodRoutine: this.assessmentData.bloodRoutine, |
| | | urineRoutine: this.assessmentData.urineRoutine, |
| | | cultureResults: this.cultureList, |
| | | nursingRecords: this.recordList |
| | | }) |
| | | }; |
| | | |
| | | let response; |
| | | if (this.isEditMode && this.currentMaintenanceId) { |
| | | // ç¼è¾æ¨¡å¼ï¼è°ç¨maintaineditæ¥å£[1](@ref) |
| | | saveData.id = this.currentMaintenanceId; |
| | | response = await maintainedit(saveData); |
| | | } else { |
| | | // æ°å¢æ¨¡å¼ï¼è°ç¨maintainAddæ¥å£[2](@ref) |
| | | response = await maintainAdd(saveData); |
| | | } |
| | | |
| | | if (response.code === 200) { |
| | | this.$message.success("ä¿åæå"); |
| | | this.isEdit = false; |
| | | |
| | | // å¦ææ¯æ°å¢ä¿åï¼æ´æ°å½åID |
| | | if (!this.isEditMode && response.data && response.data.id) { |
| | | this.currentMaintenanceId = response.data.id; |
| | | this.isEditMode = true; |
| | | } |
| | | } else { |
| | | this.$message.error("ä¿å失败ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | } catch (error) { |
| | | console.error("ä¿åæ°æ®å¤±è´¥:", error); |
| | | this.$message.error("ä¿å失败"); |
| | | } |
| | | }, |
| | | |
| | | // 忢ç¼è¾æ¨¡å¼ |
| | | toggleEditMode() { |
| | | this.isEdit = !this.isEdit; |
| | | if (!this.isEdit) { |
| | | this.handleSave(); |
| | | } |
| | | }, |
| | | |
| | | // å¹å
»è®°å½ç¸å
³æ¹æ³ |
| | | handleAddCulture() { |
| | | this.cultureDialogTitle = "æ°å¢å¹å
»è®°å½"; |
| | | this.cultureForm = { |
| | |
| | | cultureType: "", |
| | | sampleTime: "", |
| | | result: "é´æ§", |
| | | bacteria: "", |
| | | drugSensitivity: "", |
| | | testingInstitution: "", |
| | | specimenType: "", |
| | | remarks: "" |
| | | attachments: [] |
| | | }; |
| | | this.cultureDialogVisible = true; |
| | | this.$nextTick(() => { |
| | |
| | | }); |
| | | }, |
| | | |
| | | handleViewCulture(row) { |
| | | this.$alert( |
| | | ` |
| | | <div> |
| | | <p><strong>å¹å
»ç±»åï¼</strong>${this.getCultureTypeLabel( |
| | | row.cultureType |
| | | )}</p> |
| | | <p><strong>éæ ·æ¶é´ï¼</strong>${row.sampleTime}</p> |
| | | <p><strong>å¹å
»ç»æï¼</strong>${row.result}</p> |
| | | <p><strong>æ£æµæºæï¼</strong>${row.testingInstitution}</p> |
| | | </div> |
| | | `, |
| | | "å¹å
»è®°å½è¯¦æ
", |
| | | { |
| | | dangerouslyUseHTMLString: true, |
| | | customClass: "detail-dialog" |
| | | } |
| | | ); |
| | | }, |
| | | toggleEditMode() { |
| | | this.isEdit = !this.isEdit; |
| | | // if (!this.isEdit) { |
| | | // this.saveAllData(); |
| | | // } |
| | | }, |
| | | handleLiverKidneyDataChange(data) { |
| | | console.log("èåè½è¾åè½æ°æ®åæ´:", data); |
| | | // å¤çæ°æ®ä¿åæä¸´æ¶åå¨ |
| | | }, |
| | | handleBloodRoutineDataChange(data) { |
| | | console.log("è¡å¸¸è§åè½æ°æ®åæ´:", data); |
| | | // å¤çæ°æ®ä¿åæä¸´æ¶åå¨ |
| | | }, |
| | | handleUrineRoutineDataChange(data) { |
| | | console.log("尿常è§åè½æ°æ®åæ´:", data); |
| | | // å¤çæ°æ®ä¿åæä¸´æ¶åå¨ |
| | | }, |
| | | // ä¿åå¹å
»è®°å½ |
| | | handleSaveCulture() { |
| | | this.$refs.cultureForm.validate(valid => { |
| | | if (valid) { |
| | | this.cultureSaveLoading = true; |
| | | const api = this.cultureForm.id |
| | | ? updateCultureResult |
| | | : addCultureResult; |
| | | const requestData = { |
| | | ...this.cultureForm, |
| | | maintenanceId: this.form.id |
| | | }; |
| | | |
| | | api(requestData) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success( |
| | | this.cultureForm.id ? "ä¿®æ¹æå" : "æ°å¢æå" |
| | | ); |
| | | this.cultureDialogVisible = false; |
| | | this.getCultureList(); |
| | | } |
| | | this.cultureSaveLoading = false; |
| | | }) |
| | | .catch(() => { |
| | | this.cultureSaveLoading = false; |
| | | }); |
| | | if (this.cultureForm.id) { |
| | | // ç¼è¾ç°æè®°å½ |
| | | const index = this.cultureList.findIndex( |
| | | item => item.id === this.cultureForm.id |
| | | ); |
| | | if (index !== -1) { |
| | | this.cultureList.splice(index, 1, { ...this.cultureForm }); |
| | | } |
| | | } else { |
| | | // æ°å¢è®°å½ |
| | | this.cultureForm.id = Date.now(); |
| | | this.cultureList.push({ ...this.cultureForm }); |
| | | } |
| | | |
| | | this.$message.success(this.cultureForm.id ? "ä¿®æ¹æå" : "æ°å¢æå"); |
| | | this.cultureDialogVisible = false; |
| | | this.cultureSaveLoading = false; |
| | | } |
| | | }); |
| | | }, |
| | |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | deleteCultureResult(row.id).then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("å 餿å"); |
| | | this.getCultureList(); |
| | | } |
| | | }); |
| | | this.cultureList = this.cultureList.filter( |
| | | item => item.id !== row.id |
| | | ); |
| | | this.$message.success("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | getCultureTypeLabel(value) { |
| | | const type = this.cultureTypeOptions.find(item => item.value === value); |
| | | return type ? type.label : "æªç¥"; |
| | | }, |
| | | |
| | | // æ¤çæ ¸æ¥è®°å½ç¸å
³æ¹æ³ |
| | | getRecordList() { |
| | | this.recordLoading = true; |
| | | listNursingRecords(this.form.id, this.recordQueryParams) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | // this.recordList = response.data.rows; |
| | | // this.recordTotal = response.data.total; |
| | | } |
| | | this.recordLoading = false; |
| | | }) |
| | | .catch(() => { |
| | | this.recordLoading = false; |
| | | }); |
| | | }, |
| | | |
| | | // æ¤çè®°å½ç¸å
³æ¹æ³ |
| | | handleAddRecord() { |
| | | this.recordDialogTitle = "æ°å¢æ¤çæ ¸æ¥è®°å½"; |
| | | this.recordForm = { |
| | |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19), |
| | | recorder: "å½åç¨æ·", // å®é
项ç®ä¸ä»ç¨æ·ä¿¡æ¯è·å |
| | | temperature: 36.5, |
| | | heartRate: 80, |
| | | bloodPressure: "120/80", |
| | | respirationRate: 18, |
| | | oxygenSaturation: 98, |
| | | urineOutput: 50, |
| | | cvp: 8, |
| | | remarks: "" |
| | | recorder: "å½åç¨æ·", |
| | | checkRecord: "", |
| | | attachments: [] |
| | | }; |
| | | this.recordDialogVisible = true; |
| | | this.$nextTick(() => { |
| | |
| | | }); |
| | | }, |
| | | |
| | | handleViewRecord(row) { |
| | | this.$alert( |
| | | ` |
| | | <div> |
| | | <p><strong>æ ¸æ¥æ¶é´ï¼</strong>${row.recordTime}</p> |
| | | <p><strong>æ ¸æ¥äººï¼</strong>${row.recorder}</p> |
| | | <p><strong>çå½ä½å¾ï¼</strong></p> |
| | | <ul> |
| | | <li>使¸©ï¼${row.temperature}â</li> |
| | | <li>å¿çï¼${row.heartRate}次/å</li> |
| | | <li>è¡åï¼${row.bloodPressure}mmHg</li> |
| | | <li>å¼å¸ï¼${row.respirationRate}次/å</li> |
| | | <li>è¡æ°§é¥±å度ï¼${row.oxygenSaturation}%</li> |
| | | <li>å°¿éï¼${row.urineOutput}ml/h</li> |
| | | </ul> |
| | | <p><strong>夿³¨ï¼</strong>${row.remarks || "æ "}</p> |
| | | </div> |
| | | `, |
| | | "æ¤çæ ¸æ¥è®°å½è¯¦æ
", |
| | | { |
| | | dangerouslyUseHTMLString: true, |
| | | customClass: "detail-dialog" |
| | | } |
| | | ); |
| | | }, |
| | | |
| | | handleSaveRecord() { |
| | | this.$refs.recordForm.validate(valid => { |
| | | if (valid) { |
| | | this.recordSaveLoading = true; |
| | | const api = this.recordForm.id |
| | | ? updateNursingRecord |
| | | : addNursingRecord; |
| | | const requestData = { |
| | | ...this.recordForm, |
| | | maintenanceId: this.form.id |
| | | }; |
| | | |
| | | api(requestData) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success( |
| | | this.recordForm.id ? "ä¿®æ¹æå" : "æ°å¢æå" |
| | | ); |
| | | this.recordDialogVisible = false; |
| | | this.getRecordList(); |
| | | } |
| | | this.recordSaveLoading = false; |
| | | }) |
| | | .catch(() => { |
| | | this.recordSaveLoading = false; |
| | | }); |
| | | if (this.recordForm.id) { |
| | | // ç¼è¾ç°æè®°å½ |
| | | const index = this.recordList.findIndex( |
| | | item => item.id === this.recordForm.id |
| | | ); |
| | | if (index !== -1) { |
| | | this.recordList.splice(index, 1, { ...this.recordForm }); |
| | | } |
| | | } else { |
| | | // æ°å¢è®°å½ |
| | | this.recordForm.id = Date.now(); |
| | | this.recordList.push({ ...this.recordForm }); |
| | | } |
| | | |
| | | this.$message.success(this.recordForm.id ? "ä¿®æ¹æå" : "æ°å¢æå"); |
| | | this.recordDialogVisible = false; |
| | | this.recordSaveLoading = false; |
| | | } |
| | | }); |
| | | }, |
| | |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | deleteNursingRecord(row.id).then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("å 餿å"); |
| | | this.getRecordList(); |
| | | } |
| | | }); |
| | | this.recordList = this.recordList.filter(item => item.id !== row.id); |
| | | this.$message.success("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // ä¿ååºæ¬ä¿¡æ¯ |
| | | handleSave() { |
| | | this.$refs.form.validate(valid => { |
| | | if (valid) { |
| | | updateMaintenance(this.form).then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("ä¿åæå"); |
| | | this.isEdit = false; |
| | | } |
| | | }); |
| | | // éä»¶ç¸å
³æ¹æ³ |
| | | handleCultureAttachmentChange(fileList) { |
| | | this.cultureForm.attachments = fileList; |
| | | }, |
| | | |
| | | handleRecordAttachmentChange(fileList) { |
| | | this.recordForm.attachments = fileList; |
| | | }, |
| | | |
| | | handleViewCultureAttachments(row) { |
| | | this.currentAttachmentList = row.attachments || []; |
| | | this.attachmentPreviewTitle = `å¹å
»è®°å½éä»¶ - ${row.cultureType}`; |
| | | this.attachmentPreviewVisible = true; |
| | | }, |
| | | |
| | | handleViewRecordAttachments(row) { |
| | | this.currentAttachmentList = row.attachments || []; |
| | | this.attachmentPreviewTitle = `æ¤çæ ¸æ¥è®°å½éä»¶ - ${row.recorder}`; |
| | | this.attachmentPreviewVisible = true; |
| | | }, |
| | | |
| | | // è¯ä¼°æ°æ®åæ´å¤ç |
| | | handleLiverKidneyDataChange(data) { |
| | | this.assessmentData.liverKidney = data; |
| | | }, |
| | | |
| | | handleBloodRoutineDataChange(data) { |
| | | this.assessmentData.bloodRoutine = data; |
| | | }, |
| | | |
| | | handleUrineRoutineDataChange(data) { |
| | | this.assessmentData.urineRoutine = data; |
| | | }, |
| | | |
| | | handleTabClick(tab) { |
| | | this.$nextTick(() => { |
| | | let tableRef = null; |
| | | if (tab.name === "liverKidney") { |
| | | tableRef = this.$refs.liverKidney; |
| | | } else if (tab.name === "bloodRoutine") { |
| | | tableRef = this.$refs.bloodRoutine; |
| | | } else if (tab.name === "urineRoutine") { |
| | | tableRef = this.$refs.urineRoutine; |
| | | } |
| | | |
| | | if (tableRef && tableRef.doLayout) { |
| | | tableRef.doLayout(); |
| | | } |
| | | }); |
| | | } |
| | |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .culture-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .record-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .detail-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | } |
| | | .maintenance-detail { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .detail-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .culture-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .record-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .detail-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | } |
| | | .medical-panel { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .attachment-section { |
| | | margin-top: 20px; |
| | | padding: 15px; |
| | | border: 1px solid #ebeef5; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .attachment-title { |
| | | font-weight: bold; |
| | | margin-bottom: 10px; |
| | | color: #409eff; |
| | | } |
| | | |
| | | .required-item::before { |
| | | content: "*"; |
| | | color: #f56c6c; |
| | | margin-right: 4px; |
| | | } |
| | | |
| | | .assessment-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .medical-table { |
| | | width: 100%; |
| | | .record-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .dynamic-column { |
| | | min-width: 120px; |
| | | .detail-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | margin-right: 20px; |
| | | } |
| | | |
| | | .culture-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .fixed-width .el-button { |
| | | margin: 0 2px; |
| | | } |
| | | |
| | | /* 详æ
å¯¹è¯æ¡æ ·å¼ */ |
| | | :deep(.detail-dialog) { |
| | | width: 500px; |
| | | } |
| | | |
| | | :deep(.detail-dialog .el-message-box__content) { |
| | | line-height: 1.8; |
| | | } |
| | | |
| | | :deep(.detail-dialog ul) { |
| | | margin: 10px 0; |
| | | padding-left: 20px; |
| | | } |
| | | |
| | | :deep(.detail-dialog li) { |
| | | margin-bottom: 5px; |
| | | } |
| | | </style> |
| | |
| | | <el-option label="å·²ç»æ¢" value="99" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <!-- æ°å¢æç´¢å段 --> |
| | | <el-form-item label="䏿¥æ¶é´" prop="reportTimeRange"> |
| | | <el-date-picker |
| | | v-model="queryParams.reportTimeRange" |
| | | type="daterange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | value-format="yyyy-MM-dd" |
| | | size="small" |
| | | style="width: 240px;" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="é¦è¯å»é¢" prop="treatmenthospitalname"> |
| | | <el-input |
| | | v-model="queryParams.treatmenthospitalname" |
| | | placeholder="请è¾å
¥é¦è¯å»é¢" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ä½é¢å·" prop="hospitalNo"> |
| | | <el-input |
| | | v-model="queryParams.hospitalNo" |
| | | placeholder="请è¾å
¥ä½é¢å·" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | |
| | | |
| | | <el-table-column label="å¹´é¾" align="center" prop="age" width="80" /> |
| | | |
| | | <el-table-column label="è¡å" align="center" prop="bloodtype" width="80"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_BloodType" |
| | | :value="scope.row.bloodtype" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="è¯ä»¶å·ç " |
| | | label="ä¼ æç
" |
| | | align="center" |
| | | prop="idcardno" |
| | | prop="infectious" |
| | | width="180" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="æ²»çå»é¢" |
| | | label="é¦è¯å»é¢" |
| | | align="center" |
| | | prop="treatmenthospitalname" |
| | | width="150" |
| | |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="æ¡ä¾ç¼å·" |
| | | label="ä½é¢å·" |
| | | align="center" |
| | | prop="caseNo" |
| | | prop="hospitalNo" |
| | | width="120" |
| | | /> |
| | | |
| | | <!-- ç¬¬ä¸æ¬¡å»å¦è¯ä¼° --> |
| | | <el-table-column |
| | | label="ç¬¬ä¸æ¬¡è¯ä¼°ç»è®º" |
| | | label="è¯ä¼°ç¶æ" |
| | | align="center" |
| | | prop="firstAssessState" |
| | | prop="assessState" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_BaseAssessConclusion" |
| | | :value="scope.row.firstAssessState" |
| | | :value="scope.row.assessState" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="ç¬¬ä¸æ¬¡è¯ä¼°æ¶é´" |
| | | label="è¯ä¼°æ¶é´" |
| | | align="center" |
| | | prop="assessFirstTime" |
| | | prop="assessTime" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.assessFirstTime, "{y}-{m}-{d}") }}</span> |
| | | </template> |
| | | <!-- <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.assessTime, "{y}-{m}-{d}") }}</span> |
| | | </template> --> |
| | | </el-table-column> |
| | | |
| | | <!-- ç¬¬äºæ¬¡å»å¦è¯ä¼° --> |
| | | <el-table-column |
| | | label="ç¬¬äºæ¬¡è¯ä¼°ç»è®º" |
| | | align="center" |
| | | prop="secondAssessState" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_BaseAssessConclusion" |
| | | :value="scope.row.secondAssessState" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="ç¬¬äºæ¬¡è¯ä¼°æ¶é´" |
| | | align="center" |
| | | prop="assessSecondTime" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | parseTime(scope.row.assessSecondTime, "{y}-{m}-{d}") |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="亲å±ç¡®è®¤æ¶é´" |
| | | align="center" |
| | | prop="signDate" |
| | | width="110" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <!-- <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.signDate, "{y}-{m}-{d}") }}</span> |
| | | </template> |
| | | </template> --> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | |
| | | </el-table-column> |
| | | |
| | | <!-- æä½åï¼åªä¿çç»æ¢åæ¥ç详æ
--> |
| | | <el-table-column label="æä½" align="center" width="150" fixed="right"> |
| | | <el-table-column label="æä½" align="center" width="200" fixed="right"> |
| | | <template slot-scope="scope"> |
| | | <el-button size="mini" type="text" @click="handleDetail(scope.row)" |
| | | >æ¥ç详æ
</el-button |
| | |
| | | scope.row.terminationCase === 0 && scope.row.recordstate !== '99' |
| | | " |
| | | >ç»æ¢</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | style="color: #67c23a;" |
| | | @click="handleRestore(scope.row)" |
| | | v-if="scope.row.terminationCase === 1" |
| | | >æ¢å¤</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <donor-detail :donorData="currentRecord" @close="detailVisible = false" /> |
| | | </el-dialog> |
| | | |
| | | <!-- ç»æ¢ç¡®è®¤å¼¹æ¡ --> |
| | | <el-dialog |
| | | title="ç»æ¢ç¡®è®¤" |
| | | :visible.sync="terminateVisible" |
| | | width="400px" |
| | | append-to-body |
| | | > |
| | | <div style="margin-bottom: 20px;"> |
| | | <p> |
| | | ç¡®å®è¦ç»æ¢æç®è
|
| | | <strong>{{ currentRecord.name }}</strong> çæç®è¿ç¨åï¼ |
| | | </p> |
| | | <p style="color: #f56c6c; font-size: 12px;"> |
| | | æ¤æä½ä¸å¯éï¼è¯·è°¨æ
æä½ï¼ |
| | | </p> |
| | | </div> |
| | | <div slot="footer"> |
| | | <el-button @click="terminateVisible = false">åæ¶</el-button> |
| | | <el-button type="danger" @click="submitTerminate">ç¡®è®¤ç»æ¢</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | <!-- ç»æ¢/æ¢å¤å¼¹æ¡ç»ä»¶ --> |
| | | <terminate-restore-modal |
| | | :current-record="currentRecord" |
| | | :visible="modalVisible" |
| | | :titles="modalTitles" |
| | | @update:visible="handleModalVisibleChange" |
| | | @operation-success="handleOperationSuccess" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { courselist, terminateDonor } from "@/api/businessApi"; |
| | | import TerminateRestoreModal from "@/components/TerminateRestoreModal"; |
| | | |
| | | export default { |
| | | name: "Donatebaseinfo", |
| | | dicts: ["sys_donornode", "sys_EthicalReview", "sys_BaseAssessConclusion"], |
| | | components: { |
| | | TerminateRestoreModal |
| | | }, |
| | | dicts: ["sys_donornode",'sys_BloodType', "sys_EthicalReview", "sys_BaseAssessConclusion"], |
| | | data() { |
| | | return { |
| | | // é®ç½©å± |
| | | loading: false, |
| | | // æ¾ç¤ºæç´¢æ¡ä»¶ |
| | | showSearch: true, |
| | |
| | | donatebaseinfoList: [], |
| | | // 详æ
å¼¹æ¡æ¾ç¤º |
| | | detailVisible: false, |
| | | // ç»æ¢ç¡®è®¤å¼¹æ¡æ¾ç¤º |
| | | terminateVisible: false, |
| | | // å½åæä½è®°å½ |
| | | currentRecord: {}, |
| | | // ç»è®¡æ°æ® |
| | |
| | | pageSize: 10, |
| | | name: undefined, |
| | | idcardno: undefined, |
| | | recordstate: undefined |
| | | recordstate: undefined, |
| | | // æ°å¢çæç´¢å段 |
| | | reportTimeRange: [], |
| | | treatmenthospitalname: undefined, |
| | | hospitalNo: undefined |
| | | }, |
| | | // å¼¹æ¡æ¾ç¤ºç¶æ |
| | | modalVisible: { |
| | | terminate: false, |
| | | restore: false |
| | | }, |
| | | // å¼¹æ¡æ é¢ |
| | | modalTitles: { |
| | | terminate: "ç»æ¢æç®è¿ç¨", |
| | | restore: "æ¢å¤æç®è¿ç¨" |
| | | } |
| | | }; |
| | | }, |
| | |
| | | }, |
| | | methods: { |
| | | /** æ¥è¯¢æç®åºç¡å表 */ |
| | | /** æ¥è¯¢æç®åºç¡å表 */ |
| | | async getList() { |
| | | this.loading = true; |
| | | try { |
| | | const response = await courselist(this.queryParams); |
| | | |
| | | // æ ¹æ®å®é
æ¥å£è¿åç»æè°æ´ |
| | | let realData = []; |
| | | realData = response.data.donatebaseinfoProgressDTOS; |
| | | this.total = response.total; |
| | | this.stats.pendingCount = response.data.terminationCase[0]; |
| | | this.stats.approvedCount = response.data.terminationCase[1]; |
| | | this.stats.terminatedCount = response.data.terminationCase[2]; |
| | | this.stats.totalCount = response.total; |
| | | // åå¨æææ°æ®ç¨äºå端çéåå页 |
| | | this.allTableData = realData; |
| | | this.stats.totalCount = |
| | | response.total - response.data.terminationCase[2]; |
| | | |
| | | // åºç¨å端ç鿡件ï¼å¦ææ¥å£ä¸æ¯æå端çéï¼ |
| | | this.allTableData = realData; |
| | | let filteredData = this.applyFrontendFilter(realData); |
| | | |
| | | // å端å页å¤çï¼å¦ææ¥å£ä¸æ¯æå端åé¡µï¼ |
| | | if (!response.total && !response.data) { |
| | | const startIndex = |
| | | (this.queryParams.pageNum - 1) * this.queryParams.pageSize; |
| | |
| | | this.donatebaseinfoList = filteredData.slice(startIndex, endIndex); |
| | | this.total = filteredData.length; |
| | | } else { |
| | | // æ¥å£å·²å页ï¼ç´æ¥ä½¿ç¨è¿åæ°æ® |
| | | this.donatebaseinfoList = filteredData; |
| | | } |
| | | |
| | | // æ´æ°ç»è®¡æ°æ® |
| | | // this.updateStats(realData); |
| | | } catch (error) { |
| | | console.error("è·åæ°æ®å¤±è´¥:", error); |
| | | this.$message.error("æ°æ®å 载失败"); |
| | | this.donatebaseinfoList = []; |
| | | this.total = 0; |
| | | // this.updateStats([]); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | |
| | | ); |
| | | } |
| | | |
| | | return filteredData; |
| | | }, |
| | | if (this.queryParams.treatmenthospitalname) { |
| | | filteredData = filteredData.filter( |
| | | item => |
| | | item.treatmenthospitalname && |
| | | item.treatmenthospitalname.includes( |
| | | this.queryParams.treatmenthospitalname |
| | | ) |
| | | ); |
| | | } |
| | | |
| | | /** æ´æ°ç»è®¡æ°æ® */ |
| | | updateStats(data) { |
| | | this.stats.totalCount = data.length; |
| | | this.stats.pendingCount = data.filter( |
| | | item => item.recordstate === "0" || item.recordstate === 0 |
| | | ).length; |
| | | this.stats.approvedCount = data.filter( |
| | | item => item.recordstate === "1" || item.recordstate === 1 |
| | | ).length; |
| | | this.stats.terminatedCount = data.filter( |
| | | item => item.recordstate === "99" || item.recordstate === 99 |
| | | ).length; |
| | | if (this.queryParams.hospitalNo) { |
| | | filteredData = filteredData.filter( |
| | | item => |
| | | item.hospitalNo && |
| | | item.hospitalNo.includes(this.queryParams.hospitalNo) |
| | | ); |
| | | } |
| | | |
| | | if ( |
| | | this.queryParams.reportTimeRange && |
| | | this.queryParams.reportTimeRange.length === 2 |
| | | ) { |
| | | const [startTime, endTime] = this.queryParams.reportTimeRange; |
| | | filteredData = filteredData.filter(item => { |
| | | if (!item.reporttime) return false; |
| | | const reportDate = this.parseTime(item.reporttime, "{y}-{m}-{d}"); |
| | | return reportDate >= startTime && reportDate <= endTime; |
| | | }); |
| | | } |
| | | |
| | | return filteredData; |
| | | }, |
| | | |
| | | /** è·åç¶ææ ç¾æ ·å¼ */ |
| | |
| | | /** æ¶é´æ ¼å¼å */ |
| | | parseTime(time, format) { |
| | | if (!time) return "-"; |
| | | |
| | | // å¤çæ¶é´æ³åæ¥æå符串 |
| | | const date = new Date(time); |
| | | if (isNaN(date.getTime())) return time; |
| | | |
| | |
| | | /** ç»æ¢æä½ */ |
| | | handleTerminate(row) { |
| | | this.currentRecord = { ...row }; |
| | | this.terminateVisible = true; |
| | | this.modalVisible = { ...this.modalVisible, terminate: true }; |
| | | }, |
| | | |
| | | /** æäº¤ç»æ¢ */ |
| | | async submitTerminate() { |
| | | try { |
| | | // è°ç¨ç»æ¢æ¥å£ |
| | | await terminateDonor({ |
| | | id: this.currentRecord.id, |
| | | caseNo: this.currentRecord.caseNo, |
| | | terminationReason: "管çåæå¨ç»æ¢" |
| | | }); |
| | | /** æ¢å¤æä½ */ |
| | | handleRestore(row) { |
| | | this.currentRecord = { ...row }; |
| | | this.modalVisible = { ...this.modalVisible, restore: true }; |
| | | }, |
| | | |
| | | this.$message.success("ç»æ¢æå"); |
| | | this.terminateVisible = false; |
| | | this.getList(); // éæ°å è½½æ´æ°æ°æ® |
| | | } catch (error) { |
| | | this.$message.error("ç»æ¢å¤±è´¥"); |
| | | console.error("ç»æ¢é误:", error); |
| | | } |
| | | /** å¤çå¼¹æ¡æ¾ç¤ºç¶æåå */ |
| | | handleModalVisibleChange(newVisible) { |
| | | this.modalVisible = { ...newVisible }; |
| | | }, |
| | | |
| | | /** å¤çæä½æå */ |
| | | handleOperationSuccess({ type, record }) { |
| | | console.log(`${type}æä½æå:`, record); |
| | | this.getList(); // éæ°å è½½æ°æ® |
| | | } |
| | | } |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog |
| | | :title="title" |
| | | :visible.sync="localVisible" |
| | | width="1200px" |
| | | :close-on-click-modal="false" |
| | | @close="handleClose" |
| | | > |
| | | <el-form |
| | | ref="formRef" |
| | | :model="formData" |
| | | :rules="rules" |
| | | label-width="130px" |
| | | label-position="right" |
| | | > |
| | | <!-- åºç¡ä¿¡æ¯é¨å --> |
| | | <el-card header="åºç¡ä¿¡æ¯" class="form-section"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="11"> |
| | | <el-form-item label="æ¡ä¾ç¼å·" prop="caseNo"> |
| | | <el-input |
| | | v-model="formData.caseNo" |
| | | :disabled="isEdit" |
| | | placeholder="ç³»ç»èªå¨çæ" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="11"> |
| | | <el-form-item label="æç®è
ç¼å·" prop="donorno"> |
| | | <el-input |
| | | v-model="formData.donorno" |
| | | placeholder="请è¾å
¥æç®è
ç¼å·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input v-model="formData.name" placeholder="å¿
填项" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æ§å«" prop="sex"> |
| | | <el-select v-model="formData.sex" placeholder="è¯·éæ©æ§å«"> |
| | | <el-option label="æªç¥" value="0" /> |
| | | <el-option label="ç·" value="1" /> |
| | | <el-option label="女" value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="è¯ä»¶ç±»å" prop="idcardtype"> |
| | | <el-select |
| | | v-model="formData.idcardtype" |
| | | placeholder="è¯·éæ©è¯ä»¶ç±»å" |
| | | > |
| | | <el-option label="身份è¯" value="1" /> |
| | | <el-option label="å人è¯" value="2" /> |
| | | <el-option label="æ¤ç
§" value="3" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="è¯ä»¶å·ç " prop="idcardno"> |
| | | <el-input |
| | | v-model="formData.idcardno" |
| | | placeholder="请è¾å
¥è¯ä»¶å·ç " |
| | | @blur="handleIdCardBlur" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <el-form-item label="åºçæ¥æ" prop="birthday"> |
| | | <el-date-picker |
| | | v-model="formData.birthday" |
| | | type="date" |
| | | placeholder="éæ©åºçæ¥æ" |
| | | value-format="yyyy-MM-dd" |
| | | style="width: 100%" |
| | | @change="calculateAge" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å¹´é¾" prop="andAge"> |
| | | <el-input v-model="formData.andAge" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æ°æ" prop="nation"> |
| | | <el-select v-model="formData.nation" placeholder="è¯·éæ©æ°æ"> |
| | | <el-option |
| | | v-for="dict in dictOptions.sys_nation" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å½ç±" prop="nationality"> |
| | | <el-input |
| | | v-model="formData.nationality" |
| | | placeholder="请è¾å
¥å½ç±" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <el-form-item label="èç³»çµè¯" prop="phone"> |
| | | <el-input v-model="formData.phone" placeholder="请è¾å
¥èç³»çµè¯" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å¦å" prop="education"> |
| | | <el-select v-model="formData.education" placeholder="è¯·éæ©å¦å"> |
| | | <el-option |
| | | v-for="dict in dictOptions.sys_education" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="èä¸" prop="occupation"> |
| | | <el-select v-model="formData.occupation" placeholder="è¯·éæ©èä¸"> |
| | | <el-option |
| | | v-for="dict in dictOptions.sys_occupation" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="ç±è´¯" prop="nativeplace"> |
| | | <el-input |
| | | v-model="formData.nativeplace" |
| | | placeholder="请è¾å
¥ç±è´¯" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-card> |
| | | |
| | | <!-- å»çä¿¡æ¯é¨å --> |
| | | <el-card header="å»çä¿¡æ¯" class="form-section"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="é¦è¯å»é¢" prop="treatmenthospitalno"> |
| | | <org-selecter |
| | | :org-type="'3'" |
| | | v-model="formData.treatmenthospitalno" |
| | | @change="handleHospitalChange" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç§å®¤" prop="treatmentdeptname"> |
| | | <el-input |
| | | v-model="formData.treatmentdeptname" |
| | | placeholder="请è¾å
¥ç§å®¤" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä½é¢å·" prop="inpatientno"> |
| | | <el-input |
| | | v-model="formData.inpatientno" |
| | | placeholder="请è¾å
¥ä½é¢å·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosisname"> |
| | | <el-input |
| | | v-model="formData.diagnosisname" |
| | | placeholder="请è¾å
¥ç¾ç
è¯æåç§°" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è¡å" prop="bloodtype"> |
| | | <el-radio-group v-model="formData.bloodtype"> |
| | | <el-radio label="1">Aå</el-radio> |
| | | <el-radio label="2">Bå</el-radio> |
| | | <el-radio label="3">Oå</el-radio> |
| | | <el-radio label="4">ABå</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="Rh(D)" prop="rhyin"> |
| | | <el-radio-group v-model="form.rhyin"> |
| | | <el-radio |
| | | v-for="dict in dict.type.sys_bloodtype_rhd || []" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | >{{ dict.label }}</el-radio |
| | | > |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å½åå»çæºæ" prop="currentMedicalInstitution"> |
| | | <el-input |
| | | v-model="formData.currentMedicalInstitution" |
| | | placeholder="请è¾å
¥å½åå»çæºæ" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å½åå»çæºæç§å®¤" prop="currentDept"> |
| | | <el-input |
| | | v-model="formData.currentDept" |
| | | placeholder="请è¾å
¥å½åå»çæºæç§å®¤" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="馿¬¡å»çæºæ" prop="firstMedicalInstitution"> |
| | | <el-input |
| | | v-model="formData.firstMedicalInstitution" |
| | | placeholder="请è¾å
¥é¦æ¬¡å»çæºæ" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="馿¬¡å»çæºæç§å®¤" prop="firstDept"> |
| | | <el-input |
| | | v-model="formData.firstDept" |
| | | placeholder="请è¾å
¥é¦æ¬¡å»çæºæç§å®¤" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="GSCè¯å" prop="gcsScore"> |
| | | <el-input |
| | | v-model="formData.gcsScore" |
| | | placeholder="请è¾å
¥GSCè¯å" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="åè°åç¼å·" prop="coordinatorNo"> |
| | | <el-input |
| | | v-model="formData.coordinatorNo" |
| | | placeholder="请è¾å
¥åè°åç¼å·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="åè°åå§å" prop="coordinatorName"> |
| | | <el-input |
| | | v-model="formData.coordinatorName" |
| | | placeholder="请è¾å
¥åè°åå§å" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="ç
æ
æ¦åµ" prop="illnessoverview"> |
| | | <el-input |
| | | v-model="formData.illnessoverview" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥ç
æ
æ¦åµ" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-card> |
| | | |
| | | <!-- å°åä¿¡æ¯é¨å --> |
| | | <el-card header="å°åä¿¡æ¯" class="form-section"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç°ä½å°å" prop="residenceaddress"> |
| | | <li-area-select |
| | | ref="residenceSelect" |
| | | v-model="residenceAddress" |
| | | @change="handleResidenceAddressChange" |
| | | /> |
| | | <el-input |
| | | v-model="formData.residenceaddress" |
| | | placeholder="请è¾å
¥è¯¦ç»å°å" |
| | | style="margin-top: 8px" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ·ç±å°å" prop="registeraddress"> |
| | | <li-area-select |
| | | ref="registerSelect" |
| | | v-model="registerAddress" |
| | | @change="handleRegisterAddressChange" |
| | | /> |
| | | <el-input |
| | | v-model="formData.registeraddress" |
| | | placeholder="请è¾å
¥è¯¦ç»å°å" |
| | | style="margin-top: 8px" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-card> |
| | | |
| | | <!-- æç®ä¿¡æ¯é¨å --> |
| | | <el-card header="æç®ä¿¡æ¯" class="form-section"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®ç±»å«" prop="donationcategory"> |
| | | <el-select |
| | | v-model="formData.donationcategory" |
| | | placeholder="è¯·éæ©æç®ç±»å«" |
| | | > |
| | | <el-option |
| | | v-for="dict in dictOptions.sys_DonationCategory" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¡ä¾æ¶é´" prop="donatetime"> |
| | | <el-date-picker |
| | | v-model="formData.donatetime" |
| | | type="datetime" |
| | | placeholder="éæ©æ¡ä¾æ¶é´" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è®°å½ç¶æ" prop="recordstate"> |
| | | <el-select v-model="formData.recordstate" :disabled="isEdit"> |
| | | <el-option label="æ°å»º" value="0" /> |
| | | <el-option label="已䏿¥" value="1" /> |
| | | <el-option label="å®¡æ ¸ä¸" value="2" /> |
| | | <el-option label="已宿" value="3" /> |
| | | <el-option label="å·²ç»æ¢" value="99" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è·åç»ç»ç¼å·" prop="acquisitiontissueno"> |
| | | <el-input |
| | | v-model="formData.acquisitiontissueno" |
| | | placeholder="请è¾å
¥è·åç»ç»ç¼å·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è·åç»ç»åç§°" prop="acquisitiontissuename"> |
| | | <el-input |
| | | v-model="formData.acquisitiontissuename" |
| | | placeholder="请è¾å
¥è·åç»ç»åç§°" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-card> |
| | | |
| | | <!-- æ¥åä¿¡æ¯é¨å --> |
| | | <el-card header="æ¥åä¿¡æ¯" class="form-section"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¥å人ç¼å·" prop="reporterno"> |
| | | <el-select |
| | | v-model="formData.reporterno" |
| | | @change="handleReporterChange" |
| | | > |
| | | <el-option |
| | | v-for="reporter in reporters" |
| | | :key="reporter.reportNo" |
| | | :label="reporter.reportName" |
| | | :value="reporter.reportNo" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¥å人å§å" prop="reportername"> |
| | | <el-input |
| | | v-model="formData.reportername" |
| | | placeholder="æ¥å人å§å" |
| | | :disabled="true" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¥å人çµè¯" prop="reporterphone"> |
| | | <el-input |
| | | v-model="formData.reporterphone" |
| | | placeholder="æ¥å人èç³»çµè¯" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¥åæ¶é´" prop="reporttime"> |
| | | <el-date-picker |
| | | v-model="formData.reporttime" |
| | | type="datetime" |
| | | placeholder="éæ©æ¥åæ¶é´" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¨é¨ID" prop="deptid"> |
| | | <el-input v-model="formData.deptid" placeholder="请è¾å
¥é¨é¨ID" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-card> |
| | | </el-form> |
| | | |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="handleClose">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleSubmit" :loading="submitLoading"> |
| | | {{ isEdit ? "æ´æ°" : "ä¿å" }} |
| | | </el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | getDonatebaseinfo, |
| | | updateDonatebaseinfo |
| | | } from "@/api/project/donatebaseinfo"; |
| | | import OrgSelecter from "@/views/project/components/orgselect"; |
| | | import LiAreaSelect from "@/components/Address"; |
| | | |
| | | export default { |
| | | name: "EditCaseModal", |
| | | components: { |
| | | OrgSelecter, |
| | | LiAreaSelect |
| | | }, |
| | | |
| | | dicts: ["sys_bloodtype_rhd", "sys_BloodType"], |
| | | |
| | | props: { |
| | | visible: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | editData: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | dictOptions: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | reporters: { |
| | | type: Array, |
| | | default: () => [] |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | localVisible: this.visible, |
| | | isEdit: false, |
| | | submitLoading: false, |
| | | residenceAddress: {}, |
| | | registerAddress: {}, |
| | | formData: this.getDefaultFormData(), |
| | | rules: { |
| | | name: [ |
| | | { required: true, message: "请è¾å
¥æç®è
å§å", trigger: "blur" } |
| | | ], |
| | | sex: [{ required: true, message: "è¯·éæ©æ§å«", trigger: "change" }], |
| | | idcardtype: [ |
| | | { required: true, message: "è¯·éæ©è¯ä»¶ç±»å", trigger: "change" } |
| | | ], |
| | | idcardno: [ |
| | | { required: true, message: "请è¾å
¥è¯ä»¶å·ç ", trigger: "blur" } |
| | | ], |
| | | birthday: [ |
| | | { required: true, message: "è¯·éæ©åºçæ¥æ", trigger: "change" } |
| | | ], |
| | | treatmenthospitalno: [ |
| | | { required: true, message: "è¯·éæ©é¦è¯å»é¢", trigger: "change" } |
| | | ], |
| | | diagnosisname: [ |
| | | { required: true, message: "请è¾å
¥ç¾ç
è¯æ", trigger: "blur" } |
| | | ], |
| | | bloodtype: [ |
| | | { required: true, message: "è¯·éæ©è¡å", trigger: "change" } |
| | | ], |
| | | donatetime: [ |
| | | { required: true, message: "è¯·éæ©æ¡ä¾æ¶é´", trigger: "change" } |
| | | ], |
| | | reporttime: [ |
| | | { required: true, message: "è¯·éæ©æ¥åæ¶é´", trigger: "change" } |
| | | ] |
| | | } |
| | | }; |
| | | }, |
| | | computed: { |
| | | title() { |
| | | return this.isEdit ? "ç¼è¾æ¡ä¾ä¿¡æ¯" : "æ°å¢æç®æ¡ä¾"; |
| | | } |
| | | }, |
| | | watch: { |
| | | visible(newVal) { |
| | | this.localVisible = newVal; |
| | | if (newVal) { |
| | | this.initForm(); |
| | | } |
| | | }, |
| | | localVisible(newVal) { |
| | | this.$emit("update:visible", newVal); |
| | | }, |
| | | editData: { |
| | | handler(newVal) { |
| | | if (newVal && newVal.id) { |
| | | this.isEdit = true; |
| | | this.$nextTick(() => { |
| | | // ç¡®ä¿ DOM å·²ç»æ´æ°ååè¿è¡è¡¨åæä½ |
| | | this.initForm(newVal); |
| | | }); |
| | | } |
| | | }, |
| | | deep: true, |
| | | immediate: true |
| | | } |
| | | }, |
| | | methods: { |
| | | getDefaultFormData() { |
| | | return { |
| | | // åºç¡ä¿¡æ¯ |
| | | caseNo: null, |
| | | donorno: null, |
| | | donateno: null, |
| | | name: null, |
| | | sex: null, |
| | | idcardtype: null, |
| | | idcardno: null, |
| | | birthday: null, |
| | | andAge: "", |
| | | age: null, |
| | | ageunit: "å¹´", |
| | | age2: null, |
| | | ageunit2: "æ", |
| | | nation: null, |
| | | nationality: "ä¸å½", |
| | | nativeplace: null, |
| | | phone: null, |
| | | education: null, |
| | | occupation: null, |
| | | |
| | | // å»çä¿¡æ¯ |
| | | treatmenthospitalno: null, |
| | | treatmenthospitalname: null, |
| | | treatmentdeptname: null, |
| | | inpatientno: null, |
| | | diagnosisname: null, |
| | | bloodtype: "0", |
| | | rhyin: "0", |
| | | currentMedicalInstitution: null, |
| | | currentDept: null, |
| | | firstMedicalInstitution: null, |
| | | firstDept: null, |
| | | gcsScore: null, |
| | | illnessoverview: null, |
| | | coordinatorNo: null, |
| | | coordinatorName: null, |
| | | |
| | | // å°åä¿¡æ¯ |
| | | residenceaddress: null, |
| | | residenceprovince: null, |
| | | residencecity: null, |
| | | registeraddress: null, |
| | | registerprovince: null, |
| | | registercity: null, |
| | | |
| | | // æç®ä¿¡æ¯ |
| | | donationcategory: null, |
| | | donatetime: null, |
| | | recordstate: "0", |
| | | acquisitiontissueno: "ZJOPO", |
| | | acquisitiontissuename: "æµæ±ç人ä½å¨å®è·åç»ç»", |
| | | |
| | | // æ¥åä¿¡æ¯ |
| | | reporterno: null, |
| | | reportername: null, |
| | | reporterphone: null, |
| | | reporttime: null, |
| | | deptid: null, |
| | | |
| | | // æ°ç»å段 |
| | | diseasetype: [], |
| | | infectious: [], |
| | | selfwill: [], |
| | | othercases: [], |
| | | infosources: [], |
| | | kinship: [], |
| | | patientstate: [] |
| | | }; |
| | | }, |
| | | |
| | | async initForm() { |
| | | console.log(this.isEdit); |
| | | |
| | | if (this.isEdit) { |
| | | await this.loadEditData(); |
| | | } else { |
| | | this.formData = this.getDefaultFormData(); |
| | | // 设置é»è®¤å¼ |
| | | this.formData.nationality = "ä¸å½"; |
| | | this.formData.bloodtype = "0"; |
| | | this.formData.rhyin = "0"; |
| | | this.formData.recordstate = "0"; |
| | | this.formData.acquisitiontissueno = "ZJOPO"; |
| | | this.formData.acquisitiontissuename = "æµæ±ç人ä½å¨å®è·åç»ç»"; |
| | | } |
| | | this.$nextTick(() => { |
| | | this.$refs.formRef?.clearValidate(); |
| | | }); |
| | | }, |
| | | |
| | | async loadEditData() { |
| | | try { |
| | | const response = await getDonatebaseinfo(this.editData.id); |
| | | const data = response.data; |
| | | |
| | | // å¤çæ°ç»å段 |
| | | const arrayFields = [ |
| | | "diseasetype", |
| | | "infectious", |
| | | "selfwill", |
| | | "othercases", |
| | | "infosources", |
| | | "kinship", |
| | | "patientstate" |
| | | ]; |
| | | arrayFields.forEach(field => { |
| | | if (data[field]) { |
| | | data[field] = data[field].split(","); |
| | | } else { |
| | | data[field] = []; |
| | | } |
| | | }); |
| | | |
| | | this.formData = { ...this.getDefaultFormData(), ...data }; |
| | | |
| | | // 设置å°åä¿¡æ¯ |
| | | if (data.residenceprovince) { |
| | | this.residenceAddress = { |
| | | sheng: data.residenceprovincename, |
| | | shi: data.residencecityname, |
| | | qu: data.residencetownname |
| | | }; |
| | | } |
| | | |
| | | if (data.registerprovince) { |
| | | this.registerAddress = { |
| | | sheng: data.registerprovincename, |
| | | shi: data.registercityname, |
| | | qu: data.registertownname |
| | | }; |
| | | } |
| | | |
| | | this.calculateAge(data.birthday); |
| | | } catch (error) { |
| | | this.$message.error("è·åæ¡ä¾æ°æ®å¤±è´¥"); |
| | | this.handleClose(); |
| | | } |
| | | }, |
| | | |
| | | handleIdCardBlur() { |
| | | // 身份è¯èªå¨å¡«å
é»è¾ |
| | | this.updateMessage(); |
| | | }, |
| | | |
| | | updateMessage() { |
| | | const idCardReg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/; |
| | | |
| | | if (idCardReg.test(this.formData.idcardno)) { |
| | | const orgBirthday = this.formData.idcardno.substring(6, 14); |
| | | const orgGender = this.formData.idcardno.substring(16, 17); |
| | | |
| | | const sex = orgGender % 2 == 1 ? "1" : "2"; |
| | | const birthday = `${orgBirthday.substring( |
| | | 0, |
| | | 4 |
| | | )}-${orgBirthday.substring(4, 6)}-${orgBirthday.substring(6, 8)}`; |
| | | |
| | | this.formData.sex = sex; |
| | | this.formData.birthday = birthday; |
| | | this.calculateAge(birthday); |
| | | } |
| | | }, |
| | | |
| | | calculateAge(birthday) { |
| | | if (!birthday) { |
| | | this.formData.age = this.formData.age2 = null; |
| | | this.formData.andAge = ""; |
| | | return; |
| | | } |
| | | |
| | | const birthDate = new Date(birthday); |
| | | const today = new Date(); |
| | | |
| | | let yearDiff = today.getFullYear() - birthDate.getFullYear(); |
| | | let monthDiff = today.getMonth() - birthDate.getMonth(); |
| | | let dayDiff = today.getDate() - birthDate.getDate(); |
| | | |
| | | if (dayDiff < 0) { |
| | | monthDiff--; |
| | | const lastDayOfMonth = new Date( |
| | | today.getFullYear(), |
| | | today.getMonth(), |
| | | 0 |
| | | ).getDate(); |
| | | dayDiff += lastDayOfMonth; |
| | | } |
| | | |
| | | if (monthDiff < 0) { |
| | | yearDiff--; |
| | | monthDiff += 12; |
| | | } |
| | | |
| | | this.formData.age = yearDiff; |
| | | this.formData.ageunit = "å²"; |
| | | this.formData.age2 = monthDiff; |
| | | this.formData.ageunit2 = "æ"; |
| | | |
| | | if (yearDiff === 0) { |
| | | if (monthDiff === 0) { |
| | | this.formData.age = dayDiff; |
| | | this.formData.ageunit = "天"; |
| | | this.formData.age2 = null; |
| | | } else { |
| | | this.formData.age = monthDiff; |
| | | this.formData.ageunit = "æ"; |
| | | this.formData.age2 = dayDiff; |
| | | this.formData.ageunit2 = "天"; |
| | | } |
| | | } |
| | | |
| | | this.formData.andAge = [ |
| | | this.formData.age && this.formData.age !== 0 |
| | | ? `${this.formData.age}${this.formData.ageunit}` |
| | | : "", |
| | | this.formData.age2 && this.formData.age2 !== 0 |
| | | ? `${this.formData.age2}${this.formData.ageunit2}` |
| | | : "" |
| | | ] |
| | | .filter(Boolean) |
| | | .join(" "); |
| | | }, |
| | | |
| | | handleHospitalChange(hospitalInfo) { |
| | | if (hospitalInfo && hospitalInfo.organizationname) { |
| | | this.formData.treatmenthospitalname = hospitalInfo.organizationname; |
| | | } |
| | | }, |
| | | |
| | | handleReporterChange(reporterNo) { |
| | | const reporter = this.reporters.find(r => r.reportNo === reporterNo); |
| | | if (reporter) { |
| | | this.formData.reportername = reporter.reportName; |
| | | } |
| | | }, |
| | | |
| | | handleResidenceAddressChange(address) { |
| | | this.formData.residenceprovince = address.sheng; |
| | | this.formData.residencecity = address.shi; |
| | | this.formData.residencetown = address.qu; |
| | | }, |
| | | |
| | | handleRegisterAddressChange(address) { |
| | | this.formData.registerprovince = address.sheng; |
| | | this.formData.registercity = address.shi; |
| | | this.formData.registertown = address.qu; |
| | | }, |
| | | |
| | | handleClose() { |
| | | this.localVisible = false; |
| | | this.isEdit = false; |
| | | this.submitLoading = false; |
| | | this.formData = this.getDefaultFormData(); |
| | | this.residenceAddress = {}; |
| | | this.registerAddress = {}; |
| | | this.$emit("closed"); |
| | | }, |
| | | |
| | | async handleSubmit() { |
| | | const valid = await this.$refs.formRef.validate().catch(() => false); |
| | | if (!valid) return; |
| | | |
| | | this.submitLoading = true; |
| | | try { |
| | | const submitData = this.processSubmitData(); |
| | | |
| | | const result = await updateDonatebaseinfo(submitData); |
| | | if (result.code === 200) { |
| | | this.$message.success(this.isEdit ? "æ´æ°æå" : "æ°å¢æå"); |
| | | this.$emit("success", result.data); |
| | | this.handleClose(); |
| | | } else { |
| | | this.$message.error(result.msg || "æä½å¤±è´¥"); |
| | | } |
| | | } catch (error) { |
| | | this.$message.error("æä½å¤±è´¥"); |
| | | } finally { |
| | | this.submitLoading = false; |
| | | } |
| | | }, |
| | | |
| | | processSubmitData() { |
| | | const data = { ...this.formData }; |
| | | |
| | | // å¤çæ°ç»å段为å符串 |
| | | const arrayFields = [ |
| | | "diseasetype", |
| | | "infectious", |
| | | "selfwill", |
| | | "othercases", |
| | | "infosources", |
| | | "kinship", |
| | | "patientstate" |
| | | ]; |
| | | arrayFields.forEach(field => { |
| | | if (Array.isArray(data[field])) { |
| | | data[field] = data[field].join(","); |
| | | } else if (!data[field]) { |
| | | data[field] = ""; |
| | | } |
| | | }); |
| | | |
| | | // å¤çæ¥æåæ®µ |
| | | if (data.birthday) { |
| | | data.birthday = this.$moment(data.birthday).format( |
| | | "YYYY-MM-DD HH:mm:ss" |
| | | ); |
| | | } |
| | | if (data.reporttime) { |
| | | data.reporttime = this.$moment(data.reporttime).format( |
| | | "YYYY-MM-DD HH:mm:ss" |
| | | ); |
| | | } |
| | | if (data.donatetime) { |
| | | data.donatetime = this.$moment(data.donatetime).format( |
| | | "YYYY-MM-DD HH:mm:ss" |
| | | ); |
| | | } |
| | | |
| | | // 设置é»è®¤å¼ |
| | | if (!data.recordstate) { |
| | | data.recordstate = "0"; |
| | | } |
| | | if (!data.workflow) { |
| | | data.workflow = 0; |
| | | } |
| | | |
| | | return data; |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .form-section { |
| | | margin-bottom: 20px; |
| | | } |
| | | .form-section:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- æç´¢è¡¨å --> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | |
| | | > |
| | | <el-row :gutter="8"> |
| | | <el-col :span="5"> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-form-item label="æ£è
å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥å§å" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item |
| | | align="left" |
| | | label="å»çæºæ" |
| | | prop="treatmenthospitalname" |
| | | > |
| | | <el-form-item label="é¦è¯å»é¢" prop="treatmenthospitalname"> |
| | | <org-selecter |
| | | ref="orgSelecter" |
| | | :org-type="'3'" |
| | | v-model="queryParams.treatmenthospitalno" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æç®å°å¸"> |
| | | <el-select v-model="queryParams.city" placeholder="è¯·éæ©å°å¸"> |
| | | <el-option |
| | | v-for="item in provinceData" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="9"> |
| | | <el-form-item label="æ¡ä¾æ¶é´"> |
| | | <el-form-item label="䏿¥æ¶é´"> |
| | | <el-date-picker |
| | | style="width: 100%" |
| | | v-model="selecttime" |
| | |
| | | end-placeholder="ç»ææä»½" |
| | | value-format="yyyy-MM-dd" |
| | | @change="getTimeList" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="8"> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æç®è¿åº¦" prop="workflow"> |
| | | <el-select |
| | | v-model="queryParams.workflow" |
| | | placeholder="è¯·éæ©å½åè¿åº¦" |
| | | clearable |
| | | size="small" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_donornode" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æ¥å人"> |
| | | <el-select |
| | | v-model="queryParams.reporterno" |
| | | placeholder="è¯·éæ©æ¥å人" |
| | | > |
| | | <el-option |
| | | v-for="item in reportlist" |
| | | :key="item.index" |
| | | :label="item.reportername" |
| | | :value="item.reporterno" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æ¯å¦ç»æ¢"> |
| | | <el-select |
| | | v-model="queryParams.terminationCase" |
| | | placeholder="è¯·éæ©ç¶æ" |
| | | > |
| | | <el-option |
| | | v-for="item in terminationCaselist" |
| | | :key="item.value" |
| | | :label="item.name" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="9"> |
| | | <el-form-item label="ç±è´¯"> |
| | | <div> |
| | | <li_area_select |
| | | ref="areaSelect" |
| | | v-model="searchAddress" |
| | | ></li_area_select> |
| | | </div> |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | icon="el-icon-search" |
| | | size="mini" |
| | | @click="handleQuery" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" size="mini" @click="resetQuery" |
| | | >éç½®</el-button |
| | | > |
| | | æç´¢ |
| | | </el-button> |
| | | <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"> |
| | | éç½® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | |
| | | <!-- æä½æé® --> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="el-icon-plus" |
| | | size="mini" |
| | | @click="handleAdd" |
| | | v-hasPermi="['project:donatebaseinfo:add']" |
| | | >æ°å¢</el-button |
| | | > |
| | | </el-col> |
| | | <!-- <el-col :span="1.5"> |
| | | <el-button |
| | | type="success" |
| | | plain |
| | | icon="el-icon-edit" |
| | | size="mini" |
| | | :disabled="single" |
| | | @click="handleUpdate" |
| | | v-hasPermi="['project:donatebaseinfo:edit']" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | </el-col> --> |
| | | |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | |
| | | :loading="exportLoading" |
| | | @click="handleExport" |
| | | v-hasPermi="['project:donatebaseinfo:export']" |
| | | >导åº</el-button |
| | | > |
| | | å¯¼åº |
| | | </el-button> |
| | | </el-col> |
| | | <right-toolbar |
| | | :showSearch.sync="showSearch" |
| | | @queryTable="getList" |
| | | ></right-toolbar> |
| | | <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" /> |
| | | </el-row> |
| | | |
| | | <!-- æ°æ®è¡¨æ ¼ --> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="donatebaseinfoList" |
| | |
| | | border |
| | | :default-sort="{ prop: 'donatetime', order: 'descending' }" |
| | | > |
| | | <!-- <el-table-column label="æ¥åæ¶é´" align="center" prop="id" /> --> |
| | | <!-- <el-table-column type="selection" width="55" align="center" /> --> |
| | | <el-table-column |
| | | label="æ¡ä¾æ¶é´" |
| | | align="center" |
| | |
| | | </el-table-column> |
| | | <el-table-column label="å¹´é¾" align="center" prop="age" width="100"> |
| | | <template slot-scope="scope"> |
| | | {{ |
| | | {{ |
| | | `${ |
| | | scope.row.age && scope.row.age !== 0 ? `${scope.row.age}${scope.row.ageunit?scope.row.ageunit:''}` : "" |
| | | scope.row.age && scope.row.age !== 0 |
| | | ? `${scope.row.age}${scope.row.ageunit || ""}` |
| | | : "" |
| | | } ${ |
| | | scope.row.age2 && scope.row.age2 !== 0 |
| | | ? `${scope.row.age2}${scope.row.ageunit2}` |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å»çæºæ" |
| | | label="é¦è¯å»é¢" |
| | | align="center" |
| | | prop="treatmenthospitalname" |
| | | /> |
| | | <el-table-column |
| | | label="GSCè¯å" |
| | | align="center" |
| | | prop="gcsScore" |
| | | /> |
| | | <el-table-column label="GSCè¯å" align="center" prop="gcsScore" /> |
| | | <el-table-column label="è¡å" align="center" prop="bloodtype" width="100"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æç®ç±»å«" |
| | | align="center" |
| | |
| | | prop="reportername" |
| | | width="100" |
| | | /> |
| | | <!-- |
| | | <el-table-column |
| | | label="ç°æå¨å°å¸" |
| | | align="center" |
| | | prop="registercityname" |
| | | width="150" |
| | | /> |
| | | <el-table-column |
| | | label="æç®è¿åº¦" |
| | | align="center" |
| | | prop="recordstate" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_DonationStatus" |
| | | :value="scope.row.recordstate" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | --> |
| | | <el-table-column |
| | | label="æç®è¿åº¦" |
| | | align="center" |
| | |
| | | :value="scope.row.workflow" |
| | | /> |
| | | </div> |
| | | <div v-else>ä»»å¡ç»æ¢</div> |
| | | <div v-else><el-button type="danger" plain>ä»»å¡ç»æ¢</el-button></div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | width="190" |
| | | align="center" |
| | | class-name="small-padding fixed-width" |
| | | fixed="right" |
| | |
| | | icon="el-icon-edit" |
| | | @click="handleUpdate(scope.row)" |
| | | v-hasPermi="['project:donatebaseinfo:edit']" |
| | | >详æ
</el-button |
| | | > |
| | | <el-button |
| | | v-if="scope.row.recordstate == 0" |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-delete" |
| | | @click="handleDelete(scope.row)" |
| | | v-hasPermi="['project:donatebaseinfo:remove']" |
| | | >å é¤</el-button |
| | | > |
| | | <!-- |
| | | <el-button v-if="scope.row.recordstate == 0 || scope.row.recordstate == 3" size="mini" type="text" |
| | | icon="el-icon-thumb" @click="handleapproval(scope.row)">æäº¤</el-button> |
| | | --> |
| | | 详æ
|
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-refrigerator" |
| | | @click="handledownload(scope.row)" |
| | | >ä¸è½½</el-button |
| | | icon="el-icon-edit" |
| | | @click="handleOpenEdit(scope.row)" |
| | | v-hasPermi="['project:donatebaseinfo:edit']" |
| | | >ç¼è¾</el-button |
| | | > |
| | | <!-- |
| | | <el-button size="mini" type="text" icon="el-icon-edit" @click="handletermination(scope.row)" |
| | | v-hasPermi="['project:donatebaseinfo:edit']">{{ scope.row.recordstate == 99 ? "æ¢å¤": "ç»æ¢" }}</el-button> |
| | | --> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | style="color: #f56c6c;" |
| | | @click="handleTerminate(scope.row)" |
| | | v-if=" |
| | | scope.row.terminationCase === 0 && scope.row.recordstate !== '99' |
| | | " |
| | | > |
| | | ç»æ¢ |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | style="color: #67c23a;" |
| | | @click="handleRestore(scope.row)" |
| | | v-if="scope.row.terminationCase === 1" |
| | | > |
| | | æ¢å¤ |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页 --> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | <!-- æ·»å æä¿®æ¹æç®åºç¡å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | :title="title" |
| | | align="center" |
| | | :visible.sync="open" |
| | | :close-on-click-modal="false" |
| | | width="1100px" |
| | | > |
| | | <el-form |
| | | ref="form" |
| | | :model="form" |
| | | :rules="rules" |
| | | label-width="130px" |
| | | label-position="right" |
| | | > |
| | | <div |
| | | style=" |
| | | border-bottom: 1px solid #ddd; |
| | | border-top: 1px solid #ddd; |
| | | padding-right: 60px; |
| | | " |
| | | > |
| | | <el-row style="margin-top: 40px"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¡ä¾ç¼å·" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item |
| | | align="left" |
| | | label="å»çæºæ" |
| | | prop="treatmenthospitalno" |
| | | > |
| | | <org-selecter |
| | | ref="addOrgSelect" |
| | | :org-type="'3'" |
| | | v-model="form.treatmenthospitalno" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç§å®¤" prop="treatmentdeptno"> |
| | | <el-input |
| | | v-model="form.treatmentdeptname" |
| | | placeholder="请è¾å
¥ç§å®¤" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item align="left" label="å§å" prop="name"> |
| | | <el-input v-model="form.name" placeholder="å¿
填项" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æ°æ" prop="nation"> |
| | | <el-select v-model="form.nation" placeholder="è¯·éæ©æ°æ"> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_nation" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="ç±è´¯" prop="nativeplace"> |
| | | <el-input v-model="form.nativeplace" placeholder="请è¾å
¥å½ç±" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å½ç±" prop="nationality"> |
| | | <el-input v-model="form.nationality" placeholder="请è¾å
¥å½ç±" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="è¯ä»¶ç±»å" prop="idcardtype"> |
| | | <el-select |
| | | v-model="form.idcardtype" |
| | | placeholder="è¯·éæ©è¯ä»¶ç±»å" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_IDType" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="parseInt(dict.value)" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="è¯ä»¶å·ç " prop="idcardno"> |
| | | <el-input |
| | | style="width: 174px" |
| | | ref="updateBSvalue" |
| | | class="sfzcode" |
| | | v-model="form.idcardno" |
| | | placeholder="请è¾å
¥è¯ä»¶å·ç " |
| | | @blur="updateMessage" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æ§å«" prop="sex"> |
| | | <el-select v-model="form.sex" placeholder="请è¾å
¥æ§å«"> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_user_sex" |
| | | :key="dict.label" |
| | | :label="dict.label" |
| | | :value="parseInt(dict.value)" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å¦å" prop="education"> |
| | | <el-select v-model="form.education" placeholder="è¯·éæ©å¦å"> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_education" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="åºçæ¥æ" prop="birthday"> |
| | | <el-date-picker |
| | | clearable |
| | | size="small" |
| | | v-model="form.birthday" |
| | | type="date" |
| | | style="width: 174px" |
| | | @change="calculateAge" |
| | | value-format="yyyy-MM-dd" |
| | | placeholder="éæ©åºçæ¥æ" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <!-- <el-form-item label="å¹´é¾" prop="age"> |
| | | <el-input v-model="form.age" placeholder="请è¾å
¥å¹´é¾" /> |
| | | </el-form-item> --> |
| | | <el-form-item label="å¹´é¾" prop="age"> |
| | | <el-input v-model="form.andAge" disabled> </el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="èä¸" prop="occupation"> |
| | | <el-select v-model="form.occupation" placeholder="è¯·éæ©èä¸"> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_occupation" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item |
| | | label="æå¨å»çæºæ" |
| | | prop="currentMedicalInstitution" |
| | | > |
| | | <el-input |
| | | v-model="form.currentMedicalInstitution" |
| | | placeholder="请è¾å
¥" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item |
| | | label-width="150px" |
| | | label="æå¨å»çæºæç§å®¤" |
| | | prop="currentDept" |
| | | > |
| | | <el-input v-model="form.currentDept" placeholder="请è¾å
¥" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="馿¬¡å»çæºæ" prop="firstMedicalInstitution"> |
| | | <el-input |
| | | v-model="form.firstMedicalInstitution" |
| | | placeholder="请è¾å
¥" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item |
| | | label-width="150px" |
| | | label="馿¬¡å»çæºæç§å®¤" |
| | | prop="firstDept" |
| | | > |
| | | <el-input v-model="form.firstDept" placeholder="请è¾å
¥" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä½å" prop="residenceaddress"> |
| | | <div> |
| | | <li_area_select |
| | | ref="residenceSelect" |
| | | v-model="residenceAddresss" |
| | | ></li_area_select> |
| | | <!-- <div>{{defultAddress}}</div> --> |
| | | </div> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="11" :push="1"> |
| | | <el-input |
| | | v-model="form.residenceaddress" |
| | | placeholder="请è¾å
¥å
容" |
| | | /> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç°æå¨å°" prop="registeraddress"> |
| | | <div> |
| | | <li_area_select |
| | | ref="registerSelect" |
| | | v-model="registerAddresss" |
| | | ></li_area_select> |
| | | <!-- <div>{{defultAddress}}</div> --> |
| | | </div> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="11" :push="1"> |
| | | <el-input |
| | | v-model="form.registeraddress" |
| | | placeholder="请è¾å
¥å
容" |
| | | /> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | | <div |
| | | style=" |
| | | border-bottom: 1px solid #ddd; |
| | | margin-top: 20px; |
| | | padding-right: 60px; |
| | | " |
| | | > |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¡ä¾ç¼å·" prop="inpatientno"> |
| | | <el-input v-model="form.inpatientno" placeholder="æ¡ä¾ç¼å·" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="16"> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosisname"> |
| | | <el-input |
| | | v-model="form.diagnosisname" |
| | | placeholder="请è¾å
¥ç¾ç
è¯æåç§°" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item align="left" label="è¡å" prop="bloodtype"> |
| | | <el-radio-group v-model="form.bloodtype"> |
| | | <el-radio |
| | | v-for="dict in dict.type.sys_BloodType" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | >{{ dict.label }}</el-radio |
| | | > |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12" :pull="1"> |
| | | <el-form-item label="Rh(D)" align="left" prop="rhyin"> |
| | | <el-radio-group v-model="form.rhyin"> |
| | | <el-radio |
| | | v-for="dict in dict.type.sys_bloodtype_rhd" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | >{{ dict.label }}</el-radio |
| | | > |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-form-item label="ç¾ç
ç±»å" align="left"> |
| | | <el-checkbox-group v-model="form.diseasetype"> |
| | | <el-checkbox |
| | | v-for="dict in dict.type.sys_DiseaseType" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | > |
| | | {{ dict.label }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | <el-form-item label="å
¶ä»" prop="diseasetypeOther"> |
| | | <el-input |
| | | v-model="form.diseasetypeOther" |
| | | placeholder="请è¾å
¥å
¶ä»" |
| | | /> |
| | | </el-form-item> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item align="left" label="ä¼ æç
"> |
| | | <el-checkbox-group v-model="form.infectious"> |
| | | <el-checkbox |
| | | v-for="dict in dict.type.sys_Infectious" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | > |
| | | {{ dict.label }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item align="left" label="å
¶ä»" prop="infectiousOther"> |
| | | <el-input |
| | | v-model="form.infectiousOther" |
| | | placeholder="请è¾å
¥å
¶ä»" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="9"> |
| | | <el-form-item align="left" label="ç
人ç¶åµ"> |
| | | <el-checkbox-group v-model="form.patientstate"> |
| | | <el-checkbox |
| | | v-for="dict in dict.type.sys_patientstate" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | > |
| | | {{ dict.label }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="15" align="left"> |
| | | <el-form-item label="å
¶ä»æ
åµ"> |
| | | <el-checkbox-group v-model="form.othercases"> |
| | | <el-checkbox |
| | | v-for="dict in dict.type.sys_OtherCases" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | > |
| | | {{ dict.label }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | | <div |
| | | style=" |
| | | border-bottom: 1px solid #ddd; |
| | | padding-right: 60px; |
| | | margin-top: 20px; |
| | | " |
| | | > |
| | | <el-row> |
| | | <div display="flex"> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item |
| | | label="亲å±ç¶åµ" |
| | | prop="kinship" |
| | | class="relation" |
| | | align="left" |
| | | > |
| | | <el-checkbox-group v-model="form.kinship"> |
| | | <el-checkbox |
| | | v-for="dict in dict.type.sys_Kinship" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | > |
| | | {{ dict.label }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å
¶ä»" prop="kinshipOther"> |
| | | <el-input |
| | | v-model="form.kinshipOther" |
| | | placeholder="请è¾å
¥å
¶ä»" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item align="left" label="æ¬äººææ¿ "> |
| | | <el-checkbox-group v-model="form.selfwill"> |
| | | <el-checkbox |
| | | v-for="dict in dict.type.sys_SelfWill" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | > |
| | | {{ dict.label }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="主è¦äº²å±" prop="majorrelatives"> |
| | | <el-input |
| | | v-model="form.majorrelatives" |
| | | placeholder="请è¾å
¥ä¸»è¦äº²å±" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä¸æèµ è
å
³ç³»" prop="familyrelations"> |
| | | <el-select |
| | | v-model="form.familyrelations" |
| | | placeholder="è¯·éæ©ä¸æèµ è
å
³ç³»" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_FamilyRelation" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item align="left" label="ä¿¡æ¯æ¥æº"> |
| | | <el-checkbox-group v-model="form.infosources"> |
| | | <el-checkbox |
| | | v-for="dict in dict.type.sys_InfoSources" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | > |
| | | {{ dict.label }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å
¶ä»" prop="infosourcesOther"> |
| | | <el-input |
| | | v-model="form.infosourcesOther" |
| | | placeholder="请è¾å
¥ä¿¡æ¯æ¥æºå
¶ä»" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä¿¡æ¯å" prop="infoname"> |
| | | <el-input v-model="form.infoname" placeholder="请è¾å
¥ä¿¡æ¯å" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="èç³»çµè¯" prop="infophone"> |
| | | <el-input |
| | | v-model="form.infophone" |
| | | placeholder="请è¾å
¥ä¿¡æ¯åèç³»çµè¯" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item align="left" label="红ååä¼" prop="redorganno"> |
| | | <org-selecter |
| | | ref="addCrossOrgSelect" |
| | | :org-type="'2'" |
| | | v-model="form.redorganno" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è系人" prop="contactperson"> |
| | | <el-input |
| | | v-model="form.contactperson" |
| | | placeholder="请è¾å
¥è系人" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="èç³»æ¶é´" prop="contacttime"> |
| | | <el-date-picker |
| | | clearable |
| | | size="small" |
| | | style="width: 190px" |
| | | v-model="form.contacttime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ¥åæ¶é´" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item |
| | | align="left" |
| | | label="è·åç»ç»" |
| | | prop="acquisitiontissuename" |
| | | > |
| | | <org-selecter |
| | | style="width: 260px" |
| | | ref="orgSelecter" |
| | | :org-type="'1'" |
| | | v-model="form.acquisitiontissueno" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¥å人" prop="reporterno"> |
| | | <el-select |
| | | ref="getReportname" |
| | | v-model="form.reporterno" |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in reporters" |
| | | :key="item.reportNo" |
| | | :label="item.reportName" |
| | | :value="item.reportNo" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="èç³»çµè¯" prop="reporterphone"> |
| | | <el-input |
| | | v-model="form.reporterphone" |
| | | placeholder="请è¾å
¥èç³»çµè¯" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¥åæ¶é´" align="left" prop="reporttime"> |
| | | <el-date-picker |
| | | clearable |
| | | size="small" |
| | | style="width: 190px" |
| | | v-model="form.reporttime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ¥åæ¶é´" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | <!-- <div style="padding-right: 60px; margin-top: 20px"> |
| | | <el-row> |
| | | <el-form-item label="éä»¶" align="left" prop="annexfile"> |
| | | <annex-upload ref="annex" :infoid="form.id" :caseNo="form.caseNo" :flowname="flowname" |
| | | :annexno="annexno" /> |
| | | </el-form-item> |
| | | </el-row> |
| | | </div> --> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button v-show="showSaveBtn" type="primary" @click="submitForm" |
| | | >ä¿åå¹¶å徿¡ä¾å·¥ä½å°</el-button |
| | | > |
| | | <el-button |
| | | v-show="showTerminationBtn" |
| | | type="primary" |
| | | @click="submitForm" |
| | | >ç»æ¢æ¡ä¾</el-button |
| | | > |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | <!-- <el-button @click="handleapproval">æäº¤å®¡æ ¸</el-button> --> |
| | | </div> |
| | | </el-dialog> |
| | | <!-- æ¡ä¾ç¼è¾å¼¹çª --> |
| | | <edit-case-modal |
| | | :visible="editModalVisible" |
| | | :editData="currentEditData" |
| | | :dict-options="dict.type" |
| | | @update:visible="editModalVisible = $event" |
| | | @success="handleEditSuccess" |
| | | @closed="handleEditClosed" |
| | | /> |
| | | <!-- ç»æ¢/æ¢å¤å¼¹æ¡ --> |
| | | <terminate-restore-modal |
| | | :current-record="currentRecord" |
| | | :visible="modalVisible" |
| | | :titles="modalTitles" |
| | | @update:visible="handleModalVisibleChange" |
| | | @operation-success="handleOperationSuccess" |
| | | /> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import { getUserProfile } from "@/api/system/user"; |
| | | import TerminateRestoreModal from "@/components/TerminateRestoreModal"; |
| | | import EditCaseModal from "./EditCaseModal"; |
| | | import { |
| | | listDonatebaseinfo, |
| | | getDonatebaseinfo, |
| | | delDonatebaseinfo, |
| | | addDonatebaseinfo, |
| | | updateDonatebaseinfo, |
| | | exportDonatebaseinfo, |
| | | downloadbaseinfo, |
| | | getDonationNumber, |
| | | getdonatorno |
| | | exportDonatebaseinfo |
| | | } from "@/api/project/donatebaseinfo"; |
| | | import Li_area_select from "@/components/Address"; |
| | | import OrgSelecter from "@/views/project/components/orgselect"; |
| | | import AnnexUpload from "@/views/project/components/annexupload"; |
| | | import ReportName from "@/views/project/components/organizationUser"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { |
| | | listOrganization, |
| | | getOrganization, |
| | | listReportname, |
| | | listUser |
| | | } from "@/api/project/organization"; |
| | | import { listReportname, listUser } from "@/api/project/organization"; |
| | | |
| | | export default { |
| | | name: "Donatebaseinfo", |
| | | components: { |
| | | Li_area_select, |
| | | OrgSelecter, |
| | | AnnexUpload, |
| | | ReportName |
| | | TerminateRestoreModal, |
| | | EditCaseModal |
| | | }, |
| | | name: "Donatebaseinfo", |
| | | dicts: [ |
| | | "sys_Reporter", |
| | | "sys_redcrossagency", |
| | | "sys_nation", |
| | | "sys_occupation", |
| | | "sys_education", |
| | | "sys_OrganizationType", |
| | | "sys_HospitalNature", |
| | | "sys_RegionalLevel", |
| | | "country", |
| | | "sys_user_sex", |
| | | "sys_IDType", |
| | | "sys_AgeUnit", |
| | | "sys_BloodType", |
| | | "sys_0_1", |
| | | "sys_patientstate", |
| | | "sys_DonationCategory", |
| | | "sys_Kinship", |
| | | "sys_Infectious", |
| | | "sys_bloodtype_rhd", |
| | | "sys_InfoSources", |
| | | "sys_OtherCases", |
| | | "sys_DonationStatus", |
| | | "sys_DiseaseType", |
| | | "sys_SelfWill", |
| | | "sys_FamilyRelation", |
| | | "sys_donornode" |
| | | ], |
| | | data() { |
| | | return { |
| | | tempRecordState: null, |
| | | approvalState: false, |
| | | countyname: "", |
| | | cuuntry: "", |
| | | organizationname: "", |
| | | selecttime: "", |
| | | |
| | | //çå¸åº |
| | | //é»è®¤å¼è®¾ç½®ï¼å¯ä¸ºç©º |
| | | searchAddress: { |
| | | sheng: "", |
| | | shi: "", |
| | | qu: "", |
| | | organizationname: null |
| | | residenceAddresss: { sheng: "å±±ä¸ç", shi: "", qu: "" }, |
| | | registerAddresss: { sheng: "å±±ä¸ç", shi: "", qu: "" }, |
| | | modalTitles: { |
| | | terminate: "ç»æ¢æç®è¿ç¨", |
| | | restore: "æ¢å¤æç®è¿ç¨" |
| | | }, |
| | | residenceAddresss: { |
| | | sheng: "æµæ±ç", |
| | | shi: "", |
| | | qu: "" |
| | | }, |
| | | registerAddresss: { |
| | | sheng: "æµæ±ç", |
| | | shi: "", |
| | | qu: "" |
| | | }, |
| | | terminationCaselist: [ |
| | | { name: "ç»æ¢ç¶æ", value: 1 }, |
| | | { name: "æ£å¸¸ç¶æ", value: 0 } |
| | | ], |
| | | // é®ç½©å± |
| | | loading: true, |
| | | // 导åºé®ç½©å± |
| | | exportLoading: false, |
| | | // é䏿°ç» |
| | | editModalVisible: false, |
| | | currentEditData: {}, |
| | | ids: [], |
| | | // éå个ç¦ç¨ |
| | | single: true, |
| | | // éå¤ä¸ªç¦ç¨ |
| | | multiple: true, |
| | | // æ¾ç¤ºæç´¢æ¡ä»¶ |
| | | showSearch: true, |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | // æç®åºç¡è¡¨æ ¼æ°æ® |
| | | donatebaseinfoList: [], |
| | | // å¼¹åºå±æ é¢ |
| | | title: "", |
| | | // æ¯å¦æ¾ç¤ºå¼¹åºå± |
| | | open: false, |
| | | // è·åç»ç»åç§°æ¶é´èå´ |
| | | daterangeReporttime: [], |
| | | //ç¨æ·ä¿¡æ¯ |
| | | currentuser: {}, |
| | | |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | caseNo: null, |
| | | recordstate: null, |
| | | // treatmenthospitalno: null, |
| | | treatmenthospitalname: null, |
| | | name: null, |
| | | residenceprovince: null, |
| | | residencecity: null, |
| | | residencetown: null, |
| | | treatmenthospitalno: null, |
| | | starttime: null, |
| | | endtime: null, |
| | | city: null, |
| | | reportno: null |
| | | // organizationname: null, |
| | | // organizationtype: null, |
| | | // idcardno: null, |
| | | // reporterno: null, |
| | | // reporttime: null, |
| | | endtime: null |
| | | }, |
| | | // 表ååæ° |
| | | form: { |
| | | id: null, |
| | | name: null, |
| | | sex: null, |
| | | idcardtype: null, |
| | | idcardno: null, |
| | | age: null, // å¹´é¾ï¼å¹´ï¼ |
| | | age: null, |
| | | andAge: "", |
| | | ageunit: "å¹´", // åä½ï¼é常åºå®ä¸ºâå¹´â |
| | | age2: null, // å¹´é¾ï¼ææå¤©ï¼ |
| | | ageunit2: "æ", // åä½ï¼æ ¹æ®è®¡ç®å³å®æ¯âæâè¿æ¯â天â |
| | | ageunit: null, |
| | | ageunit: "å¹´", |
| | | age2: null, |
| | | ageunit2: "æ", |
| | | birthday: null, |
| | | phone: null, |
| | | residenceaddress: null, |
| | | nationality: "ä¸å½", |
| | | nativeplace: null, |
| | | residenceprovince: null, |
| | | nation: null, |
| | | residenceprovincename: null, |
| | | occupation: null, |
| | | residencecity: null, |
| | | education: null, |
| | | residencecityname: null, |
| | | residencetown: null, |
| | | residencetownname: null, |
| | | residencecommunity: null, |
| | | residencecommunityname: null, |
| | | residencecountycode: null, |
| | | residencecountyname: null, |
| | | registeraddress: null, |
| | | registerprovince: null, |
| | | registerprovincename: null, |
| | | registercity: null, |
| | | registercityname: null, |
| | | registertown: null, |
| | | registertownname: null, |
| | | registercommunity: null, |
| | | registercommunityname: null, |
| | | registercountycode: null, |
| | | registercountyname: null, |
| | | recordstate: null, |
| | | treatmenthospitalno: null, |
| | | treatmenthospitalname: null, |
| | | treatmentdeptname: null, |
| | | diagnosisno: null, |
| | | diagnosisname: null, |
| | | bloodtype: "0", |
| | | inpatientno: null, |
| | | rhyin: "0", |
| | | caseNo: null, |
| | | donationcategory: null, |
| | | illnessoverview: null, |
| | | diseasetype: [], |
| | | infectious: [], |
| | | selfwill: [], |
| | | diseasetypeOther: null, |
| | | othercases: [], |
| | | kinshipwill: 0, |
| | | infosources: [], |
| | | kinship: [], |
| | | redorganno: null, |
| | | redorganname: null, |
| | | contactperson: null, |
| | | infectiousOther: null, |
| | | contactnumber: null, |
| | | contacttime: null, |
| | | reporterno: null, |
| | | reportername: null, |
| | | patientstate: [], |
| | | reporterphone: null, |
| | | infosourcesOther: null, |
| | | reporttime: null, |
| | | delFlag: null, |
| | | createBy: null, |
| | | createTime: null, |
| | | updateBy: null, |
| | | updateTime: null, |
| | | kinshipOther: null, |
| | | majorrelatives: null, |
| | | familyrelations: null, |
| | | acquisitiontissueno: "ZJOPO", |
| | | acquisitiontissuename: "æµæ±ç人ä½å¨å®è·åç»ç»" |
| | | acquisitiontissuename: "éå²äººä½å¨å®è·åç»ç»" |
| | | }, |
| | | //ads |
| | | reporters: [], |
| | | users: [], |
| | | |
| | | // è¡¨åæ ¡éª |
| | | rules: { |
| | | rules: { |
| | | name: [ |
| | | { required: true, message: "请è¾å
¥æç®è
å§å", trigger: "blur" } |
| | | ], |
| | | nationality: [ |
| | | { required: true, message: "请è¾å
¥å½ç±", trigger: "blur" } |
| | | ], |
| | | currentMedicalInstitution: [ |
| | | { required: true, message: "请è¾å
¥æå¨å»çæºæ", trigger: "blur" } |
| | | ], |
| | | currentDept: [ |
| | | { required: true, message: "æå¨å»çæºæç§å®¤", trigger: "blur" } |
| | | ], |
| | | firstMedicalInstitution: [ |
| | | { required: true, message: "请è¾å
¥é¦æ¬¡å»çæºæ", trigger: "blur" } |
| | | ], |
| | | firstDept: [ |
| | | { required: true, message: "请è¾å
¥é¦æ¬¡å»çæºæç§å®¤", trigger: "blur" } |
| | | ], |
| | | birthday: [ |
| | | { required: true, message: "è¯·éæ©åºçæ¥æ", trigger: "blur" } |
| | | ], |
| | | idcardtype: [ |
| | | { required: true, message: "è¯·éæ©è¯ä»¶ç±»å", trigger: "blur" } |
| | | ], |
| | | residenceaddress: [ |
| | | { required: true, message: "请è¾å
¥ä½å", trigger: "blur" } |
| | | ], |
| | | registerAddresss: [ |
| | | { required: true, message: "请è¾å
¥ç°å±
ä½å°å", trigger: "blur" } |
| | | ], |
| | | diseasetype: [ |
| | | { required: true, message: "è¯·éæ©ç¾ç
ç±»å", trigger: "blur" } |
| | | ], |
| | | infectious: [ |
| | | { required: true, message: "è¯·éæ©ä¼ æç
ç±»å", trigger: "blur" } |
| | | ], |
| | | patientstate: [ |
| | | { required: true, message: "è¯·éæ©ç
人ç¶åµ", trigger: "blur" } |
| | | ], |
| | | kinship: [ |
| | | { required: true, message: "è¯·éæ©äº²å±æ
åµ", trigger: "blur" } |
| | | ], |
| | | majorrelatives: [ |
| | | { required: true, message: "请è¾å
¥ä¸»è¦äº²å±", trigger: "blur" } |
| | | ], |
| | | selfwill: [ |
| | | { required: true, message: "è¯·éæ©æ¬äººææ¿", trigger: "blur" } |
| | | ], |
| | | registerAddresss: [ |
| | | { required: true, message: "请è¾å
¥ç°æå¨å°", trigger: "blur" } |
| | | ], |
| | | familyrelations: [ |
| | | { required: true, message: "è¯·éæ©äº²å±ä¸æç®è
å
³ç³»", trigger: "blur" } |
| | | ], |
| | | infosources: [ |
| | | { required: true, message: "è¯·éæ©ä¿¡æ¯æ¥æº", trigger: "blur" } |
| | | ], |
| | | idcardno: [ |
| | | { required: true, message: "请æ£ç¡®è¾å
¥è¯ä»¶å·ç ", trigger: "blur" } |
| | | ], |
| | | sex: [{ required: true, message: "æ§å«ä¸è½ä¸ºç©º", trigger: "blur" }], |
| | | age: [{ required: true, message: "请è¾å
¥å¹´é¾", trigger: "blur" }], |
| | | treatmenthospitalno: [ |
| | | { required: true, message: "è¯·éæ©å»çæºæ", trigger: "blur" } |
| | | { required: true, message: "è¯·éæ©é¦è¯å»é¢", trigger: "blur" } |
| | | ], |
| | | bloodtype: [ |
| | | { required: true, message: "è¯·éæ©ABOè¡å", trigger: "blur" } |
| | | ], |
| | | rhyin: [{ required: true, message: "è¯·éæ©RHDè¡å", trigger: "blur" }], |
| | | diseasetype: [ |
| | | { required: true, message: "è¯·éæ©RHDè¡å", trigger: "blur" } |
| | | ], |
| | | |
| | | inpatientno: [ |
| | | { required: true, message: "è¾å
¥æ¡ä¾ç¼å·", trigger: "blur" } |
| | | ], |
| | | diagnosisname: [ |
| | | { required: true, message: "ç¾ç
è¯æä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ], |
| | | infoname: [ |
| | | { required: true, message: "请è¾å
¥ä¿¡æ¯åå§å", trigger: "blur" } |
| | | ], |
| | | infophone: [ |
| | | { required: true, message: "请è¾å
¥ä¿¡æ¯åèç³»çµè¯", trigger: "blur" } |
| | | ], |
| | | acquisitiontissueno: [ |
| | | { required: true, message: "å¨å®è·åç»ç»ä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ], |
| | | reporterno: [ |
| | | { required: true, message: "è¯·éæ©æ¥å人", trigger: "blur" } |
| | | ], |
| | | reporttime: [ |
| | | { required: true, message: "请è¾å
¥æ¥åæ¶é´", trigger: "blur" } |
| | | ], |
| | | reporterphone: [ |
| | | { required: true, message: "请è¾å
¥æ¥å人èç³»çµè¯", trigger: "blur" } |
| | | ] |
| | | }, |
| | | //æ¯å¦æ¾ç¤ºä¿åæé® |
| | | showSaveBtn: true, |
| | | showTerminationBtn: false, |
| | | //æµç¨åç§° |
| | | flowname: "æ½å¨æç®ç»è®°", |
| | | annexno: "PotentialDonationRegistration", |
| | | starttime: "", |
| | | endtime: "", |
| | | reportlist: [], |
| | | reportervalue: "", |
| | | headers: { |
| | | Authorization: "Bearer " + getToken() |
| | | }, |
| | | provinceData: [ |
| | | { label: "å
¨é¨", value: "" }, |
| | | { label: "æå·å¸", value: "1" }, |
| | | { label: "宿³¢å¸", value: "2" }, |
| | | { label: "温å·å¸", value: "3" }, |
| | | { label: "åå
´å¸", value: "4" }, |
| | | { label: "æ¹å·å¸", value: "5" }, |
| | | { label: "ç»å
´å¸", value: "6" }, |
| | | { label: "éåå¸", value: "7" }, |
| | | { label: "è¡¢å·å¸", value: "8" }, |
| | | { label: "èå±±å¸", value: "9" }, |
| | | { label: "å°å·å¸", value: "A" }, |
| | | { label: "丽水å¸", value: "B" } |
| | | ] |
| | | currentRecord: {}, |
| | | modalVisible: {} |
| | | }; |
| | | }, |
| | | created() { |
| | | if (sessionStorage.getItem("donatebaseinfo")) { |
| | | this.queryParams = JSON.parse(sessionStorage.getItem("donatebaseinfo")); |
| | | console.log(this.queryParams, "queryParams"); |
| | | const savedParams = sessionStorage.getItem("donatebaseinfo"); |
| | | if (savedParams) { |
| | | this.queryParams = { ...this.queryParams, ...JSON.parse(savedParams) }; |
| | | } |
| | | }, |
| | | async mounted() { |
| | | await Promise.all([ |
| | | this.getCurrentUser(), |
| | | this.getuserlist(), |
| | | this.selectReporters() |
| | | ]); |
| | | |
| | | mounted(e) { |
| | | // let idd = this.$route.query.userid |
| | | // console.log('chuanzhi',idd); |
| | | |
| | | this.getCurrentUser(); |
| | | this.getuserlist(); |
| | | this.selectReporters(); |
| | | |
| | | this.LoadReportList(); |
| | | |
| | | if (this.$route.params.starttime != null && this.$route.params.endtime) { |
| | | this.selecttime = [ |
| | | this.$moment(this.$route.params.starttime).format("YYYY-MM-DD"), |
| | | this.$moment(this.$route.params.endtime).format("YYYY-MM-DD") |
| | | ]; |
| | | } |
| | | if (this.$route.params.reporterno != "") { |
| | | this.reporterno = this.$route.params.reporterno; |
| | | } |
| | | this.queryParams.terminationcase = this.$route.params.terminationcase; |
| | | |
| | | if ( |
| | | this.$route.params.tempRecordState != "" && |
| | | this.$route.params.tempRecordState != undefined |
| | | ) { |
| | | this.queryParams.recordstate = "" + this.$route.params.tempRecordState; |
| | | } |
| | | if (this.$route.params.reporterno != "") { |
| | | this.reportervalue = this.$route.params.reporterno; |
| | | } |
| | | if (!this.$route.params.shen != "") { |
| | | this.searchAddress.sheng = this.$route.params.shen; |
| | | if (!this.$route.params.shi != "") { |
| | | this.searchAddress.shi = this.$route.params.shi; |
| | | } |
| | | if (!this.$route.params.qu) { |
| | | this.searchAddress.qu = this.$route.params.qu; |
| | | } |
| | | } |
| | | |
| | | if (this.$route.params.city != "") { |
| | | this.queryParams.city = this.$route.params.city; |
| | | } else { |
| | | this.queryParams.city = ""; |
| | | } |
| | | |
| | | this.initializeRouteParams(); |
| | | this.getTimeList(); |
| | | |
| | | this.getList(); |
| | | }, |
| | | |
| | | methods: { |
| | | getCurrentUser() { |
| | | getUserProfile().then(response => { |
| | | this.currentuser = response.data; |
| | | }); |
| | | async getCurrentUser() { |
| | | const response = await getUserProfile(); |
| | | this.currentuser = response.data; |
| | | }, |
| | | |
| | | calculateAge(birthday) { |
| | | if (!birthday) { |
| | | // æ¸
空年é¾å段 |
| | | this.form.age = null; |
| | | this.form.age2 = null; |
| | | // this.form.age3 = null; |
| | | this.form.age = this.form.age2 = null; |
| | | return; |
| | | } |
| | | |
| | | const birthDate = new Date(birthday); |
| | | const today = new Date(); |
| | | |
| | | // è®¡ç®æ»æä»½å·®å¼ |
| | | let yearDiff = today.getFullYear() - birthDate.getFullYear(); |
| | | let monthDiff = today.getMonth() - birthDate.getMonth(); |
| | | let dayDiff = today.getDate() - birthDate.getDate(); |
| | | |
| | | // 妿å½åæ¥æç天æ°å°äºåºçæ¥æç天æ°ï¼ååæ |
| | | if (dayDiff < 0) { |
| | | monthDiff--; |
| | | // è·åä¸ä¸ªæçæåä¸å¤© |
| | | const lastDayOfMonth = new Date( |
| | | today.getFullYear(), |
| | | today.getMonth(), |
| | |
| | | dayDiff += lastDayOfMonth; |
| | | } |
| | | |
| | | // 妿æä»½å·®ä¸ºè´ï¼ååå¹´ |
| | | if (monthDiff < 0) { |
| | | yearDiff--; |
| | | monthDiff += 12; |
| | | } |
| | | |
| | | // èµå¼å¹´é¨å |
| | | this.form.age = yearDiff; |
| | | this.form.ageunit = "å²"; |
| | | |
| | | // èµå¼æé¨åï¼æè
æ¨ä¹å¯ä»¥éæ©æ¾ç¤ºå©ä½ç天æ°ï¼ |
| | | this.form.age2 = monthDiff; |
| | | this.form.ageunit2 = "æ"; |
| | | |
| | | // 妿æ¨è¿æ³æ¾ç¤ºå¤©æ° |
| | | // this.form.age3 = dayDiff; |
| | | // this.form.ageunit3 = '天'; |
| | | |
| | | // 妿年é¾å°äº1å²ï¼å¯è½æ¨å¸æç¨ææå¤©æ¥è¡¨ç¤ºä¸»å¹´é¾ |
| | | // è¿éæ¯ä¸ä¸ªç®åçé»è¾ï¼æ¨å¯ä»¥æ ¹æ®éæ±è°æ´ |
| | | if (yearDiff === 0) { |
| | | if (monthDiff === 0) { |
| | | // å°äº1个æï¼ç¨å¤©è¡¨ç¤º |
| | | this.form.age = dayDiff; |
| | | this.form.ageunit = "天"; |
| | | this.form.age2 = null; // æ¸
空第äºå段 |
| | | // this.form.age3 = null; |
| | | this.form.age2 = null; |
| | | } else { |
| | | // å°äº1å¹´ï¼ç¨æè¡¨ç¤º |
| | | this.form.age = monthDiff; |
| | | this.form.ageunit = "æ"; |
| | | this.form.age2 = dayDiff; // 第äºå段æ¾ç¤ºå¤© |
| | | this.form.age2 = dayDiff; |
| | | this.form.ageunit2 = "天"; |
| | | } |
| | | } |
| | | |
| | | this.form.andAge = `${ |
| | | this.form.andAge = [ |
| | | this.form.age && this.form.age !== 0 |
| | | ? `${this.form.age}${this.form.ageunit}` |
| | | : "" |
| | | } ${ |
| | | : "", |
| | | this.form.age2 && this.form.age2 !== 0 |
| | | ? `${this.form.age2}${this.form.ageunit2}` |
| | | : "" |
| | | }`.trim(); |
| | | this.$forceUpdate(); // å¼ºå¶æ´æ° |
| | | console.log(this.form.andAge); |
| | | }, |
| | | LoadReportList() { |
| | | listDonatebaseinfo().then(res => { |
| | | let list = res.rows; |
| | | let reportlist = []; |
| | | reportlist.push({ reporterno: "", reportername: "å
¨é¨" }); |
| | | list.forEach(element => { |
| | | reportlist.push({ |
| | | reporterno: element.reporterno, |
| | | reportername: element.reportername |
| | | }); |
| | | }); |
| | | |
| | | if (reportlist != 0) { |
| | | reportlist = this.resetArr(reportlist); |
| | | this.reportlist = reportlist; |
| | | } |
| | | }); |
| | | ] |
| | | .filter(Boolean) |
| | | .join(" "); |
| | | }, |
| | | |
| | | resetArr(Arr) { |
| | | var hash = {}; |
| | | Arr = Arr.reduce(function(arr, current) { |
| | | hash[current.reporterno] |
| | | ? "" |
| | | : (hash[current.reporterno] = true && arr.push(current)); |
| | | return arr; |
| | | }, []); |
| | | return Arr; |
| | | handleTerminate(row) { |
| | | this.currentRecord = { ...row }; |
| | | this.modalVisible = { ...this.modalVisible, terminate: true }; |
| | | }, |
| | | |
| | | getTimeList(e) { |
| | | console.log(this.selecttime); |
| | | if (this.selecttime != null) { |
| | | if (this.selecttime != 0) { |
| | | this.endtime = this.selecttime[1]; |
| | | this.starttime = this.selecttime[0]; |
| | | // if (this.endtime == this.starttime) { |
| | | let num = Number(this.endtime.slice(5, 7)); |
| | | if (num < 9) { |
| | | let mon = Number(this.endtime.slice(6, 7)); |
| | | this.endtime = |
| | | this.endtime.slice(0, 5) + |
| | | "0" + |
| | | (mon + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | // this.endtime=this.endtime.slice(0,5)å¹´ |
| | | else if (num >= 10) { |
| | | this.endtime = |
| | | this.endtime.slice(0, 5) + |
| | | (num + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } else { |
| | | this.endtime = |
| | | this.endtime.slice(0, 5) + |
| | | "10" + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | this.starttime = |
| | | this.starttime + " " + "00" + ":" + "00" + ":" + "00"; |
| | | // } |
| | | } else { |
| | | this.starttime = "1998-01-01 00:00:00"; |
| | | this.endtime = "2998-01-01 00:00:00"; |
| | | } |
| | | } else { |
| | | this.starttime = "1998-01-01 00:00:00"; |
| | | this.endtime = "2998-01-01 00:00:00"; |
| | | handleRestore(row) { |
| | | this.currentRecord = { ...row }; |
| | | this.modalVisible = { ...this.modalVisible, restore: true }; |
| | | }, |
| | | |
| | | getTimeList() { |
| | | if (!this.selecttime) { |
| | | // this.queryParams.starttime = "1998-01-01 00:00:00"; |
| | | // this.queryParams.endtime = "2998-01-01 00:00:00"; |
| | | return; |
| | | } |
| | | |
| | | const [start, end] = this.selecttime; |
| | | this.queryParams.starttime = `${start} 00:00:00`; |
| | | |
| | | const monthNum = Number(end.slice(5, 7)); |
| | | const nextMonth = monthNum < 9 ? `0${monthNum + 1}` : monthNum + 1; |
| | | this.queryParams.endtime = `${end.slice(0, 5)}${nextMonth}-01 00:00:00`; |
| | | }, |
| | | |
| | | selectReporters() { |
| | | //ä¸è人å |
| | | listReportname("zzry").then(res => { |
| | | this.reporters = res.data; |
| | | }); |
| | | async selectReporters() { |
| | | const res = await listReportname("zzry"); |
| | | this.reporters = res.data; |
| | | }, |
| | | |
| | | getuserlist() { |
| | | //ç¨æ·å表 |
| | | listUser().then(res => { |
| | | this.users = res.data; |
| | | }); |
| | | }, |
| | | |
| | | handleapproval(row) { |
| | | this.$confirm("æ¯å¦ç¡®è®¤å°æ¡ä¾ä¸æ¥å®¡æ ¸ï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | row.recordstate = 1; |
| | | updateDonatebaseinfo(row).then(response => { |
| | | this.$modal.msgSuccess("䏿¥å®¡æ ¸æå"); |
| | | this.getList(); |
| | | }); |
| | | }) |
| | | .catch(() => { |
| | | this.$message({ |
| | | type: "info", |
| | | message: "已忶䏿¥" |
| | | }); |
| | | }); |
| | | }, |
| | | resetapproval(row) { |
| | | this.approvalState = false; |
| | | // this.reset(); |
| | | // const id = row.id || this.ids; |
| | | updateDonatebaseinfo(row).then(response => { |
| | | row.recordstate = 0; |
| | | }); |
| | | async getuserlist() { |
| | | const res = await listUser(); |
| | | this.users = res.data; |
| | | }, |
| | | |
| | | updateMessage() { |
| | | try { |
| | | const reg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/; |
| | | if (reg.test(this.form.idcardno)) { |
| | | // 身份è¯å·ç æ¯å¦åæ³ |
| | | var org_birthday = this.form.idcardno.substring(6, 14); |
| | | var org_gender = this.form.idcardno.substring(16, 17); |
| | | var sex = org_gender % 2 == 1 ? 1 : 2; |
| | | var birthday = |
| | | org_birthday.substring(0, 4) + |
| | | "-" + |
| | | org_birthday.substring(4, 6) + |
| | | "-" + |
| | | org_birthday.substring(6, 8); |
| | | var birthdays = new Date(birthday.replace(/-/g, "/")); |
| | | let d = new Date(); |
| | | let age = |
| | | d.getFullYear() - |
| | | birthdays.getFullYear() - |
| | | (d.getMonth() < birthdays.getMonth() || |
| | | (d.getMonth() == birthdays.getMonth() && |
| | | d.getDate() < birthdays.getDate()) |
| | | ? 1 |
| | | : 0); |
| | | // èµå¼ç»è¡¨æ ¼ |
| | | this.form.sex = sex; |
| | | this.form.birthday = birthday; |
| | | this.calculateAge(birthday); |
| | | // this.form.age = age; |
| | | } else { |
| | | } |
| | | } catch {} |
| | | }, |
| | | // sheng: 'æµæ±ç', |
| | | // shi: '', |
| | | // qu: '', |
| | | const idCardReg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/; |
| | | |
| | | // 身份è¯éªè¯ |
| | | //æ ¹æ®èº«ä»½è¯å·èªå¨çææ§å«ãåºçæ¥æåå¹´é¾ |
| | | inputChange() { |
| | | const idCard = this.props.form.getFieldValue("idCard"); |
| | | let birthday = ""; |
| | | let sex = "0"; |
| | | if (idCard.length === 15) { |
| | | birthday = `19${idCard.substring(6, 8)}-${idCard.substring( |
| | | 9, |
| | | 10 |
| | | )}-${idCard.substring(11, 12)}`; |
| | | sex = idCard[14] % 2 === 0 ? "0" : "1"; |
| | | } else { |
| | | birthday = `${idCard.substring(6, 10)}-${idCard.substring( |
| | | 11, |
| | | 12 |
| | | )}-${idCard.substring(13, 14)}`; |
| | | sex = idCard[16] % 2 === 0 ? "0" : "1"; |
| | | if (idCardReg.test(this.form.idcardno)) { |
| | | const orgBirthday = this.form.idcardno.substring(6, 14); |
| | | const orgGender = this.form.idcardno.substring(16, 17); |
| | | |
| | | const sex = orgGender % 2 == 1 ? 1 : 2; |
| | | const birthday = `${orgBirthday.substring( |
| | | 0, |
| | | 4 |
| | | )}-${orgBirthday.substring(4, 6)}-${orgBirthday.substring(6, 8)}`; |
| | | |
| | | this.form.sex = sex; |
| | | this.form.birthday = birthday; |
| | | this.calculateAge(birthday); |
| | | } |
| | | this.setState({ |
| | | birthday, |
| | | sex |
| | | }); |
| | | }, |
| | | |
| | | /** æ¥è¯¢æç®åºç¡å表 */ |
| | | getList() { |
| | | initializeRouteParams() { |
| | | const { params } = this.$route; |
| | | const routeParams = { |
| | | starttime: params.starttime, |
| | | endtime: params.endtime, |
| | | reporterno: params.reporterno, |
| | | terminationcase: params.terminationcase, |
| | | tempRecordState: params.tempRecordState, |
| | | city: params.city |
| | | }; |
| | | |
| | | Object.entries(routeParams).forEach(([key, value]) => { |
| | | if (value) this.queryParams[key] = value; |
| | | }); |
| | | |
| | | if (params.starttime && params.endtime) { |
| | | this.selecttime = [ |
| | | this.$moment(params.starttime).format("YYYY-MM-DD"), |
| | | this.$moment(params.endtime).format("YYYY-MM-DD") |
| | | ]; |
| | | } |
| | | }, |
| | | |
| | | async getList() { |
| | | this.loading = true; |
| | | this.queryParams.params = {}; |
| | | sessionStorage.removeItem("donatebaseinfo"); |
| | | |
| | | sessionStorage.setItem( |
| | | "donatebaseinfo", |
| | | JSON.stringify(this.queryParams) |
| | | ); |
| | | // 跳转æ¶çé»è®¤è¿åº¦ |
| | | |
| | | if (this.reportervalue != "") { |
| | | this.queryParams.reportno = this.reportervalue; |
| | | } |
| | | |
| | | if (this.starttime != "") { |
| | | this.queryParams.starttime = this.starttime; |
| | | } else { |
| | | this.queryParams.starttime = ""; |
| | | } |
| | | if (this.endtime != "") { |
| | | this.queryParams.endtime = this.endtime; |
| | | } else { |
| | | this.queryParams.endtime = ""; |
| | | } |
| | | this.queryParams.residenceprovince = this.$refs.areaSelect.getSheng(); |
| | | this.queryParams.residencecity = this.$refs.areaSelect.getShi(); |
| | | this.queryParams.residencetown = this.$refs.areaSelect.getQu(); |
| | | console.log(this.queryParams); |
| | | |
| | | listDonatebaseinfo(this.queryParams).then(response => { |
| | | this.donatebaseinfoList = response.rows; |
| | | //console.log("listDonatebaseinfo", response.rows); |
| | | try { |
| | | const response = await listDonatebaseinfo(this.queryParams); |
| | | this.donatebaseinfoList = response.data; |
| | | this.total = response.total; |
| | | } catch (error) { |
| | | console.error("è·åå表失败:", error); |
| | | } finally { |
| | | this.loading = false; |
| | | }); |
| | | } |
| | | }, |
| | | // åæ¶æé® |
| | | /** æå¼ç¼è¾å¼¹çª */ |
| | | handleOpenEdit(row) { |
| | | this.currentEditData = { ...row }; |
| | | console.log(this.currentEditData, "this.currentEditData"); |
| | | this.editModalVisible = true; |
| | | }, |
| | | |
| | | /** å¤çç¼è¾æå */ |
| | | handleEditSuccess(updatedData) { |
| | | this.$modal.msgSuccess("ç¼è¾æå"); |
| | | this.getList(); // å·æ°å表 |
| | | }, |
| | | |
| | | /** å¤çç¼è¾å¼¹çªå
³é */ |
| | | handleEditClosed() { |
| | | this.currentEditData = {}; |
| | | }, |
| | | |
| | | handleModalVisibleChange(newVisible) { |
| | | this.modalVisible = { ...newVisible }; |
| | | }, |
| | | |
| | | handleOperationSuccess({ type, record }) { |
| | | console.log(`${type}æä½æå:`, record); |
| | | this.getList(); |
| | | }, |
| | | |
| | | cancel() { |
| | | this.open = false; |
| | | this.reset(); |
| | | }, |
| | | // 表åéç½® |
| | | |
| | | reset() { |
| | | this.form = { |
| | | id: null, |
| | | name: null, |
| | | sex: null, |
| | | idcardtype: null, |
| | | idcardno: null, |
| | | age: null, |
| | | ageunit: null, |
| | | birthday: null, |
| | | phone: null, |
| | | residenceaddress: null, |
| | | nationality: "ä¸å½", |
| | | nativeplace: null, |
| | | residenceprovince: null, |
| | | nation: null, |
| | | residenceprovincename: null, |
| | | occupation: null, |
| | | residencecity: null, |
| | | education: null, |
| | | residencecityname: null, |
| | | residencetown: null, |
| | | residencetownname: null, |
| | | residencecommunity: null, |
| | | residencecommunityname: null, |
| | | residencecountycode: null, |
| | | residencecountyname: null, |
| | | registeraddress: null, |
| | | registerprovince: null, |
| | | registerprovincename: null, |
| | | registercity: null, |
| | | registercityname: null, |
| | | registertown: null, |
| | | registertownname: null, |
| | | registercommunity: null, |
| | | registercommunityname: null, |
| | | registercountycode: null, |
| | | registercountyname: null, |
| | | recordstate: null, |
| | | treatmenthospitalno: null, |
| | | treatmenthospitalname: null, |
| | | treatmentdeptname: null, |
| | | diagnosisno: null, |
| | | diagnosisname: null, |
| | | bloodtype: "0", |
| | | inpatientno: null, |
| | | rhyin: 0, |
| | | caseNo: null, |
| | | donationcategory: null, |
| | | illnessoverview: null, |
| | | diseasetype: [], |
| | | infectious: [], |
| | | selfwill: [], |
| | | diseasetypeOther: null, |
| | | othercases: [], |
| | | kinshipwill: 0, |
| | | infosources: [], |
| | | kinship: [], |
| | | redorganno: null, |
| | | redorganname: null, |
| | | contactperson: null, |
| | | infectiousOther: null, |
| | | contactnumber: null, |
| | | contacttime: null, |
| | | reporterno: null, |
| | | reportername: null, |
| | | patientstate: [], |
| | | reporterphone: null, |
| | | infosourcesOther: null, |
| | | reporttime: null, |
| | | delFlag: null, |
| | | createBy: null, |
| | | createTime: null, |
| | | updateBy: null, |
| | | updateTime: null, |
| | | kinshipOther: null, |
| | | majorrelatives: null, |
| | | familyrelations: null, |
| | | acquisitiontissueno: "ZJOPO", |
| | | acquisitiontissuename: "æµæ±ç人ä½å¨å®è·åç»ç»" |
| | | sex: null |
| | | // ... ä¿çå¿
è¦çåæ®µåå§å¼ |
| | | }; |
| | | |
| | | this.resetForm("form"); |
| | | }, |
| | | /** æç´¢æé®æä½ */ |
| | | |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | /** éç½®æé®æä½ */ |
| | | |
| | | resetQuery() { |
| | | this.daterangeReporttime = []; |
| | | |
| | | this.reportervalue = ""; |
| | | |
| | | this.queryParams = { |
| | | doname: null, |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | name: null, |
| | | idcardno: null, |
| | | residenceprovince: null, |
| | | residencecity: null, |
| | | residencetown: null, |
| | | // "2" |
| | | recordstate: null, |
| | | treatmenthospitalname: null, |
| | | caseNo: null, |
| | | acquisitiontissueno: null, |
| | | reportername: null, |
| | | reporttime: null, |
| | | city: null, |
| | | treatmenthospitalno: null |
| | | treatmenthospitalno: null, |
| | | starttime: null, |
| | | endtime: null |
| | | }; |
| | | this.selecttime = []; |
| | | this.getTimeList(); |
| | | this.searchAddress = { |
| | | sheng: "", |
| | | shi: "", |
| | | qu: "", |
| | | organizationname: null |
| | | }; |
| | | //this.$refs.areaSelect.clean(); |
| | | |
| | | this.resetForm("queryForm"); |
| | | this.handleQuery(); |
| | | }, |
| | | // å¤éæ¡é䏿°æ® |
| | | |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map(item => item.id); |
| | | this.single = selection.length !== 1; |
| | | this.multiple = !selection.length; |
| | | }, |
| | | /** æ°å¢æé®æä½ */ |
| | | |
| | | handleAdd() { |
| | | // this.$router.push({ |
| | | // path: "/organ/donationdetails/", |
| | | // query: { |
| | | // organType: "add", |
| | | // } |
| | | // }); |
| | | this.reset(); |
| | | //设置æ¥å人åé¨é¨/ç» |
| | | this.form.reporterno = this.currentuser.userName; |
| | | this.form.reportername = this.currentuser.nickName; |
| | | this.form.deptid = this.currentuser.deptid; |
| | | |
| | | this.showSaveBtn = true; |
| | | //this.$refs.annex.getAnnexList(); |
| | | this.open = true; |
| | | // this.$nextTick(function() { |
| | | // this.$refs.annex.getAnnexList(); |
| | | // }); |
| | | |
| | | this.title = "人ä½å¨å®æ½å¨æç®è
ç»è®°è¡¨"; |
| | | }, |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | |
| | | handleUpdate(row) { |
| | | this.$router.push({ |
| | | path: "/case/course", |
| | | query: { |
| | | id: row.id, |
| | | organType: "edit" |
| | | query: { id: row.id, organType: "edit" } |
| | | }); |
| | | }, |
| | | |
| | | async submitForm() { |
| | | const valid = await this.$refs.form.validate(); |
| | | if (!valid) return; |
| | | |
| | | const formData = { ...this.form }; |
| | | |
| | | // å¤çè¡¨åæ°æ® |
| | | const processedData = this.processFormData(formData); |
| | | |
| | | try { |
| | | const res = await addDonatebaseinfo(processedData); |
| | | if (res.code === 200) { |
| | | this.$modal.msgSuccess("æ°å¢æå"); |
| | | this.$router.push({ |
| | | path: "/organ/donationdetails/", |
| | | query: { id: res.data.id, organType: "edit" } |
| | | }); |
| | | this.open = false; |
| | | } else { |
| | | this.$modal.msgError("æ°å¢å¤±è´¥ï¼" + res.msg); |
| | | } |
| | | } catch (error) { |
| | | this.$modal.msgError("æä½å¤±è´¥"); |
| | | } |
| | | }, |
| | | |
| | | processFormData(data) { |
| | | const processed = { ...data }; |
| | | |
| | | // å¤çæ°ç»å段 |
| | | const arrayFields = [ |
| | | "diseasetype", |
| | | "infectious", |
| | | "selfwill", |
| | | "othercases", |
| | | "infosources", |
| | | "kinship", |
| | | "patientstate" |
| | | ]; |
| | | arrayFields.forEach(field => { |
| | | if (Array.isArray(processed[field])) { |
| | | processed[field] = processed[field].join(","); |
| | | } |
| | | }); |
| | | // this.showSaveBtn = true; |
| | | // const id = row.id || this.ids; |
| | | // //this.$refs.annex.getAnnexList(); |
| | | |
| | | // getDonatebaseinfo(id).then((response) => { |
| | | // this.reset(); |
| | | // å¤çæ¥æåæ®µ |
| | | if (processed.birthday) { |
| | | processed.birthday = this.$moment(processed.birthday).format( |
| | | "YYYY-MM-DD HH:mm:ss" |
| | | ); |
| | | } |
| | | |
| | | // this.$nextTick(function () { |
| | | // this.$refs.annex.getAnnexList(); |
| | | // }); |
| | | // this.form = response.data; |
| | | // response.data.sex = parseInt(response.data.sex); |
| | | // this.form.id = response.data.id; |
| | | // this.form.diseasetype = this.form.diseasetype.split(","); |
| | | // this.form.infectious = this.form.infectious.split(","); |
| | | // this.form.selfwill = this.form.selfwill.split(","); |
| | | // this.form.othercases = this.form.othercases.split(","); |
| | | // this.form.infosources = this.form.infosources.split(","); |
| | | // this.form.kinship = this.form.kinship.split(","); |
| | | // this.form.patientstate = this.form.patientstate.split(","); |
| | | // this.open = true; |
| | | // this.title = "人ä½å¨å®æ½å¨æç®è
ç»è®°è¡¨"; |
| | | // this.registerAddresss.sheng = response.data.registerprovincename; |
| | | // this.residenceAddresss.sheng = response.data.residenceprovincename; |
| | | // this.registerAddresss.shi = response.data.registercityname; |
| | | // this.residenceAddresss.shi = response.data.residencecityname; |
| | | // this.residenceAddresss.qu = response.data.residencetownname; |
| | | // this.registerAddresss.qu = response.data.registertownname; |
| | | // }); |
| | | processed.donatetime = processed.reporttime; |
| | | processed.workflow = 0; |
| | | processed.recordstate = 0; |
| | | |
| | | return processed; |
| | | }, |
| | | // ç»æ¢æ¡ä¾ |
| | | handletermination(row) { |
| | | this.reset(); |
| | | this.showSaveBtn = false; |
| | | this.showTerminationBtn = true; |
| | | const id = row.id || this.ids; |
| | | getDonatebaseinfo(id).then(response => { |
| | | this.form = response.data; |
| | | this.form.diseasetype = this.form.diseasetype.split(","); |
| | | this.form.infectious = this.form.infectious.split(","); |
| | | this.form.selfwill = this.form.selfwill.split(","); |
| | | this.form.othercases = this.form.othercases.split(","); |
| | | this.form.infosources = this.form.infosources.split(","); |
| | | this.form.kinship = this.form.kinship.split(","); |
| | | this.form.patientstate = this.form.patientstate.split(","); |
| | | this.registerAddresss.sheng = response.data.registerprovincename; |
| | | this.residenceAddresss.sheng = response.data.residenceprovincename; |
| | | this.registerAddresss.shi = response.data.registercityname; |
| | | this.residenceAddresss.shi = response.data.residencecityname; |
| | | this.residenceAddresss.qu = response.data.residencetownname; |
| | | this.registerAddresss.qu = response.data.registertownname; |
| | | this.open = true; |
| | | this.title = "人ä½å¨å®æ½å¨æç®è
ç»è®°è¡¨"; |
| | | this.form.recordstate = 99; |
| | | // this.$nextTick(function() { |
| | | // this.$refs.annex.getAnnexList(); |
| | | // }); |
| | | }); |
| | | }, |
| | | /** æäº¤æé® */ |
| | | submitForm() { |
| | | console.log(this.form); |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | const date = { ...this.form }; |
| | | console.log(date, "date"); |
| | | this.form.birthday = this.$moment(this.form.birthday).format( |
| | | "YYYY-MM-DD HH:mm:ss" |
| | | ); |
| | | this.form.diseasetype = this.form.diseasetype.join(","); |
| | | this.form.infectious = this.form.infectious.join(","); |
| | | this.form.selfwill = this.form.selfwill.join(","); |
| | | this.form.othercases = this.form.othercases.join(","); |
| | | this.form.infosources = this.form.infosources.join(","); |
| | | this.form.kinship = this.form.kinship.join(","); |
| | | this.form.patientstate = this.form.patientstate.join(","); |
| | | this.form.registerprovince = this.$refs.registerSelect.getSheng(); |
| | | this.form.registerprovincename = this.registerAddresss.sheng; |
| | | |
| | | this.form.residenceprovince = this.$refs.residenceSelect.getSheng(); |
| | | this.form.residenceprovincename = this.residenceAddresss.sheng; |
| | | async handleExport() { |
| | | try { |
| | | await this.$modal.confirm("æ¯å¦ç¡®è®¤å¯¼åºæææç®åºç¡æ°æ®é¡¹ï¼"); |
| | | this.exportLoading = true; |
| | | |
| | | this.form.registercity = this.$refs.registerSelect.getShi(); |
| | | this.form.registercityname = this.registerAddresss.shi; |
| | | |
| | | this.form.residencecity = this.$refs.residenceSelect.getShi(); |
| | | this.form.residencecityname = this.residenceAddresss.shi; |
| | | |
| | | this.form.residencetown = this.$refs.residenceSelect.getQu(); |
| | | this.form.residencetownname = this.residenceAddresss.qu; |
| | | |
| | | this.form.registertown = this.$refs.registerSelect.getQu(); |
| | | this.form.registertownname = this.registerAddresss.qu; |
| | | |
| | | this.form.reportername = this.$refs.getReportname.$data.selectedLabel; |
| | | this.form.donatetime = this.form.reporttime; |
| | | |
| | | try { |
| | | this.form.treatmenthospitalname = this.$refs.addOrgSelect.getOptionByValue( |
| | | this.form.treatmenthospitalno |
| | | ).organizationname; |
| | | } catch { |
| | | this.form.treatmenthospitalname = this.form.treatmenthospitalno; |
| | | } |
| | | |
| | | try { |
| | | this.form.redorganname = this.$refs.addCrossOrgSelect.getOptionByValue( |
| | | this.form.redorganno |
| | | ).organizationname; |
| | | } catch { |
| | | this.form.redorganname = this.form.redorganno; |
| | | } |
| | | |
| | | this.form.workflow = 0; |
| | | this.form.recordstate = 0; |
| | | addDonatebaseinfo(this.form).then(res => { |
| | | console.log("22"); |
| | | console.log(res.code); |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("æ°å¢æå"); |
| | | this.$router.push({ |
| | | path: "/organ/donationdetails/", |
| | | query: { |
| | | id: res.data.id, |
| | | organType: "edit" |
| | | } |
| | | }); |
| | | this.open = false; |
| | | } else { |
| | | console.log("1"); |
| | | this.form = date; |
| | | console.log(this.form, "form"); |
| | | this.$modal.msgError("æ°å¢å¤±è´¥ï¼" + res.msg); |
| | | } |
| | | }); |
| | | const response = await exportDonatebaseinfo(this.queryParams); |
| | | this.$download.name(response.msg); |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | this.$modal.msgError("导åºå¤±è´¥"); |
| | | } |
| | | }); |
| | | }, |
| | | /** å é¤æé®æä½ */ |
| | | handleDelete(row) { |
| | | const ids = row.id || this.ids; |
| | | this.$modal |
| | | .confirm('æ¯å¦ç¡®è®¤å 餿ç®åºç¡ç¼å·ä¸º"' + ids + '"çæ°æ®é¡¹ï¼') |
| | | .then(function() { |
| | | return delDonatebaseinfo(ids); |
| | | }) |
| | | .then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | /** å¯¼åºæé®æä½ */ |
| | | handleExport() { |
| | | const queryParams = this.queryParams; |
| | | this.$modal |
| | | .confirm("æ¯å¦ç¡®è®¤å¯¼åºæææç®åºç¡æ°æ®é¡¹ï¼") |
| | | .then(() => { |
| | | this.exportLoading = true; |
| | | return exportDonatebaseinfo(queryParams); |
| | | }) |
| | | .then(response => { |
| | | this.$download.name(response.msg); |
| | | this.exportLoading = false; |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // 对象转ææå®å符串åé |
| | | listToString(list, separator) { |
| | | let strs = ""; |
| | | separator = separator || ","; |
| | | for (let i in list) { |
| | | strs += list[i] + separator; |
| | | } finally { |
| | | this.exportLoading = false; |
| | | } |
| | | return strs != "" ? strs.substr(0, strs.length - 1) : ""; |
| | | }, |
| | | //åç¬¦ä¸²æ ¹æ®æå®å符串åé |
| | | stringToList(str, separator) { |
| | | separator = separator || ","; |
| | | let tempList = []; |
| | | if (str != null && str != undefined && str != "") { |
| | | tempList = str.split(separator); |
| | | } |
| | | return tempList; |
| | | }, |
| | | |
| | | //ä¸è½½æ½å¨ç»è®°è¡¨ |
| | | handledownload(row) { |
| | | const id = row.id || this.ids; |
| | | |
| | | downloadbaseinfo(id).then(res => { |
| | | var fileUrl = res; |
| | | //è·åå½åç½å |
| | | var urlBase = process.env.VUE_APP_BASE_API; |
| | | var curWWWPath = window.document.location.href; |
| | | var pos = curWWWPath.indexOf(window.document.location.pathname); |
| | | // å建aæ ç¾ |
| | | var aEle = document.createElement("a"); |
| | | aEle.href = |
| | | curWWWPath.substring(0, pos) + urlBase + fileUrl["downloadUrl"]; |
| | | console.log(aEle.href); |
| | | // æ·»å Authorizationå¤´é¨ |
| | | fetch(aEle.href, { |
| | | headers: this.headers |
| | | }) |
| | | .then(response => { |
| | | // å°æä»¶ä¸è½½é¾æ¥ä½ä¸ºblob对象è¿è¡ä¸è½½ |
| | | return response.blob(); |
| | | }) |
| | | .then(blob => { |
| | | const url = window.URL.createObjectURL(new Blob([blob])); |
| | | console.log(url); |
| | | const link = document.createElement("a"); |
| | | link.href = url; |
| | | const name = fileUrl["downloadName"]; |
| | | link.setAttribute("download", name); // æ¿æ¢file.pdf为å®é
çæä»¶å |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | link.parentNode.removeChild(link); |
| | | }); |
| | | }); |
| | | } |
| | | } |
| | | }; |