已重命名1个文件
已修改4个文件
已添加3个文件
已复制2个文件
copy from "\346\214\207\346\240\207\347\273\237\350\256\241\346\225\264\345\220\210\351\241\265\351\200\202\351\205\215\344\270\275\346\260\264\347\234\201\347\253\213\345\220\214\345\276\267.zip"
copy to "dist \0502\051.zip"
Binary files differ
copy from "\346\214\207\346\240\207\347\273\237\350\256\241\346\225\264\345\220\210\351\241\265\351\200\202\351\205\215\344\270\275\346\260\264\347\234\201\347\253\213\345\220\214\345\276\267.zip"
copy to "dist \0503\051.zip"
Binary files differ
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="batch-process"> |
| | | <!-- 页颿 é¢ --> |
| | | <div class="page-header"> |
| | | <div class="header-content"> |
| | | <h2 class="page-title">å¼å¸¸æ¹éå¤ç</h2> |
| | | <p class="page-description">æ¹éå¤çéä¸çå¼å¸¸åé¦</p> |
| | | <div class="header-actions"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-check" |
| | | @click="handleBatchSubmit" |
| | | :loading="batchProcessing" |
| | | > |
| | | æ¹éæäº¤å¤ç |
| | | </el-button> |
| | | <el-button |
| | | type="warning" |
| | | icon="el-icon-back" |
| | | @click="handleGoBack" |
| | | > |
| | | è¿åå¼å¸¸å表 |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- å¼å¸¸å表 --> |
| | | <div class="list-section"> |
| | | <el-card shadow="never"> |
| | | <div class="filter-section"> |
| | | <el-form |
| | | :model="filterParams" |
| | | :inline="true" |
| | | size="medium" |
| | | class="filter-form" |
| | | > |
| | | <el-form-item label="è´è´£ç§å®¤"> |
| | | <el-select |
| | | v-model="filterParams.deptId" |
| | | placeholder="è¯·éæ©ç§å®¤" |
| | | clearable |
| | | style="width: 200px" |
| | | > |
| | | <el-option |
| | | v-for="dept in deptList" |
| | | :key="dept.id" |
| | | :label="dept.name" |
| | | :value="dept.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å¤çç¶æ"> |
| | | <el-select |
| | | v-model="filterParams.status" |
| | | placeholder="è¯·éæ©ç¶æ" |
| | | clearable |
| | | style="width: 200px" |
| | | > |
| | | <el-option label="å¾
å¤ç" :value="0" /> |
| | | <el-option label="å¤çä¸" :value="1" /> |
| | | <el-option label="å·²å¤ç" :value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | @click="handleFilter" |
| | | > |
| | | çé |
| | | </el-button> |
| | | <el-button |
| | | icon="el-icon-refresh" |
| | | @click="handleResetFilter" |
| | | > |
| | | éç½® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="exceptionList" |
| | | :border="true" |
| | | style="width: 100%" |
| | | @selection-change="handleSelectionChange" |
| | | class="exception-table" |
| | | > |
| | | <el-table-column |
| | | type="selection" |
| | | width="55" |
| | | align="center" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="åºå·" |
| | | type="index" |
| | | width="60" |
| | | align="center" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="è´è´£ç§å®¤" |
| | | prop="responsibilityDept" |
| | | width="120" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <el-tag type="primary">{{ row.responsibilityDept }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="䏿»¡æè¯¦æ
" |
| | | prop="unsatisfactoryDetail" |
| | | min-width="200" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div class="detail-content"> |
| | | {{ row.unsatisfactoryDetail }} |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æ£è
ä¿¡æ¯" |
| | | width="300" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div class="patient-info"> |
| | | <div class="patient-item"> |
| | | <span class="label">å§åï¼</span> |
| | | <span class="value">{{ row.patientName }}</span> |
| | | </div> |
| | | <div class="patient-item"> |
| | | <span class="label">æ§å«ï¼</span> |
| | | <span class="value">{{ row.gender === 1 ? 'ç·' : '女' }}</span> |
| | | </div> |
| | | <div class="patient-item"> |
| | | <span class="label">å¹´é¾ï¼</span> |
| | | <span class="value">{{ row.age }}å²</span> |
| | | </div> |
| | | <div class="patient-item"> |
| | | <span class="label">çµè¯ï¼</span> |
| | | <span class="value">{{ row.phone }}</span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="åºé¢ä¿¡æ¯" |
| | | width="250" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div class="discharge-info"> |
| | | <div class="info-item"> |
| | | <span class="label">ç§å®¤ï¼</span> |
| | | <span class="value">{{ row.dischargeDept }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">ç
åºï¼</span> |
| | | <span class="value">{{ row.dischargeWard }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">å¡«åæ¶é´ï¼</span> |
| | | <span class="value time">{{ row.fillTime }}</span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="å¤çç¶æ" |
| | | prop="processStatus" |
| | | width="100" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <el-tag |
| | | :type="getStatusTagType(row.processStatus)" |
| | | effect="dark" |
| | | > |
| | | {{ getStatusText(row.processStatus) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æä½" |
| | | width="180" |
| | | align="center" |
| | | fixed="right" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <el-button |
| | | type="primary" |
| | | size="small" |
| | | icon="el-icon-view" |
| | | @click="handleViewDetail(row)" |
| | | > |
| | | æ¥ç详æ
|
| | | </el-button> |
| | | <el-button |
| | | type="warning" |
| | | size="small" |
| | | icon="el-icon-edit" |
| | | @click="handleProcess(row)" |
| | | :disabled="row.processStatus === 2" |
| | | > |
| | | å¤ç |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页 --> |
| | | <div class="pagination-section"> |
| | | <el-pagination |
| | | background |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :current-page="filterParams.pageNum" |
| | | :page-size="filterParams.pageSize" |
| | | :page-sizes="[10, 20, 30, 50]" |
| | | :total="total" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | /> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | |
| | | <!-- å¤çå¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | title="å¤çå¼å¸¸åé¦" |
| | | :visible.sync="processDialogVisible" |
| | | width="600px" |
| | | center |
| | | > |
| | | <el-form |
| | | :model="processForm" |
| | | :rules="processRules" |
| | | ref="processForm" |
| | | label-width="100px" |
| | | size="medium" |
| | | > |
| | | <el-form-item label="å¤çç¶æ" prop="status"> |
| | | <el-select |
| | | v-model="processForm.status" |
| | | placeholder="è¯·éæ©å¤çç¶æ" |
| | | style="width: 100%" |
| | | > |
| | | <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="reportDepts"> |
| | | <el-select |
| | | v-model="processForm.reportDepts" |
| | | placeholder="è¯·éæ©æ¥å¤ç§å®¤" |
| | | multiple |
| | | filterable |
| | | collapse-tags |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="dept in deptList" |
| | | :key="dept.id" |
| | | :label="dept.name" |
| | | :value="dept.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="å¤ç夿³¨" prop="remark"> |
| | | <el-input |
| | | v-model="processForm.remark" |
| | | type="textarea" |
| | | :rows="4" |
| | | placeholder="请è¾å
¥å¤ç夿³¨ï¼æå¤500åï¼" |
| | | maxlength="500" |
| | | show-word-limit |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="éä»¶ä¸ä¼ "> |
| | | <el-upload |
| | | class="upload-demo" |
| | | action="#" |
| | | :on-preview="handlePreview" |
| | | :on-remove="handleRemove" |
| | | :before-remove="beforeRemove" |
| | | :limit="3" |
| | | :on-exceed="handleExceed" |
| | | :file-list="fileList" |
| | | > |
| | | <el-button size="small" type="primary">ç¹å»ä¸ä¼ </el-button> |
| | | <div slot="tip" class="el-upload__tip">æ¯æä¸ä¼ å¾çãææ¡£çéä»¶ï¼å个æä»¶ä¸è¶
è¿10MB</div> |
| | | </el-upload> |
| | | </el-form-item> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="processDialogVisible = false">åæ¶</el-button> |
| | | <el-button |
| | | type="primary" |
| | | @click="submitProcess" |
| | | :loading="processing" |
| | | > |
| | | æäº¤å¤ç |
| | | </el-button> |
| | | </span> |
| | | </el-dialog> |
| | | |
| | | <!-- æ¹éå¤çå¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | title="æ¹éå¤çå¼å¸¸åé¦" |
| | | :visible.sync="batchDialogVisible" |
| | | width="600px" |
| | | center |
| | | > |
| | | <el-form |
| | | :model="batchProcessForm" |
| | | :rules="processRules" |
| | | ref="batchProcessForm" |
| | | label-width="100px" |
| | | size="medium" |
| | | > |
| | | <el-form-item label="å¤çç¶æ" prop="status"> |
| | | <el-select |
| | | v-model="batchProcessForm.status" |
| | | placeholder="è¯·éæ©å¤çç¶æ" |
| | | style="width: 100%" |
| | | > |
| | | <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="reportDepts"> |
| | | <el-select |
| | | v-model="batchProcessForm.reportDepts" |
| | | placeholder="è¯·éæ©æ¥å¤ç§å®¤" |
| | | multiple |
| | | filterable |
| | | collapse-tags |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="dept in deptList" |
| | | :key="dept.id" |
| | | :label="dept.name" |
| | | :value="dept.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="å¤ç夿³¨" prop="remark"> |
| | | <el-input |
| | | v-model="batchProcessForm.remark" |
| | | type="textarea" |
| | | :rows="4" |
| | | placeholder="请è¾å
¥å¤ç夿³¨ï¼æå¤500åï¼" |
| | | maxlength="500" |
| | | show-word-limit |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="batchDialogVisible = false">åæ¶</el-button> |
| | | <el-button |
| | | type="primary" |
| | | @click="submitBatchProcess" |
| | | :loading="batchProcessing" |
| | | > |
| | | æ¹éæäº¤ |
| | | </el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'BatchProcess', |
| | | data() { |
| | | return { |
| | | // å½åå¤ççå¼å¸¸ID |
| | | currentExceptionId: null, |
| | | |
| | | // æ¹ééä¸çå¼å¸¸ID |
| | | selectedExceptionIds: [], |
| | | |
| | | // è¿æ»¤åæ° |
| | | filterParams: { |
| | | deptId: '', |
| | | status: '', |
| | | pageNum: 1, |
| | | pageSize: 10 |
| | | }, |
| | | |
| | | // å è½½ç¶æ |
| | | loading: false, |
| | | processing: false, |
| | | batchProcessing: false, |
| | | |
| | | // ç§å®¤å表 |
| | | deptList: [ |
| | | { id: 1, name: 'å¿è¡ç®¡å
ç§' }, |
| | | { id: 2, name: 'ç¥ç»å
ç§' }, |
| | | { id: 3, name: 'æ®å¤ç§' }, |
| | | { id: 4, name: '骨ç§' }, |
| | | { id: 5, name: 'å¦äº§ç§' }, |
| | | { id: 6, name: 'å¿ç§' }, |
| | | { id: 7, name: 'æ¥è¯ç§' }, |
| | | { id: 8, name: 'å¼å¸å
ç§' }, |
| | | { id: 9, name: 'æ¶åå
ç§' }, |
| | | { id: 10, name: 'å
åæ³ç§' } |
| | | ], |
| | | |
| | | // å¼å¸¸åè¡¨æ°æ® |
| | | exceptionList: [], |
| | | total: 0, |
| | | |
| | | // å¤çå¯¹è¯æ¡ |
| | | processDialogVisible: false, |
| | | processForm: { |
| | | status: '', |
| | | reportDepts: [], |
| | | remark: '' |
| | | }, |
| | | processRules: { |
| | | status: [ |
| | | { required: true, message: 'è¯·éæ©å¤çç¶æ', trigger: 'change' } |
| | | ], |
| | | remark: [ |
| | | { required: true, message: '请è¾å
¥å¤ç夿³¨', trigger: 'blur' }, |
| | | { min: 5, max: 500, message: '夿³¨é¿åº¦å¨ 5 å° 500 个å符', trigger: 'blur' } |
| | | ] |
| | | }, |
| | | fileList: [], |
| | | |
| | | // æ¹éå¤çå¯¹è¯æ¡ |
| | | batchDialogVisible: false, |
| | | batchProcessForm: { |
| | | status: '', |
| | | reportDepts: [], |
| | | remark: '' |
| | | } |
| | | }; |
| | | }, |
| | | |
| | | mounted() { |
| | | this.loadExceptionList(); |
| | | }, |
| | | |
| | | methods: { |
| | | // å è½½å¼å¸¸å表 |
| | | async loadExceptionList() { |
| | | this.loading = true; |
| | | try { |
| | | // Mock æ°æ® |
| | | await new Promise(resolve => { |
| | | setTimeout(() => { |
| | | this.exceptionList = [ |
| | | { |
| | | id: 1, |
| | | responsibilityDept: 'å¿è¡ç®¡å
ç§', |
| | | unsatisfactoryDetail: 'å»çæ¥æ¿æ¶é´å¤ªçï¼æ²éä¸å¤å
åï¼å¯¹ç
æ
è§£éä¸å¤è¯¦ç»', |
| | | patientName: 'å¼ å
ç', |
| | | gender: 1, |
| | | age: 45, |
| | | phone: '138****1234', |
| | | dischargeDept: 'å¿è¡ç®¡å
ç§', |
| | | dischargeWard: 'å
ç§ä¸ç
åº', |
| | | fillTime: '2024-01-15 10:30:25', |
| | | processStatus: 0, |
| | | questionnaireId: 1001 |
| | | }, |
| | | { |
| | | id: 2, |
| | | responsibilityDept: 'ç¥ç»å
ç§', |
| | | unsatisfactoryDetail: 'æ¤å£«æéææ¯ä¸ä½³ï¼æäºä¸æ¬¡ææåï¼ä¸æåº¦ä¸å¤èå¿', |
| | | patientName: 'æå¥³å£«', |
| | | gender: 0, |
| | | age: 38, |
| | | phone: '139****5678', |
| | | dischargeDept: 'ç¥ç»å
ç§', |
| | | dischargeWard: 'å
ç§äºç
åº', |
| | | fillTime: '2024-01-14 16:20:10', |
| | | processStatus: 0, |
| | | questionnaireId: 1002 |
| | | }, |
| | | { |
| | | id: 3, |
| | | responsibilityDept: 'æ®å¤ç§', |
| | | unsatisfactoryDetail: 'æ¯åæ¢è¯ä¸åæ¶ï¼ä¼¤å£ç¼çæ¶æ²¡æåæ¶å¤ç', |
| | | patientName: 'çå
ç', |
| | | gender: 1, |
| | | age: 52, |
| | | phone: '137****9012', |
| | | dischargeDept: 'æ®å¤ç§', |
| | | dischargeWard: 'å¤ç§ä¸ç
åº', |
| | | fillTime: '2024-01-13 09:15:45', |
| | | processStatus: 1, |
| | | questionnaireId: 1003 |
| | | }, |
| | | { |
| | | id: 4, |
| | | responsibilityDept: '骨ç§', |
| | | unsatisfactoryDetail: 'åº·å¤æå¯¼ä¸å¤ä¸ä¸ï¼å¯¹æ¢å¤è¿ç¨æè¿°ä¸æ¸
æ¥', |
| | | patientName: 'å女士', |
| | | gender: 0, |
| | | age: 65, |
| | | phone: '136****3456', |
| | | dischargeDept: '骨ç§', |
| | | dischargeWard: 'å¤ç§äºç
åº', |
| | | fillTime: '2024-01-12 14:40:30', |
| | | processStatus: 0, |
| | | questionnaireId: 1004 |
| | | }, |
| | | { |
| | | id: 5, |
| | | responsibilityDept: 'å¦äº§ç§', |
| | | unsatisfactoryDetail: 'äº§åæ£æ¥æéæ¶é´è¿é¿ï¼çå¾
æé´æ²¡æä¼æ¯åº§ä½', |
| | | patientName: 'é女士', |
| | | gender: 0, |
| | | age: 28, |
| | | phone: '135****7890', |
| | | dischargeDept: 'å¦äº§ç§', |
| | | dischargeWard: 'å¦äº§ç§ç
åº', |
| | | fillTime: '2024-01-11 11:25:15', |
| | | processStatus: 2, |
| | | questionnaireId: 1005 |
| | | }, |
| | | { |
| | | id: 6, |
| | | responsibilityDept: 'å¿ç§', |
| | | unsatisfactoryDetail: 'å¿ç«¥ç¨è¯åéäº¤ä»£ä¸æ¸
æ°ï¼ç¨è¯æ³¨æäºé¡¹æ²¡æè¯´æ', |
| | | patientName: 'èµµå®å®', |
| | | gender: 1, |
| | | age: 5, |
| | | phone: '134****1234', |
| | | dischargeDept: 'å¿ç§', |
| | | dischargeWard: 'å¿ç§ç
åº', |
| | | fillTime: '2024-01-10 15:50:20', |
| | | processStatus: 0, |
| | | questionnaireId: 1006 |
| | | }, |
| | | { |
| | | id: 7, |
| | | responsibilityDept: 'æ¥è¯ç§', |
| | | unsatisfactoryDetail: 'æ¥è¯çå¾
æ¶é´è¿é¿ï¼ç
æ
没æå¾å°åæ¶è¯ä¼°', |
| | | patientName: 'åå
ç', |
| | | gender: 1, |
| | | age: 40, |
| | | phone: '133****5678', |
| | | dischargeDept: 'æ¥è¯ç§', |
| | | dischargeWard: 'æ¥è¯ç
åº', |
| | | fillTime: '2024-01-09 10:15:40', |
| | | processStatus: 0, |
| | | questionnaireId: 1007 |
| | | }, |
| | | { |
| | | id: 8, |
| | | responsibilityDept: 'å¼å¸å
ç§', |
| | | unsatisfactoryDetail: 'å»çå¼è¯è¾å¤ï¼è´¹ç¨è¾é«ï¼æ²¡æè¯´æå¿
è¦æ§', |
| | | patientName: 'å¨å¥³å£«', |
| | | gender: 0, |
| | | age: 55, |
| | | phone: '132****9012', |
| | | dischargeDept: 'å¼å¸å
ç§', |
| | | dischargeWard: 'å
ç§ä¸ç
åº', |
| | | fillTime: '2024-01-08 13:30:55', |
| | | processStatus: 1, |
| | | questionnaireId: 1008 |
| | | } |
| | | ]; |
| | | this.total = this.exceptionList.length; |
| | | resolve(); |
| | | }, 500); |
| | | }); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | |
| | | // è·åç¶ææ ç¾ç±»å |
| | | getStatusTagType(status) { |
| | | switch (status) { |
| | | case 0: return 'warning'; // å¾
å¤ç |
| | | case 1: return 'primary'; // å¤çä¸ |
| | | case 2: return 'success'; // å·²å¤ç |
| | | default: return 'info'; |
| | | } |
| | | }, |
| | | |
| | | // è·åç¶æææ¬ |
| | | getStatusText(status) { |
| | | switch (status) { |
| | | case 0: return 'å¾
å¤ç'; |
| | | case 1: return 'å¤çä¸'; |
| | | case 2: return 'å·²å¤ç'; |
| | | default: return 'æªç¥'; |
| | | } |
| | | }, |
| | | |
| | | // å¤ççé |
| | | handleFilter() { |
| | | this.filterParams.pageNum = 1; |
| | | this.loadExceptionList(); |
| | | }, |
| | | |
| | | // éç½®çé |
| | | handleResetFilter() { |
| | | this.filterParams = { |
| | | deptId: '', |
| | | status: '', |
| | | pageNum: 1, |
| | | pageSize: 10 |
| | | }; |
| | | this.loadExceptionList(); |
| | | }, |
| | | |
| | | // å¤çéæ©åå |
| | | handleSelectionChange(selection) { |
| | | this.selectedExceptionIds = selection.map(item => item.id); |
| | | }, |
| | | |
| | | // å¤çæ¹éæäº¤ |
| | | handleBatchSubmit() { |
| | | if (this.selectedExceptionIds.length === 0) { |
| | | this.$message.warning('请å
éæ©è¦å¤ççå¼å¸¸åé¦'); |
| | | return; |
| | | } |
| | | this.batchDialogVisible = true; |
| | | }, |
| | | |
| | | // è¿åå¼å¸¸å表 |
| | | handleGoBack() { |
| | | this.$router.push('/satisfaction/exception/list'); |
| | | }, |
| | | |
| | | // æ¥ç详æ
|
| | | handleViewDetail(row) { |
| | | this.$router.push({ |
| | | path: '/satisfaction/exception/detail', |
| | | query: { |
| | | id: row.questionnaireId |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // å¤çå个å¼å¸¸ |
| | | handleProcess(row) { |
| | | this.currentExceptionId = row.id; |
| | | this.processForm = { |
| | | status: row.processStatus === 0 ? 1 : row.processStatus, |
| | | reportDepts: [], |
| | | remark: '' |
| | | }; |
| | | this.processDialogVisible = true; |
| | | }, |
| | | |
| | | // æäº¤å¤ç |
| | | async submitProcess() { |
| | | this.$refs.processForm.validate(async (valid) => { |
| | | if (valid) { |
| | | this.processing = true; |
| | | try { |
| | | // Mock APIè°ç¨ |
| | | await new Promise(resolve => setTimeout(resolve, 1000)); |
| | | |
| | | this.$message.success('å¤çæäº¤æå'); |
| | | this.processDialogVisible = false; |
| | | this.loadExceptionList(); |
| | | } finally { |
| | | this.processing = false; |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // æäº¤æ¹éå¤ç |
| | | async submitBatchProcess() { |
| | | this.$refs.batchProcessForm.validate(async (valid) => { |
| | | if (valid) { |
| | | this.batchProcessing = true; |
| | | try { |
| | | // Mock APIè°ç¨ |
| | | await new Promise(resolve => setTimeout(resolve, 1500)); |
| | | |
| | | this.$message.success(`å·²æ¹éå¤ç ${this.selectedExceptionIds.length} æ¡å¼å¸¸åé¦`); |
| | | this.batchDialogVisible = false; |
| | | this.selectedExceptionIds = []; |
| | | this.loadExceptionList(); |
| | | } finally { |
| | | this.batchProcessing = false; |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // å页大å°åå |
| | | handleSizeChange(size) { |
| | | this.filterParams.pageSize = size; |
| | | this.filterParams.pageNum = 1; |
| | | this.loadExceptionList(); |
| | | }, |
| | | |
| | | // 页ç åå |
| | | handlePageChange(page) { |
| | | this.filterParams.pageNum = page; |
| | | this.loadExceptionList(); |
| | | }, |
| | | |
| | | // æä»¶ä¸ä¼ ç¸å
³æ¹æ³ |
| | | handlePreview(file) { |
| | | console.log('é¢è§æä»¶:', file); |
| | | }, |
| | | |
| | | handleRemove(file, fileList) { |
| | | console.log('ç§»é¤æä»¶:', file, fileList); |
| | | }, |
| | | |
| | | beforeRemove(file) { |
| | | return this.$confirm(`ç¡®å®ç§»é¤ ${file.name}ï¼`); |
| | | }, |
| | | |
| | | handleExceed(files, fileList) { |
| | | this.$message.warning(`å½åéå¶éæ© 3 个æä»¶ï¼æ¬æ¬¡éæ©äº ${files.length} 个æä»¶ï¼å
±éæ©äº ${files.length + fileList.length} 个æä»¶`); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .batch-process { |
| | | padding: 20px; |
| | | background-color: #f5f7fa; |
| | | min-height: 100vh; |
| | | |
| | | .page-header { |
| | | margin-bottom: 20px; |
| | | padding: 20px; |
| | | background: linear-gradient(135deg, #5788FE 0%, #66b1ff 100%); |
| | | border-radius: 8px; |
| | | color: white; |
| | | |
| | | .header-content { |
| | | .page-title { |
| | | margin: 0 0 8px 0; |
| | | font-size: 20px; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .page-description { |
| | | margin: 0 0 20px 0; |
| | | opacity: 0.9; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .header-actions { |
| | | display: flex; |
| | | gap: 10px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .list-section { |
| | | .filter-section { |
| | | margin-bottom: 20px; |
| | | |
| | | .filter-form { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-items: center; |
| | | |
| | | ::v-deep .el-form-item { |
| | | margin-bottom: 0; |
| | | margin-right: 20px; |
| | | |
| | | &:last-child { |
| | | margin-right: 0; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .exception-table { |
| | | ::v-deep .el-table__header-wrapper { |
| | | th { |
| | | background-color: #f8f9fa; |
| | | font-weight: 600; |
| | | color: #333; |
| | | } |
| | | } |
| | | |
| | | .detail-content { |
| | | font-size: 13px; |
| | | color: #606266; |
| | | line-height: 1.5; |
| | | text-align: left; |
| | | } |
| | | |
| | | .patient-info { |
| | | .patient-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 5px; |
| | | padding: 2px 0; |
| | | |
| | | .label { |
| | | font-size: 12px; |
| | | color: #606266; |
| | | min-width: 40px; |
| | | } |
| | | |
| | | .value { |
| | | font-size: 13px; |
| | | color: #333; |
| | | font-weight: 500; |
| | | text-align: right; |
| | | flex: 1; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .discharge-info { |
| | | .info-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 5px; |
| | | padding: 2px 0; |
| | | |
| | | .label { |
| | | font-size: 12px; |
| | | color: #606266; |
| | | min-width: 50px; |
| | | } |
| | | |
| | | .value { |
| | | font-size: 13px; |
| | | color: #333; |
| | | font-weight: 500; |
| | | text-align: right; |
| | | flex: 1; |
| | | |
| | | &.time { |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .pagination-section { |
| | | display: flex; |
| | | justify-content: center; |
| | | padding: 20px 0 0 0; |
| | | } |
| | | } |
| | | } |
| | | |
| | | @media (max-width: 768px) { |
| | | .batch-process { |
| | | padding: 10px; |
| | | |
| | | .page-header { |
| | | .header-actions { |
| | | flex-direction: column; |
| | | align-items: stretch; |
| | | } |
| | | } |
| | | |
| | | .list-section { |
| | | .filter-section { |
| | | .filter-form { |
| | | ::v-deep .el-form-item { |
| | | width: 100%; |
| | | margin-right: 0; |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="exception-list"> |
| | | <!-- 页颿 é¢ --> |
| | | <div class="page-header"> |
| | | <div class="header-content"> |
| | | <h2 class="page-title">满æåº¦å¼å¸¸å¤ç</h2> |
| | | <p class="page-description">çæ§åå¤ç满æåº¦é®å·ä¸çå¼å¸¸åé¦</p> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- æ¥è¯¢æ¡ä»¶åºå --> |
| | | <div class="search-section"> |
| | | <el-card shadow="never"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | size="medium" |
| | | :inline="true" |
| | | label-width="120px" |
| | | class="search-form" |
| | | > |
| | | <el-form-item label="满æåº¦æ¨¡æ¿" prop="templateId"> |
| | | <el-select |
| | | v-model="queryParams.templateId" |
| | | placeholder="è¯·éæ©æ¨¡æ¿" |
| | | clearable |
| | | style="width: 200px" |
| | | > |
| | | <el-option |
| | | v-for="template in templateList" |
| | | :key="template.id" |
| | | :label="template.name" |
| | | :value="template.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="责任ç§å®¤" prop="deptIds"> |
| | | <el-select |
| | | v-model="queryParams.deptIds" |
| | | placeholder="è¯·éæ©è´£ä»»ç§å®¤" |
| | | clearable |
| | | filterable |
| | | multiple |
| | | collapse-tags |
| | | style="width: 300px" |
| | | > |
| | | <el-option |
| | | v-for="dept in deptList" |
| | | :key="dept.id" |
| | | :label="dept.name" |
| | | :value="dept.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ç»è®¡æ¶é´" prop="dateRange"> |
| | | <el-date-picker |
| | | v-model="queryParams.dateRange" |
| | | type="daterange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | value-format="yyyy-MM-dd" |
| | | :picker-options="pickerOptions" |
| | | style="width: 380px" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | @click="handleSearch" |
| | | :loading="loading" |
| | | > |
| | | æ¥è¯¢ |
| | | </el-button> |
| | | <el-button icon="el-icon-refresh" @click="handleReset"> |
| | | éç½® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | </div> |
| | | |
| | | <!-- æ¹éæä½ --> |
| | | <div class="batch-section"> |
| | | <el-card shadow="never"> |
| | | <div class="batch-actions"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-s-operation" |
| | | :disabled="selectedIds.length === 0" |
| | | @click="handleBatchProcess" |
| | | > |
| | | æ¹éå¤ç ({{ selectedIds.length }}) |
| | | </el-button> |
| | | <el-button |
| | | type="info" |
| | | icon="el-icon-download" |
| | | @click="handleExport" |
| | | > |
| | | 导åºå¼å¸¸æ°æ® |
| | | </el-button> |
| | | <el-button |
| | | type="warning" |
| | | icon="el-icon-refresh-right" |
| | | @click="refreshData" |
| | | > |
| | | å·æ°æ°æ® |
| | | </el-button> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | |
| | | <!-- å¼å¸¸ç»è®¡æ¦è§ --> |
| | | <div class="overview-section"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <el-card shadow="never" class="stat-card"> |
| | | <div class="stat-content"> |
| | | <div class="stat-icon" style="background: #f0f9ff;"> |
| | | <i class="el-icon-s-claim" style="color: #5788FE;"></i> |
| | | </div> |
| | | <div class="stat-info"> |
| | | <div class="stat-title">æ»å¼å¸¸æ°é</div> |
| | | <div class="stat-value">{{ overviewData.totalExceptionCount }}</div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card shadow="never" class="stat-card"> |
| | | <div class="stat-content"> |
| | | <div class="stat-icon" style="background: #f0f9ff;"> |
| | | <i class="el-icon-s-flag" style="color: #E6A23C;"></i> |
| | | </div> |
| | | <div class="stat-info"> |
| | | <div class="stat-title">å¾
å¤çå¼å¸¸</div> |
| | | <div class="stat-value">{{ overviewData.pendingCount }}</div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card shadow="never" class="stat-card"> |
| | | <div class="stat-content"> |
| | | <div class="stat-icon" style="background: #f0f9ff;"> |
| | | <i class="el-icon-check" style="color: #67C23A;"></i> |
| | | </div> |
| | | <div class="stat-info"> |
| | | <div class="stat-title">å·²å¤çå¼å¸¸</div> |
| | | <div class="stat-value">{{ overviewData.processedCount }}</div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card shadow="never" class="stat-card"> |
| | | <div class="stat-content"> |
| | | <div class="stat-icon" style="background: #f0f9ff;"> |
| | | <i class="el-icon-s-order" style="color: #909399;"></i> |
| | | </div> |
| | | <div class="stat-info"> |
| | | <div class="stat-title">仿¥å¤çæ°</div> |
| | | <div class="stat-value">{{ overviewData.todayProcessedCount }}</div> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | | <!-- å¼å¸¸å表 --> |
| | | <div class="list-section"> |
| | | <el-card shadow="never"> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="exceptionList" |
| | | :border="true" |
| | | style="width: 100%" |
| | | @selection-change="handleSelectionChange" |
| | | class="exception-table" |
| | | > |
| | | <el-table-column |
| | | type="selection" |
| | | width="55" |
| | | align="center" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="åºå·" |
| | | type="index" |
| | | width="60" |
| | | align="center" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="é¢ç®å
容" |
| | | prop="questionContent" |
| | | min-width="300" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div class="question-content"> |
| | | <span class="question-text">{{ row.questionContent }}</span> |
| | | <div class="question-tags"> |
| | | <el-tag |
| | | size="mini" |
| | | :type="getQuestionTypeTag(row.questionType)" |
| | | > |
| | | {{ row.questionType === 1 ? 'åéé¢' : 'å¤éé¢' }} |
| | | </el-tag> |
| | | <el-tag |
| | | size="mini" |
| | | type="info" |
| | | > |
| | | {{ row.templateName }} |
| | | </el-tag> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="è´è´£ç§å®¤" |
| | | prop="responsibilityDepts" |
| | | width="180" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div class="dept-list"> |
| | | <el-tag |
| | | v-for="dept in row.responsibilityDepts" |
| | | :key="dept.id" |
| | | size="small" |
| | | type="primary" |
| | | class="dept-tag" |
| | | > |
| | | {{ dept.name }} |
| | | </el-tag> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="å¡«åæ
åµ" |
| | | width="200" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div class="fill-statistics"> |
| | | <div class="stat-item"> |
| | | <span class="stat-label">ææå¡«åï¼</span> |
| | | <span class="stat-value">{{ row.validFillCount }}</span> |
| | | </div> |
| | | <div class="stat-item"> |
| | | <span class="stat-label">å¼å¸¸å¡«åï¼</span> |
| | | <span class="stat-value exception-count">{{ row.exceptionFillCount }}</span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="å¼å¸¸ä»»å¡" |
| | | width="280" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div class="exception-tasks"> |
| | | <div class="task-category"> |
| | | <div class="task-title">å·²å¤ç</div> |
| | | <div class="task-count processed">{{ row.processedCount }}</div> |
| | | </div> |
| | | <div class="task-category"> |
| | | <div class="task-title">å¾
å¤ç</div> |
| | | <div class="task-count pending">{{ row.pendingCount }}</div> |
| | | </div> |
| | | <div class="task-category"> |
| | | <div class="task-title">å¼å¸¸æ»æ°</div> |
| | | <div class="task-count total">{{ row.totalExceptionCount }}</div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æè¿å¤ç" |
| | | prop="lastProcessTime" |
| | | width="180" |
| | | align="center" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div v-if="row.lastProcessTime" class="last-process"> |
| | | <div class="process-time">{{ row.lastProcessTime }}</div> |
| | | <div class="process-user">{{ row.lastProcessUser }}</div> |
| | | </div> |
| | | <span v-else class="no-process">ææ å¤çè®°å½</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æä½" |
| | | width="180" |
| | | align="center" |
| | | fixed="right" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <!-- <el-button |
| | | type="primary" |
| | | size="small" |
| | | icon="el-icon-view" |
| | | @click="handleViewDetail(row)" |
| | | > |
| | | 详æ
|
| | | </el-button> --> |
| | | <el-button |
| | | type="warning" |
| | | size="small" |
| | | icon="el-icon-s-operation" |
| | | @click="handleBatchQuestion(row)" |
| | | > |
| | | æ¹éå¤ç |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页 --> |
| | | <div class="pagination-section"> |
| | | <el-pagination |
| | | background |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :current-page="queryParams.pageNum" |
| | | :page-size="queryParams.pageSize" |
| | | :page-sizes="[10, 20, 30, 50]" |
| | | :total="total" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | /> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'ExceptionList', |
| | | data() { |
| | | return { |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | templateId: '', |
| | | deptIds: [], |
| | | dateRange: [], |
| | | pageNum: 1, |
| | | pageSize: 10 |
| | | }, |
| | | |
| | | // å è½½ç¶æ |
| | | loading: false, |
| | | |
| | | // éä¸çID |
| | | selectedIds: [], |
| | | |
| | | // 模æ¿å表 |
| | | templateList: [ |
| | | { id: 1, name: 'åºé¢æ»¡æåº¦é®å·' }, |
| | | { id: 2, name: 'ä½é¢æ»¡æåº¦é®å·' }, |
| | | { id: 3, name: 'é¨è¯æ»¡æåº¦é®å·' }, |
| | | { id: 4, name: 'å¸¸ç¨æ»¡æåº¦é®å·' } |
| | | ], |
| | | |
| | | // ç§å®¤å表 |
| | | deptList: [ |
| | | { id: 1, name: 'å¿è¡ç®¡å
ç§' }, |
| | | { id: 2, name: 'ç¥ç»å
ç§' }, |
| | | { id: 3, name: 'æ®å¤ç§' }, |
| | | { id: 4, name: '骨ç§' }, |
| | | { id: 5, name: 'å¦äº§ç§' }, |
| | | { id: 6, name: 'å¿ç§' }, |
| | | { id: 7, name: 'æ¥è¯ç§' }, |
| | | { id: 8, name: 'å¼å¸å
ç§' }, |
| | | { id: 9, name: 'æ¶åå
ç§' }, |
| | | { id: 10, name: 'å
åæ³ç§' }, |
| | | { id: 11, name: 'è¾å
ç§' }, |
| | | { id: 12, name: 'è¿ç¤ç§' } |
| | | ], |
| | | |
| | | // å¼å¸¸åè¡¨æ°æ® |
| | | exceptionList: [], |
| | | total: 0, |
| | | |
| | | // ç»è®¡æ¦è§æ°æ® |
| | | overviewData: { |
| | | totalExceptionCount: 0, |
| | | pendingCount: 0, |
| | | processedCount: 0, |
| | | todayProcessedCount: 0 |
| | | }, |
| | | |
| | | // æ¥æéæ©å¨é项 |
| | | pickerOptions: { |
| | | shortcuts: [ |
| | | { |
| | | text: 'æè¿ä¸å¨', |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); |
| | | picker.$emit('pick', [start, end]); |
| | | } |
| | | }, |
| | | { |
| | | text: 'æè¿ä¸ä¸ªæ', |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); |
| | | picker.$emit('pick', [start, end]); |
| | | } |
| | | }, |
| | | { |
| | | text: 'æè¿ä¸ä¸ªæ', |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); |
| | | picker.$emit('pick', [start, end]); |
| | | } |
| | | } |
| | | ], |
| | | disabledDate(time) { |
| | | return time.getTime() > Date.now(); |
| | | } |
| | | } |
| | | }; |
| | | }, |
| | | |
| | | mounted() { |
| | | this.loadData(); |
| | | }, |
| | | |
| | | methods: { |
| | | // å è½½æ°æ® |
| | | async loadData() { |
| | | this.loading = true; |
| | | try { |
| | | await Promise.all([ |
| | | this.loadExceptionList(), |
| | | this.loadOverviewData() |
| | | ]); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | |
| | | // å è½½å¼å¸¸å表 |
| | | async loadExceptionList() { |
| | | return new Promise((resolve) => { |
| | | setTimeout(() => { |
| | | // Mock æ°æ® |
| | | this.exceptionList = [ |
| | | { |
| | | id: 1, |
| | | questionId: 101, |
| | | questionContent: 'æ¨å¯¹å»æ¤äººåçæå¡æåº¦æ¯å¦æ»¡æï¼', |
| | | questionType: 1, // 1: åéé¢, 2: å¤éé¢ |
| | | templateName: 'åºé¢æ»¡æåº¦é®å·', |
| | | responsibilityDepts: [ |
| | | { id: 1, name: 'å¿è¡ç®¡å
ç§' }, |
| | | { id: 2, name: 'ç¥ç»å
ç§' } |
| | | ], |
| | | validFillCount: 145, |
| | | exceptionFillCount: 8, |
| | | processedCount: 5, |
| | | pendingCount: 3, |
| | | totalExceptionCount: 8, |
| | | lastProcessTime: '2024-01-15 10:30:25', |
| | | lastProcessUser: 'å¼ å»ç' |
| | | }, |
| | | { |
| | | id: 2, |
| | | questionId: 102, |
| | | questionContent: 'æ¨å¯¹å»ççè¯çæ°´å¹³åææ¯è½åè¯ä»·å¦ä½ï¼', |
| | | questionType: 1, |
| | | templateName: 'ä½é¢æ»¡æåº¦é®å·', |
| | | responsibilityDepts: [ |
| | | { id: 3, name: 'æ®å¤ç§' }, |
| | | { id: 4, name: '骨ç§' } |
| | | ], |
| | | validFillCount: 120, |
| | | exceptionFillCount: 12, |
| | | processedCount: 8, |
| | | pendingCount: 4, |
| | | totalExceptionCount: 12, |
| | | lastProcessTime: '2024-01-14 16:20:10', |
| | | lastProcessUser: 'ææ¤å£«é¿' |
| | | }, |
| | | { |
| | | id: 3, |
| | | questionId: 103, |
| | | questionContent: 'æ¨å¯¹å»é¢çç¯å¢åå«çç¶åµæ¯å¦æ»¡æï¼', |
| | | questionType: 1, |
| | | templateName: 'é¨è¯æ»¡æåº¦é®å·', |
| | | responsibilityDepts: [ |
| | | { id: 5, name: 'å¦äº§ç§' }, |
| | | { id: 6, name: 'å¿ç§' }, |
| | | { id: 7, name: 'æ¥è¯ç§' } |
| | | ], |
| | | validFillCount: 180, |
| | | exceptionFillCount: 15, |
| | | processedCount: 10, |
| | | pendingCount: 5, |
| | | totalExceptionCount: 15, |
| | | lastProcessTime: '2024-01-13 09:15:45', |
| | | lastProcessUser: 'ç主任' |
| | | }, |
| | | { |
| | | id: 4, |
| | | questionId: 104, |
| | | questionContent: 'æ¨è®¤ä¸ºå»æ¤äººå䏿¨çæ²éæ¯å¦å
åï¼', |
| | | questionType: 1, |
| | | templateName: 'å¸¸ç¨æ»¡æåº¦é®å·', |
| | | responsibilityDepts: [ |
| | | { id: 8, name: 'å¼å¸å
ç§' }, |
| | | { id: 9, name: 'æ¶åå
ç§' } |
| | | ], |
| | | validFillCount: 95, |
| | | exceptionFillCount: 6, |
| | | processedCount: 4, |
| | | pendingCount: 2, |
| | | totalExceptionCount: 6, |
| | | lastProcessTime: '2024-01-12 14:40:30', |
| | | lastProcessUser: 'èµµå»ç' |
| | | }, |
| | | { |
| | | id: 5, |
| | | questionId: 105, |
| | | questionContent: 'æ¨å¯¹çå¾
å°±è¯åæ²»ççæ¶é´æ¯å¦æ»¡æï¼', |
| | | questionType: 1, |
| | | templateName: 'ä½é¢æ»¡æåº¦é®å·', |
| | | responsibilityDepts: [ |
| | | { id: 10, name: 'å
åæ³ç§' }, |
| | | { id: 11, name: 'è¾å
ç§' } |
| | | ], |
| | | validFillCount: 200, |
| | | exceptionFillCount: 25, |
| | | processedCount: 15, |
| | | pendingCount: 10, |
| | | totalExceptionCount: 25, |
| | | lastProcessTime: '2024-01-11 11:25:15', |
| | | lastProcessUser: '忤士' |
| | | }, |
| | | { |
| | | id: 6, |
| | | questionId: 106, |
| | | questionContent: 'æ¨å¯¹å»é¢æ¶è´¹çéæåº¦ååçæ§è¯ä»·å¦ä½ï¼', |
| | | questionType: 1, |
| | | templateName: 'é¨è¯æ»¡æåº¦é®å·', |
| | | responsibilityDepts: [ |
| | | { id: 12, name: 'è¿ç¤ç§' } |
| | | ], |
| | | validFillCount: 160, |
| | | exceptionFillCount: 18, |
| | | processedCount: 12, |
| | | pendingCount: 6, |
| | | totalExceptionCount: 18, |
| | | lastProcessTime: '2024-01-10 15:50:20', |
| | | lastProcessUser: 'å¨å»ç' |
| | | }, |
| | | { |
| | | id: 7, |
| | | questionId: 107, |
| | | questionContent: 'æ¨ä¼åäº²åæ¨èæä»¬å»é¢åï¼', |
| | | questionType: 1, |
| | | templateName: 'åºé¢æ»¡æåº¦é®å·', |
| | | responsibilityDepts: [ |
| | | { id: 1, name: 'å¿è¡ç®¡å
ç§' }, |
| | | { id: 8, name: 'å¼å¸å
ç§' } |
| | | ], |
| | | validFillCount: 110, |
| | | exceptionFillCount: 7, |
| | | processedCount: 5, |
| | | pendingCount: 2, |
| | | totalExceptionCount: 7, |
| | | lastProcessTime: '2024-01-09 10:15:40', |
| | | lastProcessUser: 'å´ä¸»ä»»' |
| | | }, |
| | | { |
| | | id: 8, |
| | | questionId: 108, |
| | | questionContent: 'æ¨å¯¹ä»¥ä¸åªäºæ¹é¢æ¯è¾æ»¡æï¼å¤éï¼ï¼', |
| | | questionType: 2, |
| | | templateName: 'å¸¸ç¨æ»¡æåº¦é®å·', |
| | | responsibilityDepts: [ |
| | | { id: 2, name: 'ç¥ç»å
ç§' }, |
| | | { id: 3, name: 'æ®å¤ç§' }, |
| | | { id: 5, name: 'å¦äº§ç§' } |
| | | ], |
| | | validFillCount: 135, |
| | | exceptionFillCount: 9, |
| | | processedCount: 6, |
| | | pendingCount: 3, |
| | | totalExceptionCount: 9, |
| | | lastProcessTime: '2024-01-08 13:30:55', |
| | | lastProcessUser: 'éå»ç' |
| | | } |
| | | ]; |
| | | this.total = this.exceptionList.length; |
| | | resolve(); |
| | | }, 500); |
| | | }); |
| | | }, |
| | | |
| | | // å è½½æ¦è§æ°æ® |
| | | async loadOverviewData() { |
| | | return new Promise((resolve) => { |
| | | setTimeout(() => { |
| | | // 计ç®ç»è®¡æ°æ® |
| | | const totalExceptionCount = this.exceptionList.reduce((sum, item) => sum + item.totalExceptionCount, 0); |
| | | const pendingCount = this.exceptionList.reduce((sum, item) => sum + item.pendingCount, 0); |
| | | const processedCount = this.exceptionList.reduce((sum, item) => sum + item.processedCount, 0); |
| | | |
| | | this.overviewData = { |
| | | totalExceptionCount, |
| | | pendingCount, |
| | | processedCount, |
| | | todayProcessedCount: 8 // 仿¥å¤çæ° mock |
| | | }; |
| | | resolve(); |
| | | }, 300); |
| | | }); |
| | | }, |
| | | |
| | | // è·åé¢ç®ç±»åæ ç¾æ ·å¼ |
| | | getQuestionTypeTag(type) { |
| | | return type === 1 ? 'primary' : 'success'; |
| | | }, |
| | | |
| | | // å¤çæ¥è¯¢ |
| | | handleSearch() { |
| | | this.queryParams.pageNum = 1; |
| | | this.loadData(); |
| | | }, |
| | | |
| | | // å¤çéç½® |
| | | handleReset() { |
| | | this.$refs.queryForm.resetFields(); |
| | | this.queryParams.dateRange = []; |
| | | this.queryParams.pageNum = 1; |
| | | this.loadData(); |
| | | }, |
| | | |
| | | // å¤çæ¹éå¤ç |
| | | handleBatchProcess() { |
| | | if (this.selectedIds.length === 0) { |
| | | this.$message.warning('请å
éæ©è¦å¤ççå¼å¸¸é¢ç®'); |
| | | return; |
| | | } |
| | | |
| | | // è·³è½¬å°æ¹éå¤çé¡µé¢ |
| | | this.$router.push({ |
| | | path: '/satisfaction/exception/batch-process', |
| | | query: { |
| | | questionIds: this.selectedIds.join(',') |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // å¤çå¯¼åº |
| | | handleExport() { |
| | | this.$message.success('导åºåè½å¼åä¸...'); |
| | | }, |
| | | |
| | | // å·æ°æ°æ® |
| | | refreshData() { |
| | | this.loadData(); |
| | | this.$message.success('æ°æ®å·²å·æ°'); |
| | | }, |
| | | |
| | | // å¤çéæ©åå |
| | | handleSelectionChange(selection) { |
| | | this.selectedIds = selection.map(item => item.questionId); |
| | | }, |
| | | |
| | | // å¤çæ¥ç详æ
|
| | | handleViewDetail(row) { |
| | | this.$router.push({ |
| | | path: '/satisfaction/exception/detail', |
| | | query: { |
| | | id: row.questionId |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // å¤çå个é¢ç®æ¹éå¤ç |
| | | handleBatchQuestion(row) { |
| | | this.$router.push({ |
| | | path: '/Intelligentcenter/batch', |
| | | query: { |
| | | questionId: row.questionId |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // å¤çå页大å°åå |
| | | handleSizeChange(size) { |
| | | this.queryParams.pageSize = size; |
| | | this.queryParams.pageNum = 1; |
| | | this.loadExceptionList(); |
| | | }, |
| | | |
| | | // å¤ç页ç åå |
| | | handlePageChange(page) { |
| | | this.queryParams.pageNum = page; |
| | | this.loadExceptionList(); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .exception-list { |
| | | padding: 20px; |
| | | background-color: #f5f7fa; |
| | | min-height: 100vh; |
| | | |
| | | .page-header { |
| | | margin-bottom: 20px; |
| | | padding: 20px; |
| | | background: linear-gradient(135deg, #5788FE 0%, #66b1ff 100%); |
| | | border-radius: 8px; |
| | | color: white; |
| | | |
| | | .header-content { |
| | | .page-title { |
| | | margin: 0 0 8px 0; |
| | | font-size: 20px; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .page-description { |
| | | margin: 0; |
| | | opacity: 0.9; |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .search-section { |
| | | margin-bottom: 20px; |
| | | |
| | | .search-form { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-items: center; |
| | | |
| | | ::v-deep .el-form-item { |
| | | margin-bottom: 0; |
| | | margin-right: 20px; |
| | | |
| | | &:last-child { |
| | | margin-right: 0; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .batch-section { |
| | | margin-bottom: 20px; |
| | | |
| | | .batch-actions { |
| | | display: flex; |
| | | gap: 10px; |
| | | align-items: center; |
| | | } |
| | | } |
| | | |
| | | .overview-section { |
| | | margin-bottom: 20px; |
| | | |
| | | .stat-card { |
| | | .stat-content { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 20px; |
| | | |
| | | .stat-icon { |
| | | width: 60px; |
| | | height: 60px; |
| | | border-radius: 12px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | i { |
| | | font-size: 28px; |
| | | } |
| | | } |
| | | |
| | | .stat-info { |
| | | flex: 1; |
| | | |
| | | .stat-title { |
| | | font-size: 14px; |
| | | color: #606266; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .stat-value { |
| | | font-size: 24px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .list-section { |
| | | .exception-table { |
| | | ::v-deep .el-table__header-wrapper { |
| | | th { |
| | | background-color: #f8f9fa; |
| | | font-weight: 600; |
| | | color: #333; |
| | | } |
| | | } |
| | | |
| | | .question-content { |
| | | .question-text { |
| | | display: block; |
| | | font-size: 14px; |
| | | color: #303133; |
| | | margin-bottom: 8px; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | .question-tags { |
| | | display: flex; |
| | | gap: 5px; |
| | | justify-content: center; |
| | | } |
| | | } |
| | | |
| | | .dept-list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 5px; |
| | | align-items: center; |
| | | |
| | | .dept-tag { |
| | | margin: 2px 0; |
| | | } |
| | | } |
| | | |
| | | .fill-statistics { |
| | | .stat-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 5px; |
| | | padding: 2px 0; |
| | | |
| | | .stat-label { |
| | | font-size: 12px; |
| | | color: #606266; |
| | | } |
| | | |
| | | .stat-value { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | color: #333; |
| | | } |
| | | |
| | | .exception-count { |
| | | color: #e6a23c; |
| | | font-weight: 600; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .exception-tasks { |
| | | display: flex; |
| | | justify-content: space-around; |
| | | align-items: center; |
| | | |
| | | .task-category { |
| | | text-align: center; |
| | | padding: 5px 8px; |
| | | border-radius: 6px; |
| | | min-width: 70px; |
| | | |
| | | .task-title { |
| | | font-size: 12px; |
| | | color: #606266; |
| | | margin-bottom: 5px; |
| | | } |
| | | |
| | | .task-count { |
| | | font-size: 18px; |
| | | font-weight: 600; |
| | | line-height: 1; |
| | | |
| | | &.processed { |
| | | color: #67c23a; |
| | | } |
| | | |
| | | &.pending { |
| | | color: #e6a23c; |
| | | } |
| | | |
| | | &.total { |
| | | color: #5788FE; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .last-process { |
| | | .process-time { |
| | | font-size: 12px; |
| | | color: #606266; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .process-user { |
| | | font-size: 13px; |
| | | color: #5788FE; |
| | | font-weight: 500; |
| | | } |
| | | } |
| | | |
| | | .no-process { |
| | | color: #909399; |
| | | font-style: italic; |
| | | } |
| | | } |
| | | |
| | | .pagination-section { |
| | | display: flex; |
| | | justify-content: center; |
| | | padding: 20px 0 0 0; |
| | | } |
| | | } |
| | | } |
| | | |
| | | @media (max-width: 768px) { |
| | | .exception-list { |
| | | padding: 10px; |
| | | |
| | | .search-section { |
| | | .search-form { |
| | | ::v-deep .el-form-item { |
| | | width: 100%; |
| | | margin-right: 0; |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .overview-section { |
| | | .el-row { |
| | | margin-left: 0; |
| | | margin-right: 0; |
| | | |
| | | .el-col { |
| | | padding-left: 0; |
| | | padding-right: 0; |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | scope.row.followUpRate !== undefined |
| | | " |
| | | > |
| | | {{ formatPercent(scope.row.followUpRate) }} |
| | | {{ scope.row.followUpRate }} |
| | | </span> |
| | | <span v-else>-</span> |
| | | </template> |
| | |
| | | scope.row.followUpRate !== undefined |
| | | " |
| | | > |
| | | {{ formatPercent(scope.row.followUpRate) }} |
| | | {{ scope.row.followUpRate }} |
| | | </span> |
| | | <span v-else>-</span> |
| | | </template> |
| | |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | <el-tag type="danger" :disable-transitions="false">è¶
æ¶</el-tag> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | align="right" |
| | | v-model="form.date1" |
| | | class="custom-disabled" |
| | | value-format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | @change="checkFollowupDate" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | |
| | | this.form.remark = |
| | | this.form.remark + "ã" + this.getCurrentTime() + "ã"; |
| | | let form = structuredClone(this.form); |
| | | form.visitTime = this.formatTime(form.date1); |
| | | form.visitTime = this.parseTime(form.date1); |
| | | form.finishtime = ""; |
| | | if (form.resource) { |
| | | if (form.resource == 2) { |
| | |
| | | :total="patienttotal" |
| | | :page.sync="patientqueryParams.pn" |
| | | :limit.sync="patientqueryParams.ps" |
| | | @pagination="Seedetails" |
| | | @pagination="Seedetailstion" |
| | | /> |
| | | </div> |
| | | </div> |
| | |
| | | </el-table> |
| | | </div> |
| | | </el-row> |
| | | <pagination |
| | | v-show="patienttotal > 0 && this.patientqueryParams.allhosp != 6" |
| | | :total="patienttotal" |
| | | :page.sync="patientqueryParams.pn" |
| | | :limit.sync="patientqueryParams.ps" |
| | | @pagination="Seedetails" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | this.Seedloading = false; |
| | | }); |
| | | }, |
| | | Seedetailstion() { |
| | | selectTimelyRate(this.patientqueryParams).then((response) => { |
| | | this.logsheetlist = response.data.detail; |
| | | this.patienttotal = response.data.total; |
| | | this.Seedloading = false; |
| | | }); |
| | | }, |
| | | viewDetails(row, title) { |
| | | this.infotitleVisible = true; |
| | | this.infotitle = title; |