Bläddra i källkod

Merge branch 'master' of http://49.234.186.218:9000/root/ieplus

mingfu 1 månad sedan
förälder
incheckning
6644f8fdb9

+ 69 - 1
back-ui/src/api/dz/cards.js

@@ -59,14 +59,82 @@ export function issueCard(institutionId, type, count) {
 }
 
 // 分配卡
-export function assignCard(agentId, begin, end) {
+export function assignCard(
+  cardType,
+  agentId,
+  begin,
+  end,
+  location,
+  examType,
+  schoolId
+) {
   return request({
     url: "/dz/cards/assignCard",
     method: "post",
     params: {
+      cardType,
       agentId,
       begin,
       end,
+      location,
+      examType,
+      schoolId,
+    },
+  });
+}
+
+// 获取考生类型列表
+export function getExamTypes(location) {
+  return request({
+    url: "/front/user/examTypes",
+    method: "get",
+    params: {
+      location,
+    },
+  });
+}
+
+// 获取代理商列表
+export function getAgentList(query) {
+  return request({
+    url: "/dz/agent/list",
+    method: "get",
+    params: query,
+  });
+}
+
+// 缴费
+export function payCard(cardIds) {
+  return request({
+    url: "/dz/cards/changeCard",
+    method: "post",
+    params: {
+      action: "Pay",
+      cardIds: Array.isArray(cardIds) ? cardIds.join(",") : cardIds,
+    },
+  });
+}
+
+// 关卡
+export function closeCard(cardIds) {
+  return request({
+    url: "/dz/cards/changeCard",
+    method: "post",
+    params: {
+      action: "Close",
+      cardIds: Array.isArray(cardIds) ? cardIds.join(",") : cardIds,
+    },
+  });
+}
+
+// 重开
+export function reopenCard(cardIds) {
+  return request({
+    url: "/dz/cards/changeCard",
+    method: "post",
+    params: {
+      action: "ReOpen",
+      cardIds: Array.isArray(cardIds) ? cardIds.join(",") : cardIds,
     },
   });
 }

+ 46 - 0
back-ui/src/components/Form/index.vue

@@ -167,6 +167,29 @@
           :formData="formData"
         />
 
+        <!-- 范围选择器 -->
+        <div
+          v-else-if="item.type === 'range'"
+          class="range-input"
+          style="display: flex; align-items: center; gap: 10px"
+        >
+          <el-input
+            v-model="formData[item.beginField || 'begin']"
+            :placeholder="item.startPlaceholder || '开始值'"
+            :clearable="item.clearable !== false"
+            :disabled="item.disabled"
+            style="flex: 1"
+          />
+          <span style="color: #999; font-size: 14px">至</span>
+          <el-input
+            v-model="formData[item.endField || 'end']"
+            :placeholder="item.endPlaceholder || '结束值'"
+            :clearable="item.clearable !== false"
+            :disabled="item.disabled"
+            style="flex: 1"
+          />
+        </div>
+
         <!-- 默认文本显示 -->
         <span v-else>{{ formData[item.name] }}</span>
       </el-form-item>
@@ -338,6 +361,29 @@
             :formData="formData"
           />
 
+          <!-- 范围选择器 -->
+          <div
+            v-else-if="item.type === 'range'"
+            class="range-input"
+            style="display: flex; align-items: center; gap: 10px"
+          >
+            <el-input
+              v-model="formData[item.beginField || 'begin']"
+              :placeholder="item.startPlaceholder || '开始值'"
+              :clearable="item.clearable !== false"
+              :disabled="item.disabled"
+              style="flex: 1"
+            />
+            <span style="color: #999; font-size: 14px">至</span>
+            <el-input
+              v-model="formData[item.endField || 'end']"
+              :placeholder="item.endPlaceholder || '结束值'"
+              :clearable="item.clearable !== false"
+              :disabled="item.disabled"
+              style="flex: 1"
+            />
+          </div>
+
           <!-- 默认文本显示 -->
           <span v-else>{{ formData[item.name] }}</span>
         </el-form-item>

+ 66 - 18
back-ui/src/views/dz/cards/components/AssignCardDialog.vue

@@ -89,9 +89,8 @@
           v-model="form.school"
           placeholder="请选择学校"
           style="width: 100%"
-          :disabled="form.province === 'all'"
+          :disabled="!form.province"
         >
-          <el-option label="全部" value="all"></el-option>
           <el-option
             v-for="school in schoolList"
             :key="school.id"
@@ -109,9 +108,12 @@
           style="width: 100%"
         >
           <el-option label="全部" value="all"></el-option>
-          <el-option label="普通考生" value="normal"></el-option>
-          <el-option label="艺术考生" value="art"></el-option>
-          <el-option label="体育考生" value="sports"></el-option>
+          <el-option
+            v-for="examType in examTypeList"
+            :key="examType.dictValue"
+            :label="examType.dictLabel"
+            :value="examType.dictValue"
+          ></el-option>
         </el-select>
       </el-form-item>
     </el-form>
@@ -128,7 +130,7 @@
 
 <script setup>
 import { ref, computed, watch } from "vue";
-import { assignCard } from "@/api/dz/cards";
+import { assignCard, getExamTypes, getAgentList } from "@/api/dz/cards";
 import { getPaperProvinces } from "@/api/dz/papers";
 import { listUniversity } from "@/api/dz/school";
 
@@ -137,10 +139,6 @@ const props = defineProps({
     type: Boolean,
     default: false,
   },
-  agentList: {
-    type: Array,
-    default: () => [],
-  },
   schoolList: {
     type: Array,
     default: () => [],
@@ -161,14 +159,16 @@ const visible = computed({
 const assignCardFormRef = ref();
 const provinceList = ref([]); // 省份列表
 const schoolList = ref([]); // 学校列表
+const examTypeList = ref([]); // 考生类型列表
+const agentList = ref([]); // 代理商列表
 
 const form = ref({
   cardType: null,
   beginCardNo: "",
   endCardNo: "",
   agentId: null,
-  province: "all",
-  school: "all",
+  province: null,
+  school: null,
   studentCategory: "all",
 });
 
@@ -188,8 +188,8 @@ function resetForm() {
     beginCardNo: "",
     endCardNo: "",
     agentId: null,
-    province: "all",
-    school: "all",
+    province: null,
+    school: null,
     studentCategory: "all",
   };
 }
@@ -206,10 +206,42 @@ async function getProvinceList() {
   }
 }
 
+// 获取考生类型列表
+async function getExamTypeList(location) {
+  try {
+    const response = await getExamTypes(location);
+    if (response.code === 200) {
+      examTypeList.value = response.data || [];
+    }
+  } catch (error) {
+    console.error("获取考生类型列表失败:", error);
+  }
+}
+
+// 获取代理商列表
+async function getAgentListData() {
+  try {
+    const response = await getAgentList({});
+    if (response.code === 200) {
+      // 处理代理商数据,映射字段名
+      agentList.value = (response.data || []).map((item) => ({
+        id: item.agentId,
+        name: item.name,
+        agentId: item.agentId,
+        deptId: item.deptId,
+        phonenumber: item.phonenumber,
+        schoolName: item.schoolName,
+      }));
+    }
+  } catch (error) {
+    console.error("获取代理商列表失败:", error);
+  }
+}
+
 // 根据省份获取学校列表
 async function getSchoolListByProvince(province) {
   try {
-    if (province === "all" || !province) {
+    if (!province || province === "all") {
       schoolList.value = [];
       return;
     }
@@ -268,8 +300,16 @@ async function handleSubmit() {
           throw new Error("请填写完整的卡号段");
         }
 
-        // 调用分配卡API
-        await assignCard(form.value.agentId, begin, end);
+        // 调用分配卡API,传递所有参数
+        await assignCard(
+          form.value.cardType,
+          form.value.agentId,
+          begin,
+          end,
+          form.value.province,
+          form.value.studentCategory,
+          form.value.school
+        );
 
         emit("success", "分配卡成功!");
         visible.value = false;
@@ -295,6 +335,10 @@ watch(visible, (newVal) => {
   } else {
     // 弹窗打开时获取省份列表
     getProvinceList();
+    // 获取默认考生类型列表(可以根据需要调整)
+    getExamTypeList("湖南省"); // 默认获取湖南省的考生类型
+    // 获取代理商列表
+    getAgentListData();
   }
 });
 
@@ -303,9 +347,13 @@ watch(
   () => form.value.province,
   (newProvince) => {
     // 重置学校选择
-    form.value.school = "all";
+    form.value.school = null;
     // 获取对应省份的学校列表
     getSchoolListByProvince(newProvince);
+    // 获取对应省份的考生类型列表
+    if (newProvince) {
+      getExamTypeList(newProvince);
+    }
   }
 );
 </script>

+ 71 - 7
back-ui/src/views/dz/cards/components/CloseCardDialog.vue

@@ -14,7 +14,7 @@
           <Warning />
         </el-icon>
         <span class="confirm-text">
-          是否确认关卡vip卡编号为{{ cardNo }}的数据项?
+          {{ getConfirmMessage() }}
         </span>
       </div>
     </div>
@@ -22,7 +22,9 @@
     <template #footer>
       <div class="dialog-footer">
         <el-button @click="handleCancel">取消</el-button>
-        <el-button type="primary" @click="handleConfirm">确定</el-button>
+        <el-button type="primary" @click="handleConfirm" :loading="loading"
+          >确定</el-button
+        >
       </div>
     </template>
   </el-dialog>
@@ -31,6 +33,7 @@
 <script setup>
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
+import { closeCard } from "@/api/dz/cards";
 
 const props = defineProps({
   modelValue: {
@@ -38,27 +41,88 @@ const props = defineProps({
     default: false,
   },
   cardNo: {
-    type: [String, Number],
+    type: [String, Number, Array],
     default: "",
   },
+  cardIds: {
+    type: Array,
+    default: () => [],
+  },
 });
 
-const emit = defineEmits(["update:modelValue", "confirm"]);
+const emit = defineEmits(["update:modelValue", "confirm", "success"]);
+
+const loading = ref(false);
 
 const visible = computed({
   get: () => props.modelValue,
   set: (value) => emit("update:modelValue", value),
 });
 
+// 获取确认消息
+function getConfirmMessage() {
+  // 处理 cardNo 为数组的情况
+  if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+    if (props.cardNo.length === 1) {
+      return `是否确认关卡vip卡编号为${props.cardNo[0]}的数据项?`;
+    } else {
+      return `是否确认关卡以下${
+        props.cardNo.length
+      }张vip卡?\n${props.cardNo.join("、")}`;
+    }
+  }
+  // 处理 cardNo 为单个值的情况
+  else if (props.cardNo) {
+    return `是否确认关卡vip卡编号为${props.cardNo}的数据项?`;
+  }
+  // 处理 cardIds 的情况
+  else if (props.cardIds && props.cardIds.length > 0) {
+    return `是否确认关卡选中的${props.cardIds.length}张学习卡?`;
+  }
+  return "是否确认关卡?";
+}
+
 // 取消
 function handleCancel() {
   visible.value = false;
 }
 
 // 确认关卡
-function handleConfirm() {
-  emit("confirm", props.cardNo);
-  visible.value = false;
+async function handleConfirm() {
+  try {
+    loading.value = true;
+
+    // 确定要关卡的卡ID
+    let cardIdsToClose = [];
+
+    // 处理 cardNo 为数组的情况
+    if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+      cardIdsToClose = props.cardNo;
+    }
+    // 处理 cardNo 为单个值的情况
+    else if (props.cardNo) {
+      cardIdsToClose = [props.cardNo];
+    }
+    // 处理 cardIds 的情况
+    else if (props.cardIds && props.cardIds.length > 0) {
+      cardIdsToClose = props.cardIds;
+    }
+
+    if (cardIdsToClose.length === 0) {
+      throw new Error("没有选择要关卡的卡片");
+    }
+
+    // 调用关卡API
+    await closeCard(cardIdsToClose);
+
+    emit("success", "关卡成功!");
+    visible.value = false;
+  } catch (error) {
+    console.error("关卡失败:", error);
+    emit("confirm", { error: error.message });
+  } finally {
+    loading.value = false;
+  }
 }
 </script>
 

+ 71 - 7
back-ui/src/views/dz/cards/components/PaymentDialog.vue

@@ -14,7 +14,7 @@
           <Warning />
         </el-icon>
         <span class="confirm-text">
-          是否确认缴费vip卡编号为{{ cardNo }}的数据项?
+          {{ getConfirmMessage() }}
         </span>
       </div>
     </div>
@@ -22,7 +22,9 @@
     <template #footer>
       <div class="dialog-footer">
         <el-button @click="handleCancel">取消</el-button>
-        <el-button type="primary" @click="handleConfirm">确定</el-button>
+        <el-button type="primary" @click="handleConfirm" :loading="loading"
+          >确定</el-button
+        >
       </div>
     </template>
   </el-dialog>
@@ -31,6 +33,7 @@
 <script setup>
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
+import { payCard } from "@/api/dz/cards";
 
 const props = defineProps({
   modelValue: {
@@ -38,27 +41,88 @@ const props = defineProps({
     default: false,
   },
   cardNo: {
-    type: [String, Number],
+    type: [String, Number, Array],
     default: "",
   },
+  cardIds: {
+    type: Array,
+    default: () => [],
+  },
 });
 
-const emit = defineEmits(["update:modelValue", "confirm"]);
+const emit = defineEmits(["update:modelValue", "confirm", "success"]);
+
+const loading = ref(false);
 
 const visible = computed({
   get: () => props.modelValue,
   set: (value) => emit("update:modelValue", value),
 });
 
+// 获取确认消息
+function getConfirmMessage() {
+  // 处理 cardNo 为数组的情况
+  if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+    if (props.cardNo.length === 1) {
+      return `是否确认缴费vip卡编号为${props.cardNo[0]}的数据项?`;
+    } else {
+      return `是否确认缴费以下${
+        props.cardNo.length
+      }张vip卡?\n${props.cardNo.join("、")}`;
+    }
+  }
+  // 处理 cardNo 为单个值的情况
+  else if (props.cardNo) {
+    return `是否确认缴费vip卡编号为${props.cardNo}的数据项?`;
+  }
+  // 处理 cardIds 的情况
+  else if (props.cardIds && props.cardIds.length > 0) {
+    return `是否确认缴费选中的${props.cardIds.length}张学习卡?`;
+  }
+  return "是否确认缴费?";
+}
+
 // 取消
 function handleCancel() {
   visible.value = false;
 }
 
 // 确认缴费
-function handleConfirm() {
-  emit("confirm", props.cardNo);
-  visible.value = false;
+async function handleConfirm() {
+  try {
+    loading.value = true;
+
+    // 确定要缴费的卡ID
+    let cardIdsToPay = [];
+
+    // 处理 cardNo 为数组的情况
+    if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+      cardIdsToPay = props.cardNo;
+    }
+    // 处理 cardNo 为单个值的情况
+    else if (props.cardNo) {
+      cardIdsToPay = [props.cardNo];
+    }
+    // 处理 cardIds 的情况
+    else if (props.cardIds && props.cardIds.length > 0) {
+      cardIdsToPay = props.cardIds;
+    }
+
+    if (cardIdsToPay.length === 0) {
+      throw new Error("没有选择要缴费的卡片");
+    }
+
+    // 调用缴费API
+    await payCard(cardIdsToPay);
+
+    emit("success", "缴费成功!");
+    visible.value = false;
+  } catch (error) {
+    console.error("缴费失败:", error);
+    emit("confirm", { error: error.message });
+  } finally {
+    loading.value = false;
+  }
 }
 </script>
 

+ 71 - 7
back-ui/src/views/dz/cards/components/ReopenCardDialog.vue

@@ -14,7 +14,7 @@
           <Warning />
         </el-icon>
         <span class="confirm-text">
-          是否确认重开VIP卡编号为{{ cardNo }}的数据项?
+          {{ getConfirmMessage() }}
         </span>
       </div>
     </div>
@@ -22,7 +22,9 @@
     <template #footer>
       <div class="dialog-footer">
         <el-button @click="handleCancel">取消</el-button>
-        <el-button type="primary" @click="handleConfirm">确定</el-button>
+        <el-button type="primary" @click="handleConfirm" :loading="loading"
+          >确定</el-button
+        >
       </div>
     </template>
   </el-dialog>
@@ -31,6 +33,7 @@
 <script setup>
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
+import { reopenCard } from "@/api/dz/cards";
 
 const props = defineProps({
   modelValue: {
@@ -38,27 +41,88 @@ const props = defineProps({
     default: false,
   },
   cardNo: {
-    type: [String, Number],
+    type: [String, Number, Array],
     default: "",
   },
+  cardIds: {
+    type: Array,
+    default: () => [],
+  },
 });
 
-const emit = defineEmits(["update:modelValue", "confirm"]);
+const emit = defineEmits(["update:modelValue", "confirm", "success"]);
+
+const loading = ref(false);
 
 const visible = computed({
   get: () => props.modelValue,
   set: (value) => emit("update:modelValue", value),
 });
 
+// 获取确认消息
+function getConfirmMessage() {
+  // 处理 cardNo 为数组的情况
+  if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+    if (props.cardNo.length === 1) {
+      return `是否确认重开VIP卡编号为${props.cardNo[0]}的数据项?`;
+    } else {
+      return `是否确认重开以下${
+        props.cardNo.length
+      }张VIP卡?\n${props.cardNo.join("、")}`;
+    }
+  }
+  // 处理 cardNo 为单个值的情况
+  else if (props.cardNo) {
+    return `是否确认重开VIP卡编号为${props.cardNo}的数据项?`;
+  }
+  // 处理 cardIds 的情况
+  else if (props.cardIds && props.cardIds.length > 0) {
+    return `是否确认重开选中的${props.cardIds.length}张学习卡?`;
+  }
+  return "是否确认重开?";
+}
+
 // 取消
 function handleCancel() {
   visible.value = false;
 }
 
 // 确认重开
-function handleConfirm() {
-  emit("confirm", props.cardNo);
-  visible.value = false;
+async function handleConfirm() {
+  try {
+    loading.value = true;
+
+    // 确定要重开的卡ID
+    let cardIdsToReopen = [];
+
+    // 处理 cardNo 为数组的情况
+    if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+      cardIdsToReopen = props.cardNo;
+    }
+    // 处理 cardNo 为单个值的情况
+    else if (props.cardNo) {
+      cardIdsToReopen = [props.cardNo];
+    }
+    // 处理 cardIds 的情况
+    else if (props.cardIds && props.cardIds.length > 0) {
+      cardIdsToReopen = props.cardIds;
+    }
+
+    if (cardIdsToReopen.length === 0) {
+      throw new Error("没有选择要重开的卡片");
+    }
+
+    // 调用重开API
+    await reopenCard(cardIdsToReopen);
+
+    emit("success", "重开成功!");
+    visible.value = false;
+  } catch (error) {
+    console.error("重开失败:", error);
+    emit("confirm", { error: error.message });
+  } finally {
+    loading.value = false;
+  }
 }
 </script>
 

+ 6 - 2
back-ui/src/views/dz/cards/config/form.js

@@ -68,9 +68,13 @@ const info = [
     label: "卡号段",
     name: "cardNoRange",
     value: "",
-    type: "text",
+    type: "range",
     search: true,
-    placeholder: "开始卡号-结束卡号",
+    placeholder: "请选择卡号段",
+    startPlaceholder: "开始卡号",
+    endPlaceholder: "结束卡号",
+    beginField: "begin",
+    endField: "end",
   },
   {
     label: "卡类型",

+ 52 - 21
back-ui/src/views/dz/cards/index.vue

@@ -28,7 +28,6 @@
         <el-button
           type="success"
           plain
-          :disabled="single"
           @click="handleAssignCard"
           v-hasPermi="['dz:cards:add']"
           style="border-color: #67c23a; color: #67c23a; font-weight: 500"
@@ -131,11 +130,11 @@
           type="danger"
           plain
           :disabled="multiple"
+          icon="Delete"
           @click="handleDelete"
           v-hasPermi="['dz:cards:remove']"
           style="border-color: #ff4d4f; color: #ff4d4f; font-weight: 500"
         >
-          <svg-icon icon-class="delete" class="mr-1" style="font-size: 16px" />
           删除
         </el-button>
       </el-col>
@@ -189,7 +188,6 @@
 
     <AssignCardDialog
       v-model="assignCardOpen"
-      :agent-list="agentList"
       :school-list="schoolList"
       :card-type-options="card_type"
       @success="handleDialogSuccess"
@@ -205,19 +203,23 @@
     <PaymentDialog
       v-model="paymentOpen"
       :card-no="currentCardNo"
-      @confirm="handlePaymentConfirm"
+      :card-ids="selectedCardIds"
+      :selected-cards="selectedRows"
+      @success="handlePaymentSuccess"
     />
 
     <CloseCardDialog
       v-model="closeCardOpen"
       :card-no="currentCloseCardNo"
-      @confirm="handleCloseCardConfirm"
+      :card-ids="selectedCardIds"
+      @success="handleCloseCardSuccess"
     />
 
     <ReopenCardDialog
       v-model="reopenCardOpen"
       :card-no="currentReopenCardNo"
-      @confirm="handleReopenCardConfirm"
+      :card-ids="selectedCardIds"
+      @success="handleReopenCardSuccess"
     />
 
     <RefundDialog
@@ -313,14 +315,17 @@ const reopenCardOpen = ref(false); // 重开对话框
 const refundOpen = ref(false); // 退费对话框
 const associateCampusOpen = ref(false); // 关联校区对话框
 const applyCardOpen = ref(false); // 申请开卡对话框
-const currentCardNo = ref(""); // 当前缴费的卡号
-const currentCloseCardNo = ref(""); // 当前关卡的卡号
-const currentReopenCardNo = ref(""); // 当前重开的卡号
+const currentCardNo = ref([]); // 当前缴费的卡号(支持数组)
+const currentCloseCardNo = ref([]); // 当前关卡的卡号(支持数组)
+const currentReopenCardNo = ref([]); // 当前重开的卡号(支持数组)
 const currentRefundCardNo = ref(""); // 当前退费的卡号
 const campusList = ref([]); // 校区列表
 const agentList = ref([]); // 代理商列表
 const institutionList = ref([]); // 机构列表
 const selectedRows = ref([]); // 选中的行
+const selectedCardIds = computed(() =>
+  selectedRows.value.map((row) => row.cardId)
+); // 选中的卡ID列表
 const currentCardId = ref(null); // 当前编辑的卡片ID
 const loading = ref(true);
 const showSearch = ref(true);
@@ -424,6 +429,8 @@ const data = reactive({
     cardNo: null,
     password: null,
     cardNoRange: null,
+    begin: null,
+    end: null,
     type: null,
     studentCategory: null, // 分配考生类型
     studentName: null, // 学生姓名
@@ -703,13 +710,21 @@ function handlePayment() {
     return;
   }
 
-  // 获取第一个选中卡片的卡号
-  const firstCard = selectedRows.value[0];
-  currentCardNo.value = firstCard.cardNo || firstCard.id || "未知";
+  // 获取所有选中卡片的卡号数组
+  const cardNos = selectedRows.value.map(
+    (card) => card.cardNo || card.id || "未知"
+  );
+  currentCardNo.value = cardNos;
   paymentOpen.value = true;
 }
 
-// 处理缴费确认
+// 处理缴费成功
+function handlePaymentSuccess(message) {
+  proxy.$modal.msgSuccess(message);
+  getList(); // 刷新列表
+}
+
+// 处理缴费确认(保留兼容性)
 function handlePaymentConfirm(cardNo) {
   proxy.$modal.msgSuccess(`缴费成功!卡号:${cardNo}`);
   getList(); // 刷新列表
@@ -722,13 +737,21 @@ function handleCloseCard() {
     return;
   }
 
-  // 获取第一个选中卡片的卡号
-  const firstCard = selectedRows.value[0];
-  currentCloseCardNo.value = firstCard.cardNo || firstCard.id || "未知";
+  // 获取所有选中卡片的卡号数组
+  const cardNos = selectedRows.value.map(
+    (card) => card.cardNo || card.id || "未知"
+  );
+  currentCloseCardNo.value = cardNos;
   closeCardOpen.value = true;
 }
 
-// 处理关卡确认
+// 处理关卡成功
+function handleCloseCardSuccess(message) {
+  proxy.$modal.msgSuccess(message);
+  getList(); // 刷新列表
+}
+
+// 处理关卡确认(保留兼容性)
 function handleCloseCardConfirm(cardNo) {
   proxy.$modal.msgSuccess(`关卡成功!卡号:${cardNo}`);
   getList(); // 刷新列表
@@ -741,13 +764,21 @@ function handleReopenCard() {
     return;
   }
 
-  // 获取第一个选中卡片的卡号
-  const firstCard = selectedRows.value[0];
-  currentReopenCardNo.value = firstCard.cardNo || firstCard.id || "未知";
+  // 获取所有选中卡片的卡号数组
+  const cardNos = selectedRows.value.map(
+    (card) => card.cardNo || card.id || "未知"
+  );
+  currentReopenCardNo.value = cardNos;
   reopenCardOpen.value = true;
 }
 
-// 处理重开确认
+// 处理重开成功
+function handleReopenCardSuccess(message) {
+  proxy.$modal.msgSuccess(message);
+  getList(); // 刷新列表
+}
+
+// 处理重开确认(保留兼容性)
 function handleReopenCardConfirm(cardNo) {
   proxy.$modal.msgSuccess(`重开成功!卡号:${cardNo}`);
   getList(); // 刷新列表