From 03348941a9c44e3b9706a3b6c25c8fb5ba25d9d5 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期一, 30 三月 2026 09:15:28 +0800
Subject: [PATCH] 测试完成
---
dist (2).zip | 0
dist.zip | 0
src/views/followvisit/record/detailpage/index.vue | 8
src/views/sfstatistics/percentage/index.vue | 16
src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue | 2
dist (3).zip | 0
src/views/Satisfaction/configurationmyd/batch.vue | 899 ++++++++++++++++++++++++++++
src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue | 0
src/views/Satisfaction/configurationmyd/dispose.vue | 980 ++++++++++++++++++++++++++++++
src/views/Satisfaction/sfstatistics/components/visitStatistics.vue | 2
10 files changed, 1,892 insertions(+), 15 deletions(-)
diff --git "a/\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" "b/dist \0502\051.zip"
similarity index 94%
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"
index 85fc265..a864390 100644
--- "a/\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"
+++ "b/dist \0502\051.zip"
Binary files differ
diff --git "a/\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" "b/dist \0503\051.zip"
similarity index 94%
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"
index 85fc265..2dab64e 100644
--- "a/\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"
+++ "b/dist \0503\051.zip"
Binary files differ
diff --git "a/\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" b/dist.zip
similarity index 95%
rename 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"
rename to dist.zip
index 85fc265..a9d30e9 100644
--- "a/\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"
+++ b/dist.zip
Binary files differ
diff --git a/src/views/Satisfaction/configurationmyd/batch.vue b/src/views/Satisfaction/configurationmyd/batch.vue
new file mode 100644
index 0000000..41c2d0d
--- /dev/null
+++ b/src/views/Satisfaction/configurationmyd/batch.vue
@@ -0,0 +1,899 @@
+<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="鎮h�呬俊鎭�"
+ 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">鏀寔涓婁紶鍥剧墖銆佹枃妗g瓑闄勪欢锛屽崟涓枃浠朵笉瓒呰繃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 {
+ // 褰撳墠澶勭悊鐨勫紓甯窱D
+ currentExceptionId: null,
+
+ // 鎵归噺閫変腑鐨勫紓甯窱D
+ 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>
diff --git a/src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue b/src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue
diff --git a/src/views/Satisfaction/configurationmyd/dispose.vue b/src/views/Satisfaction/configurationmyd/dispose.vue
new file mode 100644
index 0000000..8a59106
--- /dev/null
+++ b/src/views/Satisfaction/configurationmyd/dispose.vue
@@ -0,0 +1,980 @@
+<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="璐d换绉戝" prop="deptIds">
+ <el-select
+ v-model="queryParams.deptIds"
+ placeholder="璇烽�夋嫨璐d换绉戝"
+ 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,
+
+ // 閫変腑鐨処D
+ 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>
diff --git a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
index 1b59b49..8de4434 100644
--- a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
@@ -199,7 +199,7 @@
scope.row.followUpRate !== undefined
"
>
- {{ formatPercent(scope.row.followUpRate) }}
+ {{ scope.row.followUpRate }}
</span>
<span v-else>-</span>
</template>
diff --git a/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue b/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
index 60a1c59..1b77e5a 100644
--- a/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
@@ -199,7 +199,7 @@
scope.row.followUpRate !== undefined
"
>
- {{ formatPercent(scope.row.followUpRate) }}
+ {{ scope.row.followUpRate }}
</span>
<span v-else>-</span>
</template>
diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
index 70752cc..0d8c44c 100644
--- a/src/views/followvisit/record/detailpage/index.vue
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -129,9 +129,7 @@
>
</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>
@@ -1060,7 +1058,7 @@
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>
@@ -2450,7 +2448,7 @@
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) {
diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index f94291b..5cad6ba 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -1069,7 +1069,7 @@
:total="patienttotal"
:page.sync="patientqueryParams.pn"
:limit.sync="patientqueryParams.ps"
- @pagination="Seedetails"
+ @pagination="Seedetailstion"
/>
</div>
</div>
@@ -1298,13 +1298,6 @@
</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>
@@ -1990,6 +1983,13 @@
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;
--
Gitblit v1.9.3