From dac4393e8af2646f544f6e1ca24dab11b40c8492 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期二, 07 四月 2026 15:16:40 +0800
Subject: [PATCH] 测试完成

---
 src/views/Satisfaction/configurationmyd/batch.vue |  922 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 922 insertions(+), 0 deletions(-)

diff --git a/src/views/Satisfaction/configurationmyd/batch.vue b/src/views/Satisfaction/configurationmyd/batch.vue
new file mode 100644
index 0000000..10d6619
--- /dev/null
+++ b/src/views/Satisfaction/configurationmyd/batch.vue
@@ -0,0 +1,922 @@
+<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="210"
+            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>
+    <!-- 寮傚父璇︽儏寮规 -->
+    <Details-anomaly
+      :visible="detailDialogVisible"
+      :record-id="selectedRecordId"
+      :title="detailDialogTitle"
+      @update:visible="handleDetailDialogClose"
+      @processed="handleProcessed"
+      @close="handleDetailDialogClose"
+    />
+  </div>
+</template>
+
+<script>
+import DetailsAnomaly from "./components/DetailsAnomaly.vue";
+export default {
+  name: "BatchProcess",
+  components: {
+    DetailsAnomaly,
+  },
+  data() {
+    return {
+      // 娣诲姞浠ヤ笅鏁版嵁
+      detailDialogVisible: false,
+      selectedRecordId: null,
+      detailDialogTitle: "寮傚父鍙嶉璇︽儏",
+      // 褰撳墠澶勭悊鐨勫紓甯窱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.selectedRecordId = row.id;
+      this.detailDialogTitle = `${row.patientName} - 寮傚父鍙嶉璇︽儏`;
+      this.detailDialogVisible = true;
+    },
+    // 澶勭悊璇︽儏寮规鍏抽棴
+    handleDetailDialogClose() {
+      this.detailDialogVisible = false;
+      this.selectedRecordId = null;
+    }, // 澶勭悊瀹屾垚鍚庣殑鍥炶皟
+    handleProcessed() {
+      // 閲嶆柊鍔犺浇鏁版嵁
+      this.loadExceptionList();
+    },
+    // 澶勭悊鍗曚釜寮傚父
+    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>

--
Gitblit v1.9.3