| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="assessment-detail"> |
| | | <el-card class="basic-info-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>æ¡ä¾åºæ¬ä¿¡æ¯</span> |
| | | <el-button |
| | | style="float: right; padding: 3px 0" |
| | | type="text" |
| | | @click="handleAttachmentPreview" |
| | | > |
| | | <i class="el-icon-folder-opened"></i> æ¥çéä»¶ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="æ¡ä¾ç¼å·">{{ |
| | | assessmentData.caseNo |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ½å¨æç®è
å§å">{{ |
| | | assessmentData.donorName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ§å«"> |
| | | <dict-tag :options="genderOptions" :value="assessmentData.gender" /> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å¹´é¾" |
| | | >{{ assessmentData.age }}å²</el-descriptions-item |
| | | > |
| | | <el-descriptions-item label="è¡å"> |
| | | <dict-tag |
| | | :options="bloodTypeOptions" |
| | | :value="assessmentData.bloodType" |
| | | /> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä»¶å·ç ">{{ |
| | | assessmentData.idCardNo |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç¾ç
è¯æ">{{ |
| | | assessmentData.diagnosis |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æå¨å»çæºæ">{{ |
| | | assessmentData.hospitalName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="主治å»ç">{{ |
| | | assessmentData.doctorName |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç³è¯·è¯ä¼°æ¶é´">{{ |
| | | assessmentData.applyTime |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°ç±»å"> |
| | | <dict-tag |
| | | :options="assessmentTypeOptions" |
| | | :value="assessmentData.assessmentType" |
| | | /> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä¼°ç¶æ"> |
| | | <el-tag :type="statusFilter(assessmentData.assessmentStatus)"> |
| | | {{ statusTextFilter(assessmentData.assessmentStatus) }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-card> |
| | | |
| | | <el-card class="organ-assessment-card"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>å¨å®è¯ä¼°è¡¨</span> |
| | | <el-button |
| | | v-if="isCoordinator && allOrgansAssessed" |
| | | style="float: right; margin-left: 10px" |
| | | type="primary" |
| | | size="mini" |
| | | @click="handleCompleteAssessment" |
| | | > |
| | | ç¡®è®¤å®æè¯ä¼° |
| | | </el-button> |
| | | <span v-if="!isCoordinator" class="jstitle"> |
| | | å½åè§è²ï¼{{ currentDepartment }}è¯ä¼°äººå |
| | | </span> |
| | | </div> |
| | | |
| | | <el-table |
| | | :data="organAssessmentList" |
| | | v-loading="assessmentLoading" |
| | | style="width: 100%" |
| | | :row-class-name="getRowClassName" |
| | | > |
| | | <el-table-column |
| | | label="å¨å®ç±»å" |
| | | align="center" |
| | | prop="organType" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="organTypeOptions" |
| | | :value="scope.row.organType" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="è¯ä¼°ç§å®¤" |
| | | align="center" |
| | | prop="department" |
| | | width="120" |
| | | /> |
| | | <el-table-column |
| | | label="è¯ä¼°äººå" |
| | | align="center" |
| | | prop="assessor" |
| | | width="100" |
| | | /> |
| | | <el-table-column label="è¯ä¼°ç¶æ" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="scope.row.assessmentStatus === '1' ? 'success' : 'warning'" |
| | | size="small" |
| | | > |
| | | {{ scope.row.assessmentStatus === "1" ? "å·²è¯ä¼°" : "å¾
è¯ä¼°" }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åè½ç¶æ" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="getFunctionStatusType(scope.row.functionStatus)" |
| | | size="small" |
| | | > |
| | | {{ getFunctionStatusText(scope.row.functionStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="è¯ä¼°æè§" |
| | | align="center" |
| | | prop="assessmentOpinion" |
| | | min-width="150" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column label="è¯ä¼°æ¶é´" align="center" width="120"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.assessmentTime || "-" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | width="150" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | v-if="canAssessOrgan(scope.row)" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleOrganAssess(scope.row)" |
| | | >{{ |
| | | scope.row.assessmentStatus === "1" ? "æ¥ç/ä¿®æ¹" : "è¯ä¼°" |
| | | }}</el-button |
| | | > |
| | | <el-button v-else size="mini" type="text" disabled |
| | | >æ æé</el-button |
| | | > |
| | | <el-button |
| | | v-if="isCoordinator" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleViewOrganDetail(scope.row)" |
| | | >详æ
</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å¨å®è¯ä¼°è¯¦æ
--> |
| | | <el-collapse |
| | | v-model="activeOrgans" |
| | | accordion |
| | | class="organ-detail-collapse" |
| | | > |
| | | <el-collapse-item |
| | | v-for="organ in organAssessmentList" |
| | | :key="organ.organType" |
| | | :name="organ.organType" |
| | | :title="getOrganTitle(organ)" |
| | | > |
| | | <organ-assessment-form |
| | | :organ-data="organ" |
| | | :readonly="!canAssessOrgan(organ)" |
| | | @save="handleSaveOrganAssessment" |
| | | /> |
| | | </el-collapse-item> |
| | | </el-collapse> |
| | | </el-card> |
| | | |
| | | <!-- éä»¶é¢è§å¼¹çª --> |
| | | <attachment-preview |
| | | :visible="attachmentVisible" |
| | | :attachment-list="attachmentList" |
| | | @close="attachmentVisible = false" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | // import { getAssessment, updateOrganAssessment, completeAssessment } from "@/api/case/assessment"; |
| | | import { |
| | | getAssessment, |
| | | updateOrganAssessment, |
| | | completeAssessment |
| | | } from "./mockAssessmentApi"; |
| | | |
| | | import OrganAssessmentForm from "./components/OrganAssessmentForm.vue"; |
| | | import AttachmentPreview from "./components/AttachmentPreview.vue"; |
| | | |
| | | export default { |
| | | name: "AssessmentDetail", |
| | | components: { OrganAssessmentForm, AttachmentPreview }, |
| | | data() { |
| | | return { |
| | | // è¯ä¼°ID |
| | | assessmentId: undefined, |
| | | // è¯ä¼°æ°æ® |
| | | assessmentData: {}, |
| | | // å¨å®è¯ä¼°å表 |
| | | organAssessmentList: [], |
| | | // éä»¶å表 |
| | | attachmentList: [], |
| | | // å è½½ç¶æ |
| | | assessmentLoading: false, |
| | | // å½åç¨æ·ä¿¡æ¯ |
| | | currentUser: { |
| | | id: "001", |
| | | name: "å¼ å»ç", |
| | | department: "å¿èå¤ç§", |
| | | role: "department" // coordinator: åè°å, department: ç§å®¤äººå |
| | | }, |
| | | // å±å¼çå¨å® |
| | | activeOrgans: [], |
| | | // éä»¶é¢è§å¯è§æ§ |
| | | attachmentVisible: false, |
| | | // åå
¸é项 |
| | | genderOptions: [ |
| | | { value: "0", label: "ç·" }, |
| | | { value: "1", label: "女" } |
| | | ], |
| | | bloodTypeOptions: [ |
| | | { value: "A", label: "Aå" }, |
| | | { value: "B", label: "Bå" }, |
| | | { value: "O", label: "Oå" }, |
| | | { value: "AB", label: "ABå" } |
| | | ], |
| | | assessmentTypeOptions: [ |
| | | { value: "1", label: "忬¡è¯ä¼°" }, |
| | | { value: "2", label: "æç»è¯ä¼°" } |
| | | ], |
| | | organTypeOptions: [ |
| | | { value: "heart", label: "å¿è" }, |
| | | { value: "liver", label: "èè" }, |
| | | { value: "kidney", label: "è¾è" }, |
| | | { value: "lung", label: "èºè" }, |
| | | { value: "pancreas", label: "è°è
º" }, |
| | | { value: "intestine", label: "è é" }, |
| | | { value: "cornea", label: "è§è" }, |
| | | { value: "skin", label: "ç®è¤" } |
| | | ] |
| | | }; |
| | | }, |
| | | computed: { |
| | | // æ¯å¦æ¯åè°å |
| | | isCoordinator() { |
| | | return this.currentUser.role === "coordinator"; |
| | | }, |
| | | // å½åç§å®¤ |
| | | currentDepartment() { |
| | | return this.currentUser.department; |
| | | }, |
| | | // ææå¨å®æ¯å¦é½å·²è¯ä¼° |
| | | allOrgansAssessed() { |
| | | return this.organAssessmentList.every( |
| | | organ => organ.assessmentStatus === "1" |
| | | ); |
| | | } |
| | | }, |
| | | created() { |
| | | this.assessmentId = this.$route.query.id; |
| | | this.getAssessmentDetail(); |
| | | }, |
| | | methods: { |
| | | // è·åè¯ä¼°è¯¦æ
- 使ç¨Mockæ°æ® |
| | | getAssessmentDetail() { |
| | | this.assessmentLoading = true; |
| | | getAssessment(this.assessmentId) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.assessmentData = response.data.caseInfo; |
| | | this.organAssessmentList = response.data.organAssessments || []; |
| | | this.attachmentList = response.data.attachments || []; |
| | | } else { |
| | | this.$message.error("è·åè¯ä¼°è¯¦æ
失败"); |
| | | } |
| | | this.assessmentLoading = false; |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·åè¯ä¼°è¯¦æ
失败:", error); |
| | | this.assessmentLoading = false; |
| | | this.$message.error("è·åè¯ä¼°è¯¦æ
失败"); |
| | | }); |
| | | }, |
| | | // ç¶æè¿æ»¤å¨ |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | | "0": "warning", |
| | | "1": "primary", |
| | | "2": "success", |
| | | "3": "danger" |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | statusTextFilter(status) { |
| | | const statusMap = { |
| | | "0": "å¾
è¯ä¼°", |
| | | "1": "è¯ä¼°ä¸", |
| | | "2": "已宿", |
| | | "3": "å·²å
³é" |
| | | }; |
| | | return statusMap[status] || "æªç¥"; |
| | | }, |
| | | // è·ååè½ç¶æç±»å |
| | | getFunctionStatusType(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] || "æªç¥"; |
| | | }, |
| | | // æ£æ¥æ¯å¦ææéè¯ä¼°è¯¥å¨å® |
| | | canAssessOrgan(organ) { |
| | | if (this.isCoordinator) return true; |
| | | return organ.department === this.currentDepartment; |
| | | }, |
| | | // è·åè¡ç±»å |
| | | getRowClassName({ row }) { |
| | | return this.canAssessOrgan(row) ? "assessable-row" : "non-assessable-row"; |
| | | }, |
| | | // è·åå¨å®æ é¢ |
| | | getOrganTitle(organ) { |
| | | const organName = |
| | | this.organTypeOptions.find(opt => opt.value === organ.organType) |
| | | ?.label || organ.organType; |
| | | return `${organName}è¯ä¼°è¯¦æ
ï¼${organ.department}ï¼`; |
| | | }, |
| | | // å¨å®è¯ä¼° |
| | | handleOrganAssess(organ) { |
| | | this.activeOrgans = [organ.organType]; |
| | | }, |
| | | // æ¥çå¨å®è¯¦æ
|
| | | handleViewOrganDetail(organ) { |
| | | this.activeOrgans = [organ.organType]; |
| | | }, |
| | | // ä¿åå¨å®è¯ä¼° - 使ç¨Mock API |
| | | handleSaveOrganAssessment(organData) { |
| | | updateOrganAssessment(organData) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("è¯ä¼°ä¿åæå"); |
| | | // å·æ°æ°æ® |
| | | this.getAssessmentDetail(); |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("ä¿åè¯ä¼°å¤±è´¥:", error); |
| | | this.$message.error("ä¿å失败"); |
| | | }); |
| | | }, |
| | | // æ¥çéä»¶é¢è§ |
| | | handleAttachmentPreview() { |
| | | this.attachmentVisible = true; |
| | | }, |
| | | // 宿è¯ä¼° - 使ç¨Mock API |
| | | handleCompleteAssessment() { |
| | | this.$confirm("ç¡®è®¤å®æææå¨å®è¯ä¼°åï¼å®æåå°æ æ³ä¿®æ¹", "确认æä½", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(() => { |
| | | completeAssessment(this.assessmentId) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("è¯ä¼°å®æç¡®è®¤æå"); |
| | | this.getAssessmentDetail(); |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("宿è¯ä¼°å¤±è´¥:", error); |
| | | this.$message.error("æä½å¤±è´¥"); |
| | | }); |
| | | }); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .assessment-detail { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .basic-info-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .organ-assessment-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .organ-detail-collapse { |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | ::v-deep .assessable-row { |
| | | background-color: #f0f9ff; |
| | | } |
| | | |
| | | ::v-deep .non-assessable-row { |
| | | background-color: #fafafa; |
| | | } |
| | | |
| | | ::v-deep .el-descriptions__label { |
| | | width: 120px; |
| | | background-color: #f5f7fa; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .fixed-width .el-button { |
| | | margin: 0 2px; |
| | | } |
| | | .jstitle { |
| | | float: right; |
| | | font-size: 18px !important; |
| | | font-weight: 600; |
| | | color: #2645f7; |
| | | font-size: 12px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // src/mock/assessmentData.js |
| | | |
| | | // 模æè¯ä¼°åè¡¨æ°æ® |
| | | export const assessmentListData = { |
| | | code: 200, |
| | | message: 'success', |
| | | data: { |
| | | total: 15, |
| | | rows: [ |
| | | { |
| | | id: '20241220001', |
| | | caseNo: 'CASE20241220001', |
| | | donorName: 'å¼ ä¸', |
| | | gender: '0', |
| | | age: 45, |
| | | diagnosis: 'èå¤ä¼¤å¯¼è´èæ»äº¡', |
| | | hospitalName: 'å京ååå»é¢', |
| | | applyTime: '2024-12-20 10:00:00', |
| | | assessmentTime: '', |
| | | assessmentStatus: '0', |
| | | assignee: 'æåè°å', |
| | | assessmentType: '1' |
| | | }, |
| | | { |
| | | id: '20241220002', |
| | | caseNo: 'CASE20241220002', |
| | | donorName: 'æå', |
| | | gender: '1', |
| | | age: 32, |
| | | diagnosis: 'æ¥æ§å¿èæ¢æ»', |
| | | hospitalName: '䏿µ·çéå»é¢', |
| | | applyTime: '2024-12-19 14:30:00', |
| | | assessmentTime: '2024-12-20 09:00:00', |
| | | assessmentStatus: '1', |
| | | assignee: 'çå»ç', |
| | | assessmentType: '2' |
| | | }, |
| | | { |
| | | id: '20241220003', |
| | | caseNo: 'CASE20241220003', |
| | | donorName: 'çäº', |
| | | gender: '0', |
| | | age: 58, |
| | | diagnosis: 'èåºè¡', |
| | | hospitalName: '广å·ä¸å±±å»é¢', |
| | | applyTime: '2024-12-18 09:15:00', |
| | | assessmentTime: '2024-12-20 14:20:00', |
| | | assessmentStatus: '2', |
| | | assignee: 'èµµåè°å', |
| | | assessmentType: '1' |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | |
| | | // 模æè¯ä¼°è¯¦æ
æ°æ® |
| | | export const assessmentDetailData = { |
| | | code: 200, |
| | | message: 'success', |
| | | data: { |
| | | caseInfo: { |
| | | id: '20241220001', |
| | | caseNo: 'CASE20241220001', |
| | | donorName: 'å¼ ä¸', |
| | | gender: '0', |
| | | age: 45, |
| | | bloodType: 'A', |
| | | idCardNo: '110101198001010011', |
| | | diagnosis: 'èå¤ä¼¤å¯¼è´èæ»äº¡', |
| | | hospitalName: 'å京ååå»é¢', |
| | | doctorName: 'å主任', |
| | | applyTime: '2024-12-20 10:00:00', |
| | | assessmentType: '1', |
| | | assessmentStatus: '0' |
| | | }, |
| | | organAssessments: [ |
| | | { |
| | | id: 1, |
| | | organType: 'heart', |
| | | department: 'å¿èå¤ç§', |
| | | assessor: 'çå»ç', |
| | | assessmentStatus: '1', |
| | | functionStatus: '1', |
| | | assessmentOpinion: 'å¿èåè½æ£å¸¸ï¼å°è¡åæ°65%ï¼ç¬¦åæç®æ¡ä»¶', |
| | | assessmentTime: '2024-12-20 10:30:00', |
| | | details: { |
| | | ejectionFraction: '65%', |
| | | valveFunction: 'æ£å¸¸', |
| | | wallMotion: 'æ£å¸¸', |
| | | ecgResult: '窦æ§å¿å¾', |
| | | specialNotes: 'æ ç¹æ®æ³¨æäºé¡¹' |
| | | } |
| | | }, |
| | | { |
| | | id: 2, |
| | | organType: 'liver', |
| | | department: 'èèå¤ç§', |
| | | assessor: '', |
| | | assessmentStatus: '0', |
| | | functionStatus: '', |
| | | assessmentOpinion: '', |
| | | assessmentTime: '', |
| | | details: null |
| | | }, |
| | | { |
| | | id: 3, |
| | | organType: 'kidney', |
| | | department: 'æ³å°¿å¤ç§', |
| | | assessor: 'æå»ç', |
| | | assessmentStatus: '1', |
| | | functionStatus: '2', |
| | | assessmentOpinion: 'å·¦è¾åè½æ£å¸¸ï¼å³è¾è½»åº¦ç§¯æ°´ï¼éè¿ä¸æ¥è¯ä¼°', |
| | | assessmentTime: '2024-12-20 11:15:00', |
| | | details: { |
| | | leftKidneyFunction: 'æ£å¸¸', |
| | | rightKidneyFunction: '轻度å¼å¸¸', |
| | | creatinineLevel: '1.2mg/dL', |
| | | urineOutput: 'æ£å¸¸', |
| | | specialNotes: '建议è¿è¡CTå¢å¼ºæ«æ' |
| | | } |
| | | }, |
| | | { |
| | | id: 4, |
| | | organType: 'lung', |
| | | department: 'è¸å¤ç§', |
| | | assessor: '', |
| | | assessmentStatus: '0', |
| | | functionStatus: '', |
| | | assessmentOpinion: '', |
| | | assessmentTime: '', |
| | | details: null |
| | | } |
| | | ], |
| | | attachments: [ |
| | | { |
| | | id: 1, |
| | | fileName: 'æç®è
身份è¯.jpg', |
| | | fileType: 'jpg', |
| | | fileSize: 1024000, |
| | | uploadTime: '2024-12-19 10:30:00', |
| | | fileUrl: '/mock/files/id_card.jpg' |
| | | }, |
| | | { |
| | | id: 2, |
| | | fileName: 'å»çè¯æè¯æ.pdf', |
| | | fileType: 'pdf', |
| | | fileSize: 2048000, |
| | | uploadTime: '2024-12-19 11:20:00', |
| | | fileUrl: '/mock/files/diagnosis.pdf' |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | |
| | | // 模æAPIååºå»¶è¿ |
| | | export const mockDelay = (ms = 500) => new Promise(resolve => setTimeout(resolve, ms)) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- src/views/case/assessment/components/AttachmentPreview.vue --> |
| | | <template> |
| | | <el-dialog |
| | | title="éä»¶é¢è§" |
| | | :visible="visible" |
| | | width="70%" |
| | | @close="$emit('close')" |
| | | > |
| | | <el-table :data="attachmentList"> |
| | | <el-table-column label="æä»¶å" prop="fileName" /> |
| | | <el-table-column label="ç±»å" prop="fileType" width="100" /> |
| | | <el-table-column label="大å°" width="100"> |
| | | <template slot-scope="scope"> |
| | | {{ (scope.row.fileSize / 1024 / 1024).toFixed(2) }} MB |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="150"> |
| | | <template slot-scope="scope"> |
| | | <el-button type="text" @click="handlePreview(scope.row)">é¢è§</el-button> |
| | | <el-button type="text" @click="handleDownload(scope.row)">ä¸è½½</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: "AttachmentPreview", |
| | | props: { |
| | | visible: Boolean, |
| | | attachmentList: { |
| | | type: Array, |
| | | default: () => [] |
| | | } |
| | | }, |
| | | methods: { |
| | | handlePreview(file) { |
| | | this.$message.info(`é¢è§æä»¶: ${file.fileName}`); |
| | | }, |
| | | handleDownload(file) { |
| | | this.$message.success(`å¼å§ä¸è½½: ${file.fileName}`); |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- src/views/case/assessment/components/OrganAssessmentForm.vue --> |
| | | <template> |
| | | <div class="organ-assessment-form"> |
| | | <el-form :model="organData" label-width="120px"> |
| | | <el-form-item label="åè½ç¶æ"> |
| | | <el-select v-model="organData.functionStatus" :disabled="readonly"> |
| | | <el-option label="æ£å¸¸" value="1" /> |
| | | <el-option label="轻度å¼å¸¸" value="2" /> |
| | | <el-option label="é度å¼å¸¸" value="3" /> |
| | | <el-option label="æ æ³è¯ä¼°" value="4" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="è¯ä¼°æè§"> |
| | | <el-input |
| | | type="textarea" |
| | | v-model="organData.assessmentOpinion" |
| | | :rows="4" |
| | | :disabled="readonly" |
| | | placeholder="请è¾å
¥è¯ä¼°æè§" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item v-if="!readonly"> |
| | | <el-button type="primary" @click="handleSave">ä¿åè¯ä¼°</el-button> |
| | | <el-button @click="handleCancel">åæ¶</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: "OrganAssessmentForm", |
| | | props: { |
| | | organData: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | readonly: { |
| | | type: Boolean, |
| | | default: false |
| | | } |
| | | }, |
| | | methods: { |
| | | handleSave() { |
| | | this.$emit('save', { |
| | | ...this.organData, |
| | | assessmentTime: new Date().toISOString(), |
| | | assessor: 'å½åç¨æ·' |
| | | }); |
| | | }, |
| | | handleCancel() { |
| | | this.$emit('cancel'); |
| | | } |
| | | } |
| | | } |
| | | </script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="assessment-list"> |
| | | <!-- æ¥è¯¢æ¡ä»¶ --> |
| | | <el-card class="search-card"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | | label-width="100px" |
| | | > |
| | | <el-form-item label="æç®è
å§å" prop="donorName"> |
| | | <el-input |
| | | v-model="queryParams.donorName" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æå¨å»çæºæ" prop="hospitalName"> |
| | | <el-input |
| | | v-model="queryParams.hospitalName" |
| | | placeholder="请è¾å
¥å»çæºæ" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¸å¡äººå" prop="assignee"> |
| | | <el-input |
| | | v-model="queryParams.assignee" |
| | | placeholder="请è¾å
¥ä¸å¡äººå" |
| | | clearable |
| | | style="width: 200px" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="è¯ä¼°ç¶æ" prop="assessmentStatus"> |
| | | <el-select |
| | | v-model="queryParams.assessmentStatus" |
| | | placeholder="è¯·éæ©è¯ä¼°ç¶æ" |
| | | clearable |
| | | style="width: 200px" |
| | | > |
| | | <el-option label="å¾
è¯ä¼°" value="0" /> |
| | | <el-option label="è¯ä¼°ä¸" value="1" /> |
| | | <el-option label="已宿" value="2" /> |
| | | <el-option label="å·²å
³é" value="3" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç³è¯·æ¶é´" prop="applyTimeRange"> |
| | | <el-date-picker |
| | | v-model="queryParams.applyTimeRange" |
| | | type="daterange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | value-format="yyyy-MM-dd" |
| | | style="width: 240px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="è¯ä¼°æ¶é´" prop="assessmentTimeRange"> |
| | | <el-date-picker |
| | | v-model="queryParams.assessmentTimeRange" |
| | | type="daterange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | value-format="yyyy-MM-dd" |
| | | style="width: 240px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="el-icon-search" @click="handleQuery" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <!-- æä½æé® --> |
| | | <el-card class="tool-card"> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="16"> |
| | | <el-button type="primary" icon="el-icon-plus" @click="handleCreate" |
| | | >æ°å¢è¯ä¼°</el-button |
| | | > |
| | | <el-button |
| | | type="success" |
| | | icon="el-icon-edit" |
| | | :disabled="single" |
| | | @click="handleUpdate" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | <el-button |
| | | type="danger" |
| | | icon="el-icon-delete" |
| | | :disabled="multiple" |
| | | @click="handleDelete" |
| | | >å é¤</el-button |
| | | > |
| | | <el-button |
| | | type="warning" |
| | | icon="el-icon-download" |
| | | @click="handleExport" |
| | | >导åº</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="8" style="text-align: right"> |
| | | <el-tooltip content="å·æ°" placement="top"> |
| | | <el-button icon="el-icon-refresh" circle @click="getList" /> |
| | | </el-tooltip> |
| | | </el-col> |
| | | </el-row> |
| | | </el-card> |
| | | |
| | | <!-- æ°æ®è¡¨æ ¼ --> |
| | | <el-card> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="assessmentList" |
| | | @selection-change="handleSelectionChange" |
| | | @row-click="handleRowClick" |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column |
| | | label="æ¡ä¾ç¼å·" |
| | | align="center" |
| | | prop="caseNo" |
| | | width="120" |
| | | /> |
| | | <el-table-column |
| | | label="æ½å¨æç®è
å§å" |
| | | align="center" |
| | | prop="donorName" |
| | | width="120" |
| | | /> |
| | | <el-table-column label="æ§å«" align="center" prop="gender" width="80"> |
| | | <template slot-scope="scope"> |
| | | <!-- <dict-tag :options="genderOptions" :value="scope.row.gender" /> --> |
| | | <dict-tag |
| | | :options="dict.type.sys_user_sex" |
| | | :value="parseInt(scope.row.gender)" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¹´é¾" align="center" prop="age" width="80" /> |
| | | <el-table-column |
| | | label="ç¾ç
è¯æ" |
| | | align="center" |
| | | prop="diagnosis" |
| | | min-width="180" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="æå¨å»çæºæ" |
| | | align="center" |
| | | prop="hospitalName" |
| | | width="150" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="ç³è¯·è¯ä¼°æ¶é´" |
| | | align="center" |
| | | prop="applyTime" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.applyTime, "{y}-{m}-{d}") }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="è¯ä¼°æ¶é´" |
| | | align="center" |
| | | prop="assessmentTime" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | scope.row.assessmentTime |
| | | ? parseTime(scope.row.assessmentTime, "{y}-{m}-{d}") |
| | | : "-" |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="è¯ä¼°ç¶æ" |
| | | align="center" |
| | | prop="assessmentStatus" |
| | | width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag :type="statusFilter(scope.row.assessmentStatus)"> |
| | | {{ statusTextFilter(scope.row.assessmentStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ä¸å¡äººå" |
| | | align="center" |
| | | prop="assignee" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | label="è¯ä¼°ç±»å" |
| | | align="center" |
| | | prop="assessmentType" |
| | | width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.assessment_Type" |
| | | :value="parseInt(scope.row.assessmentType)" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | width="200" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click.stop="handleView(scope.row)" |
| | | >详æ
</el-button |
| | | > |
| | | <el-button |
| | | v-if=" |
| | | scope.row.assessmentStatus === '0' || |
| | | scope.row.assessmentStatus === '1' |
| | | " |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click.stop="handleAssess(scope.row)" |
| | | >è¯ä¼°</el-button |
| | | > |
| | | <el-button |
| | | v-if="scope.row.assessmentStatus === '2'" |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-check" |
| | | @click.stop="handleConfirm(scope.row)" |
| | | >确认</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页ç»ä»¶ --> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | // import { listAssessment, delAssessment, exportAssessment } from "@/api/case/assessment"; |
| | | import { |
| | | listAssessment, |
| | | delAssessment, |
| | | exportAssessment |
| | | } from "./mockAssessmentApi"; |
| | | |
| | | import Pagination from "@/components/Pagination"; |
| | | |
| | | export default { |
| | | name: "AssessmentList", |
| | | components: { Pagination }, |
| | | dicts: ["sys_user_sex", "assessment_Type"], |
| | | data() { |
| | | return { |
| | | // é®ç½©å± |
| | | loading: true, |
| | | // é䏿°ç» |
| | | ids: [], |
| | | // éå个ç¦ç¨ |
| | | single: true, |
| | | // éå¤ä¸ªç¦ç¨ |
| | | multiple: true, |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | // è¯ä¼°è¡¨æ ¼æ°æ® |
| | | assessmentList: [], |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | donorName: undefined, |
| | | hospitalName: undefined, |
| | | assignee: undefined, |
| | | assessmentStatus: undefined, |
| | | applyTimeRange: [], |
| | | assessmentTimeRange: [] |
| | | }, |
| | | // æ§å«é项 |
| | | genderOptions: [ |
| | | { value: "0", label: "ç·" }, |
| | | { value: "1", label: "女" } |
| | | ], |
| | | // è¯ä¼°ç±»åé项 |
| | | assessmentTypeOptions: [ |
| | | { value: "1", label: "忬¡è¯ä¼°" }, |
| | | { value: "2", label: "æç»è¯ä¼°" } |
| | | ] |
| | | }; |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | }, |
| | | methods: { |
| | | // ç¶æè¿æ»¤å¨ |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | | "0": "warning", // å¾
è¯ä¼° |
| | | "1": "primary", // è¯ä¼°ä¸ |
| | | "2": "success", // 已宿 |
| | | "3": "danger" // å·²å
³é |
| | | }; |
| | | return statusMap[status] || "info"; |
| | | }, |
| | | statusTextFilter(status) { |
| | | const statusMap = { |
| | | "0": "å¾
è¯ä¼°", |
| | | "1": "è¯ä¼°ä¸", |
| | | "2": "已宿", |
| | | "3": "å·²å
³é" |
| | | }; |
| | | return statusMap[status] || "æªç¥"; |
| | | }, |
| | | // æ¥è¯¢è¯ä¼°å表 |
| | | getList() { |
| | | this.loading = true; |
| | | listAssessment(this.queryParams) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.assessmentList = response.data.rows; |
| | | this.total = response.data.total; |
| | | } else { |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | } |
| | | this.loading = false; |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·åè¯ä¼°å表失败:", error); |
| | | this.loading = false; |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | }); |
| | | }, |
| | | // æç´¢æé®æä½ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | // éç½®æé®æä½ |
| | | resetQuery() { |
| | | this.$refs.queryForm.resetFields(); |
| | | this.handleQuery(); |
| | | }, |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map(item => item.id); |
| | | this.single = selection.length !== 1; |
| | | this.multiple = !selection.length; |
| | | }, |
| | | // è¡ç¹å»äºä»¶ |
| | | handleRowClick(row) { |
| | | this.$router.push({ |
| | | path: "/case/assessment/detail", |
| | | query: { id: row.id } |
| | | }); |
| | | }, |
| | | // æ¥ç详æ
|
| | | handleView(row) { |
| | | this.$router.push({ path: "/organ/assessInfo", query: { id: row.id } }); |
| | | }, |
| | | // è¿è¡è¯ä¼° |
| | | handleAssess(row) { |
| | | this.$router.push({ |
| | | path: "/case/assessment/detail", |
| | | query: { id: row.id, assess: true } |
| | | }); |
| | | }, |
| | | // 确认è¯ä¼° |
| | | handleConfirm(row) { |
| | | this.$confirm("ç¡®è®¤å®æè¯¥æ¡ä¾çè¯ä¼°åï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | // è°ç¨Mock确认API |
| | | this.$message.success("确认æå"); |
| | | // å·æ°å表 |
| | | this.getList(); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // æ°å¢æé®æä½ |
| | | handleCreate() { |
| | | this.$router.push("/case/assessment/add"); |
| | | }, |
| | | // ä¿®æ¹æé®æä½ |
| | | handleUpdate() { |
| | | const id = this.ids[0]; |
| | | this.$router.push({ path: "/case/assessment/edit", query: { id: id } }); |
| | | }, |
| | | // å é¤æé®æä½ - 使ç¨Mock API |
| | | handleDelete() { |
| | | const ids = this.ids; |
| | | this.$confirm("æ¯å¦ç¡®è®¤å é¤éä¸çæ°æ®é¡¹ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | return delAssessment(ids); |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("å 餿å"); |
| | | this.getList(); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // å¯¼åºæé®æä½ - 使ç¨Mock API |
| | | handleExport() { |
| | | const queryParams = this.queryParams; |
| | | this.$confirm("æ¯å¦ç¡®è®¤å¯¼åºææè¯ä¼°æ°æ®ï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }) |
| | | .then(() => { |
| | | this.loading = true; |
| | | return exportAssessment(queryParams); |
| | | }) |
| | | .then(response => { |
| | | if (response.code === 200) { |
| | | this.$message.success("å¯¼åºæåï¼å¼å§ä¸è½½æä»¶"); |
| | | // 模ææä»¶ä¸è½½ |
| | | const link = document.createElement("a"); |
| | | link.href = response.data.downloadUrl; |
| | | link.download = "æ¡ä¾è¯ä¼°æ°æ®.xlsx"; |
| | | link.click(); |
| | | } |
| | | this.loading = false; |
| | | }) |
| | | .catch(() => { |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | // æ¶é´æ ¼å¼å |
| | | parseTime(time, pattern) { |
| | | if (!time) return ""; |
| | | // 使ç¨moment.jsæç®åæ ¼å¼å |
| | | if (this.$moment) { |
| | | return this.$moment(time).format(pattern || "{y}-{m}-{d} {h}:{i}:{s}"); |
| | | } else { |
| | | // ç®åæ ¼å¼å |
| | | const date = new Date(time); |
| | | return `${date.getFullYear()}-${(date.getMonth() + 1) |
| | | .toString() |
| | | .padStart(2, "0")}-${date |
| | | .getDate() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .assessment-list { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .search-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .tool-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .fixed-width .el-button { |
| | | margin: 0 5px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // src/api/mockAssessmentApi.js |
| | | import { assessmentListData, assessmentDetailData, mockDelay } from './assessmentData.js' |
| | | |
| | | // 模æè¯ä¼°å表API |
| | | export const listAssessment = async (queryParams) => { |
| | | await mockDelay(800) |
| | | |
| | | console.log('Mock API: è·åè¯ä¼°å表', queryParams) |
| | | |
| | | // 模æçéé»è¾ |
| | | let data = assessmentListData.data.rows |
| | | |
| | | if (queryParams.donorName) { |
| | | data = data.filter(item => item.donorName.includes(queryParams.donorName)) |
| | | } |
| | | |
| | | if (queryParams.hospitalName) { |
| | | data = data.filter(item => item.hospitalName.includes(queryParams.hospitalName)) |
| | | } |
| | | |
| | | if (queryParams.assessmentStatus) { |
| | | data = data.filter(item => item.assessmentStatus === queryParams.assessmentStatus) |
| | | } |
| | | |
| | | // 模æå页 |
| | | const pageNum = queryParams.pageNum || 1 |
| | | const pageSize = queryParams.pageSize || 10 |
| | | const startIndex = (pageNum - 1) * pageSize |
| | | const endIndex = startIndex + pageSize |
| | | const pagedData = data.slice(startIndex, endIndex) |
| | | |
| | | return { |
| | | code: 200, |
| | | message: 'success', |
| | | data: { |
| | | total: data.length, |
| | | rows: pagedData |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 模æè¯ä¼°è¯¦æ
API |
| | | export const getAssessment = async (id) => { |
| | | await mockDelay(500) |
| | | |
| | | console.log('Mock API: è·åè¯ä¼°è¯¦æ
', id) |
| | | |
| | | // æ ¹æ®IDè¿åä¸åçæ¨¡ææ°æ® |
| | | const detailData = JSON.parse(JSON.stringify(assessmentDetailData)) |
| | | |
| | | if (id === '20241220002') { |
| | | detailData.data.caseInfo.donorName = 'æå' |
| | | detailData.data.caseInfo.caseNo = 'CASE20241220002' |
| | | detailData.data.organAssessments[0].assessor = 'å¼ å»ç' |
| | | } else if (id === '20241220003') { |
| | | detailData.data.caseInfo.donorName = 'çäº' |
| | | detailData.data.caseInfo.caseNo = 'CASE20241220003' |
| | | detailData.data.organAssessments[0].assessor = 'éå»ç' |
| | | } |
| | | |
| | | return detailData |
| | | } |
| | | |
| | | // 模æå¨å®è¯ä¼°æ´æ°API |
| | | export const updateOrganAssessment = async (organData) => { |
| | | await mockDelay(300) |
| | | |
| | | console.log('Mock API: æ´æ°å¨å®è¯ä¼°', organData) |
| | | |
| | | return { |
| | | code: 200, |
| | | message: 'å¨å®è¯ä¼°æ´æ°æå', |
| | | data: organData |
| | | } |
| | | } |
| | | |
| | | // 模æå®æè¯ä¼°API |
| | | export const completeAssessment = async (id) => { |
| | | await mockDelay(500) |
| | | |
| | | console.log('Mock API: 宿è¯ä¼°', id) |
| | | |
| | | return { |
| | | code: 200, |
| | | message: 'è¯ä¼°å®æç¡®è®¤æå', |
| | | data: { |
| | | assessmentId: id, |
| | | completeTime: new Date().toISOString() |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 模æå é¤è¯ä¼°API |
| | | export const delAssessment = async (ids) => { |
| | | await mockDelay(400) |
| | | |
| | | console.log('Mock API: å é¤è¯ä¼°', ids) |
| | | |
| | | return { |
| | | code: 200, |
| | | message: 'å 餿å', |
| | | data: ids |
| | | } |
| | | } |
| | | |
| | | // 模æå¯¼åºè¯ä¼°API |
| | | export const exportAssessment = async (queryParams) => { |
| | | await mockDelay(1000) |
| | | |
| | | console.log('Mock API: 导åºè¯ä¼°', queryParams) |
| | | |
| | | // 模ææä»¶ä¸è½½ |
| | | return { |
| | | code: 200, |
| | | message: 'å¯¼åºæå', |
| | | data: { |
| | | downloadUrl: '/mock/export/assessment.xlsx', |
| | | fileSize: '2.5MB' |
| | | } |
| | | } |
| | | } |