Browse Source

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

abpcoder 1 month ago
parent
commit
ac640eb77e
26 changed files with 652 additions and 170 deletions
  1. 11 2
      back-ui/src/api/dz/cards.js
  2. 18 4
      back-ui/src/components/Table/index.vue
  3. 1 1
      back-ui/src/views/dz/cards/components/ApplyCardDialog.vue
  4. 82 19
      back-ui/src/views/dz/cards/components/AssignCardDialog.vue
  5. 30 4
      back-ui/src/views/dz/cards/components/AssociateCampusDialog.vue
  6. 29 4
      back-ui/src/views/dz/cards/components/CloseCardDialog.vue
  7. 29 4
      back-ui/src/views/dz/cards/components/PaymentDialog.vue
  8. 96 7
      back-ui/src/views/dz/cards/components/RefundDialog.vue
  9. 29 4
      back-ui/src/views/dz/cards/components/ReopenCardDialog.vue
  10. 1 8
      back-ui/src/views/dz/cards/config/form.js
  11. 5 9
      back-ui/src/views/dz/cards/config/table.js
  12. 72 10
      back-ui/src/views/dz/cards/index.vue
  13. 1 19
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzCardsController.java
  14. 41 14
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzCardsOpenController.java
  15. 7 0
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzSchoolController.java
  16. 0 3
      ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontExamController.java
  17. 15 8
      ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontPaperController.java
  18. 20 2
      ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontTeacherController.java
  19. 35 2
      ie-system/src/main/java/com/ruoyi/dz/domain/DzCardsOpen.java
  20. 1 0
      ie-system/src/main/java/com/ruoyi/dz/mapper/DzCardsMapper.java
  21. 7 8
      ie-system/src/main/java/com/ruoyi/dz/service/IDzCardsService.java
  22. 35 2
      ie-system/src/main/java/com/ruoyi/dz/service/impl/DzCardsOpenServiceImpl.java
  23. 47 34
      ie-system/src/main/java/com/ruoyi/dz/service/impl/DzCardsServiceImpl.java
  24. 1 1
      ie-system/src/main/java/com/ruoyi/enums/RequestStatus.java
  25. 35 0
      ie-system/src/main/resources/mapper/dz/DzCardsMapper.xml
  26. 4 1
      ie-system/src/main/resources/mapper/dz/DzCardsOpenMapper.xml

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

@@ -151,10 +151,19 @@ export function refundCard(cardIds) {
   });
   });
 }
 }
 
 
+// 获取学校列表
+export function getSchoolList(query) {
+  return request({
+    url: "/dz/school/getSchoolList",
+    method: "get",
+    params: query,
+  });
+}
+
 // 获取校区列表
 // 获取校区列表
 export function getCampusList(query) {
 export function getCampusList(query) {
   return request({
   return request({
-    url: "/dz/school/getSchoolList",
+    url: "/dz/school/getCampusList",
     method: "get",
     method: "get",
     params: query,
     params: query,
   });
   });
@@ -176,7 +185,7 @@ export function associateCampus(beginCardNo, endCardNo, campusId) {
 // 申请开卡
 // 申请开卡
 export function requestOpenCard(schoolId, beginCardNo, endCardNo) {
 export function requestOpenCard(schoolId, beginCardNo, endCardNo) {
   return request({
   return request({
-    url: "/dz/cards/requestOpenCard",
+    url: "/dz/cards/openCard",
     method: "post",
     method: "post",
     params: {
     params: {
       schoolId,
       schoolId,

+ 18 - 4
back-ui/src/components/Table/index.vue

@@ -108,7 +108,12 @@
 
 
             <!-- 自定义slot -->
             <!-- 自定义slot -->
             <template v-else-if="column.type === 'slot'">
             <template v-else-if="column.type === 'slot'">
-              <slot :name="column.slotName" :row="scope.row" :column="column" />
+              <slot
+                :name="column.slotName"
+                :row="scope.row"
+                :column="column"
+                :$index="scope.$index"
+              />
             </template>
             </template>
 
 
             <!-- 普通文本 -->
             <!-- 普通文本 -->
@@ -159,9 +164,9 @@
       v-if="showPagination"
       v-if="showPagination"
       v-show="total > 0"
       v-show="total > 0"
       :total="total"
       :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
+      :page="queryParams.pageNum"
+      :limit="queryParams.pageSize"
+      @pagination="handlePagination"
     />
     />
   </div>
   </div>
 </template>
 </template>
@@ -344,6 +349,15 @@ const getStatusText = (row, column) => {
 const getList = () => {
 const getList = () => {
   emit("getList");
   emit("getList");
 };
 };
+
+// 处理分页事件
+const handlePagination = (pagination) => {
+  // 更新queryParams中的分页参数
+  props.queryParams.pageNum = pagination.page;
+  props.queryParams.pageSize = pagination.limit;
+  // 触发getList事件
+  emit("getList");
+};
 </script>
 </script>
 
 
 <style scoped>
 <style scoped>

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

@@ -1,6 +1,6 @@
 <template>
 <template>
   <el-dialog
   <el-dialog
-    title="申请开卡"
+    title="直接开卡"
     v-model="visible"
     v-model="visible"
     width="500px"
     width="500px"
     append-to-body
     append-to-body

+ 82 - 19
back-ui/src/views/dz/cards/components/AssignCardDialog.vue

@@ -134,15 +134,23 @@
 
 
 <script setup>
 <script setup>
 import { ref, computed, watch } from "vue";
 import { ref, computed, watch } from "vue";
-import { assignCard, getExamTypes, getAgentList } from "@/api/dz/cards";
+import {
+  assignCard,
+  getExamTypes,
+  getAgentList,
+  getSchoolList,
+} from "@/api/dz/cards";
 import { getPaperProvinces } from "@/api/dz/papers";
 import { getPaperProvinces } from "@/api/dz/papers";
-import { listUniversity } from "@/api/dz/school";
 
 
 const props = defineProps({
 const props = defineProps({
   modelValue: {
   modelValue: {
     type: Boolean,
     type: Boolean,
     default: false,
     default: false,
   },
   },
+  selectedCards: {
+    type: Array,
+    default: () => [],
+  },
   schoolList: {
   schoolList: {
     type: Array,
     type: Array,
     default: () => [],
     default: () => [],
@@ -252,32 +260,41 @@ async function getSchoolListByProvince(province) {
       return;
       return;
     }
     }
 
 
-    const response = await listUniversity({
+    const response = await getSchoolList({
       location: province,
       location: province,
       pageNum: 1,
       pageNum: 1,
-      pageSize: 1000,
+      pageSize: 9999,
     });
     });
     if (response.code === 200) {
     if (response.code === 200) {
       // 处理API返回的数据结构
       // 处理API返回的数据结构
       let schoolData = [];
       let schoolData = [];
 
 
-      // 检查是否有rows字段(直接在response中)
-      if (response.rows) {
-        schoolData = response.rows;
+      // 检查是否有data字段
+      if (response.data) {
+        schoolData = Array.isArray(response.data) ? response.data : [];
       }
       }
-      // 检查是否有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;
+      // 检查是否有rows字段
+      else if (response.rows) {
+        schoolData = response.rows;
       }
       }
-      // 检查是否有data对象
-      else if (response.data && response.data.id) {
-        schoolData = [response.data];
+      // 检查是否有list字段
+      else if (response.list) {
+        schoolData = response.list;
       }
       }
 
 
+      // 确保数据格式符合配置要求
+      schoolData = schoolData.map((item) => {
+        // 如果API返回的是 {id, name, ...} 格式,直接使用
+        if (item.id && item.name) {
+          return item;
+        }
+        // 如果是其他格式,需要转换
+        return {
+          id: item.id || item.value || item.schoolId,
+          name: item.name || item.label || item.schoolName || item.title,
+        };
+      });
+
       schoolList.value = schoolData;
       schoolList.value = schoolData;
       console.log("学校数据:", schoolData); // 添加调试日志
       console.log("学校数据:", schoolData); // 添加调试日志
     }
     }
@@ -287,6 +304,36 @@ async function getSchoolListByProvince(province) {
   }
   }
 }
 }
 
 
+// 自动填充卡号段
+function autoFillCardRange() {
+  console.log("autoFillCardRange called, selectedCards:", props.selectedCards);
+  if (props.selectedCards && props.selectedCards.length > 0) {
+    const cardNos = props.selectedCards
+      .map((card) => card.cardNo || card.id)
+      .filter((cardNo) => cardNo && cardNo !== "未知")
+      .sort();
+
+    console.log("cardNos:", cardNos);
+    if (cardNos.length > 0) {
+      const minCardNo = cardNos[0];
+      const maxCardNo = cardNos[cardNos.length - 1];
+
+      // 开始卡号段是最小卡号段的整十数部分
+      const minCardNoNum = parseInt(minCardNo);
+      const beginCardNo = Math.floor(minCardNoNum / 10) * 10;
+
+      console.log(
+        "Setting card range:",
+        beginCardNo.toString(),
+        "to",
+        maxCardNo
+      );
+      form.value.beginCardNo = beginCardNo.toString();
+      form.value.endCardNo = maxCardNo;
+    }
+  }
+}
+
 // 取消
 // 取消
 function handleCancel() {
 function handleCancel() {
   visible.value = false;
   visible.value = false;
@@ -308,13 +355,19 @@ async function handleSubmit() {
         }
         }
 
 
         // 调用分配卡API,传递所有参数
         // 调用分配卡API,传递所有参数
+        // 将 "all" 转换为 null,因为后端 ExamType 枚举不接受 "all" 值
+        const examType =
+          form.value.studentCategory === "all"
+            ? null
+            : form.value.studentCategory;
+
         await assignCard(
         await assignCard(
           form.value.cardType,
           form.value.cardType,
           form.value.agentId,
           form.value.agentId,
           begin,
           begin,
           end,
           end,
           form.value.province,
           form.value.province,
-          form.value.studentCategory,
+          examType,
           form.value.school
           form.value.school
         );
         );
 
 
@@ -346,13 +399,19 @@ async function handleReassign() {
         }
         }
 
 
         // 再次调用分配卡API
         // 再次调用分配卡API
+        // 将 "all" 转换为 null,因为后端 ExamType 枚举不接受 "all" 值
+        const examType =
+          form.value.studentCategory === "all"
+            ? null
+            : form.value.studentCategory;
+
         await assignCard(
         await assignCard(
           form.value.cardType,
           form.value.cardType,
           form.value.agentId,
           form.value.agentId,
           begin,
           begin,
           end,
           end,
           form.value.province,
           form.value.province,
-          form.value.studentCategory,
+          examType,
           form.value.school
           form.value.school
         );
         );
 
 
@@ -374,15 +433,19 @@ async function handleReassign() {
 
 
 // 监听弹窗关闭,重置表单
 // 监听弹窗关闭,重置表单
 watch(visible, (newVal) => {
 watch(visible, (newVal) => {
+  console.log("AssignCardDialog visible changed to:", newVal);
   if (!newVal) {
   if (!newVal) {
     resetForm();
     resetForm();
   } else {
   } else {
+    console.log("AssignCardDialog opened, selectedCards:", props.selectedCards);
     // 弹窗打开时获取省份列表
     // 弹窗打开时获取省份列表
     getProvinceList();
     getProvinceList();
     // 获取默认考生类型列表(可以根据需要调整)
     // 获取默认考生类型列表(可以根据需要调整)
     getExamTypeList("湖南省"); // 默认获取湖南省的考生类型
     getExamTypeList("湖南省"); // 默认获取湖南省的考生类型
     // 获取代理商列表
     // 获取代理商列表
     getAgentListData();
     getAgentListData();
+    // 自动填充卡号段
+    autoFillCardRange();
   }
   }
 });
 });
 
 

+ 30 - 4
back-ui/src/views/dz/cards/components/AssociateCampusDialog.vue

@@ -43,7 +43,6 @@
             placeholder="请选择校区"
             placeholder="请选择校区"
             style="width: 100%"
             style="width: 100%"
           >
           >
-            <el-option label="全部" value="all"></el-option>
             <el-option
             <el-option
               v-for="campus in campusList"
               v-for="campus in campusList"
               :key="campus.id"
               :key="campus.id"
@@ -114,12 +113,39 @@ const rules = {
 // 获取校区列表
 // 获取校区列表
 async function getCampusListData() {
 async function getCampusListData() {
   try {
   try {
-    const response = await getCampusList({ pageNum: 1, pageSize: 1000 });
+    const response = await getCampusList({
+      pageNum: 1,
+      pageSize: 9999, // 获取所有校区
+    });
     if (response.code === 200) {
     if (response.code === 200) {
-      campusList.value = response.data || [];
+      // 处理API返回的数据结构
+      let campusData = [];
+      if (response.data) {
+        campusData = Array.isArray(response.data) ? response.data : [];
+      } else if (response.rows) {
+        campusData = response.rows;
+      } else if (response.list) {
+        campusData = response.list;
+      }
+
+      // 确保数据格式符合配置要求
+      campusData = campusData.map((item) => {
+        // 如果API返回的是 {id, name, ...} 格式,直接使用
+        if (item.id && item.name) {
+          return item;
+        }
+        // 如果是其他格式,需要转换
+        return {
+          id: item.id || item.value || item.campusId,
+          name: item.name || item.label || item.campusName || item.title,
+        };
+      });
+
+      campusList.value = campusData;
     }
     }
   } catch (error) {
   } catch (error) {
     console.error("获取校区列表失败:", error);
     console.error("获取校区列表失败:", error);
+    campusList.value = [];
   }
   }
 }
 }
 
 
@@ -173,7 +199,7 @@ async function handleConfirm() {
         if (!begin || !end) {
         if (!begin || !end) {
           throw new Error("请填写完整的卡号段");
           throw new Error("请填写完整的卡号段");
         }
         }
-        if (!campusId || campusId === "all") {
+        if (!campusId) {
           throw new Error("请选择校区");
           throw new Error("请选择校区");
         }
         }
 
 

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

@@ -33,7 +33,7 @@
 <script setup>
 <script setup>
 import { ref, computed } from "vue";
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
 import { Warning } from "@element-plus/icons-vue";
-import { closeCard } from "@/api/dz/cards";
+import { closeCard, listCards } from "@/api/dz/cards";
 
 
 const props = defineProps({
 const props = defineProps({
   modelValue: {
   modelValue: {
@@ -43,10 +43,12 @@ const props = defineProps({
   cardNo: {
   cardNo: {
     type: [String, Number, Array],
     type: [String, Number, Array],
     default: "",
     default: "",
+    // 卡号(字符串),关卡时会自动转换为 cardId
   },
   },
   cardIds: {
   cardIds: {
     type: Array,
     type: Array,
     default: () => [],
     default: () => [],
+    // 卡ID(数字数组),直接用于关卡API
   },
   },
 });
 });
 
 
@@ -97,13 +99,22 @@ async function handleConfirm() {
 
 
     // 处理 cardNo 为数组的情况
     // 处理 cardNo 为数组的情况
     if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
     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 为单个值的情况
     // 处理 cardNo 为单个值的情况
     else if (props.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) {
     else if (props.cardIds && props.cardIds.length > 0) {
       cardIdsToClose = props.cardIds;
       cardIdsToClose = props.cardIds;
     }
     }
@@ -124,6 +135,20 @@ async function handleConfirm() {
     loading.value = false;
     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>
 </script>
 
 
 <style scoped>
 <style scoped>

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

@@ -33,7 +33,7 @@
 <script setup>
 <script setup>
 import { ref, computed } from "vue";
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
 import { Warning } from "@element-plus/icons-vue";
-import { payCard } from "@/api/dz/cards";
+import { payCard, listCards } from "@/api/dz/cards";
 
 
 const props = defineProps({
 const props = defineProps({
   modelValue: {
   modelValue: {
@@ -43,10 +43,12 @@ const props = defineProps({
   cardNo: {
   cardNo: {
     type: [String, Number, Array],
     type: [String, Number, Array],
     default: "",
     default: "",
+    // 卡号(字符串),缴费时会自动转换为 cardId
   },
   },
   cardIds: {
   cardIds: {
     type: Array,
     type: Array,
     default: () => [],
     default: () => [],
+    // 卡ID(数字数组),直接用于缴费API
   },
   },
 });
 });
 
 
@@ -97,13 +99,22 @@ async function handleConfirm() {
 
 
     // 处理 cardNo 为数组的情况
     // 处理 cardNo 为数组的情况
     if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
     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 为单个值的情况
     // 处理 cardNo 为单个值的情况
     else if (props.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) {
     else if (props.cardIds && props.cardIds.length > 0) {
       cardIdsToPay = props.cardIds;
       cardIdsToPay = props.cardIds;
     }
     }
@@ -124,6 +135,20 @@ async function handleConfirm() {
     loading.value = false;
     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>
 </script>
 
 
 <style scoped>
 <style scoped>

+ 96 - 7
back-ui/src/views/dz/cards/components/RefundDialog.vue

@@ -14,7 +14,7 @@
           <Warning />
           <Warning />
         </el-icon>
         </el-icon>
         <span class="confirm-text">
         <span class="confirm-text">
-          是否确认退费vip卡编号为{{ cardNo }}的数据项?
+          {{ getConfirmMessage() }}
         </span>
         </span>
       </div>
       </div>
     </div>
     </div>
@@ -22,7 +22,9 @@
     <template #footer>
     <template #footer>
       <div class="dialog-footer">
       <div class="dialog-footer">
         <el-button @click="handleCancel">取消</el-button>
         <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>
       </div>
     </template>
     </template>
   </el-dialog>
   </el-dialog>
@@ -31,6 +33,7 @@
 <script setup>
 <script setup>
 import { ref, computed } from "vue";
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
 import { Warning } from "@element-plus/icons-vue";
+import { refundCard, listCards } from "@/api/dz/cards";
 
 
 const props = defineProps({
 const props = defineProps({
   modelValue: {
   modelValue: {
@@ -38,27 +41,113 @@ const props = defineProps({
     default: false,
     default: false,
   },
   },
   cardNo: {
   cardNo: {
-    type: [String, Number],
+    type: [String, Number, Array],
     default: "",
     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({
 const visible = computed({
   get: () => props.modelValue,
   get: () => props.modelValue,
   set: (value) => emit("update:modelValue", value),
   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() {
 function handleCancel() {
   visible.value = false;
   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>
 </script>
 
 

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

@@ -33,7 +33,7 @@
 <script setup>
 <script setup>
 import { ref, computed } from "vue";
 import { ref, computed } from "vue";
 import { Warning } from "@element-plus/icons-vue";
 import { Warning } from "@element-plus/icons-vue";
-import { reopenCard } from "@/api/dz/cards";
+import { reopenCard, listCards } from "@/api/dz/cards";
 
 
 const props = defineProps({
 const props = defineProps({
   modelValue: {
   modelValue: {
@@ -43,10 +43,12 @@ const props = defineProps({
   cardNo: {
   cardNo: {
     type: [String, Number, Array],
     type: [String, Number, Array],
     default: "",
     default: "",
+    // 卡号(字符串),重开时会自动转换为 cardId
   },
   },
   cardIds: {
   cardIds: {
     type: Array,
     type: Array,
     default: () => [],
     default: () => [],
+    // 卡ID(数字数组),直接用于重开API
   },
   },
 });
 });
 
 
@@ -97,13 +99,22 @@ async function handleConfirm() {
 
 
     // 处理 cardNo 为数组的情况
     // 处理 cardNo 为数组的情况
     if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
     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 为单个值的情况
     // 处理 cardNo 为单个值的情况
     else if (props.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) {
     else if (props.cardIds && props.cardIds.length > 0) {
       cardIdsToReopen = props.cardIds;
       cardIdsToReopen = props.cardIds;
     }
     }
@@ -124,6 +135,20 @@ async function handleConfirm() {
     loading.value = false;
     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>
 </script>
 
 
 <style scoped>
 <style scoped>

+ 1 - 8
back-ui/src/views/dz/cards/config/form.js

@@ -57,13 +57,6 @@ const info = [
     type: "text",
     type: "text",
     search: true,
     search: true,
   },
   },
-  {
-    label: "初始密码",
-    name: "password",
-    value: "",
-    type: "text",
-    search: true,
-  },
   {
   {
     label: "卡号段",
     label: "卡号段",
     name: "cardNoRange",
     name: "cardNoRange",
@@ -129,7 +122,7 @@ const info = [
     search: true,
     search: true,
   },
   },
   {
   {
-    label: "结束状态",
+    label: "结算状态image.png",
     name: "isSettlement",
     name: "isSettlement",
     value: "",
     value: "",
     type: "select",
     type: "select",

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

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

+ 72 - 10
back-ui/src/views/dz/cards/index.vue

@@ -103,7 +103,6 @@
         <el-button
         <el-button
           type="primary"
           type="primary"
           plain
           plain
-
           @click="handleAssociateCampus"
           @click="handleAssociateCampus"
           v-hasPermi="['dz:cards:add']"
           v-hasPermi="['dz:cards:add']"
           style="border-color: #1890ff; color: #1890ff; font-weight: 500"
           style="border-color: #1890ff; color: #1890ff; font-weight: 500"
@@ -121,7 +120,7 @@
           style="border-color: #52c41a; color: #52c41a; font-weight: 500"
           style="border-color: #52c41a; color: #52c41a; font-weight: 500"
         >
         >
           <svg-icon icon-class="edit" class="mr-1" style="font-size: 16px" />
           <svg-icon icon-class="edit" class="mr-1" style="font-size: 16px" />
-          申请开卡
+          直接开卡
         </el-button>
         </el-button>
       </el-col>
       </el-col>
       <el-col :span="1.5">
       <el-col :span="1.5">
@@ -167,6 +166,11 @@
       @selection-change="handleSelectionChange"
       @selection-change="handleSelectionChange"
       @getList="getList"
       @getList="getList"
     >
     >
+      <!-- 序号插槽 -->
+      <template #index="{ row, $index }">
+        {{ getRowIndex($index) }}
+      </template>
+
       <!-- 姓名-手机插槽 -->
       <!-- 姓名-手机插槽 -->
       <template #studentInfo="{ row }">
       <template #studentInfo="{ row }">
         <div class="student-info">
         <div class="student-info">
@@ -187,6 +191,7 @@
 
 
     <AssignCardDialog
     <AssignCardDialog
       v-model="assignCardOpen"
       v-model="assignCardOpen"
+      :selected-cards="selectedRows"
       :school-list="schoolList"
       :school-list="schoolList"
       :card-type-options="card_type"
       :card-type-options="card_type"
       @success="handleDialogSuccess"
       @success="handleDialogSuccess"
@@ -281,7 +286,7 @@ import ApplyCardDialog from "./components/ApplyCardDialog.vue";
 import formInfo from "./config/form.js";
 import formInfo from "./config/form.js";
 import tableConfig from "./config/table.js";
 import tableConfig from "./config/table.js";
 import { listUniversity } from "@/api/dz/school";
 import { listUniversity } from "@/api/dz/school";
-import { assignCard, issueCard } from "@/api/dz/cards";
+import { assignCard, issueCard, getCampusList } from "@/api/dz/cards";
 import { listDept } from "@/api/system/dept";
 import { listDept } from "@/api/system/dept";
 import { listAgent } from "@/api/dz/agent";
 import { listAgent } from "@/api/dz/agent";
 
 
@@ -304,6 +309,7 @@ const {
 
 
 const cardsList = ref([]);
 const cardsList = ref([]);
 const schoolList = ref([]);
 const schoolList = ref([]);
+const campusList = ref([]); // 校区列表
 const classList = ref([]); // 班级列表
 const classList = ref([]); // 班级列表
 const open = ref(false);
 const open = ref(false);
 const cardGenerationOpen = ref(false); // 制卡对话框
 const cardGenerationOpen = ref(false); // 制卡对话框
@@ -313,7 +319,7 @@ const closeCardOpen = ref(false); // 关卡对话框
 const reopenCardOpen = ref(false); // 重开对话框
 const reopenCardOpen = ref(false); // 重开对话框
 const refundOpen = ref(false); // 退费对话框
 const refundOpen = ref(false); // 退费对话框
 const associateCampusOpen = ref(false); // 关联校区对话框
 const associateCampusOpen = ref(false); // 关联校区对话框
-const applyCardOpen = ref(false); // 申请开卡对话框
+const applyCardOpen = ref(false); // 直接开卡对话框
 const currentCardNo = ref([]); // 当前缴费的卡号(支持数组)
 const currentCardNo = ref([]); // 当前缴费的卡号(支持数组)
 const currentCloseCardNo = ref([]); // 当前关卡的卡号(支持数组)
 const currentCloseCardNo = ref([]); // 当前关卡的卡号(支持数组)
 const currentReopenCardNo = ref([]); // 当前重开的卡号(支持数组)
 const currentReopenCardNo = ref([]); // 当前重开的卡号(支持数组)
@@ -362,6 +368,12 @@ const searchConfig = computed(() => {
       case "assignSchoolId":
       case "assignSchoolId":
         item.option = schoolList.value || [];
         item.option = schoolList.value || [];
         break;
         break;
+      case "registerSchoolId":
+        item.option = schoolList.value || [];
+        break;
+      case "campusId":
+        item.option = campusList.value || [];
+        break;
     }
     }
   });
   });
 
 
@@ -497,6 +509,13 @@ watch(
   { immediate: true, deep: true }
   { immediate: true, deep: true }
 );
 );
 
 
+/** 获取行序号 */
+function getRowIndex(index) {
+  const pageNum = queryParams.value?.pageNum || 1;
+  const pageSize = queryParams.value?.pageSize || 10;
+  return (pageNum - 1) * pageSize + index + 1;
+}
+
 /** 查询学习卡列表 */
 /** 查询学习卡列表 */
 function getList() {
 function getList() {
   loading.value = true;
   loading.value = true;
@@ -522,8 +541,8 @@ function getSchoolList() {
   // 传递pageNum和pageSize参数
   // 传递pageNum和pageSize参数
   const requestParams = {
   const requestParams = {
     location,
     location,
-    pageNum: queryParams.value.pageNum || 1,
-    pageSize: queryParams.value.pageSize || 10,
+    pageNum: 1,
+    pageSize: 9999, // 获取所有学校选项
   };
   };
 
 
   listUniversity(requestParams)
   listUniversity(requestParams)
@@ -563,6 +582,46 @@ function getSchoolList() {
     });
     });
 }
 }
 
 
+/** 获取校区列表 */
+function getCampusListData() {
+  getCampusList({
+    pageNum: 1,
+    pageSize: 9999, // 获取所有校区
+  })
+    .then((response) => {
+      if (response.code === 200) {
+        // 处理API返回的数据结构
+        let campusData = [];
+        if (response.data) {
+          campusData = Array.isArray(response.data) ? response.data : [];
+        } else if (response.rows) {
+          campusData = response.rows;
+        } else if (response.list) {
+          campusData = response.list;
+        }
+
+        // 确保数据格式符合配置要求
+        campusData = campusData.map((item) => {
+          // 如果API返回的是 {id, name, ...} 格式,直接使用
+          if (item.id && item.name) {
+            return item;
+          }
+          // 如果是其他格式,需要转换
+          return {
+            id: item.id || item.value || item.campusId,
+            name: item.name || item.label || item.campusName || item.title,
+          };
+        });
+
+        campusList.value = campusData;
+      }
+    })
+    .catch((error) => {
+      console.error("获取校区列表失败:", error);
+      campusList.value = [];
+    });
+}
+
 // 取消按钮
 // 取消按钮
 // 处理弹窗成功事件
 // 处理弹窗成功事件
 function handleDialogSuccess(message) {
 function handleDialogSuccess(message) {
@@ -689,6 +748,7 @@ function handleSearchFormUpdate(newData) {
 
 
 // 多选框选中数据
 // 多选框选中数据
 function handleSelectionChange(selection) {
 function handleSelectionChange(selection) {
+  console.log("Selection changed:", selection);
   selectedRows.value = selection;
   selectedRows.value = selection;
   ids.value = selection.map((item) => item.cardId);
   ids.value = selection.map((item) => item.cardId);
   single.value = selection.length != 1;
   single.value = selection.length != 1;
@@ -837,7 +897,7 @@ async function getAgentListData() {
   }
   }
 }
 }
 
 
-/** 申请开卡按钮操作 */
+/** 直接开卡按钮操作 */
 function handleApplyCard() {
 function handleApplyCard() {
   if (selectedRows.value.length === 0) {
   if (selectedRows.value.length === 0) {
     // proxy.$modal.msgWarning("请选择要申请开卡的卡片");
     // proxy.$modal.msgWarning("请选择要申请开卡的卡片");
@@ -846,22 +906,23 @@ function handleApplyCard() {
   applyCardOpen.value = true;
   applyCardOpen.value = true;
 }
 }
 
 
-// 处理申请开卡成功
+// 处理直接开卡成功
 function handleApplyCardSuccess(message) {
 function handleApplyCardSuccess(message) {
   proxy.$modal.msgSuccess(message);
   proxy.$modal.msgSuccess(message);
   getList();
   getList();
 }
 }
 
 
-// 处理申请开卡确认
+// 处理直接开卡确认
 function handleApplyCardConfirm(data) {
 function handleApplyCardConfirm(data) {
   proxy.$modal.msgSuccess(
   proxy.$modal.msgSuccess(
-    `申请开卡成功!卡号段:${data.beginCardNo}-${data.endCardNo}`
+    `直接开卡成功!卡号段:${data.beginCardNo}-${data.endCardNo}`
   );
   );
   getList(); // 刷新列表
   getList(); // 刷新列表
 }
 }
 
 
 /** 分配卡按钮操作 */
 /** 分配卡按钮操作 */
 function handleAssignCard() {
 function handleAssignCard() {
+  console.log("分配卡按钮点击,当前选中的行:", selectedRows.value);
   assignCardOpen.value = true;
   assignCardOpen.value = true;
   getInstitutionList(); // 获取机构列表
   getInstitutionList(); // 获取机构列表
   getAgentList(); // 获取代理商列表
   getAgentList(); // 获取代理商列表
@@ -984,6 +1045,7 @@ function handleExport() {
 }
 }
 
 
 getList();
 getList();
+getCampusListData(); // 获取校区列表
 
 
 // 监听地址选择变化,自动获取学校列表
 // 监听地址选择变化,自动获取学校列表
 watch(
 watch(

+ 1 - 19
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzCardsController.java

@@ -165,28 +165,10 @@ public class DzCardsController extends BaseController
         return AjaxResult.success(dzCardsService.changeCampus(campusId, begin, end));
         return AjaxResult.success(dzCardsService.changeCampus(campusId, begin, end));
     }
     }
 
 
-    @Log(title = "申请开卡", businessType = BusinessType.INSERT)
-    @PostMapping("/requestOpenCard")
-    @ApiOperation("申请开卡")
-    public AjaxResult requestOpenCard(@ApiParam("学校") Long schoolId, @ApiParam("开始号") String begin, @ApiParam("结束号") String end)
-    {
-        Long agentId = SecurityUtils.getLoginUser().getUser().getUserTypeId();
-        return AjaxResult.success(dzCardsService.requestOpenCard(schoolId, agentId, begin, end));
-    }
-
-    @Log(title = "确认开卡", businessType = BusinessType.INSERT)
-    @PostMapping("/confirmOpenCard")
-    @ApiOperation("确认开卡")
-    public AjaxResult confirmOpenCard(@ApiParam("开卡申请ID") Long openId)
-    {
-        dzCardsService.confirmOpenCard(openId, SecurityUtils.getLoginUser().getUser().getUserId());
-        return AjaxResult.success();
-    }
-
     @Log(title = "修改卡", businessType = BusinessType.UPDATE)
     @Log(title = "修改卡", businessType = BusinessType.UPDATE)
     @PostMapping("/changeCard")
     @PostMapping("/changeCard")
     @ApiOperation("修改卡 重卡/关卡/支付")
     @ApiOperation("修改卡 重卡/关卡/支付")
-    public AjaxResult changeCard(@ApiParam("操作") CardAction action, @ApiParam("卡ID") Long[] cardIds)
+    public AjaxResult changeCard(@ApiParam("操作") @RequestParam CardAction action, @ApiParam("卡ID") @RequestParam Long[] cardIds)
     {
     {
         dzCardsService.changeCard(action, cardIds);
         dzCardsService.changeCard(action, cardIds);
         return AjaxResult.success();
         return AjaxResult.success();

+ 41 - 14
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzCardsOpenController.java

@@ -2,11 +2,19 @@ package com.ruoyi.web.controller.dz;
 
 
 import java.util.List;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.ValidationException;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.dz.service.IDzCardsService;
+import com.ruoyi.enums.RequestStatus;
+import com.ruoyi.enums.UserTypeEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -29,18 +37,26 @@ import com.ruoyi.common.core.page.TableDataInfo;
  */
  */
 @RestController
 @RestController
 @RequestMapping("/dz/open")
 @RequestMapping("/dz/open")
+@Api(tags = "后台-学习卡管理-开卡申请")
 public class DzCardsOpenController extends BaseController
 public class DzCardsOpenController extends BaseController
 {
 {
     @Autowired
     @Autowired
     private IDzCardsOpenService dzCardsOpenService;
     private IDzCardsOpenService dzCardsOpenService;
+    @Autowired
+    private IDzCardsService dzCardsService;
 
 
     /**
     /**
      * 查询开卡申请列表
      * 查询开卡申请列表
      */
      */
     @PreAuthorize("@ss.hasPermi('dz:open:list')")
     @PreAuthorize("@ss.hasPermi('dz:open:list')")
     @GetMapping("/list")
     @GetMapping("/list")
+    @ApiOperation("开卡申请列表")
     public TableDataInfo list(DzCardsOpen dzCardsOpen)
     public TableDataInfo list(DzCardsOpen dzCardsOpen)
     {
     {
+        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
+        if(UserTypeEnum.Agent.equals(sysUser.getUserType())) {
+            dzCardsOpen.setAgentId(sysUser.getUserTypeId());
+        }
         startPage();
         startPage();
         List<DzCardsOpen> list = dzCardsOpenService.selectDzCardsOpenList(dzCardsOpen);
         List<DzCardsOpen> list = dzCardsOpenService.selectDzCardsOpenList(dzCardsOpen);
         return getDataTable(list);
         return getDataTable(list);
@@ -62,12 +78,12 @@ public class DzCardsOpenController extends BaseController
     /**
     /**
      * 获取开卡申请详细信息
      * 获取开卡申请详细信息
      */
      */
-    @PreAuthorize("@ss.hasPermi('dz:open:query')")
-    @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
-        return success(dzCardsOpenService.selectDzCardsOpenById(id));
-    }
+//    @PreAuthorize("@ss.hasPermi('dz:open:query')")
+//    @GetMapping(value = "/{id}")
+//    public AjaxResult getInfo(@PathVariable("id") Long id)
+//    {
+//        return success(dzCardsOpenService.selectDzCardsOpenById(id));
+//    }
 
 
     /**
     /**
      * 新增开卡申请
      * 新增开卡申请
@@ -75,9 +91,10 @@ public class DzCardsOpenController extends BaseController
     @PreAuthorize("@ss.hasPermi('dz:open:add')")
     @PreAuthorize("@ss.hasPermi('dz:open:add')")
     @Log(title = "开卡申请", businessType = BusinessType.INSERT)
     @Log(title = "开卡申请", businessType = BusinessType.INSERT)
     @PostMapping
     @PostMapping
+    @ApiOperation("申请开卡")
     public AjaxResult add(@RequestBody DzCardsOpen dzCardsOpen)
     public AjaxResult add(@RequestBody DzCardsOpen dzCardsOpen)
     {
     {
-        return toAjax(dzCardsOpenService.insertDzCardsOpen(dzCardsOpen));
+        return toAjax(dzCardsService.requestOpenCard(dzCardsOpen));
     }
     }
 
 
     /**
     /**
@@ -85,10 +102,12 @@ public class DzCardsOpenController extends BaseController
      */
      */
     @PreAuthorize("@ss.hasPermi('dz:open:edit')")
     @PreAuthorize("@ss.hasPermi('dz:open:edit')")
     @Log(title = "开卡申请", businessType = BusinessType.UPDATE)
     @Log(title = "开卡申请", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody DzCardsOpen dzCardsOpen)
+    @PostMapping("/audit")
+    @ApiOperation("审核开卡申请")
+    public AjaxResult audit(@RequestBody DzCardsOpen dzCardsOpen)
     {
     {
-        return toAjax(dzCardsOpenService.updateDzCardsOpen(dzCardsOpen));
+        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
+        return toAjax(dzCardsService.confirmOpenCard(dzCardsOpen, sysUser));
     }
     }
 
 
     /**
     /**
@@ -96,9 +115,17 @@ public class DzCardsOpenController extends BaseController
      */
      */
     @PreAuthorize("@ss.hasPermi('dz:open:remove')")
     @PreAuthorize("@ss.hasPermi('dz:open:remove')")
     @Log(title = "开卡申请", businessType = BusinessType.DELETE)
     @Log(title = "开卡申请", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
+	@DeleteMapping("/{id}")
+    public AjaxResult remove(@PathVariable Long id)
     {
     {
-        return toAjax(dzCardsOpenService.deleteDzCardsOpenByIds(ids));
+        DzCardsOpen open = dzCardsOpenService.selectDzCardsOpenById(id);
+        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
+        if (UserTypeEnum.Agent.equals(sysUser.getUserType()) && !open.getAgentId().equals(sysUser.getUserId())) {
+            throw new ValidationException("不可修改他人申请");
+        }
+        if(RequestStatus.Accept.getVal().equals(open.getStatus())) {
+            throw new ValidationException("不可删除已经通过的申请");
+        }
+        return toAjax(dzCardsOpenService.deleteDzCardsOpenByIds(new Long[] {id}));
     }
     }
 }
 }

+ 7 - 0
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzSchoolController.java

@@ -83,6 +83,13 @@ public class DzSchoolController extends BaseController
         return getDataTable(list);
         return getDataTable(list);
     }
     }
 
 
+    @GetMapping("/getCampusList")
+    public AjaxResult getCampusList(DzSchool dzSchool)
+    {
+        List<DzSchool> list = dzSchoolService.selectDzSchoolList(dzSchool);
+        return AjaxResult.success(list);
+    }
+
     @GetMapping("/getSchoolList")
     @GetMapping("/getSchoolList")
     public AjaxResult getSchoolList(DzSchool dzSchool)
     public AjaxResult getSchoolList(DzSchool dzSchool)
     {
     {

+ 0 - 3
ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontExamController.java

@@ -3,7 +3,6 @@ package com.ruoyi.web.controller.front;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Sets;
 import com.google.common.collect.Sets;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.dz.service.IDzControlService;
 import com.ruoyi.dz.service.IDzControlService;
@@ -11,11 +10,9 @@ import com.ruoyi.enums.ExamineeStatus;
 import com.ruoyi.enums.PaperType;
 import com.ruoyi.enums.PaperType;
 import com.ruoyi.ie.domain.AMarjorPlan;
 import com.ruoyi.ie.domain.AMarjorPlan;
 import com.ruoyi.ie.service.IAMarjorPlanService;
 import com.ruoyi.ie.service.IAMarjorPlanService;
-import com.ruoyi.ie.service.impl.AMarjorPlanServiceImpl;
 import com.ruoyi.learn.domain.LearnExaminee;
 import com.ruoyi.learn.domain.LearnExaminee;
 import com.ruoyi.learn.domain.LearnPaper;
 import com.ruoyi.learn.domain.LearnPaper;
 import com.ruoyi.learn.service.ILearnExamineeService;
 import com.ruoyi.learn.service.ILearnExamineeService;
-import com.ruoyi.learn.service.ILearnPaperQuestionService;
 import com.ruoyi.learn.service.ILearnPaperService;
 import com.ruoyi.learn.service.ILearnPaperService;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.ISysUserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;

+ 15 - 8
ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontPaperController.java

@@ -3,18 +3,21 @@ package com.ruoyi.web.controller.front;
 import com.alibaba.fastjson2.JSONObject;
 import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.common.core.content.VistorContextHolder;
 import com.ruoyi.common.core.content.VistorContextHolder;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.AjaxResult2;
 import com.ruoyi.dz.domain.DzControl;
 import com.ruoyi.dz.domain.DzControl;
+import com.ruoyi.dz.domain.DzSubject;
 import com.ruoyi.dz.service.IDzControlService;
 import com.ruoyi.dz.service.IDzControlService;
+import com.ruoyi.dz.service.IDzSubjectService;
 import com.ruoyi.enums.PaperType;
 import com.ruoyi.enums.PaperType;
 import com.ruoyi.learn.domain.LearnPaper;
 import com.ruoyi.learn.domain.LearnPaper;
 import com.ruoyi.learn.domain.LearnTest;
 import com.ruoyi.learn.domain.LearnTest;
 import com.ruoyi.learn.service.ILearnPaperQuestionService;
 import com.ruoyi.learn.service.ILearnPaperQuestionService;
 import com.ruoyi.learn.service.ILearnPaperService;
 import com.ruoyi.learn.service.ILearnPaperService;
 import com.ruoyi.learn.service.ILearnTestService;
 import com.ruoyi.learn.service.ILearnTestService;
+import com.ruoyi.web.service.LearnTeacherService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiParam;
-import org.apache.commons.compress.utils.Lists;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
@@ -26,14 +29,18 @@ import java.util.List;
 @Api(tags = "前台-学习-试卷")
 @Api(tags = "前台-学习-试卷")
 public class FrontPaperController {
 public class FrontPaperController {
     private final IDzControlService dzControlService;
     private final IDzControlService dzControlService;
+    private final IDzSubjectService dzSubjectService;
     private final ILearnTestService testService;
     private final ILearnTestService testService;
     private final ILearnPaperService paperService;
     private final ILearnPaperService paperService;
+    private final LearnTeacherService learnTeacherService;
     private final ILearnPaperQuestionService paperQuestionService;
     private final ILearnPaperQuestionService paperQuestionService;
 
 
-    public FrontPaperController(IDzControlService dzControlService, ILearnTestService testService, ILearnPaperService paperService, ILearnPaperQuestionService paperQuestionService) {
+    public FrontPaperController(IDzControlService dzControlService, IDzSubjectService dzSubjectService, ILearnTestService testService, ILearnPaperService paperService, LearnTeacherService learnTeacherService, ILearnPaperQuestionService paperQuestionService) {
         this.dzControlService = dzControlService;
         this.dzControlService = dzControlService;
+        this.dzSubjectService = dzSubjectService;
         this.testService = testService;
         this.testService = testService;
         this.paperService = paperService;
         this.paperService = paperService;
+        this.learnTeacherService = learnTeacherService;
         this.paperQuestionService = paperQuestionService;
         this.paperQuestionService = paperQuestionService;
     }
     }
 
 
@@ -48,16 +55,16 @@ public class FrontPaperController {
 
 
     @ApiOperation("02 考试科目")
     @ApiOperation("02 考试科目")
     @GetMapping(value = "subject")
     @GetMapping(value = "subject")
-    public List<JSONObject> getSubject() {
-        // TODO 生成下载科目ss
-        return Lists.newArrayList();
+    public AjaxResult2<List<DzSubject>> getSubject() {
+        DzSubject sCond = new DzSubject();
+        List<DzSubject> list = dzSubjectService.selectDzSubjectList(sCond);
+        return AjaxResult2.success(list);
     }
     }
 
 
     @ApiOperation("03 知识点树")
     @ApiOperation("03 知识点树")
     @GetMapping(value = "knownledge")
     @GetMapping(value = "knownledge")
-    public List<JSONObject> getKnownledge(@ApiParam("科目ID") Long subjectId) {
-        // TODO 生成知识点
-        return Lists.newArrayList();
+    public AjaxResult getKnownledge(@ApiParam("科目ID") Long subjectId) {
+        return AjaxResult.success(learnTeacherService.getKnowledgeTree(subjectId, null));
     }
     }
 
 
     @ApiOperation("04 取试卷")
     @ApiOperation("04 取试卷")

+ 20 - 2
ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontTeacherController.java

@@ -5,6 +5,11 @@ import com.google.common.collect.Lists;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.dz.service.IDzControlService;
+import com.ruoyi.dz.service.IDzSubjectService;
+import com.ruoyi.learn.domain.LearnTest;
+import com.ruoyi.learn.service.ILearnTestService;
+import com.ruoyi.web.service.LearnTeacherService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiParam;
@@ -19,18 +24,31 @@ import java.util.List;
 @RequestMapping("/front/teacher")
 @RequestMapping("/front/teacher")
 @Api(tags = "前台-学习-老师")
 @Api(tags = "前台-学习-老师")
 public class FrontTeacherController extends BaseController {
 public class FrontTeacherController extends BaseController {
+    private final IDzControlService dzControlService;
+    private final IDzSubjectService dzSubjectService;
+    private final ILearnTestService learnTestService;
+    private final LearnTeacherService learnTeacherService;
+
+    public FrontTeacherController(IDzControlService dzControlService, IDzSubjectService dzSubjectService, ILearnTestService learnTestService, LearnTeacherService learnTeacherService) {
+        this.dzControlService = dzControlService;
+        this.dzSubjectService = dzSubjectService;
+        this.learnTestService = learnTestService;
+        this.learnTeacherService = learnTeacherService;
+    }
+
     @ApiOperation("10 查询班级列表")
     @ApiOperation("10 查询班级列表")
     @GetMapping("classes")
     @GetMapping("classes")
     public AjaxResult getClasses()
     public AjaxResult getClasses()
     {
     {
-        return AjaxResult.success();
+        return AjaxResult.success(learnTeacherService.getClasses(getUserId()));
     }
     }
 
 
     @ApiOperation("10 查询批次列表")
     @ApiOperation("10 查询批次列表")
     @GetMapping("batchs")
     @GetMapping("batchs")
     public AjaxResult getBatchs()
     public AjaxResult getBatchs()
     {
     {
-        return AjaxResult.success();
+        List<LearnTest> list = learnTestService.selectLearnTestList(new LearnTest());
+        return AjaxResult.success(list);
     }
     }
 
 
     @ApiOperation("记录-模拟卷")
     @ApiOperation("记录-模拟卷")

+ 35 - 2
ie-system/src/main/java/com/ruoyi/dz/domain/DzCardsOpen.java

@@ -49,10 +49,19 @@ public class DzCardsOpen extends BaseEntity
     @Excel(name = "重新开卡:0否,1是")
     @Excel(name = "重新开卡:0否,1是")
     private Integer isReopen;
     private Integer isReopen;
 
 
-    /** 状态(0:无效,1:审核结束,2:审核中) */
-    @Excel(name = "状态(0:无效,1:审核结束,2:审核中)")
+    /** 状态(0:无效,1:审核通过,2:拒绝) */
+    @Excel(name = "状态(0:无效,1:审核通过,2:审核拒绝)")
     private Integer status;
     private Integer status;
 
 
+    /** 审核意见 */
+    private String auditDesc;
+
+    /** 代理 */
+    private String agentName;
+
+    /** 校区 */
+    private String schoolName;
+
     public void setId(Long id) 
     public void setId(Long id) 
     {
     {
         this.id = id;
         this.id = id;
@@ -143,6 +152,30 @@ public class DzCardsOpen extends BaseEntity
         return status;
         return status;
     }
     }
 
 
+    public String getAuditDesc() {
+        return auditDesc;
+    }
+
+    public void setAuditDesc(String auditDesc) {
+        this.auditDesc = auditDesc;
+    }
+
+    public String getAgentName() {
+        return agentName;
+    }
+
+    public void setAgentName(String agentName) {
+        this.agentName = agentName;
+    }
+
+    public String getSchoolName() {
+        return schoolName;
+    }
+
+    public void setSchoolName(String schoolName) {
+        this.schoolName = schoolName;
+    }
+
     @Override
     @Override
     public String toString() {
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 1 - 0
ie-system/src/main/java/com/ruoyi/dz/mapper/DzCardsMapper.java

@@ -46,6 +46,7 @@ public interface DzCardsMapper
      */
      */
     public int updateDzCards(DzCards dzCards);
     public int updateDzCards(DzCards dzCards);
 
 
+    public int updateDzCardsByNo(DzCards dzCards);
     /**
     /**
      * 删除学习卡
      * 删除学习卡
      * 
      * 

+ 7 - 8
ie-system/src/main/java/com/ruoyi/dz/service/IDzCardsService.java

@@ -2,8 +2,10 @@ package com.ruoyi.dz.service;
 
 
 import java.util.List;
 import java.util.List;
 
 
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.dz.domain.DzCards;
 import com.ruoyi.dz.domain.DzCards;
+import com.ruoyi.dz.domain.DzCardsOpen;
 import com.ruoyi.enums.CardAction;
 import com.ruoyi.enums.CardAction;
 import com.ruoyi.enums.CardType;
 import com.ruoyi.enums.CardType;
 
 
@@ -94,19 +96,16 @@ public interface IDzCardsService
 
 
     /**
     /**
      * 申请开卡
      * 申请开卡
-     * @param schoolId
-     * @param agentId
-     * @param beginNo
-     * @param endNo
+     * @param dzCardsOpen
      */
      */
-    public Boolean requestOpenCard(Long schoolId, Long agentId, String beginNo, String endNo);
+    public Boolean requestOpenCard(DzCardsOpen dzCardsOpen);
 
 
     /**
     /**
      * 审核开卡
      * 审核开卡
-     * @param openId
-     * @param userId
+     * @param dzCardsOpen
+     * @param sysUser
      */
      */
-    public void confirmOpenCard(Long openId, Long userId);
+    public Boolean confirmOpenCard(DzCardsOpen dzCardsOpen, SysUser sysUser);
 
 
     /**
     /**
      * 修改卡
      * 修改卡

+ 35 - 2
ie-system/src/main/java/com/ruoyi/dz/service/impl/DzCardsOpenServiceImpl.java

@@ -1,11 +1,20 @@
 package com.ruoyi.dz.service.impl;
 package com.ruoyi.dz.service.impl;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.dz.domain.*;
+import com.ruoyi.dz.mapper.DzAgentMapper;
+import com.ruoyi.dz.mapper.DzSchoolMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.ruoyi.dz.mapper.DzCardsOpenMapper;
 import com.ruoyi.dz.mapper.DzCardsOpenMapper;
-import com.ruoyi.dz.domain.DzCardsOpen;
 import com.ruoyi.dz.service.IDzCardsOpenService;
 import com.ruoyi.dz.service.IDzCardsOpenService;
 
 
 /**
 /**
@@ -19,6 +28,10 @@ public class DzCardsOpenServiceImpl implements IDzCardsOpenService
 {
 {
     @Autowired
     @Autowired
     private DzCardsOpenMapper dzCardsOpenMapper;
     private DzCardsOpenMapper dzCardsOpenMapper;
+    @Autowired
+    private DzAgentMapper dzAgentMapper;
+    @Autowired
+    private DzSchoolMapper dzSchoolMapper;
 
 
     /**
     /**
      * 查询开卡申请
      * 查询开卡申请
@@ -41,7 +54,27 @@ public class DzCardsOpenServiceImpl implements IDzCardsOpenService
     @Override
     @Override
     public List<DzCardsOpen> selectDzCardsOpenList(DzCardsOpen dzCardsOpen)
     public List<DzCardsOpen> selectDzCardsOpenList(DzCardsOpen dzCardsOpen)
     {
     {
-        return dzCardsOpenMapper.selectDzCardsOpenList(dzCardsOpen);
+        return fillNames(dzCardsOpenMapper.selectDzCardsOpenList(dzCardsOpen));
+    }
+
+    private List<DzCardsOpen> fillNames(List<DzCardsOpen> list) {
+        Set<Long> schoolIdSet = Sets.newHashSet();
+        Set<Long> agentIdSet = Sets.newHashSet();
+        for(DzCardsOpen o : list) {
+            if(null != o.getSchoolId()) {
+                schoolIdSet.add(o.getSchoolId());
+            }
+            if(null != o.getAgentId()) {
+                agentIdSet.add(o.getAgentId());
+            }
+        }
+        Map<Long, String> schoolMap = !schoolIdSet.isEmpty() ? dzSchoolMapper.selectDzSchoolListByIds(schoolIdSet).stream().collect(Collectors.toMap(DzSchool::getId, DzSchool::getName)) : Maps.newHashMap();;
+        Map<Long, String> agentMap = !agentIdSet.isEmpty() ? dzAgentMapper.selectDzAgentByAgentIds(agentIdSet).stream().collect(Collectors.toMap(DzAgent::getAgentId, DzAgent::getName)) : Maps.newHashMap();
+        for(DzCardsOpen o : list) {
+            o.setSchoolName(schoolMap.get(o.getSchoolId()));
+            o.setAgentName(agentMap.get(o.getAgentId()));
+        }
+        return list;
     }
     }
 
 
     /**
     /**

+ 47 - 34
ie-system/src/main/java/com/ruoyi/dz/service/impl/DzCardsServiceImpl.java

@@ -10,6 +10,7 @@ import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.collect.Sets;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -234,7 +235,7 @@ public class DzCardsServiceImpl implements IDzCardsService
         newOpen.setEndDate(DateUtils.addDays(DateUtils.getNowDate(), 14)); // TODO MF 卡默认有效期
         newOpen.setEndDate(DateUtils.addDays(DateUtils.getNowDate(), 14)); // TODO MF 卡默认有效期
         newOpen.setSchoolId(schoolId);
         newOpen.setSchoolId(schoolId);
         newOpen.setIsReopen(0);
         newOpen.setIsReopen(0);
-        newOpen.setStatus(RequestStatus.Pass.getVal());
+        newOpen.setStatus(RequestStatus.Accept.getVal());
         dzCardsOpenMapper.insertDzCardsOpen(newOpen);
         dzCardsOpenMapper.insertDzCardsOpen(newOpen);
         // TODO MF 检查已经使用的或无效的
         // TODO MF 检查已经使用的或无效的
         CardCriteria cond = new CardCriteria();
         CardCriteria cond = new CardCriteria();
@@ -257,46 +258,57 @@ public class DzCardsServiceImpl implements IDzCardsService
     }
     }
 
 
     @Override
     @Override
-    public Boolean requestOpenCard(Long schoolId, Long agentId, String beginNo, String endNo) {
-
-        DzCardsOpen newOpen = new DzCardsOpen();
-        newOpen.setAgentId(agentId);
-        newOpen.setStartNo(beginNo);
-        newOpen.setEndNo(endNo);
-        newOpen.setEndDate(DateUtils.addDays(DateUtils.getNowDate(), 14)); // TODO MF 卡默认有效期
-        newOpen.setSchoolId(schoolId);
-        newOpen.setIsReopen(0);
-        newOpen.setStatus(RequestStatus.Wait.getVal());
-        dzCardsOpenMapper.insertDzCardsOpen(newOpen);
+    public Boolean requestOpenCard(DzCardsOpen dzCardsOpen) {
+        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
+        if(UserTypeEnum.Agent.equals(sysUser.getUserType())) {
+            dzCardsOpen.setAgentId(sysUser.getUserTypeId());
+        } else {
+            dzCardsOpen.setAgentId(0L);
+        }
+        dzCardsOpen.setStatus(RequestStatus.Submit.getVal());
+        dzCardsOpen.setEndDate(DateUtils.addDays(DateUtils.getNowDate(), 14));
+        dzCardsOpen.setIsReopen(0);
+        dzCardsOpenMapper.insertDzCardsOpen(dzCardsOpen);
         return true;
         return true;
     }
     }
 
 
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
-    public void confirmOpenCard(Long openId, Long userId) {
-        DzCardsOpen open = dzCardsOpenMapper.selectDzCardsOpenById(openId);
-        if(!open.getStatus().equals(RequestStatus.Wait.getVal())) {
-            throw new ValidationException("无效状态");
+    public Boolean confirmOpenCard(DzCardsOpen dzCardsOpen, SysUser sysUser) {
+        DzCardsOpen exist = dzCardsOpenMapper.selectDzCardsOpenById(dzCardsOpen.getId());
+        if(UserTypeEnum.Agent.equals(sysUser.getUserType()) && !exist.getAgentId().equals(dzCardsOpen.getAgentId())) {
+            throw new ValidationException("不可修改他人申请");
         }
         }
-        CardCriteria cond = new CardCriteria();
-        cond.setStartNo(open.getStartNo());
-        cond.setEndNo(open.getEndNo());
-        List<DzCards> cards = dzCardsMapper.selectListByCond(cond);
-        if(cards.stream().filter(t -> !t.getPayStatus().equals(PayStatus.UnPay.getVal())).count() > 0) {
-            throw new ValidationException("重复打开已开卡: " + open.getStartNo() + "-" + open.getEndNo());
+        if(RequestStatus.Accept.getVal().equals(exist.getStatus())) {
+            throw new ValidationException("不可修改已经通过的申请");
         }
         }
-        DzCards dzCards = new DzCards();
-        cards.stream().forEach(c -> {
-            dzCards.setCardId(c.getCardId());
-            dzCards.setPayTime(DateUtils.getNowDate());
-            dzCards.setPayStatus(PayStatus.Paid.getVal());
-            dzCards.setStatus(CardStatus.Paid.getVal());
-            dzCardsMapper.updateDzCards(dzCards);
-        });
-        DzCardsOpen up = new DzCardsOpen();
-        up.setId(openId);
-        up.setStatus(RequestStatus.Pass.getVal());
-        dzCardsOpenMapper.updateDzCardsOpen(up);
+        if(!RequestStatus.Submit.getVal().equals(exist.getStatus())) {
+            throw new ValidationException("状态无效");
+        }
+        DzCardsOpen upOpen = new DzCardsOpen();
+        upOpen.setId(dzCardsOpen.getId());
+        upOpen.setStatus(RequestStatus.Accept.getVal().equals(dzCardsOpen.getStatus()) ? RequestStatus.Accept.getVal() : RequestStatus.Reject.getVal());
+        upOpen.setAuditDesc(dzCardsOpen.getAuditDesc());
+
+        if(RequestStatus.Accept.getVal().equals(upOpen.getStatus())) {
+            CardCriteria cond = new CardCriteria();
+            cond.setStartNo(exist.getStartNo());
+            cond.setEndNo(exist.getEndNo());
+            List<DzCards> cards = dzCardsMapper.selectListByCond(cond);
+            if(cards.stream().filter(t -> !t.getPayStatus().equals(PayStatus.UnPay.getVal())).count() > 0) {
+                throw new ValidationException("重复打开已开卡: " + exist.getStartNo() + "-" + exist.getEndNo());
+            }
+            DzCards dzCards = new DzCards();
+            cards.stream().forEach(c -> {
+                dzCards.setCardId(c.getCardId());
+                dzCards.setPayTime(DateUtils.getNowDate());
+                dzCards.setPayStatus(PayStatus.Paid.getVal());
+                dzCards.setStatus(CardStatus.Paid.getVal());
+                dzCardsMapper.updateDzCards(dzCards);
+            });
+        }
+        dzCardsOpenMapper.updateDzCardsOpen(upOpen);
+        return true;
     }
     }
 
 
     @Override
     @Override
@@ -326,6 +338,7 @@ public class DzCardsServiceImpl implements IDzCardsService
             if(cards.stream().filter(t -> t.getPayStatus().equals(PayStatus.Refund.getVal())).count() > 0) {
             if(cards.stream().filter(t -> t.getPayStatus().equals(PayStatus.Refund.getVal())).count() > 0) {
                 throw new ValidationException("重复退款: " + StringUtils.join(cardIds, ","));
                 throw new ValidationException("重复退款: " + StringUtils.join(cardIds, ","));
             }
             }
+            up.setDistributeStatus(CardDistributeStatus.Close.getVal());
             up.setPayStatus(PayStatus.Refund.getVal());
             up.setPayStatus(PayStatus.Refund.getVal());
             up.setRefundTime(DateUtils.getNowDate());
             up.setRefundTime(DateUtils.getNowDate());
         } else {
         } else {

+ 1 - 1
ie-system/src/main/java/com/ruoyi/enums/RequestStatus.java

@@ -6,7 +6,7 @@ import lombok.Getter;
 @Getter
 @Getter
 @AllArgsConstructor
 @AllArgsConstructor
 public enum RequestStatus {
 public enum RequestStatus {
-    Draft(0), Pass(1), Wait(2); //
+    Draft(0), Submit(1), Accept(2), Reject(3); //
 
 
     private final Integer val;
     private final Integer val;
 }
 }

+ 35 - 0
ie-system/src/main/resources/mapper/dz/DzCardsMapper.xml

@@ -184,6 +184,41 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where card_id = #{cardId}
         where card_id = #{cardId}
     </update>
     </update>
 
 
+    <update id="updateDzCardsByNo" parameterType="DzCards">
+        update dz_cards
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="password != null">password = #{password},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="distributeStatus != null">distribute_status = #{distributeStatus},</if>
+            <if test="timeStatus != null">time_status = #{timeStatus},</if>
+            <if test="payStatus != null">pay_status = #{payStatus},</if>
+            <if test="isSettlement != null">is_settlement = #{isSettlement},</if>
+            <if test="deptId != null">dept_id = #{deptId},</if>
+            <if test="agentId != null">agent_id = #{agentId},</if>
+            <if test="leafAgentId != null">leaf_agent_id = #{leafAgentId},</if>
+            <if test="campusId != null">campus_id = #{campusId},</if>
+            assign_location = #{assignLocation},assign_exam_type = #{assignExamType},assign_school_id = #{assignSchoolId},
+            <if test="schoolId != null">school_id = #{schoolId},</if>
+            <if test="classId != null">class_id = #{classId},</if>
+            <if test="year != null">year = #{year},</if>
+            <if test="endYear != null">end_year = #{endYear},</if>
+            <if test="openId != null">open_id = #{openId},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="distributeTime != null">distribute_time = #{distributeTime},</if>
+            <if test="outDate != null">out_date = #{outDate},</if>
+            <if test="openTime != null">open_time = #{openTime},</if>
+            <if test="payTime != null">pay_time = #{payTime},</if>
+            <if test="activeTime != null">active_time = #{activeTime},</if>
+            <if test="settlementTime != null">settlement_time = #{settlementTime},</if>
+            <if test="refundTime != null">refund_time = #{refundTime},</if>
+            <if test="closeTime != null">close_time = #{closeTime},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where card_no = #{cardNo}
+    </update>
+
     <delete id="deleteDzCardsByCardId" parameterType="Long">
     <delete id="deleteDzCardsByCardId" parameterType="Long">
         delete from dz_cards where card_id = #{cardId}
         delete from dz_cards where card_id = #{cardId}
     </delete>
     </delete>

+ 4 - 1
ie-system/src/main/resources/mapper/dz/DzCardsOpenMapper.xml

@@ -15,10 +15,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="createTime"    column="create_time"    />
         <result property="createTime"    column="create_time"    />
         <result property="isReopen"    column="is_reopen"    />
         <result property="isReopen"    column="is_reopen"    />
         <result property="status"    column="status"    />
         <result property="status"    column="status"    />
+        <result property="auditDesc"    column="audit_desc"    />
+
     </resultMap>
     </resultMap>
 
 
     <sql id="selectDzCardsOpenVo">
     <sql id="selectDzCardsOpenVo">
-        select id, agent_id, start_no, end_no, end_date, school_id, sender, create_time, is_reopen, status from dz_cards_open
+        select id, agent_id, start_no, end_no, end_date, school_id, sender, create_time, is_reopen, status, audit_desc from dz_cards_open
     </sql>
     </sql>
 
 
     <select id="selectDzCardsOpenList" parameterType="DzCardsOpen" resultMap="DzCardsOpenResult">
     <select id="selectDzCardsOpenList" parameterType="DzCardsOpen" resultMap="DzCardsOpenResult">
@@ -78,6 +80,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="isReopen != null">is_reopen = #{isReopen},</if>
             <if test="isReopen != null">is_reopen = #{isReopen},</if>
             <if test="status != null">status = #{status},</if>
             <if test="status != null">status = #{status},</if>
+            <if test="auditDesc != null "> and audit_desc = #{auditDesc}</if>
         </trim>
         </trim>
         where id = #{id}
         where id = #{id}
     </update>
     </update>