Pārlūkot izejas kodu

完成弹窗优化以及制卡接口对接

month-red-love 1 mēnesi atpakaļ
vecāks
revīzija
3997a33f8f

+ 4 - 2
back-ui/src/api/dz/cards.js

@@ -36,9 +36,11 @@ export function updateCards(data) {
 }
 
 // 删除学习卡
-export function delCards(cardId) {
+export function delCards(cardIds) {
+  // 如果是数组,转换为逗号分隔的字符串
+  const ids = Array.isArray(cardIds) ? cardIds.join(",") : cardIds;
   return request({
-    url: "/dz/cards/" + cardId,
+    url: "/dz/cards/" + ids,
     method: "delete",
   });
 }

+ 16 - 11
back-ui/src/views/dz/cards/components/ApplyCardDialog.vue

@@ -6,6 +6,7 @@
     append-to-body
     align-center
     :center="true"
+    :destroy-on-close="true"
   >
     <div class="apply-card-content">
       <el-form
@@ -15,19 +16,23 @@
         label-width="100px"
       >
         <!-- 卡号段 -->
-        <el-form-item label="卡号段" prop="cardRange" :required="true">
+        <el-form-item label="卡号段" :required="true">
           <div style="display: flex; align-items: center; gap: 10px">
-            <el-input
-              v-model="form.beginCardNo"
-              placeholder="开始卡号"
-              style="flex: 1"
-            />
+            <el-form-item prop="beginCardNo" style="flex: 1; margin-bottom: 0">
+              <el-input
+                v-model="form.beginCardNo"
+                placeholder="开始卡号"
+                style="width: 100%"
+              />
+            </el-form-item>
             <span>-</span>
-            <el-input
-              v-model="form.endCardNo"
-              placeholder="结束卡号"
-              style="flex: 1"
-            />
+            <el-form-item prop="endCardNo" style="flex: 1; margin-bottom: 0">
+              <el-input
+                v-model="form.endCardNo"
+                placeholder="结束卡号"
+                style="width: 100%"
+              />
+            </el-form-item>
           </div>
         </el-form-item>
 

+ 96 - 16
back-ui/src/views/dz/cards/components/AssignCardDialog.vue

@@ -6,6 +6,7 @@
     append-to-body
     align-center
     :center="true"
+    :destroy-on-close="true"
   >
     <el-form
       ref="assignCardFormRef"
@@ -30,19 +31,23 @@
       </el-form-item>
 
       <!-- 卡号段 -->
-      <el-form-item label="卡号段" prop="cardRange" :required="true">
+      <el-form-item label="卡号段" :required="true">
         <div style="display: flex; align-items: center; gap: 10px">
-          <el-input
-            v-model="form.beginCardNo"
-            placeholder="开始卡号"
-            style="flex: 1"
-          />
+          <el-form-item prop="beginCardNo" style="flex: 1; margin-bottom: 0">
+            <el-input
+              v-model="form.beginCardNo"
+              placeholder="开始卡号"
+              style="width: 100%"
+            />
+          </el-form-item>
           <span>-</span>
-          <el-input
-            v-model="form.endCardNo"
-            placeholder="结束卡号"
-            style="flex: 1"
-          />
+          <el-form-item prop="endCardNo" style="flex: 1; margin-bottom: 0">
+            <el-input
+              v-model="form.endCardNo"
+              placeholder="结束卡号"
+              style="width: 100%"
+            />
+          </el-form-item>
         </div>
       </el-form-item>
 
@@ -69,11 +74,12 @@
           placeholder="请选择省份"
           style="width: 100%"
         >
-          <el-option label="全部" value="all"></el-option>
-          <el-option label="湖南" value="hunan"></el-option>
-          <el-option label="广东" value="guangdong"></el-option>
-          <el-option label="北京" value="beijing"></el-option>
-          <el-option label="上海" value="shanghai"></el-option>
+          <el-option
+            v-for="province in provinceList"
+            :key="province.dictValue"
+            :label="province.dictLabel"
+            :value="province.dictValue"
+          ></el-option>
         </el-select>
       </el-form-item>
 
@@ -83,6 +89,7 @@
           v-model="form.school"
           placeholder="请选择学校"
           style="width: 100%"
+          :disabled="form.province === 'all'"
         >
           <el-option label="全部" value="all"></el-option>
           <el-option
@@ -122,6 +129,8 @@
 <script setup>
 import { ref, computed, watch } from "vue";
 import { assignCard } from "@/api/dz/cards";
+import { getPaperProvinces } from "@/api/dz/papers";
+import { listUniversity } from "@/api/dz/school";
 
 const props = defineProps({
   modelValue: {
@@ -150,6 +159,8 @@ const visible = computed({
 });
 
 const assignCardFormRef = ref();
+const provinceList = ref([]); // 省份列表
+const schoolList = ref([]); // 学校列表
 
 const form = ref({
   cardType: null,
@@ -183,6 +194,61 @@ function resetForm() {
   };
 }
 
+// 获取省份列表
+async function getProvinceList() {
+  try {
+    const response = await getPaperProvinces();
+    if (response.code === 200) {
+      provinceList.value = response.data || [];
+    }
+  } catch (error) {
+    console.error("获取省份列表失败:", error);
+  }
+}
+
+// 根据省份获取学校列表
+async function getSchoolListByProvince(province) {
+  try {
+    if (province === "all" || !province) {
+      schoolList.value = [];
+      return;
+    }
+
+    const response = await listUniversity({
+      location: province,
+      pageNum: 1,
+      pageSize: 1000,
+    });
+    if (response.code === 200) {
+      // 处理API返回的数据结构
+      let schoolData = [];
+
+      // 检查是否有rows字段(直接在response中)
+      if (response.rows) {
+        schoolData = response.rows;
+      }
+      // 检查是否有data.rows字段
+      else if (response.data && response.data.rows) {
+        schoolData = response.data.rows;
+      }
+      // 检查是否有data数组
+      else if (response.data && Array.isArray(response.data)) {
+        schoolData = response.data;
+      }
+      // 检查是否有data对象
+      else if (response.data && response.data.id) {
+        schoolData = [response.data];
+      }
+
+      schoolList.value = schoolData;
+      console.log("学校数据:", schoolData); // 添加调试日志
+    }
+  } catch (error) {
+    console.error("获取学校列表失败:", error);
+    schoolList.value = [];
+  }
+}
+
 // 取消
 function handleCancel() {
   visible.value = false;
@@ -226,8 +292,22 @@ function handleReassign() {
 watch(visible, (newVal) => {
   if (!newVal) {
     resetForm();
+  } else {
+    // 弹窗打开时获取省份列表
+    getProvinceList();
   }
 });
+
+// 监听省份变化,获取对应学校
+watch(
+  () => form.value.province,
+  (newProvince) => {
+    // 重置学校选择
+    form.value.school = "all";
+    // 获取对应省份的学校列表
+    getSchoolListByProvince(newProvince);
+  }
+);
 </script>
 
 <style scoped>

+ 16 - 11
back-ui/src/views/dz/cards/components/AssociateCampusDialog.vue

@@ -6,6 +6,7 @@
     append-to-body
     align-center
     :center="true"
+    :destroy-on-close="true"
   >
     <div class="associate-campus-content">
       <el-form
@@ -15,19 +16,23 @@
         label-width="100px"
       >
         <!-- 卡号段 -->
-        <el-form-item label="卡号段" prop="cardRange" :required="true">
+        <el-form-item label="卡号段" :required="true">
           <div style="display: flex; align-items: center; gap: 10px">
-            <el-input
-              v-model="form.beginCardNo"
-              placeholder="开始卡号"
-              style="flex: 1"
-            />
+            <el-form-item prop="beginCardNo" style="flex: 1; margin-bottom: 0">
+              <el-input
+                v-model="form.beginCardNo"
+                placeholder="开始卡号"
+                style="width: 100%"
+              />
+            </el-form-item>
             <span>-</span>
-            <el-input
-              v-model="form.endCardNo"
-              placeholder="结束卡号"
-              style="flex: 1"
-            />
+            <el-form-item prop="endCardNo" style="flex: 1; margin-bottom: 0">
+              <el-input
+                v-model="form.endCardNo"
+                placeholder="结束卡号"
+                style="width: 100%"
+              />
+            </el-form-item>
           </div>
         </el-form-item>
 

+ 85 - 11
back-ui/src/views/dz/cards/components/CardGenerationDialog.vue

@@ -6,6 +6,7 @@
     append-to-body
     align-center
     :center="true"
+    :destroy-on-close="true"
   >
     <el-form
       ref="cardGenerationFormRef"
@@ -46,26 +47,29 @@
       </el-form-item>
 
       <!-- 省份 -->
-      <el-form-item label="省份">
+      <!-- <el-form-item label="省份">
         <el-select
           v-model="form.province"
           placeholder="请选择省份"
           style="width: 100%"
         >
           <el-option label="全部" value="all"></el-option>
-          <el-option label="湖南" value="hunan"></el-option>
-          <el-option label="广东" value="guangdong"></el-option>
-          <el-option label="北京" value="beijing"></el-option>
-          <el-option label="上海" value="shanghai"></el-option>
+          <el-option
+            v-for="province in provinceList"
+            :key="province.dictValue"
+            :label="province.dictLabel"
+            :value="province.dictValue"
+          ></el-option>
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
 
       <!-- 学校 -->
-      <el-form-item label="学校">
+      <!-- <el-form-item label="学校">
         <el-select
           v-model="form.school"
           placeholder="请选择学校"
           style="width: 100%"
+          :disabled="form.province === 'all'"
         >
           <el-option label="全部" value="all"></el-option>
           <el-option
@@ -75,7 +79,7 @@
             :value="school.id"
           ></el-option>
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
 
       <!-- 卡数量 -->
       <el-form-item label="卡数量" prop="cardQuantity" :required="true">
@@ -101,7 +105,8 @@
 <script setup>
 import { ref, computed, watch } from "vue";
 import { issueCard } from "@/api/dz/cards";
-
+import { getPaperProvinces } from "@/api/dz/papers";
+import { listUniversity } from "@/api/dz/school";
 const props = defineProps({
   modelValue: {
     type: Boolean,
@@ -129,7 +134,8 @@ const visible = computed({
 });
 
 const cardGenerationFormRef = ref();
-
+const provinceList = ref([]); // 省份列表
+const schoolList = ref([]); // 学校列表
 const form = ref({
   institutionId: null,
   type: null,
@@ -166,7 +172,61 @@ function getCardTypeEnum(typeValue) {
   return cardTypeMap[typeValue] || "ECard"; // 默认返回电子卡
 }
 
-// 重置表单
+// 获取省份列表
+async function getProvinceList() {
+  try {
+    const response = await getPaperProvinces();
+    if (response.code === 200) {
+      provinceList.value = response.data || [];
+    }
+  } catch (error) {
+    console.error("获取省份列表失败:", error);
+  }
+}
+
+// 根据省份获取学校列表
+async function getSchoolListByProvince(province) {
+  try {
+    if (province === "all" || !province) {
+      schoolList.value = [];
+      return;
+    }
+
+    const response = await listUniversity({
+      location: province,
+      pageNum: 1,
+      pageSize: 1000,
+    });
+    if (response.code === 200) {
+      // 处理API返回的数据结构
+      let schoolData = [];
+
+      // 检查是否有rows字段(直接在response中)
+      if (response.rows) {
+        schoolData = response.rows;
+      }
+      // 检查是否有data.rows字段
+      else if (response.data && response.data.rows) {
+        schoolData = response.data.rows;
+      }
+      // 检查是否有data数组
+      else if (response.data && Array.isArray(response.data)) {
+        schoolData = response.data;
+      }
+      // 检查是否有data对象
+      else if (response.data && response.data.id) {
+        schoolData = [response.data];
+      }
+
+      schoolList.value = schoolData;
+      console.log("学校数据:", schoolData); // 添加调试日志
+    }
+  } catch (error) {
+    console.error("获取学校列表失败:", error);
+    schoolList.value = [];
+  }
+}
+
 function resetForm() {
   form.value = {
     institutionId: null,
@@ -214,8 +274,22 @@ async function handleSubmit() {
 watch(visible, (newVal) => {
   if (!newVal) {
     resetForm();
+  } else {
+    // 弹窗打开时获取省份列表
+    // getProvinceList(); // 暂时屏蔽
   }
 });
+
+// 监听省份变化,获取对应学校
+// watch(
+//   () => form.value.province,
+//   (newProvince) => {
+//     // 重置学校选择
+//     form.value.school = "all";
+//     // 获取对应省份的学校列表
+//     getSchoolListByProvince(newProvince);
+//   }
+// );
 </script>
 
 <style scoped>

+ 1 - 0
back-ui/src/views/dz/cards/components/CloseCardDialog.vue

@@ -6,6 +6,7 @@
     append-to-body
     align-center
     :center="true"
+    :destroy-on-close="true"
   >
     <div class="close-card-confirm-content">
       <div class="confirm-item">

+ 49 - 1
back-ui/src/views/dz/cards/components/EditStudentDialog.vue

@@ -1,5 +1,13 @@
 <template>
-  <el-dialog title="编辑" v-model="visible" width="500px" append-to-body>
+  <el-dialog
+    title="编辑"
+    v-model="visible"
+    width="500px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
     <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
       <!-- 学校 -->
       <el-form-item label="学校" prop="schoolId">
@@ -72,6 +80,7 @@
 <script setup>
 import { ref, computed, watch } from "vue";
 import { getCards, addCards, updateCards } from "@/api/dz/cards";
+import { listUniversity } from "@/api/dz/school";
 
 const props = defineProps({
   modelValue: {
@@ -100,6 +109,7 @@ const visible = computed({
 });
 
 const formRef = ref();
+const schoolList = ref([]); // 学校列表
 
 const form = ref({
   cardId: null,
@@ -144,6 +154,43 @@ function resetForm() {
   };
 }
 
+// 获取所有学校列表
+async function getAllSchools() {
+  try {
+    const response = await listUniversity({
+      pageNum: 1,
+      pageSize: 1000,
+    });
+    if (response.code === 200) {
+      // 处理API返回的数据结构
+      let schoolData = [];
+
+      // 检查是否有rows字段(直接在response中)
+      if (response.rows) {
+        schoolData = response.rows;
+      }
+      // 检查是否有data.rows字段
+      else if (response.data && response.data.rows) {
+        schoolData = response.data.rows;
+      }
+      // 检查是否有data数组
+      else if (response.data && Array.isArray(response.data)) {
+        schoolData = response.data;
+      }
+      // 检查是否有data对象
+      else if (response.data && response.data.id) {
+        schoolData = [response.data];
+      }
+
+      schoolList.value = schoolData;
+      console.log("所有学校数据:", schoolData);
+    }
+  } catch (error) {
+    console.error("获取所有学校列表失败:", error);
+    schoolList.value = [];
+  }
+}
+
 // 取消
 function handleCancel() {
   visible.value = false;
@@ -188,6 +235,7 @@ async function fetchCardData() {
 watch(visible, (newVal) => {
   if (newVal && props.cardId) {
     fetchCardData();
+    getAllSchools(); // 获取所有学校列表
   } else if (!newVal) {
     resetForm();
   }

+ 1 - 0
back-ui/src/views/dz/cards/components/PaymentDialog.vue

@@ -6,6 +6,7 @@
     append-to-body
     align-center
     :center="true"
+    :destroy-on-close="true"
   >
     <div class="payment-confirm-content">
       <div class="confirm-item">

+ 1 - 0
back-ui/src/views/dz/cards/components/RefundDialog.vue

@@ -6,6 +6,7 @@
     append-to-body
     align-center
     :center="true"
+    :destroy-on-close="true"
   >
     <div class="refund-confirm-content">
       <div class="confirm-item">

+ 1 - 0
back-ui/src/views/dz/cards/components/ReopenCardDialog.vue

@@ -6,6 +6,7 @@
     append-to-body
     align-center
     :center="true"
+    :destroy-on-close="true"
   >
     <div class="reopen-card-confirm-content">
       <div class="confirm-item">

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

@@ -38,7 +38,7 @@ const tableConfig = {
     },
     {
       label: "分配学校",
-      prop: "assignSchoolId",
+      prop: "assignSchoolName",
       align: "center",
       type: "dict",
       options: [], // 动态设置学校选项
@@ -54,7 +54,7 @@ const tableConfig = {
     },
     {
       label: "班级",
-      prop: "classId",
+      prop: "className",
       align: "center",
       type: "dict",
       options: [], // 动态设置班级选项
@@ -62,7 +62,7 @@ const tableConfig = {
     },
     {
       label: "校区",
-      prop: "campusId",
+      prop: "campusName",
       align: "center",
       type: "dict",
       options: [], // 动态设置校区选项
@@ -70,7 +70,7 @@ const tableConfig = {
     },
     {
       label: "校区班级",
-      prop: "classId",
+      prop: "className",
       align: "center",
       type: "dict",
       options: [], // 动态设置校区班级选项
@@ -152,14 +152,14 @@ const tableConfig = {
 
   // 操作按钮配置
   actions: [
-    {
-      key: "edit",
-      label: "修改",
-      type: "primary",
-      icon: "Edit",
-      link: true,
-      permission: ["dz:cards:edit"],
-    },
+    // {
+    //   key: "edit",
+    //   label: "修改",
+    //   type: "primary",
+    //   icon: "Edit",
+    //   link: true,
+    //   permission: ["dz:cards:edit"],
+    // },
     {
       key: "delete",
       label: "删除",
@@ -174,7 +174,7 @@ const tableConfig = {
   tableProps: {
     stripe: true,
     border: false,
-    showSelection: false, // 移除多选列
+    showSelection: true, // 启用多选列
     showIndex: false, // 使用自定义序号列
     showPagination: true,
     actionWidth: "auto",

+ 79 - 6
back-ui/src/views/dz/cards/index.vue

@@ -126,6 +126,19 @@
           申请开卡
         </el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          :disabled="multiple"
+          @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>
       <el-col :span="1.5">
         <el-button
           type="primary"
@@ -185,7 +198,6 @@
     <EditStudentDialog
       v-model="open"
       :card-id="currentCardId"
-      :school-list="schoolList"
       :class-list="classList"
       @success="handleDialogSuccess"
     />
@@ -291,6 +303,7 @@ const {
 
 const cardsList = ref([]);
 const schoolList = ref([]);
+const classList = ref([]); // 班级列表
 const open = ref(false);
 const cardGenerationOpen = ref(false); // 制卡对话框
 const assignCardOpen = ref(false); // 分配卡对话框
@@ -823,12 +836,60 @@ function handleAssignCard() {
 }
 
 /** 修改按钮操作 */
-function handleUpdate(row) {
+async function handleUpdate(row) {
   reset();
   const _cardId = row.cardId || ids.value;
   currentCardId.value = _cardId;
-  open.value = true;
-  getClassList(); // 获取班级列表
+
+  try {
+    // 获取学习卡详细信息
+    const response = await getCards(_cardId);
+    if (response.code === 200) {
+      const cardData = response.data;
+
+      // 将后端数据对应到表单字段
+      form.value = {
+        cardId: cardData.cardId,
+        cardNo: cardData.cardNo,
+        password: cardData.password,
+        type: cardData.type,
+        status: cardData.status,
+        distributeStatus: cardData.distributeStatus,
+        timeStatus: cardData.timeStatus,
+        payStatus: cardData.payStatus,
+        isSettlement: cardData.isSettlement,
+        deptId: cardData.deptId,
+        agentId: cardData.agentId,
+        leftAgentId: cardData.leftAgentId,
+        campusId: cardData.campusId,
+        assignSchoolId: cardData.assignSchoolId,
+        schoolId: cardData.schoolId,
+        classId: cardData.classId,
+        year: cardData.year,
+        endYear: cardData.endYear,
+        openId: cardData.openId,
+        nickName: cardData.nickName,
+        mobile: cardData.mobile,
+        chineseMathEnglish: cardData.chineseMathEnglish,
+        vocationalSkills: cardData.vocationalSkills,
+        studentCategory: cardData.studentCategory,
+        assignExamType: cardData.assignExamType,
+        areaIds: cardData.areaIds,
+        remark: cardData.remark,
+      };
+
+      // 获取班级列表
+      await getClassList();
+
+      // 打开编辑弹窗
+      open.value = true;
+    } else {
+      proxy.$modal.msgError("获取学习卡信息失败");
+    }
+  } catch (error) {
+    console.error("获取学习卡详细信息失败:", error);
+    proxy.$modal.msgError("获取学习卡信息失败");
+  }
 }
 
 /** 提交按钮 */
@@ -855,10 +916,22 @@ function submitForm() {
 /** 删除按钮操作 */
 function handleDelete(row) {
   const _cardIds = row.cardId || ids.value;
+  const cardIdsArray = Array.isArray(_cardIds) ? _cardIds : [_cardIds];
+
+  if (cardIdsArray.length === 0) {
+    proxy.$modal.msgWarning("请选择要删除的数据");
+    return;
+  }
+
+  const message =
+    cardIdsArray.length === 1
+      ? `是否确认删除学习卡编号为"${cardIdsArray[0]}"的数据项?`
+      : `是否确认删除选中的${cardIdsArray.length}条学习卡数据?`;
+
   proxy.$modal
-    .confirm('是否确认删除学习卡编号为"' + _cardIds + '"的数据项?')
+    .confirm(message)
     .then(function () {
-      return delCards(_cardIds);
+      return delCards(cardIdsArray);
     })
     .then(() => {
       getList();