Kaynağa Gözat

完成卡管理功能

month-red-love 1 ay önce
ebeveyn
işleme
d8fc9a173f

+ 14 - 2
back-ui/src/views/dz/cards/components/AssignCardDialog.vue

@@ -308,13 +308,19 @@ async function handleSubmit() {
         }
 
         // 调用分配卡API,传递所有参数
+        // 将 "all" 转换为 null,因为后端 ExamType 枚举不接受 "all" 值
+        const examType =
+          form.value.studentCategory === "all"
+            ? null
+            : form.value.studentCategory;
+
         await assignCard(
           form.value.cardType,
           form.value.agentId,
           begin,
           end,
           form.value.province,
-          form.value.studentCategory,
+          examType,
           form.value.school
         );
 
@@ -346,13 +352,19 @@ async function handleReassign() {
         }
 
         // 再次调用分配卡API
+        // 将 "all" 转换为 null,因为后端 ExamType 枚举不接受 "all" 值
+        const examType =
+          form.value.studentCategory === "all"
+            ? null
+            : form.value.studentCategory;
+
         await assignCard(
           form.value.cardType,
           form.value.agentId,
           begin,
           end,
           form.value.province,
-          form.value.studentCategory,
+          examType,
           form.value.school
         );
 

+ 1 - 2
back-ui/src/views/dz/cards/components/AssociateCampusDialog.vue

@@ -43,7 +43,6 @@
             placeholder="请选择校区"
             style="width: 100%"
           >
-            <el-option label="全部" value="all"></el-option>
             <el-option
               v-for="campus in campusList"
               :key="campus.id"
@@ -173,7 +172,7 @@ async function handleConfirm() {
         if (!begin || !end) {
           throw new Error("请填写完整的卡号段");
         }
-        if (!campusId || campusId === "all") {
+        if (!campusId) {
           throw new Error("请选择校区");
         }
 

+ 29 - 4
back-ui/src/views/dz/cards/components/CloseCardDialog.vue

@@ -33,7 +33,7 @@
 <script setup>
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
-import { closeCard } from "@/api/dz/cards";
+import { closeCard, listCards } from "@/api/dz/cards";
 
 const props = defineProps({
   modelValue: {
@@ -43,10 +43,12 @@ const props = defineProps({
   cardNo: {
     type: [String, Number, Array],
     default: "",
+    // 卡号(字符串),关卡时会自动转换为 cardId
   },
   cardIds: {
     type: Array,
     default: () => [],
+    // 卡ID(数字数组),直接用于关卡API
   },
 });
 
@@ -97,13 +99,22 @@ async function handleConfirm() {
 
     // 处理 cardNo 为数组的情况
     if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
-      cardIdsToClose = props.cardNo;
+      // 根据 cardNo 数组查询对应的 cardId
+      for (const cardNo of props.cardNo) {
+        const cardInfo = await getCardIdByCardNo(cardNo);
+        if (cardInfo) {
+          cardIdsToClose.push(cardInfo.cardId);
+        }
+      }
     }
     // 处理 cardNo 为单个值的情况
     else if (props.cardNo) {
-      cardIdsToClose = [props.cardNo];
+      const cardInfo = await getCardIdByCardNo(props.cardNo);
+      if (cardInfo) {
+        cardIdsToClose.push(cardInfo.cardId);
+      }
     }
-    // 处理 cardIds 的情况
+    // 处理 cardIds 的情况(直接使用 cardId)
     else if (props.cardIds && props.cardIds.length > 0) {
       cardIdsToClose = props.cardIds;
     }
@@ -124,6 +135,20 @@ async function handleConfirm() {
     loading.value = false;
   }
 }
+
+// 根据 cardNo 查询 cardId
+async function getCardIdByCardNo(cardNo) {
+  try {
+    const response = await listCards({ cardNo: cardNo });
+    if (response.code === 200 && response.rows && response.rows.length > 0) {
+      return response.rows[0]; // 返回第一个匹配的卡片信息
+    }
+    return null;
+  } catch (error) {
+    console.error(`根据卡号 ${cardNo} 查询卡片信息失败:`, error);
+    return null;
+  }
+}
 </script>
 
 <style scoped>

+ 29 - 4
back-ui/src/views/dz/cards/components/PaymentDialog.vue

@@ -33,7 +33,7 @@
 <script setup>
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
-import { payCard } from "@/api/dz/cards";
+import { payCard, listCards } from "@/api/dz/cards";
 
 const props = defineProps({
   modelValue: {
@@ -43,10 +43,12 @@ const props = defineProps({
   cardNo: {
     type: [String, Number, Array],
     default: "",
+    // 卡号(字符串),缴费时会自动转换为 cardId
   },
   cardIds: {
     type: Array,
     default: () => [],
+    // 卡ID(数字数组),直接用于缴费API
   },
 });
 
@@ -97,13 +99,22 @@ async function handleConfirm() {
 
     // 处理 cardNo 为数组的情况
     if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
-      cardIdsToPay = props.cardNo;
+      // 根据 cardNo 数组查询对应的 cardId
+      for (const cardNo of props.cardNo) {
+        const cardInfo = await getCardIdByCardNo(cardNo);
+        if (cardInfo) {
+          cardIdsToPay.push(cardInfo.cardId);
+        }
+      }
     }
     // 处理 cardNo 为单个值的情况
     else if (props.cardNo) {
-      cardIdsToPay = [props.cardNo];
+      const cardInfo = await getCardIdByCardNo(props.cardNo);
+      if (cardInfo) {
+        cardIdsToPay.push(cardInfo.cardId);
+      }
     }
-    // 处理 cardIds 的情况
+    // 处理 cardIds 的情况(直接使用 cardId)
     else if (props.cardIds && props.cardIds.length > 0) {
       cardIdsToPay = props.cardIds;
     }
@@ -124,6 +135,20 @@ async function handleConfirm() {
     loading.value = false;
   }
 }
+
+// 根据 cardNo 查询 cardId
+async function getCardIdByCardNo(cardNo) {
+  try {
+    const response = await listCards({ cardNo: cardNo });
+    if (response.code === 200 && response.rows && response.rows.length > 0) {
+      return response.rows[0]; // 返回第一个匹配的卡片信息
+    }
+    return null;
+  } catch (error) {
+    console.error(`根据卡号 ${cardNo} 查询卡片信息失败:`, error);
+    return null;
+  }
+}
 </script>
 
 <style scoped>

+ 96 - 7
back-ui/src/views/dz/cards/components/RefundDialog.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 { refundCard, listCards } from "@/api/dz/cards";
 
 const props = defineProps({
   modelValue: {
@@ -38,27 +41,113 @@ const props = defineProps({
     default: false,
   },
   cardNo: {
-    type: [String, Number],
+    type: [String, Number, Array],
     default: "",
+    // 卡号(字符串),退费时会自动转换为 cardId
+  },
+  cardIds: {
+    type: Array,
+    default: () => [],
+    // 卡ID(数字数组),直接用于退费API
   },
 });
 
-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 cardIdsToRefund = [];
+
+    // 处理 cardNo 为数组的情况
+    if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+      // 根据 cardNo 数组查询对应的 cardId
+      for (const cardNo of props.cardNo) {
+        const cardInfo = await getCardIdByCardNo(cardNo);
+        if (cardInfo) {
+          cardIdsToRefund.push(cardInfo.cardId);
+        }
+      }
+    }
+    // 处理 cardNo 为单个值的情况
+    else if (props.cardNo) {
+      const cardInfo = await getCardIdByCardNo(props.cardNo);
+      if (cardInfo) {
+        cardIdsToRefund.push(cardInfo.cardId);
+      }
+    }
+    // 处理 cardIds 的情况(直接使用 cardId)
+    else if (props.cardIds && props.cardIds.length > 0) {
+      cardIdsToRefund = props.cardIds;
+    }
+
+    if (cardIdsToRefund.length === 0) {
+      throw new Error("没有选择要退费的卡片");
+    }
+
+    // 调用退费API
+    await refundCard(cardIdsToRefund);
+
+    emit("success", "退费成功!");
+    visible.value = false;
+  } catch (error) {
+    console.error("退费失败:", error);
+    emit("confirm", { error: error.message });
+  } finally {
+    loading.value = false;
+  }
+}
+
+// 根据 cardNo 查询 cardId
+async function getCardIdByCardNo(cardNo) {
+  try {
+    const response = await listCards({ cardNo: cardNo });
+    if (response.code === 200 && response.rows && response.rows.length > 0) {
+      return response.rows[0]; // 返回第一个匹配的卡片信息
+    }
+    return null;
+  } catch (error) {
+    console.error(`根据卡号 ${cardNo} 查询卡片信息失败:`, error);
+    return null;
+  }
 }
 </script>
 

+ 29 - 4
back-ui/src/views/dz/cards/components/ReopenCardDialog.vue

@@ -33,7 +33,7 @@
 <script setup>
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
-import { reopenCard } from "@/api/dz/cards";
+import { reopenCard, listCards } from "@/api/dz/cards";
 
 const props = defineProps({
   modelValue: {
@@ -43,10 +43,12 @@ const props = defineProps({
   cardNo: {
     type: [String, Number, Array],
     default: "",
+    // 卡号(字符串),重开时会自动转换为 cardId
   },
   cardIds: {
     type: Array,
     default: () => [],
+    // 卡ID(数字数组),直接用于重开API
   },
 });
 
@@ -97,13 +99,22 @@ async function handleConfirm() {
 
     // 处理 cardNo 为数组的情况
     if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
-      cardIdsToReopen = props.cardNo;
+      // 根据 cardNo 数组查询对应的 cardId
+      for (const cardNo of props.cardNo) {
+        const cardInfo = await getCardIdByCardNo(cardNo);
+        if (cardInfo) {
+          cardIdsToReopen.push(cardInfo.cardId);
+        }
+      }
     }
     // 处理 cardNo 为单个值的情况
     else if (props.cardNo) {
-      cardIdsToReopen = [props.cardNo];
+      const cardInfo = await getCardIdByCardNo(props.cardNo);
+      if (cardInfo) {
+        cardIdsToReopen.push(cardInfo.cardId);
+      }
     }
-    // 处理 cardIds 的情况
+    // 处理 cardIds 的情况(直接使用 cardId)
     else if (props.cardIds && props.cardIds.length > 0) {
       cardIdsToReopen = props.cardIds;
     }
@@ -124,6 +135,20 @@ async function handleConfirm() {
     loading.value = false;
   }
 }
+
+// 根据 cardNo 查询 cardId
+async function getCardIdByCardNo(cardNo) {
+  try {
+    const response = await listCards({ cardNo: cardNo });
+    if (response.code === 200 && response.rows && response.rows.length > 0) {
+      return response.rows[0]; // 返回第一个匹配的卡片信息
+    }
+    return null;
+  } catch (error) {
+    console.error(`根据卡号 ${cardNo} 查询卡片信息失败:`, error);
+    return null;
+  }
+}
 </script>
 
 <style scoped>

+ 3 - 8
back-ui/src/views/dz/cards/config/table.js

@@ -40,32 +40,27 @@ const tableConfig = {
       label: "分配学校",
       prop: "assignSchoolName",
       align: "center",
-      type: "dict",
-      options: [], // 动态设置学校选项
+
       width: 120,
     },
     {
       label: "注册学校",
       prop: "schoolName",
       align: "center",
-      type: "dict",
-      options: [], // 动态设置学校选项
+
       width: 120,
     },
     {
       label: "班级",
       prop: "className",
       align: "center",
-      type: "dict",
-      options: [], // 动态设置班级选项
+
       width: 100,
     },
     {
       label: "校区",
       prop: "campusName",
       align: "center",
-      type: "dict",
-      options: [], // 动态设置校区选项
       width: 100,
     },
     {