| | |
| | | data: data |
| | | }) |
| | | } |
| | | export function deathinfoadd(data) { |
| | | return request({ |
| | | url: '/project/deathinfo/add', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | // æ»äº¡ä¿¡æ¯è¯¦æ
|
| | | export function deathinfoInfo(id) { |
| | | return request({ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-card class="basic-info-card" v-loading="loading"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>æ¡ä¾åºæ¬ä¿¡æ¯</span> |
| | | <el-button |
| | | v-if="showAttachment && hasAttachments" |
| | | style="float: right; padding: 3px 0" |
| | | type="text" |
| | | @click="handleAttachmentPreview" |
| | | > |
| | | <i class="el-icon-folder-opened"></i> æ¥çéä»¶ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <el-descriptions v-if="basicData" :column="column" border> |
| | | <!-- 1. æ¡ä¾ç¼å· --> |
| | | <el-descriptions-item label="æ¡ä¾ç¼å·"> |
| | | {{ basicData.caseNo || "--" }} |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 2. æ½å¨æç®è
å§å --> |
| | | <el-descriptions-item label="æç®è
å§å"> |
| | | {{ basicData.name || basicData.donorName || "--" }} |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 3. æ§å«/å¹´é¾ --> |
| | | <el-descriptions-item label="æ§å«/å¹´é¾"> |
| | | <span v-if="basicData.sex"> |
| | | <dict-tag |
| | | v-if="useDict" |
| | | :options="sexOptions" |
| | | :value="basicData.sex" |
| | | /> |
| | | <template v-else>{{ basicData.sex == "1" ? "ç·" : "女" }}</template> |
| | | </span> |
| | | <span v-if="basicData.age"> |
| | | / {{ basicData.age }}{{ basicData.ageunit || "å²" }}</span |
| | | > |
| | | <span v-if="!basicData.sex && !basicData.age">--</span> |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 4. è¯ä»¶å·ç --> |
| | | <el-descriptions-item label="è¯ä»¶å·ç "> |
| | | {{ basicData.idcardno || basicData.idCardNo || "--" }} |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 5. è¡å --> |
| | | <el-descriptions-item label="è¡å"> |
| | | <template v-if="basicData.bloodType || basicData.bloodtype"> |
| | | {{ basicData.bloodType || basicData.bloodtype }} |
| | | </template> |
| | | <template v-else>--</template> |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 6. ç¾ç
è¯æ --> |
| | | <el-descriptions-item label="ç¾ç
è¯æ"> |
| | | {{ basicData.diagnosisname || basicData.diagnosis || "--" }} |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 7. æå¨å»çæºæ --> |
| | | <el-descriptions-item label="æå¨å»çæºæ"> |
| | | {{ basicData.treatmenthospitalname || basicData.hospitalName || "--" }} |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 8. åè°å --> |
| | | <el-descriptions-item label="åè°å"> |
| | | {{ basicData.coordinatorName || basicData.contactPerson || "--" }} |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 9. 䏿¥æ¶é´ --> |
| | | <el-descriptions-item label="䏿¥æ¶é´"> |
| | | {{ formatDateTime(basicData.reportTime) || "--" }} |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 10. æ¡ä¾ç¶æ --> |
| | | <el-descriptions-item label="æ¡ä¾è¿åº¦"> |
| | | <!-- <el-tag :type="getReportStatusType(basicData.workflow)" size="small"> |
| | | {{ getReportStatusText(basicData.workflow) }} |
| | | </el-tag> --> |
| | | <div> |
| | | <dict-tag |
| | | :options="dict.type.sys_donornode" |
| | | :value="basicData.workflow" |
| | | /> |
| | | </div> |
| | | </el-descriptions-item> |
| | | |
| | | <!-- 11. 转è¿ç¶æï¼æ ¹æ®éæ±å¯éï¼ --> |
| | | <el-descriptions-item v-if="showTransport" label="转è¿ç¶æ"> |
| | | <el-tag |
| | | :type="getTransportStatusType(basicData.isTransport)" |
| | | size="small" |
| | | > |
| | | {{ getTransportStatusText(basicData.isTransport) }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <!-- ç©ºç¶æ --> |
| | | <div v-else class="empty-state"> |
| | | <el-empty description="ææ æ¡ä¾ä¿¡æ¯" :image-size="100"></el-empty> |
| | | </div> |
| | | </el-card> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getDonatebaseinfo } from "@/api/project/donatebaseinfo"; |
| | | |
| | | export default { |
| | | name: "CaseBasicInfoSimple", |
| | | props: { |
| | | // æ¡ä¾ID |
| | | caseId: { |
| | | type: [String, Number], |
| | | required: true |
| | | }, |
| | | // åæ° |
| | | column: { |
| | | type: Number, |
| | | default: 2 |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºéä»¶æé® |
| | | showAttachment: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // æ¯å¦ä½¿ç¨åå
¸ |
| | | useDict: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºè½¬è¿ç¶æ |
| | | showTransport: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // æ¯å¦èªå¨å è½½ |
| | | autoLoad: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // å¤é¨ä¼ å
¥çæ°æ®ï¼ä¸è°ç¨æ¥å£ï¼ |
| | | externalData: { |
| | | type: Object, |
| | | default: null |
| | | }, |
| | | // èªå®ä¹å段å表 |
| | | fields: { |
| | | type: Array, |
| | | default: () => [ |
| | | "caseNo", // æ¡ä¾ç¼å· |
| | | "name", // å§å |
| | | "sexAge", // æ§å«/å¹´é¾ |
| | | "idcardno", // è¯ä»¶å·ç |
| | | "bloodType", // è¡å |
| | | "diagnosis", // ç¾ç
è¯æ |
| | | "hospital", // å»çæºæ |
| | | "coordinator", // åè°å |
| | | "reportTime", // 䏿¥æ¶é´ |
| | | "status" // æ¡ä¾ç¶æ |
| | | ] |
| | | } |
| | | }, |
| | | dicts: [ |
| | | "sys_user_sex", |
| | | "sys_BloodType", |
| | | "sys_DonationCategory", |
| | | "sys_donornode" |
| | | ], |
| | | data() { |
| | | return { |
| | | loading: false, |
| | | basicData: null, |
| | | // åå
¸é项 |
| | | sexOptions: [], |
| | | bloodTypeOptions: [] |
| | | }; |
| | | }, |
| | | computed: { |
| | | hasAttachments() { |
| | | return ( |
| | | this.basicData && |
| | | (this.basicData.assessannex || this.basicData.attachments) |
| | | ); |
| | | } |
| | | }, |
| | | watch: { |
| | | caseId: { |
| | | handler(newVal) { |
| | | if (newVal && this.autoLoad && !this.externalData) { |
| | | this.loadBasicInfo(); |
| | | } |
| | | }, |
| | | immediate: true |
| | | }, |
| | | externalData: { |
| | | handler(newVal) { |
| | | if (newVal) { |
| | | this.basicData = this.mapExternalData(newVal); |
| | | } |
| | | }, |
| | | immediate: true |
| | | } |
| | | }, |
| | | created() { |
| | | if (this.useDict) { |
| | | this.loadDicts(); |
| | | } |
| | | |
| | | if (this.caseId && this.autoLoad && !this.externalData) { |
| | | this.loadBasicInfo(); |
| | | } else if (this.externalData) { |
| | | this.basicData = this.mapExternalData(this.externalData); |
| | | } |
| | | }, |
| | | methods: { |
| | | // å è½½åå
¸ |
| | | async loadDicts() { |
| | | try { |
| | | // å è½½æ§å«åå
¸ |
| | | this.sexOptions = [ |
| | | { dictLabel: "ç·", dictValue: "1" }, |
| | | { dictLabel: "女", dictValue: "2" } |
| | | ]; |
| | | |
| | | // å è½½è¡ååå
¸ |
| | | this.bloodTypeOptions = [ |
| | | { dictLabel: "Aå", dictValue: "A" }, |
| | | { dictLabel: "Bå", dictValue: "B" }, |
| | | { dictLabel: "Oå", dictValue: "O" }, |
| | | { dictLabel: "ABå", dictValue: "AB" } |
| | | ]; |
| | | } catch (error) { |
| | | console.warn("å è½½åå
¸å¤±è´¥:", error); |
| | | } |
| | | }, |
| | | |
| | | // å è½½åºæ¬ä¿¡æ¯ |
| | | async loadBasicInfo() { |
| | | if (!this.caseId) return; |
| | | |
| | | this.loading = true; |
| | | try { |
| | | const response = await getDonatebaseinfo(this.caseId); |
| | | |
| | | if (response.code === 200) { |
| | | this.basicData = this.mapApiData(response.data); |
| | | console.log(this.basicData ); |
| | | |
| | | this.loading = false; |
| | | } else { |
| | | this.$message.error( |
| | | "è·åæ¡ä¾ä¿¡æ¯å¤±è´¥ï¼" + (response.msg || "æªç¥é误") |
| | | ); |
| | | } |
| | | } catch (error) { |
| | | console.error("å è½½æ¡ä¾åºæ¬ä¿¡æ¯å¤±è´¥:", error); |
| | | this.$message.error("å 载失败ï¼è¯·éè¯"); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | |
| | | // æ å°APIæ°æ® |
| | | mapApiData(apiData) { |
| | | if (!apiData) return null; |
| | | |
| | | return { |
| | | // æ ¸å¿å段 |
| | | caseNo: apiData.caseNo, |
| | | name: apiData.name || apiData.donorName, |
| | | donorName: apiData.donorName, |
| | | sex: apiData.sex, |
| | | age: apiData.age, |
| | | ageunit: apiData.ageunit, |
| | | workflow: apiData.workflow, |
| | | bloodType: apiData.bloodType || apiData.bloodtype, |
| | | idcardno: apiData.idcardno || apiData.idCardNo, |
| | | diagnosisname: apiData.diagnosisname || apiData.diagnosis, |
| | | treatmenthospitalname: |
| | | apiData.treatmenthospitalname || apiData.hospitalName, |
| | | coordinatorName: apiData.coordinatorName || apiData.contactPerson, |
| | | reportTime: apiData.reporttime, |
| | | reportStatus: apiData.reportStatus, |
| | | isTransport: apiData.isTransport, |
| | | |
| | | // éä»¶åæ®µ |
| | | assessannex: apiData.assessannex, |
| | | attachments: apiData.attachments |
| | | }; |
| | | }, |
| | | |
| | | // æ å°å¤é¨æ°æ® |
| | | mapExternalData(externalData) { |
| | | return this.mapApiData(externalData); |
| | | }, |
| | | |
| | | // æ ¼å¼åæ¥ææ¶é´ |
| | | formatDateTime(dateTimeStr) { |
| | | if (!dateTimeStr) return ""; |
| | | try { |
| | | const date = new Date(dateTimeStr); |
| | | return date |
| | | .toLocaleString("zh-CN", { |
| | | year: "numeric", |
| | | month: "2-digit", |
| | | day: "2-digit", |
| | | hour: "2-digit", |
| | | minute: "2-digit", |
| | | second: "2-digit" |
| | | }) |
| | | .replace(/\//g, "-"); |
| | | } catch (e) { |
| | | return dateTimeStr; |
| | | } |
| | | }, |
| | | |
| | | // 䏿¥ç¶æç¸å
³ |
| | | getReportStatusType(status) { |
| | | const statusMap = { |
| | | "1": "warning", // 已䏿¥ |
| | | "2": "primary", // å·²é
读 |
| | | "3": "success", // å·²åæ |
| | | "4": "danger" // 已驳å |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | |
| | | getReportStatusText(status) { |
| | | const statusMap = { |
| | | "0": "æ½å¨æç®", |
| | | "2": "å·²é
读", |
| | | "3": "å·²åæ", |
| | | "4": "已驳å" |
| | | }; |
| | | return statusMap[status] || "æªç¥"; |
| | | }, |
| | | |
| | | // 转è¿ç¶æç¸å
³ |
| | | getTransportStatusType(status) { |
| | | const statusMap = { |
| | | "1": "warning", // æ éè½¬è¿ |
| | | "2": "primary", // éè½¬è¿ |
| | | "3": "success", // 转è¿ä¸ |
| | | "4": "danger" // 转è¿å®æ |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | |
| | | getTransportStatusText(status) { |
| | | const statusMap = { |
| | | "1": "æ é转è¿", |
| | | "2": "é转è¿", |
| | | "3": "转è¿ä¸", |
| | | "4": "转è¿å®æ" |
| | | }; |
| | | return statusMap[status] || "æªç¥"; |
| | | }, |
| | | |
| | | // æ¥çéä»¶ |
| | | handleAttachmentPreview() { |
| | | this.$emit("attachment-preview", this.basicData); |
| | | }, |
| | | |
| | | // å·æ°æ°æ® |
| | | async refresh() { |
| | | await this.loadBasicInfo(); |
| | | }, |
| | | |
| | | // è·åæ°æ® |
| | | getData() { |
| | | return this.basicData; |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .basic-info-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .clearfix::after { |
| | | content: ""; |
| | | display: table; |
| | | clear: both; |
| | | } |
| | | |
| | | .empty-state { |
| | | padding: 40px 0; |
| | | text-align: center; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .basic-info-card { |
| | | margin: 10px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="confirmation-detail"> |
| | | <case-basic-info :case-id="caseId" :show-attachment="true" /> |
| | | |
| | | <el-card class="detail-card"> |
| | | <!-- åºç¡ä¿¡æ¯ --> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">æç®ç¡®è®¤åºæ¬ä¿¡æ¯</span> |
| | | <span class="detail-title">æç®ç¡®è®¤ä¿¡æ¯</span> |
| | | <el-button |
| | | type="success" |
| | | style="float: right;" |
| | |
| | | </div> |
| | | |
| | | <el-form :model="form" ref="form" label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä½é¢å·" prop="caseNo"> |
| | | <el-input v-model="form.caseNo" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <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="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> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å¹´é¾" prop="age"> |
| | | <el-input v-model="form.age" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <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="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="coordinatedusernameo"> |
| | |
| | | <el-date-picker |
| | | v-model="form.signdate" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | |
| | | <script> |
| | | import { relativesList, relativesEdit, relativesAdd } from "@/api/businessApi"; |
| | | import FilePreviewDialog from "@/components/FilePreviewDialog"; |
| | | |
| | | import CaseBasicInfo from "@/components/CaseBasicInfo"; |
| | | export default { |
| | | name: "ConfirmationDetail", |
| | | components: { |
| | | FilePreviewDialog |
| | | FilePreviewDialog, |
| | | CaseBasicInfo |
| | | }, |
| | | dicts: ["sys_FamilyRelation"], |
| | | data() { |
| | | return { |
| | | caseId: null, |
| | | |
| | | // æ¯å¦ç¼è¾æ¨¡å¼ |
| | | isEdit: false, |
| | | // è¡¨åæ°æ® |
| | |
| | | // å è½½ç¶æ |
| | | loading: false, |
| | | saveLoading: false, |
| | | infoid:null, |
| | | // éä»¶ç¸å
³æ°æ® |
| | | activeAttachmentType: "1", |
| | | attachmentLoading: false, |
| | |
| | | } |
| | | }, |
| | | created() { |
| | | const infoid = this.$route.query.infoid; |
| | | this.infoid = this.$route.query.infoid; |
| | | this.caseId = this.$route.query.infoid; |
| | | this.isEdit = this.$route.query.confirm === "true"; |
| | | if (infoid) { |
| | | this.getDetail(infoid); |
| | | if (this.infoid) { |
| | | this.getDetail(this.infoid); |
| | | } |
| | | }, |
| | | methods: { |
| | |
| | | |
| | | const saveData = { |
| | | ...this.form, |
| | | infoid: this.infoid, |
| | | organdecision: this.organdecision.join(","), |
| | | organdecisionOther: this.organdecisionOther |
| | | // assessannexåæ®µå·²å¨updateAssessannexField䏿´æ° |
| | |
| | | <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 type="primary" icon="el-icon-plus" @click="handleCreate" |
| | | >æ°å¢ç¡®è®¤</el-button |
| | | > |
| | | <el-button |
| | |
| | | :disabled="multiple" |
| | | @click="handleDelete" |
| | | >å é¤</el-button |
| | | > |
| | | > --> |
| | | <el-button |
| | | type="warning" |
| | | icon="el-icon-download" |
| | |
| | | </el-card> |
| | | |
| | | <!-- å°åä¿¡æ¯æ¨¡å --> |
| | | <el-card class="detail-section"> |
| | | <!-- <el-card class="detail-section"> |
| | | <div slot="header" class="section-header"> |
| | | <span class="section-title">å°åä¿¡æ¯</span> |
| | | </div> |
| | |
| | | {{ getFullResidenceAddress() }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | </el-card> --> |
| | | |
| | | <!-- å»çä¿¡æ¯æ¨¡å --> |
| | | <el-card class="detail-section"> |
| | |
| | | <el-descriptions-item label="ç¾ç
è¯æåç§°">{{ |
| | | caseData.diagnosisname || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç
æ
æ¦åµ">{{ |
| | | <!-- <el-descriptions-item label="ç
æ
æ¦åµ">{{ |
| | | caseData.illnessoverview || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç
人ç¶åµ">{{ |
| | | caseData.patientstate || "-" |
| | | }}</el-descriptions-item> |
| | | }}</el-descriptions-item> --> |
| | | <el-descriptions-item label="GCSè¯å">{{ |
| | | caseData.gcsScore || "-" |
| | | }}</el-descriptions-item> |
| | |
| | | <el-descriptions-item label="æ²»çå»é¢åç§°">{{ |
| | | caseData.treatmenthospitalname || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ²»çç§å®¤åç§°">{{ |
| | | <!-- <el-descriptions-item label="æ²»çç§å®¤åç§°">{{ |
| | | caseData.treatmentdeptname || "-" |
| | | }}</el-descriptions-item> |
| | | }}</el-descriptions-item> --> |
| | | <el-descriptions-item label="ä½é¢å·">{{ |
| | | caseData.inpatientno || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="é¨é¨åç§°">{{ |
| | | caseData.deptName || "-" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="é¨é¨ç¼å·">{{ |
| | | <!-- <el-descriptions-item label="é¨é¨ç¼å·">{{ |
| | | caseData.deptNo || "-" |
| | | }}</el-descriptions-item> |
| | | }}</el-descriptions-item> --> |
| | | <el-descriptions-item label="䏿¥å»é¢">{{ |
| | | caseData.toHospital || "-" |
| | | }}</el-descriptions-item> |
| | |
| | | style="width: 200px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æç®è
å§å" prop="name"> |
| | | <el-form-item label="æ£è
å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | placeholder="请è¾å
¥æ£è
å§å" |
| | | clearable |
| | | style="width: 200px" |
| | | /> |
| | |
| | | width="160" |
| | | /> |
| | | <el-table-column |
| | | label="æç®è
å§å" |
| | | label="ç¶æ" |
| | | align="center" |
| | | prop="reportStatus" |
| | | width="100" |
| | | > |
| | | <template #default="scope"> |
| | | <el-tag :type="scope.row.reportStatus | statusFilter"> |
| | | {{ scope.row.reportStatus | statusTextFilter }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="转è¿ç¶æ" align="center" width="100"> |
| | | <template #default="scope"> |
| | | <el-tag :type="getTransportStatusTag(scope.row)"> |
| | | {{ getTransportStatusText(scope.row) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æ£è
å§å" |
| | | align="center" |
| | | prop="name" |
| | | width="100" |
| | |
| | | prop="treatmenthospitalname" |
| | | width="150" |
| | | /> |
| | | <el-table-column |
| | | label="ç¶æ" |
| | | align="center" |
| | | prop="reportStatus" |
| | | width="100" |
| | | > |
| | | <template #default="scope"> |
| | | <el-tag :type="scope.row.reportStatus | statusFilter"> |
| | | {{ scope.row.reportStatus | statusTextFilter }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="转è¿ç¶æ" align="center" width="100"> |
| | | <template #default="scope"> |
| | | <el-tag :type="getTransportStatusTag(scope.row)"> |
| | | {{ getTransportStatusText(scope.row) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | fixed="right" |
| | | class-name="small-padding fixed-width" |
| | | width="350" |
| | | > |
| | | |
| | | <el-table-column label="æä½" align="center" fixed="right" width="350"> |
| | | <template #default="scope"> |
| | | <el-button |
| | | size="mini" |
| | |
| | | icon="el-icon-check" |
| | | @click="handleApprove(scope.row)" |
| | | v-if="scope.row.reportStatus === '2' && scope.row.delFlag === 0" |
| | | >审æ¹</el-button |
| | | >确认</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-truck" |
| | | :type="shouldShowTransportButton(scope.row) ? 'primary' : 'text'" |
| | | :type="getTransportStatustype(scope.row)" |
| | | @click="handleTransport(scope.row)" |
| | | v-if="shouldShowTransportButton(scope.row)" |
| | | :disabled="!canGoToTransport(scope.row)" |
| | |
| | | <case-detail :caseData="currentCase" @close="detailOpen = false" /> |
| | | </el-dialog> |
| | | |
| | | <!-- 审æ¹å¼¹æ¡ --> |
| | | <!-- ç¡®è®¤å¼¹æ¡ --> |
| | | <el-dialog |
| | | title="æ¡ä¾å®¡æ¹" |
| | | title="æ¡ä¾ç¡®è®¤" |
| | | :visible.sync="approveOpen" |
| | | width="80vw" |
| | | append-to-body |
| | |
| | | </div> |
| | | </el-aside> |
| | | |
| | | <!-- å³ä¾§ï¼å®¡æ¹è¡¨å --> |
| | | <!-- å³ä¾§ï¼ç¡®è®¤è¡¨å --> |
| | | <el-main style="padding: 20px;"> |
| | | <el-form |
| | | ref="approveForm" |
| | |
| | | :rules="approveRules" |
| | | label-width="100px" |
| | | > |
| | | <el-form-item label="审æ¹ç»æ" prop="approveResult"> |
| | | <el-form-item label="ç¡®è®¤ç»æ" prop="approveResult"> |
| | | <el-radio-group v-model="approveForm.approveResult"> |
| | | <el-radio label="3">åæ</el-radio> |
| | | <el-radio label="4">驳å</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="å®¡æ¹æè§" prop="approveOpinion"> |
| | | <el-form-item label="确认æè§" prop="approveOpinion"> |
| | | <el-input |
| | | type="textarea" |
| | | v-model="approveForm.approveOpinion" |
| | | placeholder="请è¾å
¥è¯¦ç»çå®¡æ¹æè§ï¼å
æ¬éè¿æé©³åççç±" |
| | | placeholder="请è¾å
¥è¯¦ç»ç确认æè§ï¼å
æ¬éè¿æé©³åççç±" |
| | | :rows="6" |
| | | maxlength="500" |
| | | show-word-limit |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æç®è
å§å" prop="name"> |
| | | <el-form-item label="æ£è
å§å" prop="name"> |
| | | <el-input |
| | | v-model="editForm.name" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | placeholder="请è¾å
¥æ£è
å§å" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | placeholder="è¯·éæ©è¡å" |
| | | 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="Aå" :value="1" /> |
| | | <el-option label="Bå" :value="2" /> |
| | | <el-option label="Oå" :value="3" /> |
| | | <el-option label="ABå" :value="4" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | caseList: [], |
| | | // 详æ
å¼¹æ¡æ¯å¦æ¾ç¤º |
| | | detailOpen: false, |
| | | // 审æ¹å¼¹æ¡æ¯å¦æ¾ç¤º |
| | | // ç¡®è®¤å¼¹æ¡æ¯å¦æ¾ç¤º |
| | | approveOpen: false, |
| | | // ç¼è¾å¼¹æ¡æ¯å¦æ¾ç¤º |
| | | editOpen: false, |
| | |
| | | name: undefined, |
| | | reportStatus: undefined |
| | | }, |
| | | // 审æ¹è¡¨å |
| | | // 确认表å |
| | | approveForm: { |
| | | id: null, |
| | | approveResult: "3", |
| | | approveOpinion: "" |
| | | }, |
| | | // 审æ¹è¡¨åéªè¯ |
| | | // 确认表åéªè¯ |
| | | approveRules: { |
| | | approveResult: [ |
| | | { required: true, message: "è¯·éæ©å®¡æ¹ç»æ", trigger: "change" } |
| | | { required: true, message: "è¯·éæ©ç¡®è®¤ç»æ", trigger: "change" } |
| | | ], |
| | | approveOpinion: [ |
| | | { required: true, message: "请è¾å
¥å®¡æ¹æè§", trigger: "blur" } |
| | | { required: true, message: "请è¾å
¥ç¡®è®¤æè§", trigger: "blur" } |
| | | ] |
| | | }, |
| | | // ç¼è¾è¡¨å |
| | |
| | | { required: true, message: "请è¾å
¥æ¡ä¾ç¼å·", trigger: "blur" } |
| | | ], |
| | | name: [ |
| | | { required: true, message: "请è¾å
¥æç®è
å§å", trigger: "blur" } |
| | | { required: true, message: "请è¾å
¥æ£è
å§å", trigger: "blur" } |
| | | ], |
| | | sex: [{ required: true, message: "è¯·éæ©æ§å«", trigger: "change" }], |
| | | age: [{ required: true, message: "请è¾å
¥å¹´é¾", trigger: "blur" }], |
| | |
| | | statusFilter(reportStatus) { |
| | | const statusMap = { |
| | | "1": "info", // 已䏿¥ |
| | | "2": "warning", // å·²é
读ï¼å¾
审æ¹ï¼ |
| | | "2": "warning", // å·²é
读ï¼å¾
ç¡®è®¤ï¼ |
| | | "3": "success", // å·²åæ |
| | | "4": "danger" // 已驳å |
| | | }; |
| | |
| | | ) { |
| | | return "æ¥ç转è¿å"; |
| | | } else { |
| | | return "åå¾è½¬è¿å"; |
| | | return "å建转è¿å"; |
| | | } |
| | | } |
| | | return "转è¿"; |
| | | return "æ é转è¿"; |
| | | }, |
| | | |
| | | getTransportStatustype(row) { |
| | | if (row.isTransport == "1") { |
| | | return "info"; // ä¸éè¦è½¬è¿ |
| | | } |
| | | if ( |
| | | row.serviceTransport && |
| | | Array.isArray(row.serviceTransport) && |
| | | row.serviceTransport.length > 0 |
| | | ) { |
| | | // æ ¹æ®è½¬è¿åç¶ææ¾ç¤ºä¸åé¢è² |
| | | const transport = row.serviceTransport[0]; |
| | | if (transport.transitStatus) { |
| | | return "primary"; // æè½¬è¿ä¿¡æ¯ä½æ ç¶æ |
| | | } |
| | | return "primary"; // æè½¬è¿ä¿¡æ¯ä½æ ç¶æ |
| | | } |
| | | return "success"; // éè¦è½¬è¿ä½æ 转è¿ä¿¡æ¯ |
| | | }, |
| | | /** è·å转è¿ç¶ææ ç¾æ ·å¼ */ |
| | | getTransportStatusTag(row) { |
| | | if (row.isTransport === "1") { |
| | |
| | | } |
| | | return "primary"; // æè½¬è¿ä¿¡æ¯ä½æ ç¶æ |
| | | } |
| | | return "danger"; // éè¦è½¬è¿ä½æ 转è¿ä¿¡æ¯ |
| | | return "success"; // éè¦è½¬è¿ä½æ 转è¿ä¿¡æ¯ |
| | | }, |
| | | |
| | | /** è·å转è¿ç¶æææ¬ */ |
| | |
| | | ) { |
| | | // å·²æè½¬è¿åï¼è·³è½¬å°è½¬è¿å详æ
页 |
| | | const transport = caseData.serviceTransport[0]; |
| | | this.goToTransportDetail(transport.id, row.caseNo); |
| | | this.goToTransportDetail(transport.id, row.name); |
| | | } else { |
| | | // 没æè½¬è¿åï¼è·³è½¬å°å建转è¿åé¡µé¢ |
| | | this.goToCreateTransport(row); |
| | |
| | | |
| | | /** 跳转å°å建转è¿åé¡µé¢ */ |
| | | goToCreateTransport(caseData) { |
| | | // è¿éå¯ä»¥è·³è½¬å°å建转è¿åçé¡µé¢ |
| | | // æ¹å¼1ï¼å¨æ°é¡µé¢æå¼ |
| | | this.$router.push({ |
| | | path: "/report/transfer", |
| | | query: { |
| | | autoCreate: "true", |
| | | autoCreate: "true", //è·³è½¬è½¬è¿æ è¯ |
| | | caseId: caseData.id, |
| | | caseNo: caseData.caseNo, |
| | | patName: caseData.name, |
| | |
| | | treatmentHospitalName: caseData.treatmenthospitalname |
| | | } |
| | | }); |
| | | |
| | | // æ¹å¼2ï¼å¨å½å页颿å¼å¼¹æ¡ï¼æ¨èï¼ |
| | | // this.openTransportDialog(caseData); |
| | | }, |
| | | |
| | | /** æå¼è½¬è¿åå¼¹æ¡ */ |
| | |
| | | }, |
| | | |
| | | /** 跳转å°è½¬è¿å详æ
页 */ |
| | | goToTransportDetail(transportId, caseNo) { |
| | | goToTransportDetail(transportId, name) { |
| | | this.$router.push({ |
| | | path: "/report/transfer", |
| | | query: { |
| | | id: transportId, |
| | | caseNo: caseNo |
| | | autoCreate: "true", |
| | | patName: name |
| | | } |
| | | }); |
| | | }, |
| | |
| | | }); |
| | | }, |
| | | |
| | | /** å®¡æ¹æé®æä½ */ |
| | | /** 确认æé®æä½ */ |
| | | async handleApprove(row) { |
| | | try { |
| | | const response = await donateInfo(row.id); |
| | |
| | | this.approveForm.approveResult = "3"; |
| | | this.approveForm.approveOpinion = ""; |
| | | this.approveOpen = true; |
| | | this.$modal.msgError("è·å详æ
失败ï¼ä½å·²æå¼å®¡æ¹çªå£"); |
| | | this.$modal.msgError("è·å详æ
失败ï¼ä½å·²æå¼ç¡®è®¤çªå£"); |
| | | } |
| | | }, |
| | | |
| | | /** æäº¤å®¡æ¹ */ |
| | | /** æäº¤ç¡®è®¤ */ |
| | | async submitApprove() { |
| | | try { |
| | | const valid = await this.$refs.approveForm.validate(); |
| | |
| | | }; |
| | | |
| | | await donateEdit(approveData); |
| | | this.$modal.msgSuccess("å®¡æ¹æå"); |
| | | this.$modal.msgSuccess("确认æå"); |
| | | this.approveOpen = false; |
| | | this.getList(); |
| | | } |
| | | } catch (error) { |
| | | console.error("审æ¹å¤±è´¥:", error); |
| | | console.error("确认失败:", error); |
| | | if (error !== "cancel") { |
| | | this.$modal.msgError("审æ¹å¤±è´¥"); |
| | | this.$modal.msgError("确认失败"); |
| | | } |
| | | } |
| | | }, |
| | |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | /* 审æ¹å¼¹æ¡æ ·å¼ */ |
| | | /* ç¡®è®¤å¼¹æ¡æ ·å¼ */ |
| | | .approve-dialog >>> .el-dialog__body { |
| | | padding: 0; |
| | | } |
| | |
| | | <template> |
| | | <div class="assessment-detail"> |
| | | <el-card class="basic-info-card"> |
| | | <!-- åºç¡æ¡ä¾ä¿¡æ¯ --> |
| | | <case-basic-info |
| | | :case-id="caseId" |
| | | :show-attachment="true" |
| | | /> |
| | | <!-- <el-card class="basic-info-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>æ¡ä¾åºæ¬ä¿¡æ¯</span> |
| | | <el-button |
| | |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | </el-card> --> |
| | | |
| | | <el-card class="organ-assessment-card"> |
| | | <div slot="header" class="clearfix"> |
| | |
| | | </el-tab-pane> |
| | | |
| | | <!-- è¯ä¼°æ±æ»Tab --> |
| | | <el-tab-pane label="è¯ä¼°æ±æ»" name="summary"> |
| | | <div class="assessment-summary"> |
| | | <!-- åºæ¬ä¿¡æ¯æ±æ» --> |
| | | <el-descriptions title="åºæ¬ä¿¡æ¯æ±æ»" :column="2" border> |
| | | <el-descriptions-item label="å¨å®ç±»å"> |
| | | <span class="summary-item">{{ getOrganLabel(scope.row.organno) }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è·åæºæ"> |
| | | <span class="summary-item">{{ scope.row.gainhospitalname }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°æ¬¡æ°" :span="2"> |
| | | <el-tag type="info" size="medium"> |
| | | {{ getAssessmentCount(scope.row) }}次 |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ææ°è¯ä¼°æ¶é´" :span="2"> |
| | | <span class="highlight-text">{{ getLatestAssessmentTime(scope.row) || "-" }}</span> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | <el-tab-pane label="è¯ä¼°æ±æ»" name="summary"> |
| | | <div class="assessment-summary"> |
| | | <!-- åºæ¬ä¿¡æ¯æ±æ» --> |
| | | <el-descriptions title="åºæ¬ä¿¡æ¯æ±æ»" :column="2" border> |
| | | <el-descriptions-item label="å¨å®ç±»å"> |
| | | <span class="summary-item">{{ |
| | | getOrganLabel(scope.row.organno) |
| | | }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è·åæºæ"> |
| | | <span class="summary-item">{{ |
| | | scope.row.gainhospitalname |
| | | }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°æ¬¡æ°" :span="2"> |
| | | <el-tag type="info" size="medium"> |
| | | {{ getAssessmentCount(scope.row) }}次 |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ææ°è¯ä¼°æ¶é´" :span="2"> |
| | | <span class="highlight-text">{{ |
| | | getLatestAssessmentTime(scope.row) || "-" |
| | | }}</span> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <!-- è¯ä¼°è¯¦æ
æ±æ» --> |
| | | <el-card header="è¯ä¼°è¯¦æ
å表" style="margin-top: 20px;" class="assessment-detail-card"> |
| | | <div v-if="getOrganAssessments(scope.row).length === 0" class="no-assessment"> |
| | | <el-empty description="ææ è¯ä¼°è®°å½"></el-empty> |
| | | </div> |
| | | <!-- è¯ä¼°è¯¦æ
æ±æ» --> |
| | | <el-card |
| | | header="è¯ä¼°è¯¦æ
å表" |
| | | style="margin-top: 20px;" |
| | | class="assessment-detail-card" |
| | | > |
| | | <div |
| | | v-if="getOrganAssessments(scope.row).length === 0" |
| | | class="no-assessment" |
| | | > |
| | | <el-empty description="ææ è¯ä¼°è®°å½"></el-empty> |
| | | </div> |
| | | |
| | | <div v-else> |
| | | <!-- æ¯æ¬¡è¯ä¼°è¯¦æ
--> |
| | | <div v-for="(assessment, index) in getOrganAssessments(scope.row)" |
| | | :key="index" |
| | | class="assessment-item"> |
| | | <el-card shadow="hover" class="assessment-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="assessment-title">第{{ index + 1 }}次è¯ä¼°</span> |
| | | <el-tag |
| | | :type="getAssessmentTagType(assessment.status)" |
| | | size="small" |
| | | class="status-tag" |
| | | > |
| | | {{ getAssessmentStatusText(assessment.status) }} |
| | | </el-tag> |
| | | </div> |
| | | <div v-else> |
| | | <!-- æ¯æ¬¡è¯ä¼°è¯¦æ
--> |
| | | <div |
| | | v-for="(assessment, index) in getOrganAssessments( |
| | | scope.row |
| | | )" |
| | | :key="index" |
| | | class="assessment-item" |
| | | > |
| | | <el-card shadow="hover" class="assessment-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="assessment-title" |
| | | >第{{ index + 1 }}次è¯ä¼°</span |
| | | > |
| | | <el-tag |
| | | :type="getAssessmentTagType(assessment.status)" |
| | | size="small" |
| | | class="status-tag" |
| | | > |
| | | {{ getAssessmentStatusText(assessment.status) }} |
| | | </el-tag> |
| | | </div> |
| | | |
| | | <el-descriptions :column="2" border class="detail-descriptions"> |
| | | <el-descriptions-item label="è¯ä¼°æ¶é´" :span="2"> |
| | | <span class="time-text">{{ assessment.assessmentTime || "-" }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions |
| | | :column="2" |
| | | border |
| | | class="detail-descriptions" |
| | | > |
| | | <el-descriptions-item label="è¯ä¼°æ¶é´" :span="2"> |
| | | <span class="time-text">{{ |
| | | assessment.assessmentTime || "-" |
| | | }}</span> |
| | | </el-descriptions-item> |
| | | |
| | | <el-descriptions-item label="è¯ä¼°äºº"> |
| | | <el-tag type="info" size="small"> |
| | | {{ assessment.assessor || "æªå¡«å" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°äºº"> |
| | | <el-tag type="info" size="small"> |
| | | {{ assessment.assessor || "æªå¡«å" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | |
| | | <el-descriptions-item label="åè½ç¶æ"> |
| | | <el-tag |
| | | :type="getFunctionStatusTagType(assessment.functionStatus)" |
| | | size="small" |
| | | > |
| | | {{ getFunctionStatusText(assessment.functionStatus) }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="åè½ç¶æ"> |
| | | <el-tag |
| | | :type=" |
| | | getFunctionStatusTagType( |
| | | assessment.functionStatus |
| | | ) |
| | | " |
| | | size="small" |
| | | > |
| | | {{ |
| | | getFunctionStatusText( |
| | | assessment.functionStatus |
| | | ) |
| | | }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | |
| | | <el-descriptions-item label="è¯ä¼°æè§" :span="2"> |
| | | <div class="opinion-content"> |
| | | {{ assessment.assessmentOpinion || "ææ è¯ä¼°æè§" }} |
| | | </div> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°æè§" :span="2"> |
| | | <div class="opinion-content"> |
| | | {{ |
| | | assessment.assessmentOpinion || |
| | | "ææ è¯ä¼°æè§" |
| | | }} |
| | | </div> |
| | | </el-descriptions-item> |
| | | |
| | | <el-descriptions-item label="éä»¶æ°é" :span="2" v-if="assessment.attachments && assessment.attachments.length > 0"> |
| | | <el-tag type="success" size="small"> |
| | | {{ assessment.attachments.length }}个 |
| | | </el-tag> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click="showAttachmentList(assessment.attachments, index + 1)" |
| | | style="margin-left: 10px;" |
| | | > |
| | | æ¥çéä»¶å表 |
| | | </el-button> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | <el-descriptions-item |
| | | label="éä»¶æ°é" |
| | | :span="2" |
| | | v-if=" |
| | | assessment.attachments && |
| | | assessment.attachments.length > 0 |
| | | " |
| | | > |
| | | <el-tag type="success" size="small"> |
| | | {{ assessment.attachments.length }}个 |
| | | </el-tag> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click=" |
| | | showAttachmentList( |
| | | assessment.attachments, |
| | | index + 1 |
| | | ) |
| | | " |
| | | style="margin-left: 10px;" |
| | | > |
| | | æ¥çéä»¶å表 |
| | | </el-button> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | |
| | | <!-- å¨å®åºæ¬ä¿¡æ¯å¡ç --> |
| | | <el-card header="å¨å®ä¿¡æ¯" style="margin-top: 20px;" class="organ-info-card"> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="è·ååæ´»æ£"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.isbiopsybefore === '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | {{ scope.row.isbiopsybefore === "1" ? "æ¯" : "å¦" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è·ååæ´»æ£"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.isbiopsyafter === '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | {{ scope.row.isbiopsyafter === "1" ? "æ¯" : "å¦" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¾¹ç¼å¨å®"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.ismarginalorgan === '1' |
| | | ? 'warning' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | {{ |
| | | scope.row.ismarginalorgan === "1" ? "æ¯" : "å¦" |
| | | }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ç
åè鳿§"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.ispathogenpositive === '1' |
| | | ? 'danger' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | {{ |
| | | scope.row.ispathogenpositive === "1" ? "æ¯" : "å¦" |
| | | }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | <!-- å¨å®åºæ¬ä¿¡æ¯å¡ç --> |
| | | <el-card |
| | | header="å¨å®ä¿¡æ¯" |
| | | style="margin-top: 20px;" |
| | | class="organ-info-card" |
| | | > |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="è·ååæ´»æ£"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.isbiopsybefore === '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | {{ scope.row.isbiopsybefore === "1" ? "æ¯" : "å¦" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è·ååæ´»æ£"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.isbiopsyafter === '1' |
| | | ? 'success' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | {{ scope.row.isbiopsyafter === "1" ? "æ¯" : "å¦" }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¾¹ç¼å¨å®"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.ismarginalorgan === '1' |
| | | ? 'warning' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | {{ |
| | | scope.row.ismarginalorgan === "1" ? "æ¯" : "å¦" |
| | | }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ç
åè鳿§"> |
| | | <el-tag |
| | | :type=" |
| | | scope.row.ispathogenpositive === '1' |
| | | ? 'danger' |
| | | : 'info' |
| | | " |
| | | size="small" |
| | | > |
| | | {{ |
| | | scope.row.ispathogenpositive === "1" ? "æ¯" : "å¦" |
| | | }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | </template> |
| | |
| | | assessedit, |
| | | assessAdd |
| | | } from "@/api/businessApi/index"; |
| | | import CaseBasicInfo from "@/components/CaseBasicInfo"; |
| | | import FilePreviewDialog from "@/components/FilePreviewDialog"; |
| | | import OrganAssessmentForm from "@/components/assessInfoComponents/OrganAssessmentForm.vue"; |
| | | |
| | | export default { |
| | | name: "AssessmentDetail", |
| | | components: { OrganAssessmentForm, FilePreviewDialog }, |
| | | components: { OrganAssessmentForm, FilePreviewDialog, CaseBasicInfo }, |
| | | dicts: ["sys_user_sex", "sys_Organ", "sys_0_1"], |
| | | data() { |
| | | return { |
| | | caseId: null, |
| | | // æ¯å¦ç¼è¾æ¨¡å¼ |
| | | isEdit: false, |
| | | // å è½½ç¶æ |
| | |
| | | }, |
| | | created() { |
| | | this.infoid = this.$route.query.infoid; |
| | | this.caseId = this.infoid; |
| | | this.assessmentId = this.$route.query.id; |
| | | this.isEdit = this.$route.query.assess === "true"; |
| | | this.getAssessmentDetail(); |
| | |
| | | this.activeTabMap.set(organ.organno, tab.name); |
| | | } |
| | | }, |
| | | // è·ååè½ç¶ææ ç¾ç±»å |
| | | getFunctionStatusTagType(status) { |
| | | const typeMap = { |
| | | "1": "success", // æ£å¸¸ |
| | | "2": "warning", // 轻度å¼å¸¸ |
| | | "3": "danger", // é度å¼å¸¸ |
| | | "4": "info" // æ æ³è¯ä¼° |
| | | }; |
| | | return typeMap[status] || "info"; |
| | | }, |
| | | // è·ååè½ç¶ææ ç¾ç±»å |
| | | getFunctionStatusTagType(status) { |
| | | const typeMap = { |
| | | "1": "success", // æ£å¸¸ |
| | | "2": "warning", // 轻度å¼å¸¸ |
| | | "3": "danger", // é度å¼å¸¸ |
| | | "4": "info" // æ æ³è¯ä¼° |
| | | }; |
| | | return typeMap[status] || "info"; |
| | | }, |
| | | |
| | | // è·ååè½ç¶æææ¬ |
| | | getFunctionStatusText(status) { |
| | | const textMap = { |
| | | "1": "æ£å¸¸", |
| | | "2": "轻度å¼å¸¸", |
| | | "3": "é度å¼å¸¸", |
| | | "4": "æ æ³è¯ä¼°" |
| | | }; |
| | | return textMap[status] || "æªè¯ä¼°"; |
| | | }, |
| | | // è·ååè½ç¶æææ¬ |
| | | getFunctionStatusText(status) { |
| | | const textMap = { |
| | | "1": "æ£å¸¸", |
| | | "2": "轻度å¼å¸¸", |
| | | "3": "é度å¼å¸¸", |
| | | "4": "æ æ³è¯ä¼°" |
| | | }; |
| | | return textMap[status] || "æªè¯ä¼°"; |
| | | }, |
| | | |
| | | // æ¾ç¤ºéä»¶å表 |
| | | showAttachmentList(attachments, assessmentNumber) { |
| | | if (!attachments || attachments.length === 0) { |
| | | this.$message.info(`第${assessmentNumber}次è¯ä¼°ææ éä»¶`); |
| | | return; |
| | | } |
| | | // æ¾ç¤ºéä»¶å表 |
| | | showAttachmentList(attachments, assessmentNumber) { |
| | | if (!attachments || attachments.length === 0) { |
| | | this.$message.info(`第${assessmentNumber}次è¯ä¼°ææ éä»¶`); |
| | | return; |
| | | } |
| | | |
| | | this.$alert( |
| | | `<div> |
| | | this.$alert( |
| | | `<div> |
| | | <h4>第${assessmentNumber}次è¯ä¼°éä»¶å表</h4> |
| | | <ul style="list-style: none; padding-left: 0;"> |
| | | ${attachments.map((item, index) => ` |
| | | ${attachments |
| | | .map( |
| | | (item, index) => ` |
| | | <li style="margin: 5px 0; padding: 5px; background: #f5f7fa; border-radius: 4px;"> |
| | | <i class="el-icon-document"></i> |
| | | <span style="margin-left: 8px;">${item.fileName}</span> |
| | |
| | | ä¸è½½ |
| | | </el-button> |
| | | </li> |
| | | `).join('')} |
| | | ` |
| | | ) |
| | | .join("")} |
| | | </ul> |
| | | </div>`, |
| | | 'éä»¶å表', |
| | | { |
| | | dangerouslyUseHTMLString: true, |
| | | showConfirmButton: false, |
| | | showCancelButton: true, |
| | | cancelButtonText: 'å
³é' |
| | | } |
| | | ); |
| | | }, |
| | | "éä»¶å表", |
| | | { |
| | | dangerouslyUseHTMLString: true, |
| | | showConfirmButton: false, |
| | | showCancelButton: true, |
| | | cancelButtonText: "å
³é" |
| | | } |
| | | ); |
| | | }, |
| | | // è·åå¨å®çè¯ä¼°å表 |
| | | getOrganAssessments(organ) { |
| | | if (!organ.assesscontent) return []; |
| | |
| | | |
| | | if (response.code === 200) { |
| | | this.$message.success("è¯ä¼°è¡¨ä¿åæåï¼"); |
| | | if (!this.assessmentData.id && response.data && response.data.id) { |
| | | this.assessmentData.id = response.data.id; |
| | | if (!this.assessmentData.id && response.data) { |
| | | this.assessmentData.id = response.data; |
| | | } |
| | | this.refreshKey += 1; // 触åéæ°æ¸²æ |
| | | } else { |
| | |
| | | } else { |
| | | detailData = response; |
| | | } |
| | | |
| | | this.assessmentData = { |
| | | id: detailData.id || this.assessmentId, |
| | | infoid: detailData.infoid || this.infoid, |
| | |
| | | } |
| | | |
| | | .highlight-text { |
| | | color: #409EFF; |
| | | color: #409eff; |
| | | font-weight: 500; |
| | | } |
| | | |
| | |
| | | |
| | | .assessment-card:hover { |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | border-color: #409EFF; |
| | | border-color: #409eff; |
| | | } |
| | | |
| | | .assessment-title { |
| | |
| | | } |
| | | |
| | | .time-text { |
| | | color: #67C23A; |
| | | color: #67c23a; |
| | | font-weight: 500; |
| | | } |
| | | |
| | |
| | | background-color: #fafafa; |
| | | } |
| | | |
| | | ::v-deep .el-table--enable-row-hover .el-table__body tr:hover>td { |
| | | ::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td { |
| | | background-color: #ecf5ff; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | ::v-deep .el-tabs__item.is-active { |
| | | color: #409EFF; |
| | | color: #409eff; |
| | | font-weight: 600; |
| | | } |
| | | |
| | |
| | | background-color: #e4e7ed; |
| | | } |
| | | |
| | | ::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active { |
| | | ::v-deep .el-tabs--card > .el-tabs__header .el-tabs__item.is-active { |
| | | background-color: #fff; |
| | | border-bottom-color: #fff; |
| | | } |
| | |
| | | width="120" |
| | | /> |
| | | <el-table-column |
| | | label="æ½å¨æç®è
å§å" |
| | | label="æç®è
å§å" |
| | | align="center" |
| | | prop="name" |
| | | width="120" |
| | |
| | | <template> |
| | | <div class="death-judgment-detail"> |
| | | <case-basic-info :case-id="caseId" :show-attachment="true" /> |
| | | <el-card class="detail-card"> |
| | | <!-- åºç¡ä¿¡æ¯ --> |
| | | <div slot="header" class="clearfix"> |
| | |
| | | <el-form :model="form" ref="form" :rules="rules" label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®è
ç¼å·" prop="donorno"> |
| | | <el-input |
| | | v-model="form.donorno" |
| | | :readonly="!isEdit" |
| | | placeholder="èªå¨çææç®è
ç¼å·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®è
å§å" prop="name"> |
| | | <el-input v-model="form.name" :readonly="!isEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ§å«" prop="sex"> |
| | | <el-select |
| | | v-model="form.sex" |
| | | :disabled="!isEdit" |
| | | style="width: 100%" |
| | | > |
| | | <el-option label="ç·" value="1" /> |
| | | <el-option label="女" value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å¹´é¾" prop="age"> |
| | | <el-input v-model="form.age" :readonly="!isEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosisname"> |
| | | <el-input v-model="form.diagnosisname" :readonly="!isEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ»äº¡åå " prop="deathreason"> |
| | | <el-select |
| | | <el-input v-model="form.deathreason" :readonly="!isEdit" /> |
| | | <!-- <el-select |
| | | v-model="form.deathreason" |
| | | :disabled="!isEdit" |
| | | style="width: 100%" |
| | |
| | | <el-option label="èæ»äº¡" value="brain_death" /> |
| | | <el-option label="å¿æ»äº¡" value="heart_death" /> |
| | | <el-option label="å
¶ä»" value="other" /> |
| | | </el-select> |
| | | </el-select> --> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è´è´£äºº" prop="responsibleusername"> |
| | | <el-input |
| | | v-model="form.responsibleusername" |
| | | :readonly="!isEdit" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <!-- <el-col :span="8"> |
| | | <el-form-item label="è®°å½ç¶æ" prop="recordstate"> |
| | | <el-tag :type="getStatusTag(form.recordstate)"> |
| | | {{ getStatusText(form.recordstate) }} |
| | | </el-tag> |
| | | </el-form-item> |
| | | </el-col> --> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¯å¦æ¢å¤éä½ä»ªå®¹" prop="isrestoreremains"> |
| | | <el-form-item label="æ¢å¤éä½ä»ªå®¹" prop="isrestoreremains"> |
| | | <el-select |
| | | v-model="form.isrestoreremains" |
| | | :disabled="!isEdit" |
| | |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è´è´£äºº" prop="responsibleusername"> |
| | | <el-input |
| | | v-model="form.responsibleusername" |
| | | :readonly="!isEdit" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è®°å½ç¶æ" prop="recordstate"> |
| | | <el-tag :type="getStatusTag(form.recordstate)"> |
| | | {{ getStatusText(form.recordstate) }} |
| | | </el-tag> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-form-item label="æ»äº¡å¤å®è¯´æ" prop="judgmentDescription"> |
| | | <el-form-item label="æ»äº¡å¤å®è¯´æ" prop="remark"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="3" |
| | | v-model="form.judgmentDescription" |
| | | v-model="form.remark" |
| | | :readonly="!isEdit" |
| | | placeholder="详ç»è®°å½æ»äº¡å¤å®è¿ç¨å便®" |
| | | /> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { deathinfoedit, deathinfoInfo } from "@/api/businessApi"; |
| | | import { |
| | | deathinfoedit, |
| | | deathinfoadd, |
| | | queryDathInfoBaseInfo |
| | | } from "@/api/businessApi"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import CaseBasicInfo from "@/components/CaseBasicInfo"; |
| | | |
| | | export default { |
| | | name: "DeathJudgmentDetail", |
| | | components: { CaseBasicInfo }, |
| | | |
| | | data() { |
| | | return { |
| | | caseId: null, |
| | | // æ¯å¦ç¼è¾æ¨¡å¼ |
| | | isEdit: false, |
| | | // ä¿åå è½½ç¶æ |
| | | saveLoading: false, |
| | | infoid: undefined, |
| | | |
| | | // è¡¨åæ°æ® |
| | | form: { |
| | | id: undefined, |
| | |
| | | gainhospitalname: "", |
| | | isspendremember: 0, |
| | | isrestoreremains: 0, |
| | | rememberannex: "", |
| | | rememberAnnex: "", |
| | | responsibleuserid: "", |
| | | responsibleusername: "", |
| | | recordstate: "0", |
| | |
| | | } |
| | | }, |
| | | created() { |
| | | this.infoid = this.$route.query.infoid; |
| | | this.caseId = this.infoid; |
| | | const id = this.$route.query.id; |
| | | this.isEdit = this.$route.query.isEdit; |
| | | if (id && !this.$route.path.includes("/add")) { |
| | | this.getDetail(id); |
| | | } else if (this.$route.path.includes("/add")) { |
| | | this.generateDonorNo(); |
| | | } |
| | | this.getDetail(this.infoid); |
| | | |
| | | // if (id && !this.$route.path.includes("/add")) { |
| | | // this.getDetail(id); |
| | | // } else if (this.$route.path.includes("/add")) { |
| | | // this.generateDonorNo(); |
| | | // } |
| | | this.getAttachmentList(); |
| | | }, |
| | | methods: { |
| | |
| | | this.form.donorno = "DONOR" + timestamp.slice(-8); |
| | | }, |
| | | // è·å详æ
|
| | | async getDetail(id) { |
| | | async getDetail(infoid) { |
| | | try { |
| | | const response = await deathinfoInfo(id); |
| | | const response = await queryDathInfoBaseInfo({ infoid }); |
| | | let realData = {}; |
| | | |
| | | if (response && response.data) { |
| | | realData = response.data; |
| | | realData = response.data[0]; |
| | | } else if (response) { |
| | | realData = response; |
| | | } |
| | |
| | | }; |
| | | |
| | | // è§£æéä»¶ä¿¡æ¯ |
| | | if (realData.rememberannex) { |
| | | this.parseAttachmentData(realData.rememberannex); |
| | | if (realData.rememberAnnex) { |
| | | this.parseAttachmentData(realData.rememberAnnex); |
| | | } |
| | | } catch (error) { |
| | | console.error("è·åæ»äº¡å¤å®è¯¦æ
失败:", error); |
| | |
| | | } |
| | | |
| | | // æ´æ°éä»¶JSONæ°æ®å°è¡¨å |
| | | this.form.rememberannex = this.buildAttachmentJson(); |
| | | this.form.rememberAnnex = this.buildAttachmentJson(); |
| | | |
| | | this.$message.success("æä»¶ä¸ä¼ æå"); |
| | | this.uploadDialogVisible = false; |
| | |
| | | // } |
| | | |
| | | // // æ´æ°éä»¶JSONæ°æ®å°è¡¨å |
| | | // this.form.rememberannex = this.buildAttachmentJson(); |
| | | // this.form.rememberAnnex = this.buildAttachmentJson(); |
| | | |
| | | // this.$message.success("æä»¶ä¸ä¼ æå"); |
| | | // this.uploadDialogVisible = false; |
| | |
| | | if (index !== -1) { |
| | | this.attachmentList.splice(index, 1); |
| | | // æ´æ°éä»¶JSONæ°æ®å°è¡¨å |
| | | this.form.rememberannex = this.buildAttachmentJson(); |
| | | this.form.rememberAnnex = this.buildAttachmentJson(); |
| | | this.$message.success("è¯ä¼°è¡¨å 餿å"); |
| | | } |
| | | }) |
| | |
| | | // æå»ºæäº¤æ°æ® |
| | | const submitData = { |
| | | ...this.form, |
| | | infoid: this.infoid, |
| | | // ç¡®ä¿éä»¶æ°æ®ææ° |
| | | rememberannex: this.buildAttachmentJson() |
| | | }; |
| | | let response = null; |
| | | |
| | | const response = await deathinfoedit(submitData); |
| | | if (submitData.id) { |
| | | response = await deathinfoedit(submitData); |
| | | } else { |
| | | response = await deathinfoadd(submitData); |
| | | } |
| | | // const response = await deathinfoedit(submitData); |
| | | |
| | | if (response.code === 200) { |
| | | this.$message.success("ä¿åæå"); |
| | | this.isEdit = false; |
| | | |
| | | if (!this.form.id) { |
| | | this.form.id = response.data; |
| | | } |
| | | if (this.$route.path.includes("/add")) { |
| | | this.$router.push("/case/deathJudgment"); |
| | | } |
| | |
| | | <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 type="primary" icon="el-icon-plus" @click="handleCreate" |
| | | >æ°å»ºæ»äº¡å¤å®</el-button |
| | | > |
| | | <el-button |
| | |
| | | :disabled="single" |
| | | @click="handleUpdate" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | > --> |
| | | <el-button |
| | | type="warning" |
| | | icon="el-icon-download" |
| | |
| | | handleView(row) { |
| | | this.$router.push({ |
| | | path: "/case/DecideInfo", |
| | | query: { id: row.id } |
| | | query: { id: row.id,infoid:row.infoid } |
| | | }); |
| | | }, |
| | | |
| | |
| | | const id = row.id || this.ids[0]; |
| | | this.$router.push({ |
| | | path: "/case/DecideInfo", |
| | | query: { id: id, isEdit: true } |
| | | query: { id: id,infoid:row.infoid, isEdit: true } |
| | | }); |
| | | }, |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="ethics-review-detail"> |
| | | <el-card class="detail-card"> |
| | | <!-- åºç¡ä¿¡æ¯ --> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">伦ç审æ¥åºæ¬ä¿¡æ¯</span> |
| | | <div style="float: right;"> |
| | | <el-button type="primary" @click="handleSave" :loading="saveLoading"> |
| | | ä¿å |
| | | </el-button> |
| | | |
| | | <el-button |
| | | type="warning" |
| | | @click="handleEndReview" |
| | | :disabled="form.ethicsConclusion === 'terminated'" |
| | | > |
| | | ç»æå®¡æ¥ |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | |
| | | <el-form :model="form" ref="form" :rules="rules" label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä½é¢å·" prop="hospitalNo"> |
| | | <el-input v-model="form.hospitalNo" readonly /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-input v-model="form.donorName" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ§å«" prop="gender"> |
| | | <el-select v-model="form.gender" style="width: 100%"> |
| | | <el-option label="ç·" value="0" /> |
| | | <el-option label="女" value="1" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å¹´é¾" prop="age"> |
| | | <el-input v-model="form.age" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="16"> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosis"> |
| | | <el-input v-model="form.diagnosis" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="伦çç»è®º" prop="ethicsConclusion"> |
| | | <el-select v-model="form.ethicsConclusion" style="width: 100%"> |
| | | <el-option label="审æ¥ä¸" value="reviewing" /> |
| | | <el-option label="åæ" value="approved" /> |
| | | <el-option |
| | | label="ä¿®æ¹ååæ" |
| | | value="approved_with_modifications" |
| | | /> |
| | | <el-option label="ä¿®æ¹åé审" value="re-review" /> |
| | | <el-option label="ä¸åæ" value="disapproved" /> |
| | | <el-option label="ç»æ¢å®¡æ¥" value="terminated" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å®¡æ¥æ¶é´" prop="reviewTime"> |
| | | <el-date-picker |
| | | v-model="form.reviewTime" |
| | | type="datetime" |
| | | 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="registrant"> |
| | | <el-input v-model="form.registrant" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="伦çæè§" prop="ethicsOpinion"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="3" |
| | | v-model="form.ethicsOpinion" |
| | | placeholder="请è¾å
¥ä¼¦çå®¡æ¥æè§" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-form-item label="ç»è®°æ¶é´" prop="registrationTime"> |
| | | <el-date-picker |
| | | v-model="form.registrationTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | <!-- éä»¶ä¸ä¼ --> |
| | | <el-card class="attachment-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">ç¸å
³éä»¶</span> |
| | | <el-button type="primary" size="mini" @click="handleUploadAttachment"> |
| | | ä¸ä¼ éä»¶ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <el-table :data="attachments" style="width: 100%"> |
| | | <el-table-column label="æä»¶åç§°" min-width="200"> |
| | | <template slot-scope="scope"> |
| | | <div class="file-info"> |
| | | <i |
| | | class="el-icon-document" |
| | | style="margin-right: 8px; color: #409EFF;" |
| | | ></i> |
| | | <span>{{ scope.row.fileName }}</span> |
| | | </div> |
| | | </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="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatFileSize(scope.row.fileSize) }}</span> |
| | | </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>{{ scope.row.uploader }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="æä½" width="120" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handlePreviewAttachment(scope.row)" |
| | | >é¢è§</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-download" |
| | | @click="handleDownloadAttachment(scope.row)" |
| | | >ä¸è½½</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | <!-- ä¸å®¶å®¡æ¥æ
åµ --> |
| | | <el-card class="expert-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">ä¸å®¶å®¡æ¥æ
åµ (18ä½ä¸å®¶ + 1ä½ä¸»å§ä¸å®¶)</span> |
| | | <div style="float: right;"> |
| | | <el-button |
| | | size="mini" |
| | | type="primary" |
| | | @click="handleSendToNormalExperts" |
| | | :disabled="!canSendToNormalExperts" |
| | | > |
| | | åéä¸å®¶ |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="success" |
| | | @click="handleSendToChiefExpert" |
| | | :disabled="!canSendToChiefExpert" |
| | | > |
| | | åé主å§ä¸å®¶ |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="warning" |
| | | @click="handleBatchSend" |
| | | :disabled="!canBatchSend" |
| | | > |
| | | æ¹éåé |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | <!-- ä¸å®¶ç»è®¡ä¿¡æ¯ --> |
| | | <div |
| | | class="expert-stats" |
| | | style="margin-top: 20px; padding: 15px; background: #f5f7fa; border-radius: 4px;" |
| | | > |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <div class="stat-item"> |
| | | <span class="stat-label">ä¸å®¶å·²åæ:</span> |
| | | <span class="stat-value">{{ approvedNormalExperts }}/18</span> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="stat-item"> |
| | | <span class="stat-label">主å§ä¸å®¶ç¶æ:</span> |
| | | <span class="stat-value">{{ chiefExpertStatus }}</span> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="stat-item"> |
| | | <span class="stat-label">æ»å®æè¿åº¦:</span> |
| | | <span class="stat-value">{{ completionRate }}%</span> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="stat-item"> |
| | | <span class="stat-label">审æ¥ç»æ:</span> |
| | | <span class="stat-value"> |
| | | <el-tag :type="overallConclusionFilter"> |
| | | {{ overallConclusionText }} |
| | | </el-tag> |
| | | </span> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | <!-- ä¸å®¶å®¡æ¥è¡¨æ ¼ --> |
| | | <el-table |
| | | :data="expertReviews" |
| | | v-loading="expertLoading" |
| | | style="width: 100%" |
| | | heiht="800" |
| | | :row-class-name="getExpertRowClassName" |
| | | > |
| | | <el-table-column label="åºå·" width="60" align="center" type="index" /> |
| | | |
| | | <el-table-column |
| | | label="ä¸å®¶å§å" |
| | | width="120" |
| | | align="center" |
| | | fixed="left" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.expertName }}</span> |
| | | <el-tag |
| | | v-if="scope.row.isChief" |
| | | size="mini" |
| | | type="danger" |
| | | style="margin-left: 5px;" |
| | | >主å§</el-tag |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="ä¸å®¶ç±»å" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span :class="scope.row.isChief ? 'chief-expert' : 'normal-expert'"> |
| | | {{ scope.row.isChief ? "主å§ä¸å®¶" : "ä¸å®¶" }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="审æ¥ç¶æ" width="100" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="statusFilter(scope.row.reviewStatus)" size="small"> |
| | | {{ statusTextFilter(scope.row.reviewStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="ä¸å®¶ç»è®º" width="120" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | v-if="scope.row.expertConclusion" |
| | | :type="conclusionFilter(scope.row.expertConclusion)" |
| | | size="small" |
| | | > |
| | | {{ conclusionTextFilter(scope.row.expertConclusion) }} |
| | | </el-tag> |
| | | <span v-else class="no-data">-</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="å®¡æ¥æè§" min-width="200" show-overflow-tooltip> |
| | | <template slot-scope="scope"> |
| | | <span :class="{ 'expert-opinion': scope.row.expertOpinion }"> |
| | | {{ scope.row.expertOpinion || "ææ æè§" }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="å®¡æ¥æ¶é´" width="160" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.reviewTime ? parseTime(scope.row.reviewTime) : "æªå®¡æ¥" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åéæ¶é´" width="160" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.reviewTime ? parseTime(scope.row.reviewTime) : "æªåé" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="æä½" width="280" align="center" fixed="right"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-s-promotion" |
| | | @click="handleSendToExpert(scope.row)" |
| | | :disabled="scope.row.reviewStatus === 'submitted'" |
| | | :class="{ 'sent-button': scope.row.reviewStatus === 'submitted' }" |
| | | > |
| | | {{ scope.row.reviewStatus === "submitted" ? "å·²åé" : "åé" }} |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="handleEditExpertReview(scope.row)" |
| | | :disabled="scope.row.reviewStatus !== 'submitted'" |
| | | > |
| | | ç¼è¾ |
| | | </el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handleViewExpertReview(scope.row)" |
| | | > |
| | | 详æ
|
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <!-- åéä¸å®¶å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | title="åéä¸å®¶å®¡æ¥" |
| | | :visible.sync="sendDialogVisible" |
| | | width="500px" |
| | | > |
| | | <el-form :model="sendForm" ref="sendForm" label-width="100px"> |
| | | <el-form-item label="ä¸å®¶ç±»å" prop="expertType"> |
| | | <el-radio-group v-model="sendForm.expertType"> |
| | | <el-radio label="normal">ä¸å®¶</el-radio> |
| | | <el-radio label="chief">主å§ä¸å®¶</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item |
| | | label="éæ©ä¸å®¶" |
| | | prop="expertIds" |
| | | v-if="sendForm.expertType === 'normal'" |
| | | > |
| | | <el-select |
| | | v-model="sendForm.expertIds" |
| | | multiple |
| | | placeholder="è¯·éæ©ä¸å®¶" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="expert in availableExperts" |
| | | :key="expert.id" |
| | | :label="expert.name" |
| | | :value="expert.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åéå
容" prop="content"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="4" |
| | | v-model="sendForm.content" |
| | | placeholder="请è¾å
¥åéç»ä¸å®¶ç审æ¥å
容说æ" |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer"> |
| | | <el-button @click="sendDialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleSendConfirm" |
| | | >确认åé</el-button |
| | | > |
| | | </div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import { |
| | | getEthicsReviewDetail, |
| | | updateEthicsReview, |
| | | sendExpertReview, |
| | | endEthicsReview, |
| | | uploadAttachment, |
| | | deleteAttachment, |
| | | getAttachments |
| | | } from "./ethicsReview"; |
| | | import { |
| | | reviewinitiateBaseInfoList, |
| | | ethicalreviewedit, |
| | | ethicalreviewadd |
| | | } from "@/api/businessApi"; |
| | | |
| | | export default { |
| | | name: "EthicsReviewDetail", |
| | | data() { |
| | | return { |
| | | // è¡¨åæ°æ® |
| | | form: { |
| | | id: undefined, |
| | | hospitalNo: "", |
| | | donorName: "", |
| | | gender: "", |
| | | age: "", |
| | | diagnosis: "", |
| | | ethicsConclusion: "reviewing", |
| | | ethicsOpinion: "", |
| | | reviewTime: "", |
| | | registrant: "", |
| | | registrationTime: new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19) |
| | | }, |
| | | // 表åéªè¯è§å |
| | | rules: { |
| | | donorName: [ |
| | | { required: true, message: "æç®è
å§åä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ], |
| | | ethicsConclusion: [ |
| | | { required: true, message: "伦çç»è®ºä¸è½ä¸ºç©º", trigger: "change" } |
| | | ], |
| | | reviewTime: [ |
| | | { required: true, message: "å®¡æ¥æ¶é´ä¸è½ä¸ºç©º", trigger: "change" } |
| | | ] |
| | | }, |
| | | // ä¿åå è½½ç¶æ |
| | | saveLoading: false, |
| | | |
| | | // éä»¶æ°æ® |
| | | attachments: [], |
| | | expertReviews: [ |
| | | // ä¸å®¶ï¼18ä½ï¼- åå§ç¶æä¸ºç³è¯·ä¸ |
| | | { |
| | | id: 1, |
| | | expertName: "é¶æ", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 2, |
| | | expertName: "åæ", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 3, |
| | | expertName: "äºæµ·å ", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 4, |
| | | expertName: "ç红æ¢
", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 5, |
| | | expertName: "çæ¥å
", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 6, |
| | | expertName: "çé", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 7, |
| | | expertName: "è¾¹æè¶
", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 8, |
| | | expertName: "é«å¿å", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 9, |
| | | expertName: "许å¤", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 10, |
| | | expertName: "è®¸ä¼ å±¾", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 11, |
| | | expertName: "å¼ çº¢å²©", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 12, |
| | | expertName: "æ¨èæ°", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 13, |
| | | expertName: "å®ç强", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 14, |
| | | expertName: "å¨ä¼ å©", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 15, |
| | | expertName: "è塿³¢", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 16, |
| | | expertName: "ç«ææ·", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 17, |
| | | expertName: "è£é", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | { |
| | | id: 18, |
| | | expertName: "è¡éè´", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | // 主å§ä¸å®¶ï¼1ä½ï¼ |
| | | { |
| | | id: 19, |
| | | expertName: "åå¿æ¶", |
| | | isChief: true, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | } |
| | | ], |
| | | expertLoading: false, |
| | | attachmentLoading: false, |
| | | // åéå¯¹è¯æ¡ |
| | | sendDialogVisible: false, |
| | | sendForm: { |
| | | expertType: "normal", |
| | | expertIds: [], |
| | | content: "" |
| | | }, |
| | | // ä¸ä¼ ç¸å
³ |
| | | uploadDialogVisible: false, |
| | | uploadLoading: false, |
| | | tempFileList: [], |
| | | // å¯ç¨ä¸å®¶å表 |
| | | availableExperts: [ |
| | | { id: 1, name: "å¼ ææ", type: "normal" }, |
| | | { id: 2, name: "æææ", type: "normal" }, |
| | | { id: 3, name: "çææ", type: "normal" }, |
| | | { id: 4, name: "赵主å§", type: "chief" } |
| | | ] |
| | | }; |
| | | }, |
| | | computed: { |
| | | // 计ç®å±æ§ï¼ä¸å®¶åææ°é |
| | | approvedNormalExperts() { |
| | | return this.expertReviews.filter( |
| | | expert => !expert.isChief && expert.expertConclusion === "approved" |
| | | ).length; |
| | | }, |
| | | // 计ç®å±æ§ï¼ä¸»å§ä¸å®¶ç¶æ |
| | | chiefExpertStatus() { |
| | | const chiefExpert = this.expertReviews.find(expert => expert.isChief); |
| | | return chiefExpert |
| | | ? this.statusTextFilter(chiefExpert.reviewStatus) |
| | | : "æªåé
"; |
| | | }, |
| | | // 计ç®å±æ§ï¼å®æè¿åº¦ |
| | | completionRate() { |
| | | const totalExperts = this.expertReviews.length; |
| | | const completedExperts = this.expertReviews.filter( |
| | | expert => expert.reviewStatus === "submitted" |
| | | ).length; |
| | | return totalExperts > 0 |
| | | ? Math.round((completedExperts / totalExperts) * 100) |
| | | : 0; |
| | | }, |
| | | // 计ç®å±æ§ï¼æ»ä½ç»è®º |
| | | overallConclusionText() { |
| | | if (this.approvedNormalExperts >= 12) { |
| | | return "éè¿"; |
| | | } else if (this.approvedNormalExperts >= 9) { |
| | | return "ä¿®æ¹åéè¿"; |
| | | } else { |
| | | return "ä¸éè¿"; |
| | | } |
| | | }, |
| | | overallConclusionFilter() { |
| | | if (this.approvedNormalExperts >= 12) { |
| | | return "success"; |
| | | } else if (this.approvedNormalExperts >= 9) { |
| | | return "warning"; |
| | | } else { |
| | | return "danger"; |
| | | } |
| | | }, |
| | | // æ¯å¦å¯ä»¥åéç»ä¸å®¶ |
| | | canSendToNormalExperts() { |
| | | return ( |
| | | this.expertReviews.filter( |
| | | expert => !expert.isChief && expert.reviewStatus === "applying" |
| | | ).length > 0 |
| | | ); |
| | | }, |
| | | // æ¯å¦å¯ä»¥åéç»ä¸»å§ä¸å®¶ï¼éè¦è³å°12个ä¸å®¶åæï¼ |
| | | canSendToChiefExpert() { |
| | | return ( |
| | | this.approvedNormalExperts >= 12 && |
| | | this.expertReviews.filter( |
| | | expert => expert.isChief && expert.reviewStatus === "applying" |
| | | ).length > 0 |
| | | ); |
| | | }, |
| | | // æ¯å¦å¯ä»¥æ¹éåé |
| | | canBatchSend() { |
| | | return ( |
| | | this.expertReviews.filter(expert => expert.reviewStatus === "applying") |
| | | .length > 0 |
| | | ); |
| | | }, |
| | | // æ¯å¦å¯ä»¥åéä¸å®¶å®¡æ¥ |
| | | canSendToExperts() { |
| | | return this.form.id && this.form.ethicsConclusion === "reviewing"; |
| | | }, |
| | | // å½åç¨æ·ä¿¡æ¯ |
| | | currentUser() { |
| | | return JSON.parse(sessionStorage.getItem("user") || "{}"); |
| | | } |
| | | }, |
| | | created() { |
| | | const id = this.$route.query.id; |
| | | if (id) { |
| | | this.getDetail(id); |
| | | this.getAttachments(id); |
| | | // ä¸åéè¦ä»æ¥å£è·åä¸å®¶å表ï¼ä½¿ç¨åºå®çexpertReviewsæ°æ® |
| | | } else if (this.$route.path.includes("/add")) { |
| | | this.generateHospitalNo(); |
| | | this.form.registrant = this.currentUser.username || "å½åç¨æ·"; |
| | | } |
| | | }, |
| | | methods: { |
| | | // çæä½é¢å· |
| | | generateHospitalNo() { |
| | | const timestamp = Date.now().toString(); |
| | | this.form.hospitalNo = "D" + timestamp.slice(-6); |
| | | }, |
| | | getExpertRowClassName({ row }) { |
| | | return row.isChief ? "chief-expert-row" : "normal-expert-row"; |
| | | }, |
| | | // è·å详æ
|
| | | getDetail(id) { |
| | | getEthicsReviewDetail(id) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.form = response.data; |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·å伦ç审æ¥è¯¦æ
失败:", error); |
| | | this.$message.error("è·å详æ
失败"); |
| | | }); |
| | | }, |
| | | |
| | | // è·åä¸å®¶å®¡æ¥å表 |
| | | getExpertReviews(ethicsReviewId) { |
| | | this.expertLoading = true; |
| | | // æ¨¡ææ°æ® - å®é
项ç®ä¸ä»æ¥å£è·å |
| | | setTimeout(() => { |
| | | this.expertReviews = [ |
| | | // ä¸å®¶ï¼18ä½ï¼ |
| | | { |
| | | id: 1, |
| | | expertName: "å¼ ææ", |
| | | isChief: false, |
| | | reviewStatus: "submitted", |
| | | expertConclusion: "approved", |
| | | expertOpinion: "符å伦çè¦æ±", |
| | | reviewTime: "2025-12-01 10:30:00" |
| | | }, |
| | | { |
| | | id: 2, |
| | | expertName: "æææ", |
| | | isChief: false, |
| | | reviewStatus: "submitted", |
| | | expertConclusion: "approved", |
| | | expertOpinion: "æ¹æ¡è®¾è®¡åç", |
| | | reviewTime: "2025-12-01 11:20:00" |
| | | }, |
| | | { |
| | | id: 3, |
| | | expertName: "çææ", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | // 主å§ä¸å®¶ï¼1ä½ï¼ |
| | | { |
| | | id: 19, |
| | | expertName: "赵主å§", |
| | | isChief: true, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | } |
| | | ]; |
| | | this.expertLoading = false; |
| | | }, 500); |
| | | }, |
| | | |
| | | // è·åéä»¶å表 |
| | | getAttachments(ethicsReviewId) { |
| | | this.attachmentLoading = true; |
| | | getAttachments(ethicsReviewId) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.attachments = response.data; |
| | | } |
| | | this.attachmentLoading = false; |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·åéä»¶å表失败:", error); |
| | | this.attachmentLoading = false; |
| | | }); |
| | | }, |
| | | |
| | | // ç¶æè¿æ»¤å¨ |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | | applying: "info", |
| | | submitted: "success" |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | |
| | | statusTextFilter(status) { |
| | | const statusMap = { |
| | | applying: "ç³è¯·ä¸", |
| | | submitted: "å·²æäº¤" |
| | | }; |
| | | return statusMap[status] || "æªç¥"; |
| | | }, |
| | | |
| | | // ç»è®ºè¿æ»¤å¨ |
| | | conclusionFilter(conclusion) { |
| | | const conclusionMap = { |
| | | approved: "success", |
| | | approved_with_modifications: "warning", |
| | | disapproved: "danger" |
| | | }; |
| | | return conclusionMap[conclusion] || "info"; |
| | | }, |
| | | |
| | | conclusionTextFilter(conclusion) { |
| | | const conclusionMap = { |
| | | approved: "åæ", |
| | | approved_with_modifications: "ä¿®æ¹ååæ", |
| | | disapproved: "ä¸åæ" |
| | | }; |
| | | return conclusionMap[conclusion] || "æªç¥"; |
| | | }, |
| | | |
| | | // ä¿åä¿¡æ¯ |
| | | handleSave() { |
| | | this.$refs.form.validate(valid => { |
| | | if (valid) { |
| | | this.saveLoading = true; |
| | | const apiMethod = this.form.id ? updateEthicsReview : addEthicsReview; |
| | | |
| | | apiMethod(this.form) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("ä¿åæå"); |
| | | if (!this.form.id) { |
| | | this.form.id = response.data.id; |
| | | this.$router.replace({ |
| | | query: { ...this.$route.query, id: this.form.id } |
| | | }); |
| | | } |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("ä¿å失败:", error); |
| | | this.$message.error("ä¿å失败"); |
| | | }) |
| | | .finally(() => { |
| | | this.saveLoading = false; |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // åéä¸å®¶å®¡æ¥ |
| | | handleSendToExperts() { |
| | | this.sendDialogVisible = true; |
| | | }, |
| | | |
| | | // åéç»ä¸å®¶ |
| | | handleSendToNormalExperts() { |
| | | const normalExperts = this.expertReviews.filter( |
| | | expert => !expert.isChief && expert.reviewStatus === "applying" |
| | | ); |
| | | this.sendForm.expertIds = normalExperts.map(expert => expert.id); |
| | | this.sendForm.expertType = "normal"; |
| | | this.sendDialogVisible = true; |
| | | }, |
| | | |
| | | // åéç»ä¸»å§ä¸å®¶ |
| | | handleSendToChiefExpert() { |
| | | const chiefExpert = this.expertReviews.find( |
| | | expert => expert.isChief && expert.reviewStatus === "applying" |
| | | ); |
| | | if (chiefExpert) { |
| | | this.sendForm.expertIds = [chiefExpert.id]; |
| | | this.sendForm.expertType = "chief"; |
| | | this.sendDialogVisible = true; |
| | | } |
| | | }, |
| | | |
| | | // æ¹éåé |
| | | handleBatchSend() { |
| | | const applyingExperts = this.expertReviews.filter( |
| | | expert => expert.reviewStatus === "applying" |
| | | ); |
| | | this.sendForm.expertIds = applyingExperts.map(expert => expert.id); |
| | | this.sendForm.expertType = "batch"; |
| | | this.sendDialogVisible = true; |
| | | }, |
| | | |
| | | // åéç»å个ä¸å®¶ |
| | | handleSendToExpert(expert) { |
| | | this.sendForm.expertIds = [expert.id]; |
| | | this.sendForm.expertType = expert.isChief ? "chief" : "normal"; |
| | | this.sendDialogVisible = true; |
| | | }, |
| | | |
| | | // 确认åé |
| | | handleSendConfirm() { |
| | | if (this.sendForm.expertIds.length === 0) { |
| | | this.$message.warning("è¯·éæ©è¦åéçä¸å®¶"); |
| | | return; |
| | | } |
| | | |
| | | sendExpertReview({ |
| | | ethicsReviewId: this.form.id, |
| | | expertIds: this.sendForm.expertIds, |
| | | content: this.sendForm.content |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("åéæå"); |
| | | this.sendDialogVisible = false; |
| | | this.getExpertReviews(this.form.id); |
| | | this.sendForm = { |
| | | expertType: "normal", |
| | | expertIds: [], |
| | | content: "" |
| | | }; |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("åé失败:", error); |
| | | this.$message.error("åé失败"); |
| | | }); |
| | | }, |
| | | |
| | | // ç»æå®¡æ¥ |
| | | handleEndReview() { |
| | | this.$confirm( |
| | | "ç¡®å®è¦ç»ææ¬æ¬¡ä¼¦ç审æ¥åï¼ç»æåå°æ æ³ä¿®æ¹ä¸å®¶å®¡æ¥ç»æã", |
| | | "æç¤º", |
| | | { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | } |
| | | ) |
| | | .then(() => { |
| | | endEthicsReview(this.form.id) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("审æ¥å·²ç»æ"); |
| | | this.form.ethicsConclusion = "terminated"; |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("ç»æå®¡æ¥å¤±è´¥:", error); |
| | | this.$message.error("ç»æå®¡æ¥å¤±è´¥"); |
| | | }); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // ç¼è¾ä¸å®¶å®¡æ¥ |
| | | handleEditExpertReview(expert) { |
| | | this.$prompt("请è¾å
¥å®¡æ¥æè§", "ç¼è¾ä¸å®¶å®¡æ¥", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | inputValue: expert.expertOpinion || "", |
| | | inputValidator: value => { |
| | | if (!value || value.trim() === "") { |
| | | return "å®¡æ¥æè§ä¸è½ä¸ºç©º"; |
| | | } |
| | | return true; |
| | | } |
| | | }) |
| | | .then(({ value }) => { |
| | | // æ¨¡ææ´æ°ä¸å®¶å®¡æ¥ |
| | | const index = this.expertReviews.findIndex(e => e.id === expert.id); |
| | | if (index !== -1) { |
| | | this.expertReviews[index].expertOpinion = value; |
| | | this.$message.success("å®¡æ¥æè§å·²æ´æ°"); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // æ¥çä¸å®¶å®¡æ¥è¯¦æ
|
| | | handleViewExpertReview(expert) { |
| | | this.$alert( |
| | | ` |
| | | <div> |
| | | <p><strong>ä¸å®¶å§åï¼</strong>${expert.expertName}</p> |
| | | <p><strong>ä¸å®¶ç±»åï¼</strong>${ |
| | | expert.isChief ? "主å§ä¸å®¶" : "ä¸å®¶" |
| | | }</p> |
| | | <p><strong>审æ¥ç¶æï¼</strong>${this.statusTextFilter( |
| | | expert.reviewStatus |
| | | )}</p> |
| | | <p><strong>ä¸å®¶ç»è®ºï¼</strong>${ |
| | | expert.expertConclusion |
| | | ? this.conclusionTextFilter(expert.expertConclusion) |
| | | : "æªæäº¤" |
| | | }</p> |
| | | <p><strong>å®¡æ¥æè§ï¼</strong>${expert.expertOpinion || "æ "}</p> |
| | | <p><strong>å®¡æ¥æ¶é´ï¼</strong>${expert.reviewTime || "æªå®¡æ¥"}</p> |
| | | </div> |
| | | `, |
| | | "ä¸å®¶å®¡æ¥è¯¦æ
", |
| | | { |
| | | dangerouslyUseHTMLString: true, |
| | | customClass: "expert-review-detail-dialog" |
| | | } |
| | | ); |
| | | }, |
| | | |
| | | // ä¸ä¼ éä»¶ |
| | | handleUploadAttachment() { |
| | | this.uploadDialogVisible = true; |
| | | }, |
| | | |
| | | // ä¸ä¼ åæ ¡éª |
| | | beforeUpload(file) { |
| | | const allowedTypes = [ |
| | | "application/pdf", |
| | | "image/jpeg", |
| | | "image/png", |
| | | "application/msword", |
| | | "application/vnd.openxmlformats-officedocument.wordprocessingml.document", |
| | | "application/vnd.ms-excel", |
| | | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" |
| | | ]; |
| | | |
| | | const maxSize = 10 * 1024 * 1024; |
| | | |
| | | 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") || |
| | | file.name.endsWith(".xls") || |
| | | file.name.endsWith(".xlsx"); |
| | | |
| | | if (!isTypeOk) { |
| | | this.$message.error("æä»¶æ ¼å¼ä¸æ¯æ"); |
| | | return false; |
| | | } |
| | | |
| | | if (file.size > maxSize) { |
| | | this.$message.error("æä»¶å¤§å°ä¸è½è¶
è¿10MB"); |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | }, |
| | | |
| | | // æä»¶éæ©åå |
| | | handleFileChange(file, fileList) { |
| | | this.tempFileList = fileList; |
| | | }, |
| | | |
| | | // æäº¤ä¸ä¼ |
| | | submitUpload() { |
| | | if (this.tempFileList.length === 0) { |
| | | this.$message.warning("请å
éæ©è¦ä¸ä¼ çæä»¶"); |
| | | return; |
| | | } |
| | | |
| | | this.uploadLoading = true; |
| | | |
| | | const uploadPromises = this.tempFileList.map(file => { |
| | | const formData = new FormData(); |
| | | formData.append("file", file.raw); |
| | | formData.append("ethicsReviewId", this.form.id); |
| | | |
| | | return uploadAttachment(formData); |
| | | }); |
| | | |
| | | Promise.all(uploadPromises) |
| | | .then(responses => { |
| | | this.$message.success("æä»¶ä¸ä¼ æå"); |
| | | this.uploadDialogVisible = false; |
| | | this.tempFileList = []; |
| | | this.getAttachments(this.form.id); |
| | | }) |
| | | .catch(error => { |
| | | console.error("ä¸ä¼ 失败:", error); |
| | | this.$message.error("æä»¶ä¸ä¼ 失败"); |
| | | }) |
| | | .finally(() => { |
| | | this.uploadLoading = false; |
| | | }); |
| | | }, |
| | | |
| | | // é¢è§éä»¶ |
| | | handlePreviewAttachment(attachment) { |
| | | if (attachment.fileName.endsWith(".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" |
| | | } |
| | | ); |
| | | } else { |
| | | this.$message.info("该æä»¶ç±»åæä¸æ¯æå¨çº¿é¢è§ï¼è¯·ä¸è½½åæ¥ç"); |
| | | } |
| | | }, |
| | | |
| | | // ä¸è½½éä»¶ |
| | | handleDownloadAttachment(attachment) { |
| | | const link = document.createElement("a"); |
| | | link.href = attachment.fileUrl; |
| | | link.download = attachment.fileName; |
| | | link.click(); |
| | | this.$message.success(`å¼å§ä¸è½½: ${attachment.fileName}`); |
| | | }, |
| | | |
| | | // å é¤éä»¶ |
| | | handleRemoveAttachment(attachment) { |
| | | this.$confirm("ç¡®å®è¦å é¤è¿ä¸ªéä»¶åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | deleteAttachment(attachment.id) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("éä»¶å 餿å"); |
| | | this.getAttachments(this.form.id); |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("å é¤é件失败:", error); |
| | | this.$message.error("å é¤é件失败"); |
| | | }); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // è·åæä»¶ç±»å |
| | | getFileType(fileName) { |
| | | const ext = fileName |
| | | .split(".") |
| | | .pop() |
| | | .toLowerCase(); |
| | | const typeMap = { |
| | | pdf: "PDF", |
| | | doc: "DOC", |
| | | docx: "DOCX", |
| | | xls: "XLS", |
| | | xlsx: "XLSX", |
| | | jpg: "JPG", |
| | | jpeg: "JPEG", |
| | | png: "PNG" |
| | | }; |
| | | return typeMap[ext] || ext.toUpperCase(); |
| | | }, |
| | | |
| | | // æä»¶å¤§å°æ ¼å¼å |
| | | formatFileSize(size) { |
| | | if (size === 0) return "0 B"; |
| | | const k = 1024; |
| | | 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]; |
| | | }, |
| | | |
| | | // æ¶é´æ ¼å¼å |
| | | 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")}`; |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | <style scoped> |
| | | .ethics-review-detail { |
| | | padding: 20px; |
| | | background-color: #f5f7fa; |
| | | } |
| | | |
| | | .detail-card { |
| | | margin-bottom: 20px; |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .expert-card { |
| | | margin-bottom: 20px; |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .attachment-card { |
| | | margin-bottom: 20px; |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .detail-title { |
| | | font-size: 18px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | |
| | | .expert-stats { |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | | color: rgb(43, 181, 245); |
| | | border-radius: 8px; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .stat-item { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | padding: 10px; |
| | | } |
| | | |
| | | .stat-label { |
| | | font-size: 12px; |
| | | opacity: 0.9; |
| | | margin-bottom: 5px; |
| | | } |
| | | |
| | | .stat-value { |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .upload-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 15px; |
| | | padding: 10px; |
| | | background-color: #f8f9fa; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .upload-title { |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | |
| | | .file-info { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .empty-attachment { |
| | | text-align: center; |
| | | padding: 40px 0; |
| | | color: #909399; |
| | | } |
| | | |
| | | /* è¡¨åæ ·å¼ä¼å */ |
| | | :deep(.el-form-item__label) { |
| | | font-weight: 500; |
| | | } |
| | | |
| | | :deep(.el-input__inner) { |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-textarea__inner) { |
| | | border-radius: 4px; |
| | | resize: vertical; |
| | | } |
| | | |
| | | /* è¡¨æ ¼æ ·å¼ä¼å */ |
| | | :deep(.el-table) { |
| | | border-radius: 8px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | :deep(.el-table th) { |
| | | background-color: #f5f7fa; |
| | | color: #606266; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | :deep(.el-table .cell) { |
| | | padding: 8px 12px; |
| | | } |
| | | |
| | | /* æé®æ ·å¼ä¼å */ |
| | | :deep(.el-button--primary) { |
| | | background: linear-gradient(135deg, #409eff 0%, #3375e0 100%); |
| | | border: none; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-button--success) { |
| | | background: linear-gradient(135deg, #67c23a 0%, #529b2f 100%); |
| | | border: none; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-button--warning) { |
| | | background: linear-gradient(135deg, #e6a23c 0%, #d18c2a 100%); |
| | | border: none; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-button--danger) { |
| | | background: linear-gradient(135deg, #f56c6c 0%, #e05b5b 100%); |
| | | border: none; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | /* æ ç¾æ ·å¼ */ |
| | | :deep(.el-tag) { |
| | | border-radius: 12px; |
| | | border: none; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* å¯¹è¯æ¡æ ·å¼ä¼å */ |
| | | :deep(.el-dialog) { |
| | | border-radius: 8px; |
| | | box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); |
| | | } |
| | | |
| | | :deep(.el-dialog__header) { |
| | | background: linear-gradient(135deg, #f5f7fa 0%, #e4e7ed 100%); |
| | | border-bottom: 1px solid #e4e7ed; |
| | | padding: 15px 20px; |
| | | } |
| | | |
| | | :deep(.el-dialog__title) { |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | |
| | | /* ä¸ä¼ ç»ä»¶æ ·å¼ */ |
| | | :deep(.el-upload-dragger) { |
| | | border: 2px dashed #dcdfe6; |
| | | border-radius: 6px; |
| | | background-color: #fafafa; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | :deep(.el-upload-dragger:hover) { |
| | | border-color: #409eff; |
| | | background-color: #f0f7ff; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .ethics-review-detail { |
| | | padding: 10px; |
| | | } |
| | | |
| | | .expert-stats .el-col { |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .upload-header { |
| | | flex-direction: column; |
| | | align-items: flex-start; |
| | | gap: 10px; |
| | | } |
| | | } |
| | | |
| | | /* å¨ç»ææ */ |
| | | .fade-enter-active, |
| | | .fade-leave-active { |
| | | transition: opacity 0.3s ease; |
| | | } |
| | | |
| | | .fade-enter, |
| | | .fade-leave-to { |
| | | opacity: 0; |
| | | } |
| | | |
| | | /* å è½½ç¶æ */ |
| | | .loading-container { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | height: 200px; |
| | | } |
| | | |
| | | /* ä¸å®¶ç±»åæ ·å¼ */ |
| | | .normal-expert { |
| | | color: #409eff; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .chief-expert { |
| | | color: #f56c6c; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | /* ä¸å®¶è¡æ ·å¼ */ |
| | | :deep(.normal-expert-row) { |
| | | background-color: #fafafa; |
| | | } |
| | | |
| | | :deep(.chief-expert-row) { |
| | | background-color: #fff7e6; |
| | | } |
| | | |
| | | :deep(.normal-expert-row:hover) { |
| | | background-color: #f0f7ff; |
| | | } |
| | | |
| | | :deep(.chief-expert-row:hover) { |
| | | background-color: #ffecc2; |
| | | } |
| | | |
| | | /* æ æ°æ®æ ·å¼ */ |
| | | .no-data { |
| | | color: #909399; |
| | | font-style: italic; |
| | | } |
| | | |
| | | /* ä¸å®¶æè§æ ·å¼ */ |
| | | .expert-opinion { |
| | | color: #303133; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | /* å·²åéæé®æ ·å¼ */ |
| | | .sent-button { |
| | | color: #67c23a !important; |
| | | } |
| | | |
| | | /* è¡¨æ ¼è¡æ¬åææ */ |
| | | :deep(.el-table__row:hover) { |
| | | transform: translateY(-1px); |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | /* èªå®ä¹æ»å¨æ¡ */ |
| | | :deep(::-webkit-scrollbar) { |
| | | width: 6px; |
| | | height: 6px; |
| | | } |
| | | |
| | | :deep(::-webkit-scrollbar-track) { |
| | | background: #f1f1f1; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | :deep(::-webkit-scrollbar-thumb) { |
| | | background: #c1c1c1; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | :deep(::-webkit-scrollbar-thumb:hover) { |
| | | background: #a8a8a8; |
| | | } |
| | | |
| | | /* ä¸å®¶å®¡æ¥è¡¨æ ¼ç¹æ®æ ·å¼ */ |
| | | .expert-table-special :deep(.el-table__row) { |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .expert-table-special :deep(.el-table__row:hover) { |
| | | background-color: #f0f7ff; |
| | | transform: translateY(-1px); |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | /* 主å§ä¸å®¶è¡é«äº® */ |
| | | :deep(.chief-expert-row) { |
| | | background-color: #fff7e6 !important; |
| | | } |
| | | |
| | | :deep(.chief-expert-row:hover) { |
| | | background-color: #ffecc2 !important; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="ethics-review-detail"> |
| | | <case-basic-info :case-id="caseId" :show-attachment="true" /> |
| | | |
| | | <el-card class="detail-card"> |
| | | <!-- åºç¡ä¿¡æ¯ --> |
| | | <!-- 伦ç审æ¥åºæ¬ä¿¡æ¯ --> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">伦ç审æ¥åºæ¬ä¿¡æ¯</span> |
| | | <div style="float: right;"> |
| | |
| | | <el-button |
| | | type="warning" |
| | | @click="handleEndReview" |
| | | :disabled="form.ethicsConclusion === 'terminated'" |
| | | :disabled="form.status === '2'" |
| | | > |
| | | ç»æå®¡æ¥ |
| | | </el-button> |
| | |
| | | <el-form :model="form" ref="form" :rules="rules" label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä½é¢å·" prop="hospitalNo"> |
| | | <el-input v-model="form.hospitalNo" readonly /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-input v-model="form.donorName" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ§å«" prop="gender"> |
| | | <el-select v-model="form.gender" style="width: 100%"> |
| | | <el-option label="ç·" value="0" /> |
| | | <el-option label="女" value="1" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="å起主é¢" prop="initiateTheme"> |
| | | <el-input |
| | | v-model="form.initiateTheme" |
| | | placeholder="请è¾å
¥å起主é¢" |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å¹´é¾" prop="age"> |
| | | <el-input v-model="form.age" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="16"> |
| | | <el-form-item label="ç¾ç
è¯æ" prop="diagnosis"> |
| | | <el-input v-model="form.diagnosis" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="伦çç»è®º" prop="ethicsConclusion"> |
| | | <el-select v-model="form.ethicsConclusion" style="width: 100%"> |
| | | <el-option label="审æ¥ä¸" value="reviewing" /> |
| | | <el-option label="åæ" value="approved" /> |
| | | <el-option |
| | | label="ä¿®æ¹ååæ" |
| | | value="approved_with_modifications" |
| | | /> |
| | | <el-option label="ä¿®æ¹åé审" value="re-review" /> |
| | | <el-option label="ä¸åæ" value="disapproved" /> |
| | | <el-option label="ç»æ¢å®¡æ¥" value="terminated" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å®¡æ¥æ¶é´" prop="reviewTime"> |
| | | <el-date-picker |
| | | v-model="form.reviewTime" |
| | | type="datetime" |
| | | 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="registrant"> |
| | | <el-input v-model="form.registrant" /> |
| | | <el-form-item label="å起人" prop="initiatePerson"> |
| | | <el-input v-model="form.initiatePerson" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="审æ¥ç¶æ" prop="status"> |
| | | <el-select |
| | | v-model="form.status" |
| | | 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 :span="8"> |
| | | <el-form-item label="åèµ·æ¶é´" prop="startTime"> |
| | | <el-date-picker |
| | | v-model="form.startTime" |
| | | type="datetime" |
| | | 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="cutOffTime"> |
| | | <el-date-picker |
| | | v-model="form.cutOffTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | style="width: 100%" |
| | | |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- ä¸å®¶ç¸å
³ä¿¡æ¯ --> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä¸å®¶å§å" prop="expertName"> |
| | | <el-input v-model="form.expertName" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä¸å®¶ç¼å·" prop="expertNo"> |
| | | <el-input v-model="form.expertNo" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä¸å®¶ç±»å" prop="expertType"> |
| | | <el-select |
| | | v-model="form.expertType" |
| | | style="width: 100%" |
| | | |
| | | > |
| | | <el-option label="æ®éä¸å®¶" value="normal" /> |
| | | <el-option label="主å§ä¸å®¶" value="chief" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä¸å®¶ç»è®º" prop="expertConclusion"> |
| | | <el-select |
| | | v-model="form.expertConclusion" |
| | | style="width: 100%" |
| | | |
| | | > |
| | | <el-option label="åæ" value="1" /> |
| | | <el-option label="ä¸åæ" value="0" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä¸å®¶ç»è®ºæ¶é´" prop="expertTime"> |
| | | <el-date-picker |
| | | v-model="form.expertTime" |
| | | type="datetime" |
| | | 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="orderNo"> |
| | | <el-input-number |
| | | v-model="form.orderNo" |
| | | :min="1" |
| | | :max="20" |
| | | style="width: 100%" |
| | | |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="伦çæè§" prop="ethicsOpinion"> |
| | | <el-form-item label="ä¸å®¶æè§" prop="expertOpinion"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="3" |
| | | v-model="form.ethicsOpinion" |
| | | placeholder="请è¾å
¥ä¼¦çå®¡æ¥æè§" |
| | | :rows="2" |
| | | v-model="form.expertOpinion" |
| | | placeholder="请è¾å
¥ä¸å®¶æè§" |
| | | |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-form-item label="ç»è®°æ¶é´" prop="registrationTime"> |
| | | <el-date-picker |
| | | v-model="form.registrationTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="3" |
| | | v-model="form.remark" |
| | | placeholder="请è¾å
¥å¤æ³¨ä¿¡æ¯" |
| | | |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <!-- éä»¶ä¸ä¼ --> |
| | | <el-card class="attachment-card"> |
| | | <div slot="header" class="clearfix"> |
| | |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | |
| | | <!-- ä¸å®¶å®¡æ¥æ
åµ --> |
| | | <el-card class="expert-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title" |
| | | >ä¸å®¶å®¡æ¥æ
åµ (18ä½ä¸å®¶ + 1ä½ä¸»å§ä¸å®¶)</span |
| | | > |
| | | <span class="detail-title">ä¸å®¶å®¡æ¥æ
åµ (18ä½ä¸å®¶ + 1ä½ä¸»å§ä¸å®¶)</span> |
| | | <div style="float: right;"> |
| | | <el-button |
| | | size="mini" |
| | |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | <!-- ä¸å®¶ç»è®¡ä¿¡æ¯ --> |
| | | |
| | | <!-- ä¸å®¶ç»è®¡ä¿¡æ¯ --> |
| | | <div |
| | | class="expert-stats" |
| | | style="margin-top: 20px; padding: 15px; background: #f5f7fa; border-radius: 4px;" |
| | |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | | <!-- ä¸å®¶å®¡æ¥è¡¨æ ¼ --> |
| | | <el-table |
| | | :data="expertReviews" |
| | | v-loading="expertLoading" |
| | | style="width: 100%" |
| | | heiht="300" |
| | | height="800" |
| | | :row-class-name="getExpertRowClassName" |
| | | > |
| | | <el-table-column label="åºå·" width="60" align="center" type="index" /> |
| | |
| | | <el-table-column label="åéæ¶é´" width="160" align="center"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.reviewTime ? parseTime(scope.row.reviewTime) : "æªåé" |
| | | scope.row.sendTime ? parseTime(scope.row.sendTime) : "æªåé" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | |
| | | </el-card> |
| | | |
| | | <!-- åéä¸å®¶å¯¹è¯æ¡ --> |
| | |
| | | > |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- ä¸ä¼ éä»¶å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | title="ä¸ä¼ éä»¶" |
| | | :visible.sync="uploadDialogVisible" |
| | | width="500px" |
| | | :close-on-click-modal="false" |
| | | > |
| | | <el-upload |
| | | ref="uploadRef" |
| | | class="upload-demo" |
| | | drag |
| | | :action="uploadAction" |
| | | :headers="headers" |
| | | multiple |
| | | :file-list="tempFileList" |
| | | :before-upload="beforeUpload" |
| | | :on-change="handleFileChange" |
| | | :on-remove="handleTempRemove" |
| | | :on-success="handleUploadSuccess" |
| | | :auto-upload="false" |
| | | > |
| | | <i class="el-icon-upload"></i> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | <div class="el-upload__tip" slot="tip"> |
| | | æ¯æä¸ä¼ pdfãjpgãpngãdocãdocxãxlsãxlsxæ ¼å¼æä»¶ï¼å个æä»¶ä¸è¶
è¿10MB |
| | | </div> |
| | | </el-upload> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="uploadDialogVisible = false">åæ¶</el-button> |
| | | <el-button |
| | | type="primary" |
| | | @click="submitUpload" |
| | | :loading="uploadLoading" |
| | | :disabled="tempFileList.length === 0" |
| | | > |
| | | 确认ä¸ä¼ |
| | | </el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getToken } from "@/utils/auth"; |
| | | import { |
| | | getEthicsReviewDetail, |
| | | updateEthicsReview, |
| | | sendExpertReview, |
| | | endEthicsReview, |
| | | uploadAttachment, |
| | | deleteAttachment, |
| | | getAttachments |
| | | } from "./ethicsReview"; |
| | | reviewinitiateBaseInfoList, |
| | | ethicalreviewedit, |
| | | ethicalreviewadd |
| | | } from "@/api/businessApi"; |
| | | import CaseBasicInfo from "@/components/CaseBasicInfo"; |
| | | |
| | | export default { |
| | | name: "EthicsReviewDetail", |
| | | components: { CaseBasicInfo }, |
| | | |
| | | data() { |
| | | return { |
| | | // 页颿¨¡å¼ |
| | | isEdit: false, |
| | | // åºæ¬ä¿¡æ¯ |
| | | infoid: undefined, |
| | | caseId: null, |
| | | caseNo: "", |
| | | |
| | | // è¡¨åæ°æ® |
| | | form: { |
| | | // åºç¡ä¿¡æ¯ |
| | | id: undefined, |
| | | hospitalNo: "", |
| | | donorName: "", |
| | | gender: "", |
| | | age: "", |
| | | diagnosis: "", |
| | | ethicsConclusion: "reviewing", |
| | | ethicsOpinion: "", |
| | | reviewTime: "", |
| | | registrant: "", |
| | | registrationTime: new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19) |
| | | infoid: undefined, |
| | | caseNo: "", |
| | | initiateTheme: "", |
| | | initiatePerson: "", |
| | | |
| | | // ç¶æåæ¶é´ |
| | | status: "0", // 0:æ°å»º, 1:审æ¥ä¸, 2:ç»æ |
| | | startTime: "", |
| | | cutOffTime: "", |
| | | endTime: "", |
| | | |
| | | // ä¸å®¶ä¿¡æ¯ |
| | | expertName: "", |
| | | expertNo: "", |
| | | expertType: "normal", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | expertTime: "", |
| | | orderNo: 1, |
| | | |
| | | // 夿³¨ |
| | | remark: "", |
| | | |
| | | // ç³»ç»å段 |
| | | createBy: "", |
| | | createTime: "", |
| | | updateBy: "", |
| | | updateTime: "", |
| | | delFlag: "0" |
| | | }, |
| | | // 表åéªè¯è§å |
| | | rules: { |
| | | donorName: [ |
| | | { required: true, message: "æç®è
å§åä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ], |
| | | ethicsConclusion: [ |
| | | { required: true, message: "伦çç»è®ºä¸è½ä¸ºç©º", trigger: "change" } |
| | | ], |
| | | reviewTime: [ |
| | | { required: true, message: "å®¡æ¥æ¶é´ä¸è½ä¸ºç©º", trigger: "change" } |
| | | ] |
| | | }, |
| | | rules: { |
| | | initiateTheme: [ |
| | | { required: true, message: "å起主é¢ä¸è½ä¸ºç©º", trigger: "blur" }, |
| | | { min: 2, max: 100, message: "é¿åº¦å¨ 2 å° 100 个å符", trigger: "blur" } |
| | | ], |
| | | initiatePerson: [ |
| | | { required: true, message: "å起人ä¸è½ä¸ºç©º", trigger: "blur" } |
| | | ], |
| | | status: [ |
| | | { required: true, message: "审æ¥ç¶æä¸è½ä¸ºç©º", trigger: "change" } |
| | | ], |
| | | startTime: [ |
| | | { required: true, message: "åèµ·æ¶é´ä¸è½ä¸ºç©º", trigger: "change" } |
| | | ], |
| | | cutOffTime: [ |
| | | { required: true, message: "æªæ¢æ¶é´ä¸è½ä¸ºç©º", trigger: "change" } |
| | | ], |
| | | expertName: [ |
| | | { max: 50, message: "é¿åº¦ä¸è½è¶
è¿ 50 个å符", trigger: "blur" } |
| | | ], |
| | | expertNo: [ |
| | | { max: 50, message: "é¿åº¦ä¸è½è¶
è¿ 50 个å符", trigger: "blur" } |
| | | ], |
| | | expertConclusion: [ |
| | | { max: 2, message: "é¿åº¦ä¸è½è¶
è¿ 2 个å符", trigger: "change" } |
| | | ], |
| | | remark: [ |
| | | { max: 500, message: "é¿åº¦ä¸è½è¶
è¿ 500 个å符", trigger: "blur" } |
| | | ] |
| | | }, |
| | | // ä¿åå è½½ç¶æ |
| | | saveLoading: false, |
| | | |
| | | // éä»¶æ°æ® |
| | | attachments: [], |
| | | expertReviews: [ |
| | | // ä¸å®¶å®¡æ¥æ°æ® |
| | | expertReviews: [ |
| | | // ä¸å®¶ï¼18ä½ï¼- åå§ç¶æä¸ºç³è¯·ä¸ |
| | | { |
| | | id: 1, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 2, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 3, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 4, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 5, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 6, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 7, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 8, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 9, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 10, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 11, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 12, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 13, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 14, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 15, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 16, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 17, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | { |
| | | id: 18, |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | }, |
| | | // 主å§ä¸å®¶ï¼1ä½ï¼ |
| | | { |
| | |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | reviewTime: "", |
| | | sendTime: "" |
| | | } |
| | | ], |
| | | expertLoading: false, |
| | | attachmentLoading: false, |
| | | |
| | | // åéå¯¹è¯æ¡ |
| | | sendDialogVisible: false, |
| | | sendForm: { |
| | |
| | | expertIds: [], |
| | | content: "" |
| | | }, |
| | | |
| | | // ä¸ä¼ ç¸å
³ |
| | | uploadDialogVisible: false, |
| | | uploadLoading: false, |
| | | tempFileList: [], |
| | | uploadAction: process.env.VUE_APP_BASE_API + "/common/upload", |
| | | headers: { |
| | | Authorization: "Bearer " + getToken() |
| | | }, |
| | | |
| | | // å¯ç¨ä¸å®¶å表 |
| | | availableExperts: [ |
| | | { id: 1, name: "å¼ ææ", type: "normal" }, |
| | | { id: 2, name: "æææ", type: "normal" }, |
| | | { id: 3, name: "çææ", type: "normal" }, |
| | | { id: 4, name: "赵主å§", type: "chief" } |
| | | { id: 1, name: "é¶æ", type: "normal" }, |
| | | { id: 2, name: "åæ", type: "normal" }, |
| | | { id: 3, name: "äºæµ·å", type: "normal" }, |
| | | { id: 4, name: "ç红æ¢
", type: "normal" }, |
| | | { id: 5, name: "çæ¥å
", type: "normal" }, |
| | | { id: 6, name: "çé", type: "normal" }, |
| | | { id: 7, name: "è¾¹æè¶
", type: "normal" }, |
| | | { id: 8, name: "é«å¿å", type: "normal" }, |
| | | { id: 9, name: "许å¤", type: "normal" }, |
| | | { id: 10, name: "è®¸ä¼ å±¾", type: "normal" }, |
| | | { id: 11, name: "å¼ çº¢å²©", type: "normal" }, |
| | | { id: 12, name: "æ¨èæ°", type: "normal" }, |
| | | { id: 13, name: "å®ç强", type: "normal" }, |
| | | { id: 14, name: "å¨ä¼ å©", type: "normal" }, |
| | | { id: 15, name: "è塿³¢", type: "normal" }, |
| | | { id: 16, name: "ç«ææ·", type: "normal" }, |
| | | { id: 17, name: "è£é", type: "normal" }, |
| | | { id: 18, name: "è¡éè´", type: "normal" }, |
| | | { id: 19, name: "åå¿æ¶", type: "chief" } |
| | | ] |
| | | }; |
| | | }, |
| | |
| | | .length > 0 |
| | | ); |
| | | }, |
| | | // æ¯å¦å¯ä»¥åéä¸å®¶å®¡æ¥ |
| | | canSendToExperts() { |
| | | return this.form.id && this.form.ethicsConclusion === "reviewing"; |
| | | }, |
| | | // å½åç¨æ·ä¿¡æ¯ |
| | | currentUser() { |
| | | return JSON.parse(sessionStorage.getItem("user") || "{}"); |
| | | } |
| | | }, |
| | | created() { |
| | | const id = this.$route.query.id; |
| | | if (id) { |
| | | this.getDetail(id); |
| | | this.getAttachments(id); |
| | | // ä¸åéè¦ä»æ¥å£è·åä¸å®¶å表ï¼ä½¿ç¨åºå®çexpertReviewsæ°æ® |
| | | } else if (this.$route.path.includes("/add")) { |
| | | this.generateHospitalNo(); |
| | | this.form.registrant = this.currentUser.username || "å½åç¨æ·"; |
| | | } |
| | | this.infoid = this.$route.query.infoid; |
| | | this.caseId = this.$route.query.infoid; |
| | | // const id = this.$route.query.id; |
| | | this.getDetail(this.infoid); |
| | | |
| | | // if (id && !this.$route.path.includes("/add")) { |
| | | // this.getDetail(this.infoid); |
| | | // } else if (this.$route.path.includes("/add") && this.infoid) { |
| | | // this.initNewData(); |
| | | // } |
| | | }, |
| | | methods: { |
| | | // çæä½é¢å· |
| | | generateHospitalNo() { |
| | | const timestamp = Date.now().toString(); |
| | | this.form.hospitalNo = "D" + timestamp.slice(-6); |
| | | // åå§åæ°å¢æ°æ® |
| | | initNewData() { |
| | | this.form.infoid = this.infoid; |
| | | this.form.caseNo = this.$route.query.caseNo || ""; |
| | | this.form.initiatePerson = this.currentUser.username || "å½åç¨æ·"; |
| | | this.form.startTime = new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19); |
| | | this.form.createBy = this.currentUser.username || "admin"; |
| | | }, |
| | | getExpertRowClassName({ row }) { |
| | | return row.isChief ? "chief-expert-row" : "normal-expert-row"; |
| | | }, |
| | | |
| | | // è·å详æ
|
| | | getDetail(id) { |
| | | getEthicsReviewDetail(id) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.form = response.data; |
| | | async getDetail(infoid) { |
| | | try { |
| | | this.expertLoading = true; |
| | | const response = await reviewinitiateBaseInfoList({ infoid: infoid }); |
| | | |
| | | if (response.code === 200) { |
| | | let detailData = {}; |
| | | |
| | | if (response.data) { |
| | | this.form = response.data[0]; |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·å伦ç审æ¥è¯¦æ
失败:", error); |
| | | this.$message.error("è·å详æ
失败"); |
| | | }); |
| | | console.log(this.form, "this.form "); |
| | | |
| | | this.infoid = detailData.infoid || this.infoid; |
| | | this.caseNo = detailData.caseNo || ""; |
| | | |
| | | this.$message.success("æ°æ®å è½½æå"); |
| | | } else { |
| | | this.$message.error("è·å详æ
失败ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | } catch (error) { |
| | | console.error("è·å伦ç审æ¥è¯¦æ
失败:", error); |
| | | this.$message.error("æ°æ®å 载失败"); |
| | | } finally { |
| | | this.expertLoading = false; |
| | | } |
| | | }, |
| | | |
| | | // è·åä¸å®¶å®¡æ¥å表 |
| | |
| | | this.expertLoading = true; |
| | | // æ¨¡ææ°æ® - å®é
项ç®ä¸ä»æ¥å£è·å |
| | | setTimeout(() => { |
| | | this.expertReviews = [ |
| | | // ä¸å®¶ï¼18ä½ï¼ |
| | | { |
| | | id: 1, |
| | | expertName: "å¼ ææ", |
| | | isChief: false, |
| | | reviewStatus: "submitted", |
| | | expertConclusion: "approved", |
| | | expertOpinion: "符å伦çè¦æ±", |
| | | reviewTime: "2025-12-01 10:30:00" |
| | | }, |
| | | { |
| | | id: 2, |
| | | expertName: "æææ", |
| | | isChief: false, |
| | | reviewStatus: "submitted", |
| | | expertConclusion: "approved", |
| | | expertOpinion: "æ¹æ¡è®¾è®¡åç", |
| | | reviewTime: "2025-12-01 11:20:00" |
| | | }, |
| | | { |
| | | id: 3, |
| | | expertName: "çææ", |
| | | isChief: false, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | }, |
| | | // 主å§ä¸å®¶ï¼1ä½ï¼ |
| | | { |
| | | id: 19, |
| | | expertName: "赵主å§", |
| | | isChief: true, |
| | | reviewStatus: "applying", |
| | | expertConclusion: "", |
| | | expertOpinion: "", |
| | | reviewTime: "" |
| | | } |
| | | ]; |
| | | this.expertLoading = false; |
| | | }, 500); |
| | | }, |
| | |
| | | // è·åéä»¶å表 |
| | | getAttachments(ethicsReviewId) { |
| | | this.attachmentLoading = true; |
| | | getAttachments(ethicsReviewId) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.attachments = response.data; |
| | | } |
| | | this.attachmentLoading = false; |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·åéä»¶å表失败:", error); |
| | | this.attachmentLoading = false; |
| | | }); |
| | | // 模æè·åéä»¶ |
| | | setTimeout(() => { |
| | | this.attachmentLoading = false; |
| | | }, 500); |
| | | }, |
| | | |
| | | // ä¸å®¶è¡æ ·å¼ |
| | | getExpertRowClassName({ row }) { |
| | | return row.isChief ? "chief-expert-row" : "normal-expert-row"; |
| | | }, |
| | | |
| | | // ç¶æè¿æ»¤å¨ |
| | |
| | | }, |
| | | |
| | | // ä¿åä¿¡æ¯ |
| | | handleSave() { |
| | | this.$refs.form.validate(valid => { |
| | | async handleSave() { |
| | | this.$refs.form.validate(async valid => { |
| | | if (valid) { |
| | | this.saveLoading = true; |
| | | const apiMethod = this.form.id ? updateEthicsReview : addEthicsReview; |
| | | try { |
| | | const submitData = { |
| | | ...this.form, |
| | | // ç¡®ä¿å¿
è¦å段 |
| | | infoid: this.infoid, |
| | | caseNo: this.caseNo |
| | | }; |
| | | |
| | | apiMethod(this.form) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("ä¿åæå"); |
| | | if (!this.form.id) { |
| | | this.form.id = response.data.id; |
| | | this.$router.replace({ |
| | | query: { ...this.$route.query, id: this.form.id } |
| | | }); |
| | | } |
| | | let response = null; |
| | | |
| | | if (submitData.id) { |
| | | response = await ethicalreviewedit(submitData); |
| | | } else { |
| | | response = await ethicalreviewadd(submitData); |
| | | } |
| | | |
| | | if (response.code === 200) { |
| | | this.$message.success("ä¿åæå"); |
| | | this.isEdit = false; |
| | | if (!this.form.id && response.data && response.data.id) { |
| | | this.form.id = response.data.id; |
| | | this.$router.replace({ |
| | | query: { ...this.$route.query, id: this.form.id } |
| | | }); |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("ä¿å失败:", error); |
| | | this.$message.error("ä¿å失败"); |
| | | }) |
| | | .finally(() => { |
| | | this.saveLoading = false; |
| | | }); |
| | | } else { |
| | | this.$message.error("ä¿å失败ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | } catch (error) { |
| | | console.error("ä¿å失败:", error); |
| | | this.$message.error("ä¿å失败ï¼è¯·éè¯"); |
| | | } finally { |
| | | this.saveLoading = false; |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // åéä¸å®¶å®¡æ¥ |
| | | handleSendToExperts() { |
| | | this.sendDialogVisible = true; |
| | | // ç»æå®¡æ¥ |
| | | async handleEndReview() { |
| | | this.$confirm( |
| | | "ç¡®å®è¦ç»ææ¬æ¬¡ä¼¦ç审æ¥åï¼ç»æåå°æ æ³ä¿®æ¹ä¸å®¶å®¡æ¥ç»æã", |
| | | "æç¤º", |
| | | { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | } |
| | | ) |
| | | .then(async () => { |
| | | try { |
| | | const updateData = { |
| | | ...this.form, |
| | | status: "2", |
| | | endTime: new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19) |
| | | }; |
| | | |
| | | const response = await ethicalreviewedit(updateData); |
| | | |
| | | if (response.code === 200) { |
| | | this.$message.success("审æ¥å·²ç»æ"); |
| | | this.form.status = "2"; |
| | | this.form.endTime = updateData.endTime; |
| | | } else { |
| | | this.$message.error("æä½å¤±è´¥ï¼" + (response.msg || "æªç¥é误")); |
| | | } |
| | | } catch (error) { |
| | | console.error("ç»æå®¡æ¥å¤±è´¥:", error); |
| | | this.$message.error("ç»æå®¡æ¥å¤±è´¥"); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // åéç»ä¸å®¶ |
| | |
| | | return; |
| | | } |
| | | |
| | | sendExpertReview({ |
| | | ethicsReviewId: this.form.id, |
| | | expertIds: this.sendForm.expertIds, |
| | | content: this.sendForm.content |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("åéæå"); |
| | | this.sendDialogVisible = false; |
| | | this.getExpertReviews(this.form.id); |
| | | this.sendForm = { |
| | | expertType: "normal", |
| | | expertIds: [], |
| | | content: "" |
| | | }; |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("åé失败:", error); |
| | | this.$message.error("åé失败"); |
| | | }); |
| | | }, |
| | | // 模æåé |
| | | this.$message.success("åéæå"); |
| | | this.sendDialogVisible = false; |
| | | |
| | | // ç»æå®¡æ¥ |
| | | handleEndReview() { |
| | | this.$confirm( |
| | | "ç¡®å®è¦ç»ææ¬æ¬¡ä¼¦ç审æ¥åï¼ç»æåå°æ æ³ä¿®æ¹ä¸å®¶å®¡æ¥ç»æã", |
| | | "æç¤º", |
| | | { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | // æ´æ°ä¸å®¶ç¶æ |
| | | this.sendForm.expertIds.forEach(expertId => { |
| | | const index = this.expertReviews.findIndex( |
| | | expert => expert.id === expertId |
| | | ); |
| | | if (index !== -1) { |
| | | this.expertReviews[index].reviewStatus = "submitted"; |
| | | this.expertReviews[index].sendTime = new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19); |
| | | } |
| | | ) |
| | | .then(() => { |
| | | endEthicsReview(this.form.id) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("审æ¥å·²ç»æ"); |
| | | this.form.ethicsConclusion = "terminated"; |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("ç»æå®¡æ¥å¤±è´¥:", error); |
| | | this.$message.error("ç»æå®¡æ¥å¤±è´¥"); |
| | | }); |
| | | }) |
| | | .catch(() => {}); |
| | | }); |
| | | |
| | | this.sendForm = { |
| | | expertType: "normal", |
| | | expertIds: [], |
| | | content: "" |
| | | }; |
| | | }, |
| | | |
| | | // ç¼è¾ä¸å®¶å®¡æ¥ |
| | |
| | | ); |
| | | }, |
| | | |
| | | // ä¸ä¼ éä»¶ |
| | | // ä¸ä¼ éä»¶ç¸å
³æ¹æ³ |
| | | handleUploadAttachment() { |
| | | this.uploadDialogVisible = true; |
| | | }, |
| | |
| | | this.tempFileList = fileList; |
| | | }, |
| | | |
| | | // ç§»é¤ä¸´æ¶æä»¶ |
| | | handleTempRemove(file, fileList) { |
| | | this.tempFileList = fileList; |
| | | }, |
| | | |
| | | // ä¸ä¼ æåå¤ç |
| | | handleUploadSuccess(response, file, fileList) { |
| | | if (response.code === 200) { |
| | | this.$message.success("æä»¶ä¸ä¼ æå"); |
| | | this.uploadDialogVisible = false; |
| | | this.tempFileList = []; |
| | | } else { |
| | | this.$message.error(response.msg || "æä»¶ä¸ä¼ 失败"); |
| | | } |
| | | }, |
| | | |
| | | // æäº¤ä¸ä¼ |
| | | submitUpload() { |
| | | async submitUpload() { |
| | | if (this.tempFileList.length === 0) { |
| | | this.$message.warning("请å
éæ©è¦ä¸ä¼ çæä»¶"); |
| | | return; |
| | | } |
| | | |
| | | this.$refs.uploadRef.submit(); |
| | | this.uploadLoading = true; |
| | | |
| | | const uploadPromises = this.tempFileList.map(file => { |
| | | const formData = new FormData(); |
| | | formData.append("file", file.raw); |
| | | formData.append("ethicsReviewId", this.form.id); |
| | | |
| | | return uploadAttachment(formData); |
| | | }); |
| | | |
| | | Promise.all(uploadPromises) |
| | | .then(responses => { |
| | | this.$message.success("æä»¶ä¸ä¼ æå"); |
| | | this.uploadDialogVisible = false; |
| | | this.tempFileList = []; |
| | | this.getAttachments(this.form.id); |
| | | }) |
| | | .catch(error => { |
| | | console.error("ä¸ä¼ 失败:", error); |
| | | this.$message.error("æä»¶ä¸ä¼ 失败"); |
| | | }) |
| | | .finally(() => { |
| | | this.uploadLoading = false; |
| | | }); |
| | | }, |
| | | |
| | | // é¢è§éä»¶ |
| | |
| | | link.download = attachment.fileName; |
| | | link.click(); |
| | | this.$message.success(`å¼å§ä¸è½½: ${attachment.fileName}`); |
| | | }, |
| | | |
| | | // å é¤éä»¶ |
| | | handleRemoveAttachment(attachment) { |
| | | this.$confirm("ç¡®å®è¦å é¤è¿ä¸ªéä»¶åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | deleteAttachment(attachment.id) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("éä»¶å 餿å"); |
| | | this.getAttachments(this.form.id); |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("å é¤é件失败:", error); |
| | | this.$message.error("å é¤é件失败"); |
| | | }); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // è·åæä»¶ç±»å |
| | |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .ethics-review-detail { |
| | | padding: 20px; |
| | |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .upload-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 15px; |
| | | padding: 10px; |
| | | background-color: #f8f9fa; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .upload-title { |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | |
| | | .file-info { |
| | | display: flex; |
| | | align-items: center; |
| | |
| | | color: #909399; |
| | | } |
| | | |
| | | /* è¡¨åæ ·å¼ä¼å */ |
| | | :deep(.el-form-item__label) { |
| | | font-weight: 500; |
| | | } |
| | | |
| | | :deep(.el-input__inner) { |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-textarea__inner) { |
| | | border-radius: 4px; |
| | | resize: vertical; |
| | | } |
| | | |
| | | /* è¡¨æ ¼æ ·å¼ä¼å */ |
| | | :deep(.el-table) { |
| | | border-radius: 8px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | :deep(.el-table th) { |
| | | background-color: #f5f7fa; |
| | | color: #606266; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | :deep(.el-table .cell) { |
| | | padding: 8px 12px; |
| | | } |
| | | |
| | | /* æé®æ ·å¼ä¼å */ |
| | | :deep(.el-button--primary) { |
| | | background: linear-gradient(135deg, #409eff 0%, #3375e0 100%); |
| | | border: none; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-button--success) { |
| | | background: linear-gradient(135deg, #67c23a 0%, #529b2f 100%); |
| | | border: none; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-button--warning) { |
| | | background: linear-gradient(135deg, #e6a23c 0%, #d18c2a 100%); |
| | | border: none; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | :deep(.el-button--danger) { |
| | | background: linear-gradient(135deg, #f56c6c 0%, #e05b5b 100%); |
| | | border: none; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | /* æ ç¾æ ·å¼ */ |
| | | :deep(.el-tag) { |
| | | border-radius: 12px; |
| | | border: none; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* å¯¹è¯æ¡æ ·å¼ä¼å */ |
| | | :deep(.el-dialog) { |
| | | border-radius: 8px; |
| | | box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); |
| | | } |
| | | |
| | | :deep(.el-dialog__header) { |
| | | background: linear-gradient(135deg, #f5f7fa 0%, #e4e7ed 100%); |
| | | border-bottom: 1px solid #e4e7ed; |
| | | padding: 15px 20px; |
| | | } |
| | | |
| | | :deep(.el-dialog__title) { |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | |
| | | /* ä¸ä¼ ç»ä»¶æ ·å¼ */ |
| | | :deep(.el-upload-dragger) { |
| | | border: 2px dashed #dcdfe6; |
| | | border-radius: 6px; |
| | | background-color: #fafafa; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | :deep(.el-upload-dragger:hover) { |
| | | border-color: #409eff; |
| | | background-color: #f0f7ff; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .ethics-review-detail { |
| | | padding: 10px; |
| | | } |
| | | |
| | | .expert-stats .el-col { |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .upload-header { |
| | | flex-direction: column; |
| | | align-items: flex-start; |
| | | gap: 10px; |
| | | } |
| | | } |
| | | |
| | | /* å¨ç»ææ */ |
| | | .fade-enter-active, |
| | | .fade-leave-active { |
| | | transition: opacity 0.3s ease; |
| | | } |
| | | |
| | | .fade-enter, |
| | | .fade-leave-to { |
| | | opacity: 0; |
| | | } |
| | | |
| | | /* å è½½ç¶æ */ |
| | | .loading-container { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | height: 200px; |
| | | } |
| | | /* ä¸å®¶ç±»åæ ·å¼ */ |
| | | .normal-expert { |
| | | color: #409eff; |
| | |
| | | color: #67c23a !important; |
| | | } |
| | | |
| | | /* è¡¨æ ¼è¡æ¬åææ */ |
| | | :deep(.el-table__row:hover) { |
| | | transform: translateY(-1px); |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | transition: all 0.3s ease; |
| | | } |
| | | /* èªå®ä¹æ»å¨æ¡ */ |
| | | :deep(::-webkit-scrollbar) { |
| | | width: 6px; |
| | | height: 6px; |
| | | } |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .ethics-review-detail { |
| | | padding: 10px; |
| | | } |
| | | |
| | | :deep(::-webkit-scrollbar-track) { |
| | | background: #f1f1f1; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | :deep(::-webkit-scrollbar-thumb) { |
| | | background: #c1c1c1; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | :deep(::-webkit-scrollbar-thumb:hover) { |
| | | background: #a8a8a8; |
| | | } |
| | | |
| | | /* ä¸å®¶å®¡æ¥è¡¨æ ¼ç¹æ®æ ·å¼ */ |
| | | .expert-table-special :deep(.el-table__row) { |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .expert-table-special :deep(.el-table__row:hover) { |
| | | background-color: #f0f7ff; |
| | | transform: translateY(-1px); |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | /* 主å§ä¸å®¶è¡é«äº® */ |
| | | :deep(.chief-expert-row) { |
| | | background-color: #fff7e6 !important; |
| | | } |
| | | |
| | | :deep(.chief-expert-row:hover) { |
| | | background-color: #ffecc2 !important; |
| | | .expert-stats .el-col { |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <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 type="primary" icon="el-icon-plus" @click="handleCreate" |
| | | >æ°å»ºå®¡æ¥</el-button |
| | | > |
| | | <el-button |
| | | > --> |
| | | <!-- <el-button |
| | | type="success" |
| | | icon="el-icon-edit" |
| | | :disabled="single" |
| | | @click="handleUpdate" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | > --> |
| | | <el-button |
| | | type="warning" |
| | | icon="el-icon-download" |
| | |
| | | handleView(row) { |
| | | this.$router.push({ |
| | | path: "/case/ethicalReviewInfo", |
| | | query: { id: row.infoid } |
| | | query: { infoid: row.infoid } |
| | | }); |
| | | }, |
| | | // æ°å¢æé®æä½ |
| | |
| | | }, |
| | | // ä¿®æ¹æé®æä½ |
| | | handleUpdate(row) { |
| | | const id = row.infoid || this.ids[0]; |
| | | const infoid = row.infoid; |
| | | this.$router.push({ |
| | | path: "/case/ethicalReviewInfo", |
| | | query: { id: id } |
| | | query: { infoid: infoid } |
| | | }); |
| | | }, |
| | | // ç»æå®¡æ¥æä½ |
| | |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column |
| | | label="ä½é¢å·" |
| | | label="æ¡ä¾ç¼å·" |
| | | align="center" |
| | | prop="caseNo" |
| | | width="120" |
| | |
| | | prop="coordinatorName" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | <!-- <el-table-column |
| | | label="ç»´æ¤é¡¹ç®" |
| | | align="center" |
| | | prop="itemName" |
| | | width="120" |
| | | show-overflow-tooltip |
| | | /> |
| | | /> --> |
| | | <el-table-column |
| | | label="ç»´æ¤æ¶é´" |
| | | label="ææ°ç»´æ¤æ¶é´" |
| | | align="center" |
| | | prop="itemTime" |
| | | prop="updateTime" |
| | | width="140" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.itemTime |
| | | ? parseTime(scope.row.itemTime, "{y}-{m}-{d} {h}:{i}") |
| | | scope.row.updateTime |
| | | ? parseTime(scope.row.updateTime) |
| | | : "-" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ç»´æ¤äººå" |
| | | align="center" |
| | | prop="updateBy" |
| | | width="120" |
| | | /> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | width="120" |
| | |
| | | <template> |
| | | <div class="maintenance-detail"> |
| | | <case-basic-info :case-id="caseId" :show-attachment="true" /> |
| | | <!-- åºç¡ä¿¡æ¯ --> |
| | | <el-card class="detail-card"> |
| | | <!-- <el-card class="detail-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">ä¾è
åºæ¬ä¿¡æ¯</span> |
| | | <el-button type="success" style="float: right;" @click="handleSave"> |
| | |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | </el-card> --> |
| | | |
| | | <el-card class="assessment-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">ä¾è
è¯ä¼°å项记å½</span> |
| | | <span class="detail-title">è¯ä¼°å项记å½</span> |
| | | <el-button |
| | | type="primary" |
| | | size="mini" |
| | |
| | | </el-table> |
| | | </el-card> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="æ¤çæ ¸æ¥è®°å½" name="hlihc"> |
| | | <el-card class="record-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">æ¤çæ ¸æ¥è®°å½</span> |
| | | <el-button |
| | | type="primary" |
| | | size="mini" |
| | | icon="el-icon-plus" |
| | | @click="handleAddRecord" |
| | | > |
| | | æ°å¢æ ¸æ¥è®°å½ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <el-table :data="recordList" v-loading="recordLoading"> |
| | | <el-table-column |
| | | label="æ ¸æ¥æ¶é´" |
| | | align="center" |
| | | prop="recordTime" |
| | | width="160" |
| | | /> |
| | | <el-table-column |
| | | label="æ ¸æ¥äºº" |
| | | align="center" |
| | | prop="recorder" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | label="æ ¸æ¥è®°å½" |
| | | align="center" |
| | | prop="checkRecord" |
| | | min-width="200" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column label="éä»¶" align="center" width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | v-if=" |
| | | scope.row.attachments && scope.row.attachments.length > 0 |
| | | " |
| | | size="mini" |
| | | type="text" |
| | | @click="handleViewRecordAttachments(scope.row)" |
| | | > |
| | | æ¥çéä»¶({{ scope.row.attachments.length }}) |
| | | </el-button> |
| | | <span v-else>æ éä»¶</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | width="180" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <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> |
| | | </el-card> |
| | | </el-tab-pane> |
| | | |
| | | <!-- èåè½è¾åè½ --> |
| | | <el-tab-pane label="èåè½è¾åè½" name="liverKidney"> |
| | |
| | | </el-card> |
| | | |
| | | <!-- æ¤çæ ¸æ¥è®°å½ --> |
| | | <el-card class="record-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span class="detail-title">æ¤çæ ¸æ¥è®°å½</span> |
| | | <el-button |
| | | type="primary" |
| | | size="mini" |
| | | icon="el-icon-plus" |
| | | @click="handleAddRecord" |
| | | > |
| | | æ°å¢æ ¸æ¥è®°å½ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <el-table :data="recordList" v-loading="recordLoading"> |
| | | <el-table-column |
| | | label="æ ¸æ¥æ¶é´" |
| | | align="center" |
| | | prop="recordTime" |
| | | width="160" |
| | | /> |
| | | <el-table-column |
| | | label="æ ¸æ¥äºº" |
| | | align="center" |
| | | prop="recorder" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | label="æ ¸æ¥è®°å½" |
| | | align="center" |
| | | prop="checkRecord" |
| | | min-width="200" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column label="éä»¶" align="center" width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | v-if="scope.row.attachments && scope.row.attachments.length > 0" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleViewRecordAttachments(scope.row)" |
| | | > |
| | | æ¥çéä»¶({{ scope.row.attachments.length }}) |
| | | </el-button> |
| | | <span v-else>æ éä»¶</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | width="180" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <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> |
| | | </el-card> |
| | | |
| | | <!-- å¹å
»è®°å½ç¼è¾å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | |
| | | import LiverKidneyPanel from "@/components/MaintainComponents/LiverKidneyPanel.vue"; |
| | | import BloodRoutinePanel from "@/components/MaintainComponents/BloodRoutinePanel.vue"; |
| | | import UrineRoutinePanel from "@/components/MaintainComponents/UrineRoutinePanel.vue"; |
| | | import CaseBasicInfo from "@/components/CaseBasicInfo"; |
| | | import store from "@/store"; |
| | | import dayjs from "dayjs"; |
| | | |
| | | export default { |
| | |
| | | FilePreviewDialog, |
| | | LiverKidneyPanel, |
| | | BloodRoutinePanel, |
| | | UrineRoutinePanel |
| | | UrineRoutinePanel, |
| | | CaseBasicInfo |
| | | }, |
| | | dicts: [ |
| | | "sys_donornode", |
| | |
| | | |
| | | data() { |
| | | return { |
| | | isEdit: false, |
| | | caseId: null, |
| | | isEdit: true, |
| | | currentMaintenanceId: null, |
| | | isEditMode: false, |
| | | form: { |
| | |
| | | |
| | | // éä»¶ç¸å
³é
ç½® |
| | | attachmentLimit: 10, |
| | | attachmentAccept: ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt", |
| | | attachmentAccept: |
| | | ".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt", |
| | | |
| | | // è¯ä¼°æ°æ®åå¨ |
| | | assessmentData: { |
| | |
| | | }; |
| | | }, |
| | | created() { |
| | | this.caseId = this.$route.query.infoid; |
| | | |
| | | this.loadMaintenanceData(); |
| | | }, |
| | | watch: { |
| | |
| | | if (response.code === 200) { |
| | | this.$message.success("ä¿åæå"); |
| | | this.isEdit = false; |
| | | this.donatebaseinfoEdit({ |
| | | id: this.$route.query.infoid, |
| | | extracontent: JSON.stringify(this.extracontentinfo) |
| | | }); |
| | | if (!this.currentMaintenanceId) { |
| | | this.currentMaintenanceId = response.data; |
| | | } |
| | | // this.donatebaseinfoEdit({ |
| | | // id: this.$route.query.infoid, |
| | | // extracontent: JSON.stringify(this.extracontentinfo) |
| | | // }); |
| | | if (!this.isEditMode && response.data && response.data.id) { |
| | | this.currentMaintenanceId = response.data.id; |
| | | this.isEditMode = true; |
| | |
| | | handleEditCulture(row) { |
| | | this.cultureDialogTitle = "ç¼è¾å¹å
»è®°å½"; |
| | | this.cultureForm = { ...row }; |
| | | this.cultureFileList = row.attachments ? row.attachments.map(item => ({ |
| | | uid: item.id || Math.random(), |
| | | name: item.fileName, |
| | | fileSize: item.fileSize, |
| | | url: item.path || item.fileUrl, |
| | | uploadTime: item.uploadTime, |
| | | status: "success" |
| | | })) : []; |
| | | this.cultureFileList = row.attachments |
| | | ? row.attachments.map(item => ({ |
| | | uid: item.id || Math.random(), |
| | | name: item.fileName, |
| | | fileSize: item.fileSize, |
| | | url: item.path || item.fileUrl, |
| | | uploadTime: item.uploadTime, |
| | | status: "success" |
| | | })) |
| | | : []; |
| | | this.cultureDialogVisible = true; |
| | | this.$nextTick(() => { |
| | | this.$refs.cultureForm && this.$refs.cultureForm.clearValidate(); |
| | |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19), |
| | | recorder: "å½åç¨æ·", |
| | | recorder: store.getters.name, |
| | | checkRecord: "", |
| | | attachments: [] |
| | | }; |
| | |
| | | handleEditRecord(row) { |
| | | this.recordDialogTitle = "ç¼è¾æ¤çæ ¸æ¥è®°å½"; |
| | | this.recordForm = { ...row }; |
| | | this.recordFileList = row.attachments ? row.attachments.map(item => ({ |
| | | uid: item.id || Math.random(), |
| | | name: item.fileName, |
| | | fileSize: item.fileSize, |
| | | url: item.path || item.fileUrl, |
| | | uploadTime: item.uploadTime, |
| | | status: "success" |
| | | })) : []; |
| | | this.recordFileList = row.attachments |
| | | ? row.attachments.map(item => ({ |
| | | uid: item.id || Math.random(), |
| | | name: item.fileName, |
| | | fileSize: item.fileSize, |
| | | url: item.path || item.fileUrl, |
| | | uploadTime: item.uploadTime, |
| | | status: "success" |
| | | })) |
| | | : []; |
| | | this.recordDialogVisible = true; |
| | | this.$nextTick(() => { |
| | | this.$refs.recordForm && this.$refs.recordForm.clearValidate(); |
| | |
| | | /** è·åæä»¶ç±»å */ |
| | | getFileType(fileName) { |
| | | if (!fileName) return "other"; |
| | | const extension = fileName.split(".").pop().toLowerCase(); |
| | | 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"]; |
| | |
| | | |
| | | /** è·åæä»¶æ©å±å */ |
| | | getFileExtension(filename) { |
| | | return filename.split(".").pop().toLowerCase(); |
| | | return filename |
| | | .split(".") |
| | | .pop() |
| | | .toLowerCase(); |
| | | }, |
| | | |
| | | /** æ ¼å¼åæä»¶å¤§å° */ |
| | |
| | | prop="caseNo" |
| | | width="140" |
| | | /> |
| | | <el-table-column |
| | | label="转è¿ç¶æ" |
| | | align="center" |
| | | prop="transitStatus" |
| | | width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="getStatusTagType(scope.row.transitStatus)"> |
| | | {{ getStatusText(scope.row.transitStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ£è
ä¿¡æ¯" align="center" width="260"> |
| | | <template slot-scope="scope"> |
| | | <div class="donor-info"> |
| | |
| | | prop="contactPerson" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | label="转è¿ç¶æ" |
| | | align="center" |
| | | prop="transitStatus" |
| | | width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="getStatusTagType(scope.row.transitStatus)"> |
| | | {{ getStatusText(scope.row.transitStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="å建æ¶é´" |
| | | align="center" |
| | |
| | | append-to-body |
| | | > |
| | | <div class="action-confirm"> |
| | | <p> |
| | | ç¡®å®è¦{{ actionText }}转è¿å "{{ |
| | | currentTransport.id |
| | | }}" åï¼ |
| | | </p> |
| | | <p>ç¡®å®è¦{{ actionText }}转è¿å "{{ currentTransport.id }}" åï¼</p> |
| | | </div> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="actionOpen = false">å æ¶</el-button> |
| | |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | caseNo: undefined, |
| | | patName: undefined, |
| | | patName: undefined |
| | | // åªæ¥è¯¢å·²åæä¸éè¦è½¬è¿çæ¡ä¾ |
| | | // reportStatus: "3", // å·²åæ |
| | | isTransport: "2" // éè¦è½¬è¿ |
| | | // isTransport: "2" // éè¦è½¬è¿ |
| | | } |
| | | }; |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | // this.getList(); |
| | | this.checkAutoCreate(); |
| | | }, |
| | | methods: { |
| | |
| | | }, |
| | | checkAutoCreate() { |
| | | const query = this.$route.query; |
| | | // 䏿¥è·³è½¬è¿æ¥è¿è¡å¤ç |
| | | if (query.autoCreate === "true") { |
| | | // èªå¨æå¼æ¡ä¾éæ©å¼¹æ¡ |
| | | this.selectCaseOpen = true; |
| | | this.resetCaseSearch(); |
| | | |
| | | // 妿æç¹å®çæ¡ä¾ç¼å·ï¼å¯ä»¥é¢å
æç´¢ |
| | | if (query.caseNo) { |
| | | // this.selectCaseOpen = true; |
| | | this.resetCaseSearch(1); |
| | | this.caseQueryParams.caseNo = query.caseNo; |
| | | this.searchCaseList(); |
| | | this.searchCaseList(1); |
| | | } else { |
| | | this.queryParams.patName = query.patName; |
| | | } |
| | | } |
| | | this.getList(); |
| | | }, |
| | | /** æç´¢å¯ç¨æ¡ä¾ */ |
| | | async searchCaseList() { |
| | | async searchCaseList(type) { |
| | | this.caseLoading = true; |
| | | try { |
| | | const response = await donateList(this.caseQueryParams); |
| | | if (response.code === 200) { |
| | | this.availableCaseList = response.rows || response.data || []; |
| | | this.caseTotal = response.total || 0; |
| | | if (type == 1 && response.data[0]) { |
| | | this.selectCase(response.data[0]); |
| | | } |
| | | } else { |
| | | this.$modal.msgError(response.msg || "è·åæ¡ä¾å表失败"); |
| | | } |
| | |
| | | }, |
| | | |
| | | /** éç½®æ¡ä¾æç´¢ */ |
| | | resetCaseSearch() { |
| | | resetCaseSearch(type) { |
| | | this.caseQueryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | |
| | | // reportStatus: "3", |
| | | isTransport: "2" |
| | | }; |
| | | this.searchCaseList(); |
| | | if (!type) { |
| | | this.searchCaseList(); |
| | | } else { |
| | | // è·¨é¡µé¢æ°å¢åæ¶éå¶ |
| | | this.caseQueryParams.isTransport = null; |
| | | } |
| | | }, |
| | | |
| | | /** 夿æ¡ä¾æ¯å¦å·²æè½¬è¿å */ |
| | |
| | | |
| | | // æå¼è½¬è¿åç¼è¾é¡µé¢ï¼å¹¶ä¼ å
¥éä¸çæ¡ä¾ |
| | | this.currentTransport = this.convertCaseToTransport(caseData); |
| | | console.log(this.currentTransport,'currentTransport'); |
| | | console.log(this.currentTransport, "currentTransport"); |
| | | |
| | | this.isEditing = false; |
| | | this.editOpen = true; |
| | |
| | | |
| | | /** å°æ¡ä¾ä¿¡æ¯è½¬æ¢ä¸ºè½¬è¿åæ ¼å¼ */ |
| | | convertCaseToTransport(caseData) { |
| | | console.log(caseData,'2'); |
| | | console.log(caseData, "2"); |
| | | |
| | | return { |
| | | caseNo: caseData.caseNo, |
| | |
| | | |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map(item => item.id); |
| | | this.ids = selection.map(item => item.id); |
| | | this.single = selection.length !== 1; |
| | | this.multiple = !selection.length; |
| | | }, |
| | |
| | | /** 详æ
æé®æä½ */ |
| | | handleDetail(row) { |
| | | this.currentTransport = row; |
| | | this.detailTitle = `转è¿å详æ
- ${ row.id}`; |
| | | this.detailTitle = `转è¿å详æ
- ${row.id}`; |
| | | this.detailOpen = true; |
| | | }, |
| | | |
| | |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="å§å" align="center" prop="name" width="100" /> |
| | | <el-table-column label="æç®è
å§å" align="center" prop="name" width="100" /> |
| | | |
| | | <el-table-column label="æ§å«" align="center" prop="sex" width="80"> |
| | | <template slot-scope="scope"> |
| | |
| | | <el-col :span="6"> |
| | | <el-form-item label="æ§å«" prop="sex"> |
| | | <el-select v-model="formData.sex" placeholder="è¯·éæ©æ§å«"> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_user_sex || []" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="parseInt(dict.value)" |
| | | /> |
| | | <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="GSCè¯å" prop="gcsScore"> |
| | | <el-form-item label="GCSè¯å" prop="gcsScore"> |
| | | <el-input |
| | | v-model="formData.gcsScore" |
| | | placeholder="请è¾å
¥GSCè¯å" |
| | | placeholder="请è¾å
¥GCSè¯å" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | |
| | | async handleSubmit() { |
| | | const valid = await this.$refs.formRef.validate().catch(() => false); |
| | | if (!valid) return; |
| | | if (!valid) { |
| | | this.$message.error("请确认表åå¿
å¡«ä¿¡æ¯å®æ´åæäº¤"); |
| | | return; |
| | | } |
| | | |
| | | this.submitLoading = true; |
| | | try { |
| | |
| | | > |
| | | <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="请è¾å
¥å§å" |
| | |
| | | prop="caseNo" |
| | | width="200" |
| | | /> |
| | | <el-table-column label="å§å" align="center" prop="name" width="100" /> |
| | | <el-table-column label="æç®è
å§å" align="center" prop="name" width="100" /> |
| | | <el-table-column label="æ§å«" align="center" prop="sex" width="100"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | |
| | | align="center" |
| | | prop="treatmenthospitalname" |
| | | /> |
| | | <el-table-column label="GSCè¯å" align="center" prop="gcsScore" /> |
| | | <el-table-column label="GCSè¯å" align="center" prop="gcsScore" /> |
| | | <el-table-column label="è¡å" align="center" prop="bloodtype" width="100"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |