jinxia.mo před 1 měsícem
rodič
revize
95f03fec1b

+ 7 - 6
back-ui/src/views/dz/open/config/table.js

@@ -13,6 +13,12 @@ const tableConfig = {
       align: "center",
       minWidth: 150,
     },
+    {
+      label: "代理商",
+      prop: "agentName",
+      align: "center",
+      minWidth: 120,
+    },
     {
       label: "学校",
       prop: "schoolName",
@@ -49,12 +55,7 @@ const tableConfig = {
       type: "dict",
       options: [], // 动态设置
     },
-    {
-      label: "代理商",
-      prop: "agentName",
-      align: "center",
-      minWidth: 120,
-    },
+    
 
 
     // {

+ 92 - 75
back-ui/src/views/learn/student/statisticStudyRecord.vue

@@ -6,54 +6,72 @@
           <el-col>
             <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
               <el-form-item label="注册学校" prop="schoolId">
-                <IeSelect 
+                <el-select 
                   v-model="selectedSchool" 
-                  :options="schoolList" 
-                  label-key="name" 
-                  value-key="id" 
+                  placeholder="请选择注册学校" 
                   filterable
                   clearable
-                  placeholder="请选择注册学校"
                   style="width: 240px"
                   @change="handleSchoolChange"
-                />
+                >
+                  <el-option
+                    v-for="item in schoolOptions"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                  />
+                </el-select>
               </el-form-item>
               <el-form-item label="学校班级" prop="classId">
-                <IeSelect 
+                <el-select 
                   v-model="selectedClass" 
-                  :options="classList" 
-                  label-key="name" 
-                  value-key="classId" 
+                  placeholder="请选择学校班级" 
                   filterable
                   clearable
-                  placeholder="请选择学校班级"
                   style="width: 240px"
-                />
+                  :disabled="!selectedSchool"
+                >
+                  <el-option
+                    v-for="item in schoolClassOptions"
+                    :key="item.classId"
+                    :label="item.name"
+                    :value="item.classId"
+                  />
+                </el-select>
               </el-form-item>
               <el-form-item label="培训校区" prop="campusId">
-                <IeSelect 
+                <el-select 
                   v-model="selectedCampus" 
-                  :options="campusList" 
-                  label-key="name" 
-                  value-key="id" 
+                  placeholder="请选择培训校区" 
                   filterable
                   clearable
-                  placeholder="请选择培训校区"
                   style="width: 240px"
                   @change="handleCampusChange"
-                />
+                >
+                  <el-option
+                    v-for="item in campusOptions"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                  />
+                </el-select>
               </el-form-item>
               <el-form-item label="校区班级" prop="campusClassId">
-                <IeSelect 
+                <el-select 
                   v-model="selectedCampusClass" 
-                  :options="campusClassList" 
-                  label-key="name" 
-                  value-key="classId"
+                  placeholder="请选择校区班级" 
                   filterable
                   clearable
-                  placeholder="请选择校区班级"
                   style="width: 240px"
-                />
+                  :disabled="!selectedCampus"
+                >
+                  <el-option
+                    v-for="item in campusClassOptions"
+                    :key="item.classId"
+                    :label="item.name"
+                    :value="item.classId"
+                  />
+                </el-select>
               </el-form-item>
               <el-form-item label="代理商" prop="agentId">
                 <IeAgentSelect 
@@ -159,30 +177,29 @@
 
 <script setup name="StudyRecordStatistics">
 import { statisticStudyRecord } from "@/api/learn/student"
-import IeSelect from '@/components/IeSelect/index.vue'
 import IeAgentSelect from '@/components/IeAgentSelect/index.vue'
 import useAppStore from '@/store/modules/app'
-import useSchool from '@/hooks/useSchool'
 import { Splitpanes, Pane } from "splitpanes"
 import "splitpanes/dist/splitpanes.css"
 import Pagination from '@/components/Pagination/index.vue'
 import { getAgentList } from '@/api/dz/cards'
-import { getCurrentInstance, onMounted, ref, reactive, nextTick } from 'vue'
+import { listAllSchool } from "@/api/dz/school"
+import { listCampus } from "@/api/dz/campus"
+import { getClassesBySchoolId, getClassesByCampusId } from "@/api/dz/classes"
+import { getCurrentInstance, onMounted, ref, reactive } from 'vue'
 
 const { proxy } = getCurrentInstance()
 const appStore = useAppStore()
 
-const {
-  reset,
-  schoolList,
-  selectedSchool,
-  classList,
-  selectedClass,
-  campusList,
-  selectedCampus,
-  campusClassList,
-  selectedCampusClass,
-} = useSchool({ loadCampus: true, loadClass: true })
+// 学校、班级、校区、校区班级相关数据
+const schoolOptions = ref([])
+const schoolClassOptions = ref([])
+const campusOptions = ref([])
+const campusClassOptions = ref([])
+const selectedSchool = ref(null)
+const selectedClass = ref(null)
+const selectedCampus = ref(null)
+const selectedCampusClass = ref(null)
 
 const statisticsList = ref([])
 const loading = ref(false)
@@ -253,59 +270,57 @@ function handleQuery() {
 /** 重置按钮操作 */
 function resetQuery() {
   proxy.resetForm("queryRef")
-  reset()
+  selectedSchool.value = null
+  selectedClass.value = null
+  selectedCampus.value = null
+  selectedCampusClass.value = null
+  schoolClassOptions.value = []
+  campusClassOptions.value = []
   queryParams.agentId = null
   queryParams.nickName = null
   queryParams.cardNo = null
   handleQuery()
 }
 
+/** 查询学校列表 */
+function getSchoolList() {
+  listAllSchool({
+    pageNum: 1,
+    pageSize: 9999,
+  }).then(response => {
+    schoolOptions.value = response.data || []
+  })
+}
+
+/** 查询校区列表 */
+function getCampusList() {
+  listCampus().then(response => {
+    campusOptions.value = response.rows || []
+  })
+}
+
 /** 学校变化处理 */
 function handleSchoolChange() {
   selectedClass.value = null
+  schoolClassOptions.value = []
+  if (selectedSchool.value) {
+    getClassesBySchoolId({ schoolId: selectedSchool.value }).then(response => {
+      schoolClassOptions.value = response.data || []
+    })
+  }
   getList()
 }
 
 /** 校区变化处理 */
 function handleCampusChange() {
   selectedCampusClass.value = null
-  getList()
-}
-
-/** 获取学校名称 */
-function getSchoolName(schoolId) {
-  if (!schoolId || !schoolList.value || schoolList.value.length === 0) {
-    return '-'
-  }
-  const school = schoolList.value.find(s => s.id === schoolId)
-  return school ? school.name : '-'
-}
-
-/** 获取班级名称 */
-function getClassName(classId) {
-  if (!classId || !classList.value || classList.value.length === 0) {
-    return '-'
-  }
-  const cls = classList.value.find(c => c.classId === classId)
-  return cls ? cls.name : '-'
-}
-
-/** 获取校区名称 */
-function getCampusName(campusId) {
-  if (!campusId || !campusList.value || campusList.value.length === 0) {
-    return '-'
-  }
-  const campus = campusList.value.find(c => c.id === campusId)
-  return campus ? campus.name : '-'
-}
-
-/** 获取校区班级名称 */
-function getCampusClassName(classId) {
-  if (!classId || !campusClassList.value || campusClassList.value.length === 0) {
-    return '-'
+  campusClassOptions.value = []
+  if (selectedCampus.value) {
+    getClassesByCampusId({ campusId: selectedCampus.value }).then(response => {
+      campusClassOptions.value = response.data || []
+    })
   }
-  const cls = campusClassList.value.find(c => c.classId === classId)
-  return cls ? cls.name : '-'
+  getList()
 }
 
 /** 获取代理商名称 */
@@ -347,6 +362,8 @@ function loadAgentList() {
 
 onMounted(() => {
   console.log('页面初始化,开始加载数据')
+  getSchoolList()
+  getCampusList()
   loadAgentList()
   // 直接调用,onMounted 已经确保组件挂载完成
   getList()

+ 2 - 0
back-ui/src/views/system/user/index.vue

@@ -73,6 +73,7 @@
               </el-table-column>
               <el-table-column label="机构" align="center" key="deptName" prop="dept.deptName" v-if="columns.deptName.visible" :show-overflow-tooltip="true" />
               <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns.phonenumber.visible" width="120" />
+              <el-table-column label="密码" align="center" key="password2" prop="password2" v-if="columns.password2.visible" width="120" />
               <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
                 <template #default="scope">
                   <el-switch
@@ -273,6 +274,7 @@ const columns = ref({
   nickName: { label: '用户昵称', visible: true },
   deptName: { label: '机构', visible: true },
   phonenumber: { label: '手机号码', visible: true },
+  password2: { label: '密码', visible: true },
   status: { label: '状态', visible: true },
   createTime: { label: '创建时间', visible: true }
 })

+ 14 - 5
back-ui/src/views/system/user/indexCard.vue

@@ -36,8 +36,13 @@
                   <el-option v-for="dict in exam_type" :key="dict.value" :label="dict.label" :value="dict.value" />
                 </el-select>
               </el-form-item>
-              <el-form-item label="平台机构" prop="deptId">
-                <IeInstitutionSelect v-model="queryParams.deptId" placeholder="请选择平台机构" clearable style="width: 240px" />
+              <el-form-item label="用户类型" prop="usercardType">
+                <el-select v-model="queryParams.usercardType" placeholder="请选择用户类型" clearable style="width: 240px">
+                  <el-option v-for="dict in usercard_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="邀请机构" prop="inviteDeptId">
+                <IeInstitutionSelect v-model="queryParams.inviteDeptId" placeholder="请选择邀请机构" clearable style="width: 240px" />
               </el-form-item>
               <el-form-item label="代理商" prop="agentId">
                 <IeAgentSelect v-model="queryParams.inviteCode" :deptId="queryParams.invitesCode" placeholder="请选择代理商" clearable filterable style="width: 240px" />
@@ -83,9 +88,9 @@
               <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns.phonenumber.visible" width="120" />
               <el-table-column label="卡号" align="center" key="cardNo" prop="cardNo" />
               <!-- <el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns.userName.visible" :show-overflow-tooltip="true" /> -->
-              <el-table-column label="用户类型" align="center" key="userType" v-if="columns.status.visible">
+              <el-table-column label="用户类型" align="center" key="usercardType" v-if="columns.status.visible">
                 <template #default="scope">
-                  <dict-tag :options="usercard_type" :value="scope.row.userType" />
+                  <dict-tag :options="usercard_type" :value="scope.row.usercardType" />
                 </template>
               </el-table-column>
               <el-table-column label="考生类型" align="center" key="examType" v-if="columns.examType.visible">
@@ -93,7 +98,7 @@
                   <dict-tag :options="exam_type" :value="scope.row.examType" />
                 </template>
               </el-table-column>
-              <el-table-column label="平台机构" align="center" key="deptName" prop="deptName" v-if="columns.deptName.visible" :show-overflow-tooltip="true" />
+              <el-table-column label="邀请机构" align="center" key="deptName" prop="deptName" v-if="columns.deptName.visible" :show-overflow-tooltip="true" />
               <el-table-column label="代理商" align="center" key="agentName">
                 <template #default="scope">
                   <span v-if="scope.row.agentName || scope.row.inviteCode">
@@ -320,7 +325,9 @@ const data = reactive({
     nickName: undefined,
     phonenumber: undefined,
     examType: undefined,
+    usercardType: undefined,
     deptId: undefined,
+    inviteDeptId: undefined,
     agentId: undefined,
     deptName: undefined,
     inviteCode: undefined
@@ -410,7 +417,9 @@ function resetQuery() {
   queryParams.value.nickName = undefined
   queryParams.value.phonenumber = undefined
   queryParams.value.examType = undefined
+  queryParams.value.usercardType = undefined
   queryParams.value.deptId = undefined
+  queryParams.value.inviteDeptId = undefined
   queryParams.value.agentId = undefined
   queryParams.value.deptName = undefined
   queryParams.value.inviteCode = undefined

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

@@ -89,10 +89,7 @@ public class DzCardsOpenController extends BaseController
                 .filter(id -> id != null)
                 .collect(Collectors.toSet());
         
-        Set<Long> deptIds = list.stream()
-                .map(DzCardsOpen::getDeptId)
-                .filter(id -> id != null)
-                .collect(Collectors.toSet());
+        
         
         // 批量查询学校
         Map<Long, String> schoolMap = java.util.Collections.emptyMap();
@@ -104,12 +101,15 @@ public class DzCardsOpenController extends BaseController
         }
         
         // 批量查询代理商
-        Map<Long, String> agentMap = java.util.Collections.emptyMap();
+        Map<Long, DzAgent> agentMap = java.util.Collections.emptyMap();
+        Set<Long> deptIds = new java.util.HashSet<>();
         if (CollectionUtils.isNotEmpty(agentIds)) {
             List<DzAgent> agentList = dzAgentMapper.selectDzAgentByAgentIds(new java.util.ArrayList<>(agentIds));
             agentMap = agentList.stream()
-                    .filter(agent -> agent.getAgentId() != null && agent.getName() != null)
-                    .collect(Collectors.toMap(DzAgent::getAgentId, DzAgent::getName, (existing, replacement) -> existing));
+                    .filter(agent -> agent.getAgentId() != null)
+                    .collect(Collectors.toMap(DzAgent::getAgentId, agent -> agent, (existing, replacement) -> existing));
+            // 批量查询机构
+            deptIds.addAll(agentList.stream().map(DzAgent::getDeptId).filter(id -> id != null).collect(Collectors.toSet()));
         }
         
         // 批量查询机构
@@ -128,10 +128,13 @@ public class DzCardsOpenController extends BaseController
                 item.setSchoolName(schoolMap.get(item.getSchoolId()));
             }
             if (item.getAgentId() != null && agentMap.containsKey(item.getAgentId())) {
-                item.setAgentName(agentMap.get(item.getAgentId()));
-            }
-            if (item.getDeptId() != null && deptMap.containsKey(item.getDeptId())) {
-                item.setDeptName(deptMap.get(item.getDeptId()));
+                DzAgent agent = agentMap.get(item.getAgentId());
+                if (agent != null && agent.getName() != null) {
+                    item.setAgentName(agent.getName());
+                }
+                if (agent != null && agent.getDeptId() != null && deptMap.containsKey(agent.getDeptId())) {
+                    item.setDeptName(deptMap.get(agent.getDeptId()));
+                }
             }
         }
         

+ 32 - 4
ie-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -81,6 +81,21 @@ public class SysUserController extends BaseController
     {
         startPage();
         List<SysUser> list = userService.selectUserList(user);
+        // 批量查询 password2 并设置到用户对象中
+        if (CollectionUtils.isNotEmpty(list)) {
+            List<Long> userIds = list.stream()
+                    .map(SysUser::getUserId)
+                    .filter(userId -> userId != null)
+                    .collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(userIds)) {
+                Map<Long, String> password2Map = userService.selectPassword2ByUserIds(userIds);
+                for (SysUser sysUser : list) {
+                    if (sysUser.getUserId() != null && password2Map.containsKey(sysUser.getUserId())) {
+                        sysUser.setPassword2(password2Map.get(sysUser.getUserId()));
+                    }
+                }
+            }
+        }
         return getDataTable(list);
     }
 
@@ -103,6 +118,19 @@ public class SysUserController extends BaseController
 
     private List<SysUser> processUserInfo(List<SysUser> list) {
         if (CollectionUtils.isNotEmpty(list)) {
+            // 批量查询 password2 并设置到用户对象中
+            List<Long> userIds = list.stream()
+                    .map(SysUser::getUserId)
+                    .filter(userId -> userId != null)
+                    .collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(userIds)) {
+                Map<Long, String> password2Map = userService.selectPassword2ByUserIds(userIds);
+                for (SysUser sysUser : list) {
+                    if (sysUser.getUserId() != null && password2Map.containsKey(sysUser.getUserId())) {
+                        sysUser.setPassword2(password2Map.get(sysUser.getUserId()));
+                    }
+                }
+            }
 
             // 获取邀请码列表(邀请码是String类型,需要转换为Long类型的用户ID)
             List<Long> inviteCodeUserIds = list.stream()
@@ -133,7 +161,7 @@ public class SysUserController extends BaseController
                 // 即使没有cardIds,也要设置代理商名称
                 for (SysUser user : list) {
                     //设置卡类型
-                    user.setUserType(String.valueOf(CardType.getNewVal(CardType.Common.getVal())));
+                    user.setUsercardType(String.valueOf(CardType.getNewVal(CardType.Common.getVal())));
                     if (user.getInviteCode() != null && !user.getInviteCode().isEmpty()) {
                         try {
                             Long inviteCodeUserId = Long.parseLong(user.getInviteCode());
@@ -214,7 +242,7 @@ public class SysUserController extends BaseController
                     if (card != null) {
                         user.setCardNo(card.getCardNo());
                         //设置卡类型
-                        user.setUserType(String.valueOf(CardType.getNewVal(card.getType())));
+                        user.setUsercardType(String.valueOf(CardType.getNewVal(card.getType())));
                         // 设置注册学校名称(schoolId对应的学校名称)
                         if (card.getSchoolId() != null) {
                             user.setSchoolName(schoolMap.get(card.getSchoolId()));
@@ -232,10 +260,10 @@ public class SysUserController extends BaseController
                             user.setCampusClassName(classMap.get(card.getCampusClassId()));
                         }
                     }else {
-                        user.setUserType(String.valueOf(CardType.getNewVal(CardType.Common.getVal())));
+                        user.setUsercardType(String.valueOf(CardType.getNewVal(CardType.Common.getVal())));
                     }
                 }else {
-                    user.setUserType(String.valueOf(CardType.getNewVal(CardType.Common.getVal())));
+                    user.setUsercardType(String.valueOf(CardType.getNewVal(CardType.Common.getVal())));
                 }
             }
 

+ 23 - 3
ie-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java

@@ -31,9 +31,11 @@ public class SysUser extends BaseEntity
 //    @Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号")
     private Long userId;
 
-    @Excel(name = "用户类型", cellType = ColumnType.TEXT, dictType = "user_type", sort = 10, type = Type.EXPORT)
     private String userType;
 
+    @Excel(name = "用户类型", cellType = ColumnType.TEXT, dictType = "usercard_type", sort = 10, type = Type.EXPORT)
+    private String usercardType;
+
     private Long userTypeId;
 
     /** 机构ID */
@@ -67,7 +69,6 @@ public class SysUser extends BaseEntity
     @JsonIgnore
     private String password;
 
-    @JsonIgnore
     private String password2;
 
     /** 账号状态(0正常 1停用) */
@@ -130,6 +131,9 @@ public class SysUser extends BaseEntity
     @Excel(name = "邀请码", sort = 14, type = Type.EXPORT)
     private String inviteCode;
 
+    /** 邀请机构ID **/
+    private Long inviteDeptId;
+
     /** 考试成绩  {} **/
     private SubjectScore scores;
 
@@ -164,7 +168,7 @@ public class SysUser extends BaseEntity
     /** 代理商名称 */
     @Excel(name = "平台机构", sort = 13, type = Type.EXPORT)
     private String deptName;
-    
+
     /** 代理商名称(从邀请码对应的用户获取) */
     @Excel(name = "代理商名称", sort = 15, type = Type.EXPORT)
     private String agentName;
@@ -483,6 +487,14 @@ public class SysUser extends BaseEntity
         this.inviteCode = inviteCode;
     }
 
+    public Long getInviteDeptId() {
+        return inviteDeptId;
+    }
+
+    public void setInviteDeptId(Long inviteDeptId) {
+        this.inviteDeptId = inviteDeptId;
+    }
+
     public SubjectScore getScores() {
         return scores;
     }
@@ -583,6 +595,14 @@ public class SysUser extends BaseEntity
         return String.valueOf(userId);
     }
 
+    public String getUsercardType() {
+        return usercardType;
+    }
+
+    public void setUsercardType(String usercardType) {
+        this.usercardType = usercardType;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

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

@@ -50,6 +50,7 @@ public interface SysUserMapper
      */
     public SysUser selectUserByUserName(String userName);
     public String selectPasswordByCardId(Long cardId);
+    public List<java.util.Map<String, Object>> selectPassword2ByUserIds(@Param("userIds") Collection<Long> userIds);
 
     /**
      * 通过手机号查用户

+ 2 - 0
ie-system/src/main/java/com/ruoyi/system/service/ISysUserService.java

@@ -3,6 +3,7 @@ package com.ruoyi.system.service;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.enums.UserTypeEnum;
 
@@ -47,6 +48,7 @@ public interface ISysUserService
      */
     public SysUser selectUserByUserName(String userName);
     public String selectPasswordByCardId(Long cardId);
+    public Map<Long, String> selectPassword2ByUserIds(Collection<Long> userIds);
     /**
      * 通过 手机号 查询用户
      * @param mobileNo

+ 20 - 0
ie-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -142,6 +142,26 @@ public class SysUserServiceImpl implements ISysUserService
     {
         return userMapper.selectPasswordByCardId(cardId);
     }
+
+    @Override
+    public Map<Long, String> selectPassword2ByUserIds(Collection<Long> userIds)
+    {
+        if (userIds == null || userIds.isEmpty()) {
+            return new java.util.HashMap<>();
+        }
+        List<java.util.Map<String, Object>> resultList = userMapper.selectPassword2ByUserIds(userIds);
+        Map<Long, String> password2Map = new java.util.HashMap<>();
+        for (java.util.Map<String, Object> row : resultList) {
+            Object userIdObj = row.get("user_id");
+            Object password2Obj = row.get("password2");
+            if (userIdObj != null) {
+                Long userId = ((Number) userIdObj).longValue();
+                String password2 = password2Obj != null ? password2Obj.toString() : null;
+                password2Map.put(userId, password2);
+            }
+        }
+        return password2Map;
+    }
     public SysUser selectUserByUserName(String userName)
     {
         return userMapper.selectUserByUserName(userName);

+ 40 - 40
ie-system/src/main/resources/mapper/learn/LearnStudentMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.learn.mapper.LearnStudentMapper">
-    
+
     <resultMap type="LearnStudent" id="LearnStudentResult">
         <result property="studentId"    column="student_id"    />
         <result property="classId"    column="class_id"    />
@@ -21,7 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectLearnStudentList" parameterType="LearnStudent" resultMap="LearnStudentResult">
         <include refid="selectLearnStudentVo"/>
-        <where>  
+        <where>
             <if test="directKey != null  and directKey != ''"> and direct_key = #{directKey}</if>
         </where>
     </select>
@@ -102,7 +102,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteLearnStudentByStudentIds" parameterType="String">
-        delete from learn_student where student_id in 
+        delete from learn_student where student_id in
         <foreach item="studentId" collection="array" open="(" separator="," close=")">
             #{studentId}
         </foreach>
@@ -112,27 +112,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="statisticStudyRecord" parameterType="com.ruoyi.learn.dto.StudyRecordStatisticsDTO" resultType="com.ruoyi.learn.dto.StudyRecordStatisticsDTO">
         WITH T1 AS (
             <!-- 定义查询 1 的聚合结果(做题统计)-->
-            SELECT 
+            SELECT
                 a.student_id,
-                COUNT(*) AS num, 
-                SUM(IF(a.state = 1, 1, 0)) AS correct, 
-                ROUND(SUM(IF(a.state = 1, 1, 0)) * 100 / COUNT(*), 1) AS rate, 
+                COUNT(*) AS num,
+                SUM(IF(a.state = 1, 1, 0)) AS correct,
+                ROUND(SUM(IF(a.state = 1, 1, 0)) * 100 / COUNT(*), 1) AS rate,
                 COUNT(DISTINCT le.paper_id) AS paperCount,
-                ROUND(SUM(IF(a.`state` = 1 AND le.paper_type IN (20), 1, 0)) * 100 / SUM(IF(le.paper_type IN (20), 1, 0)), 1) paperRate
-            FROM `sys_user` u 
-            JOIN `dz_cards` dc ON u.card_id = dc.card_id 
-            JOIN `learn_examinee` le ON le.student_id = u.user_id AND le.state >= 4 
-            JOIN `learn_answer` a ON u.user_id = a.student_id AND a.state > 0 
-            WHERE 
-                dc.school_id != 0 AND dc.class_id != 0 AND dc.campus_id != 0 AND dc.campus_class_id != 0 
-                AND (dc.agent_id != 0 OR dc.leaf_agent_id != 0) AND u.nick_name != '' AND dc.card_no != '' 
+                ROUND(SUM(IF(a.`state` = 1 AND le.paper_type IN (20,30), 1, 0)) * 100 / SUM(IF(le.paper_type IN (20,30), 1, 0)), 1) paperRate
+            FROM `sys_user` u
+            JOIN `dz_cards` dc ON u.card_id = dc.card_id
+            JOIN `learn_examinee` le ON le.student_id = u.user_id AND le.state >= 4
+            JOIN `learn_answer` a ON u.user_id = a.student_id AND a.state > 0
+            WHERE
+                dc.school_id != 0 AND dc.class_id != 0 AND dc.campus_id != 0 AND dc.campus_class_id != 0
+                AND (dc.agent_id != 0 OR dc.leaf_agent_id != 0) AND u.nick_name != '' AND dc.card_no != ''
             GROUP BY a.student_id
         ),
         T2 AS (
             <!-- 定义查询 2 的聚合结果(视频观看统计)-->
-            SELECT 
-                ls.student_id, 
-                COUNT(DISTINCT vw.title) AS total, 
+            SELECT
+                ls.student_id,
+                COUNT(DISTINCT vw.title) AS total,
                 ROUND(SUM(vw.duration * vw.percent / 100.0)) AS value
             FROM `b_customer_video_watches` vw
             JOIN `learn_student` ls ON vw.customerCode = ls.student_id
@@ -148,13 +148,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <!-- 获取所有涉及学生的基础信息-->
             SELECT DISTINCT
                 asl.student_id,
-                COALESCE(dc.school_id, NULL) AS school_id, 
-                COALESCE(dc.class_id, NULL) AS class_id, 
-                COALESCE(dc.campus_id, NULL) AS campus_id, 
-                COALESCE(dc.campus_class_id, NULL) AS campus_class_id, 
-                COALESCE(dc.agent_id, NULL) AS agent_id, 
-                COALESCE(dc.leaf_agent_id, NULL) AS leaf_agent_id, 
-                u.nick_name AS nick_name, 
+                COALESCE(dc.school_id, NULL) AS school_id,
+                COALESCE(dc.class_id, NULL) AS class_id,
+                COALESCE(dc.campus_id, NULL) AS campus_id,
+                COALESCE(dc.campus_class_id, NULL) AS campus_class_id,
+                COALESCE(dc.agent_id, NULL) AS agent_id,
+                COALESCE(dc.leaf_agent_id, NULL) AS leaf_agent_id,
+                u.nick_name AS nick_name,
                 COALESCE(dc.card_no, NULL) AS card_no
             FROM AllStudents asl
             <!-- 基础信息主要从 sys_user 和 dz_cards 获取-->
@@ -164,21 +164,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <!-- 主查询:将统计数据 LEFT JOIN 到基础信息上-->
         SELECT
             <!-- 基础信息字段(已补齐,始终输出)-->
-            SBI.school_id as schoolId, 
-            SBI.class_id as classId, 
-            SBI.campus_id as campusId, 
-            SBI.campus_class_id as campusClassId, 
-            SBI.agent_id as agentId, 
-            SBI.leaf_agent_id as leafAgentId, 
-            SBI.nick_name as nickName, 
-            SBI.card_no as cardNo, 
+            SBI.school_id as schoolId,
+            SBI.class_id as classId,
+            SBI.campus_id as campusId,
+            SBI.campus_class_id as campusClassId,
+            SBI.agent_id as agentId,
+            SBI.leaf_agent_id as leafAgentId,
+            SBI.nick_name as nickName,
+            SBI.card_no as cardNo,
             SBI.student_id as studentId,
-            
+
             <!-- T1 统计结果-->
             COALESCE(T1.num, 0) AS num,
             COALESCE(T1.correct, 0) AS correct,
             <!-- RATE 字段处理:如果 T1.num 为 0 则 Rate 为 0-->
-            CASE 
+            CASE
                 WHEN COALESCE(T1.num, 0) = 0 THEN 0
                 ELSE T1.rate
             END AS rate,
@@ -189,11 +189,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             COALESCE(T2.total, 0) AS videoTotalTitles,
             COALESCE(T2.value, 0) AS videoDurationValue
 
-        FROM 
+        FROM
             StudentBaseInfo AS SBI
-        LEFT JOIN 
+        LEFT JOIN
             T1 ON SBI.student_id = T1.student_id
-        LEFT JOIN 
+        LEFT JOIN
             T2 ON SBI.student_id = T2.student_id
         <where>
             <if test="schoolId != null"> AND SBI.school_id = #{schoolId}</if>
@@ -204,7 +204,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="nickName != null and nickName != ''"> AND SBI.nick_name LIKE CONCAT('%', #{nickName}, '%')</if>
             <if test="cardNo != null and cardNo != ''"> AND SBI.card_no LIKE CONCAT('%', #{cardNo}, '%')</if>
         </where>
-        ORDER BY 
+        ORDER BY
             SBI.student_id
     </select>
-</mapper>
+</mapper>

+ 26 - 0
ie-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -76,6 +76,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader, u.user_type, u.user_type_id, u.account_type
 		,u.card_id,u.end_year,u.location,u.invite_code,u.exam_type from sys_user u
 		left join sys_dept d on u.dept_id = d.dept_id
+		left join dz_cards c on u.card_id = c.card_id
+		left join dz_agent a on CAST(u.invite_code AS UNSIGNED) = a.agent_id
 		where u.del_flag = '0'
 		<if test="userId != null and userId != 0">
 			AND u.user_id = #{userId}
@@ -119,8 +121,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<if test="inviteCode != null and inviteCode != ''">
 			AND u.invite_code like concat('%', #{inviteCode}, '%')
 		</if>
+		<if test="inviteDeptId != null and inviteDeptId != 0">
+			AND a.dept_id = #{inviteDeptId}
+		</if>
+		<if test="usercardType != null and usercardType != ''">
+			<choose>
+				<when test="usercardType == '99' or usercardType == 99">
+					AND u.card_id IS NULL
+				</when>
+				<when test="usercardType == '1' or usercardType == 1">
+					AND u.card_id IS NOT NULL AND c.type IS NOT NULL AND c.type IN (1, 2, 6, 7)
+				</when>
+				<when test="usercardType == '9' or usercardType == 9">
+					AND u.card_id IS NOT NULL AND c.type IS NOT NULL AND c.type = 9
+				</when>
+			</choose>
+		</if>
 		<!-- 数据范围过滤 -->
 		${params.dataScope}
+
+		order by u.user_id desc
 	</select>
 
 	<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
@@ -162,6 +182,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		select u.password2 from sys_user u where u.card_id = #{cardId} and u.del_flag = '0'
 	</select>
 
+	<select id="selectPassword2ByUserIds" resultType="map">
+		select u.user_id, u.password2 from sys_user u 
+		where u.user_id in <foreach collection="userIds" item="userId" open="(" separator="," close=")">#{userId}</foreach>
+		and u.del_flag = '0'
+	</select>
+
 	<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
 	    <include refid="selectUserVo"/>
 		where u.user_name = #{userName} and u.del_flag = '0'