Crazy 8 mēneši atpakaļ
vecāks
revīzija
e4b81e65ac
16 mainītis faili ar 368 papildinājumiem un 97 dzēšanām
  1. 6 0
      yudao-module-system/yudao-module-system-biz/pom.xml
  2. 53 25
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java
  3. 1 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.http
  4. 134 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.java
  5. 24 31
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/studentAttendance/StudentAttendanceController.java
  6. 54 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/studentAttendance/vo/StudentAttendanceEmailVO.java
  7. 2 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/studentAttendance/vo/StudentAttendanceRespVO.java
  8. 42 17
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java
  9. 2 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java
  10. 0 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java
  11. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java
  12. 2 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/studentAttendance/StudentAttendanceMapper.java
  13. 8 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java
  14. 2 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java
  15. 4 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java
  16. 31 12
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java

+ 6 - 0
yudao-module-system/yudao-module-system-biz/pom.xml

@@ -130,6 +130,12 @@
             <version>2.2.0-jdk8-snapshot</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+            <version>2.15.4</version> <!-- 使用你的 Jackson 版本 -->
+        </dependency>
+
 
     </dependencies>
 

+ 53 - 25
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/DeptController.java

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqV
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.userAchievement.vo.UserAchievementPageReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
@@ -15,6 +16,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.userAchievement.UserAchieve
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.user.AdminUserService;
 import cn.iocoder.yudao.module.system.service.userAchievement.UserAchievementService;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -99,27 +101,56 @@ public class DeptController {
         return success(BeanUtils.toBean(list, DeptSimpleRespVO.class));
     }
 
+
     @GetMapping("/get")
     @Operation(summary = "获得部门信息")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthorize("@ss.hasPermission('system:dept:query')")
     public CommonResult<DeptRespVO> getDept(@RequestParam("id") Long id) {
+        // 获取部门信息
         DeptDO dept = deptService.getDept(id);
-        //新加的负责人用户信息
-        DeptRespVO newDept =BeanUtils.toBean(dept, DeptRespVO.class);
-        List<Long> leaderUserIds = newDept.getLeaderUserId();
-        List<AdminUserDO> userList =  new ArrayList<>();
-        if (leaderUserIds.size()>0) {
-            for (Long leaderUserId : leaderUserIds) {
-                AdminUserDO user = (leaderUserId != null) ? adminUserService.getUser(leaderUserId) : null;
-                userList.add(user);
-            }
+        if (dept == null) {
+            return null;
+        }
+
+        DeptRespVO newDept = BeanUtils.toBean(dept, DeptRespVO.class);
+
+        // 获取负责人用户信息
+        if (CollectionUtils.isNotEmpty(newDept.getLeaderUserId())) {
+            List<AdminUserDO> userList = newDept.getLeaderUserId().stream()
+                    .map(leaderUserId -> leaderUserId != null ? adminUserService.getUser(leaderUserId) : null)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toList());
             newDept.setUser(userList);
         }
+        // 获取工作间下所有用户
+        UserPageReqVO reqVO = new UserPageReqVO();
+        List<AdminUserDO> allUser = adminUserService.getUserPage(reqVO.setDeptId(id)).getList();
+
+        List<AdminUserDO> student = new ArrayList<>();
+        List<AdminUserDO> supervisor = new ArrayList<>();
+        // 合并筛选逻辑,避免重复遍历
+        for (AdminUserDO ad : allUser) {
+            if ("1".equals(ad.getUserType())) {
+                student.add(ad);
+            } else if ("3".equals(ad.getUserType())) {
+                supervisor.add(ad);
+            }
+        }
+        // 获取用户的成绩信息
+        UserAchievementPageReqVO pageReqVO = new UserAchievementPageReqVO();
+        pageReqVO.setDeptId(id);
+        List<UserAchievementDO> userAchievements = userAchievementService.getUserAchievementPage(pageReqVO).getList();
+
+        newDept.setSupervisorNum(String.valueOf(supervisor.size()));
+        newDept.setStudentNum(String.valueOf(student.size()));
+        newDept.setUserAchievements(userAchievements);
+
         return success(newDept);
     }
 
 
+
     @GetMapping("/GetUserDept")
     @Operation(summary = "获得登录人员工作间信息")
     @PreAuthorize("@ss.hasPermission('system:dept:selfQuery')")
@@ -132,39 +163,36 @@ public class DeptController {
             return null;
         }
 
+        DeptRespVO newDept = BeanUtils.toBean(dept, DeptRespVO.class);
         // 获取负责人用户信息
-        DeptRespVO newDept =BeanUtils.toBean(dept, DeptRespVO.class);
-        List<Long> leaderUserIds = newDept.getLeaderUserId();
-        List<AdminUserDO> userList =  new ArrayList<>();
-        if (leaderUserIds.size()>0) {
-            for (Long leaderUserId : leaderUserIds) {
-                AdminUserDO user = (leaderUserId != null) ? adminUserService.getUser(leaderUserId) : null;
-                userList.add(user);
-            }
+        if (CollectionUtils.isNotEmpty(newDept.getLeaderUserId())) {
+            List<AdminUserDO> userList = newDept.getLeaderUserId().stream()
+                    .map(leaderUserId -> leaderUserId != null ? adminUserService.getUser(leaderUserId) : null)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toList());
             newDept.setUser(userList);
         }
-
-        // 获取工作间下所有用户
         List<AdminUserDO> allUser = adminUserService.getDeptUser();
+
         List<AdminUserDO> student = new ArrayList<>();
         List<AdminUserDO> supervisor = new ArrayList<>();
-
+        // 合并筛选逻辑,避免重复遍历
         for (AdminUserDO ad : allUser) {
-            if (ad.getUserType().equals("1")) {//仅在校生
+            if ("1".equals(ad.getUserType())) {
                 student.add(ad);
-            } else if (ad.getUserType().equals("3")) {
+            } else if ("3".equals(ad.getUserType())) {
                 supervisor.add(ad);
             }
         }
-
-        UserAchievementPageReqVO pageReqVO =new UserAchievementPageReqVO();
+        // 获取用户的成绩信息
+        UserAchievementPageReqVO pageReqVO = new UserAchievementPageReqVO();
         pageReqVO.setDeptId(deptId);
         List<UserAchievementDO> userAchievements = userAchievementService.getUserAchievementPage(pageReqVO).getList();
+
         newDept.setSupervisorNum(String.valueOf(supervisor.size()));
         newDept.setStudentNum(String.valueOf(student.size()));
         newDept.setUserAchievements(userAchievements);
 
-        System.out.println(newDept);
         return success(newDept);
     }
 

+ 1 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.http

@@ -6,7 +6,7 @@ tenant-id: {{adminTenentId}}
 
 {
   "templateCode": "test_01",
-  "mail": "7685413@qq.com",
+  "mail": "1157853982@qq.com",
   "templateParams": {
     "key01": "value01",
     "key02": "value02"

+ 134 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.java

@@ -4,18 +4,35 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.*;
+import cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo.StudentAttendanceEmailVO;
+import cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo.StudentAttendancePageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo.StudentAttendanceRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.studentAttendance.StudentAttendanceDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.mail.MailSendService;
 import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
+import cn.iocoder.yudao.module.system.service.studentAttendance.StudentAttendanceService;
+import cn.iocoder.yudao.module.system.service.user.AdminUserService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@@ -29,6 +46,68 @@ public class MailTemplateController {
     private MailTemplateService mailTempleService;
     @Resource
     private MailSendService mailSendService;
+    @Resource
+    private AdminUserService adminUserService;
+    @Resource
+    private StudentAttendanceService studentAttendanceService;
+    @Resource
+    private DeptService deptService;
+
+    @Scheduled(cron = "0 30 22 * * ?") // 每天晚上 22:30
+    @Operation(summary = "定时发送邮件给导师")
+    public void sendMailToFamilyScheduled() {
+        // 创建结果对象并设置属性
+        UserPageReqVO reqVO = new UserPageReqVO();
+        reqVO.setUserType("2");
+        List<AdminUserDO> TeacherList = adminUserService.getUserPage(reqVO).getList();
+        StudentAttendancePageReqVO pageReqVO =new StudentAttendancePageReqVO();
+        Map<String, Object> templateParams =new HashMap<>();//模板参数设置
+        // 获取当前这天
+        LocalDate today = LocalDate.now();
+        for (AdminUserDO teacher : TeacherList) {
+            pageReqVO.setDate(today);
+            List<StudentAttendanceEmailVO> normalList = BeanUtils.toBean(
+                    studentAttendanceService.getStudentAttendancePage(pageReqVO.setDeptId(String.valueOf(teacher.getDeptId()))).getList(),
+                    StudentAttendanceEmailVO.class
+            );
+            List<StudentAttendanceEmailVO> errorList = BeanUtils.toBean(
+                    studentAttendanceService.getStudentAttendanceErrorPage(pageReqVO.setDeptId(String.valueOf(teacher.getDeptId()))).getList(),
+                    StudentAttendanceEmailVO.class
+            );
+
+            StringBuilder normalListBuilder = new StringBuilder();
+            for (StudentAttendanceEmailVO attendance : normalList) {
+                normalListBuilder.append("学生id: ").append(attendance.getId())
+                        .append(", 学生姓名: ").append(attendance.getStudentName())
+                        .append(", 学生学号: ").append(attendance.getUserNumber() != null ? attendance.getUserNumber() : "无")
+                        .append(", 工作间名称: ").append(deptService.getDept(Long.valueOf(attendance.getDeptId())).getName()) // 这里需要映射为实际工作间名称
+                        .append(", 日期: ").append(attendance.getDate())
+                        .append(", 打卡时间: ").append(attendance.getClockInTime() != null ? attendance.getClockInTime() : "未打卡")
+                        .append(", 创建时间: ").append(attendance.getCreateTime())
+                        .append("<br/>");
+            }
+
+            StringBuilder errorListBuilder = new StringBuilder();
+            for (StudentAttendanceEmailVO attendance : errorList) {
+                errorListBuilder.append("学生id: ").append(attendance.getId())
+                        .append(", 学生姓名: ").append(attendance.getStudentName())
+                        .append(", 学生学号: ").append(attendance.getUserNumber() != null ? attendance.getUserNumber() : "无")
+                        .append(", 工作间名称: ").append(deptService.getDept(Long.valueOf(attendance.getDeptId())).getName())
+                        .append(", 日期: ").append(attendance.getDate())
+                        .append(", 打卡时间: ").append(attendance.getClockInTime() != null ? attendance.getClockInTime() : "未打卡")
+                        .append(", 创建时间: ").append(attendance.getCreateTime())
+                        .append("<br/>");
+            }
+
+            templateParams.put("normalList", normalListBuilder.toString());
+            templateParams.put("errorList", errorListBuilder.toString());
+
+            mailSendService.sendSingleMailToMember(teacher.getEmail(), teacher.getId(),"attendance-list", templateParams);
+        }
+
+    }
+
+
 
     @PostMapping("/create")
     @Operation(summary = "创建邮件模版")
@@ -86,4 +165,59 @@ public class MailTemplateController {
                 sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams()));
     }
 
+
+    @PostMapping("/test")
+    @Operation(summary = "发送邮件给导师测试")
+    public void test() {
+        // 创建结果对象并设置属性
+        UserPageReqVO reqVO = new UserPageReqVO();
+        reqVO.setUserType("2");
+        List<AdminUserDO> TeacherList = adminUserService.getUserPage(reqVO).getList();//所有老师
+        StudentAttendancePageReqVO pageReqVO =new StudentAttendancePageReqVO();
+        // 获取当前这天
+        LocalDate today = LocalDate.now();
+        Map<String, Object> templateParams =new HashMap<>();//模板参数设置
+        for (AdminUserDO teacher : TeacherList) {
+            pageReqVO.setDate(today);
+            List<StudentAttendanceEmailVO> normalList = BeanUtils.toBean(
+                    studentAttendanceService.getStudentAttendancePage(pageReqVO.setDeptId(String.valueOf(teacher.getDeptId()))).getList(),
+                    StudentAttendanceEmailVO.class
+            );
+            List<StudentAttendanceEmailVO> errorList = BeanUtils.toBean(
+                    studentAttendanceService.getStudentAttendanceErrorPage(pageReqVO.setDeptId(String.valueOf(teacher.getDeptId()))).getList(),
+                    StudentAttendanceEmailVO.class
+            );
+
+            StringBuilder normalListBuilder = new StringBuilder();
+            for (StudentAttendanceEmailVO attendance : normalList) {
+                normalListBuilder.append("学生id: ").append(attendance.getId())
+                        .append(", 学生姓名: ").append(attendance.getStudentName())
+                        .append(", 学生学号: ").append(attendance.getUserNumber() != null ? attendance.getUserNumber() : "无")
+                        .append(", 工作间名称: ").append(deptService.getDept(Long.valueOf(attendance.getDeptId())).getName())
+                        .append(", 日期: ").append(attendance.getDate())
+                        .append(", 打卡时间: ").append(attendance.getClockInTime() != null ? attendance.getClockInTime() : "未打卡")
+                        .append(", 创建时间: ").append(attendance.getCreateTime())
+                        .append("<br/>");
+            }
+
+            StringBuilder errorListBuilder = new StringBuilder();
+            for (StudentAttendanceEmailVO attendance : errorList) {
+                errorListBuilder.append("学生id: ").append(attendance.getId())
+                        .append(", 学生姓名: ").append(attendance.getStudentName())
+                        .append(", 学生学号: ").append(attendance.getUserNumber() != null ? attendance.getUserNumber() : "无")
+                        .append(", 工作间名称: ").append(deptService.getDept(Long.valueOf(attendance.getDeptId())).getName())
+                        .append(", 日期: ").append(attendance.getDate())
+                        .append(", 打卡时间: ").append(attendance.getClockInTime() != null ? attendance.getClockInTime() : "未打卡")
+                        .append(", 创建时间: ").append(attendance.getCreateTime())
+                        .append("<br/>");
+            }
+
+            templateParams.put("normalList", normalListBuilder.toString());
+            templateParams.put("errorList", errorListBuilder.toString());
+
+            mailSendService.sendSingleMailToMember("2653015384@qq.com", teacher.getId(), "attendance-list", templateParams);
+        }
+
+    }
+
 }

+ 24 - 31
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/studentAttendance/StudentAttendanceController.java

@@ -16,11 +16,13 @@ import io.swagger.v3.oas.annotations.Operation;
 import javax.validation.constraints.*;
 import javax.validation.*;
 import javax.servlet.http.*;
+import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.io.IOException;
+import java.util.stream.Collectors;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -216,45 +218,36 @@ public class StudentAttendanceController {
     @Operation(summary = "周出勤统计")
     @PreAuthorize("@ss.hasPermission('system:student-attendance:day')")
     public CommonResult<weekendAttendanceResVO> getWeekendAttendance () {
-        List<AdminUserDO>studentList = adminUserService.getAllUserList();
-        //获取当天所在的一周内
+        UserPageReqVO reqVO = new UserPageReqVO();
+        reqVO.setUserType("1");
+        List<AdminUserDO> studentList = adminUserService.getUserPage(reqVO).getList();
+
+        // 获取当前这周
         LocalDate today = LocalDate.now();
-        LocalDate startDate = today.with(TemporalAdjusters.previousOrSame(java.time.DayOfWeek.MONDAY));
-        LocalDate endDate = today.with(TemporalAdjusters.nextOrSame(java.time.DayOfWeek.SUNDAY));
-        List<AdminUserDO> errorList =new ArrayList<>();
-        List<AdminUserDO> normalList =new ArrayList<>();
-        List<String> errorNameList =new ArrayList<>();
-        List<String> normalNameList =new ArrayList<>();
+        LocalDate startDate = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+        LocalDate endDate = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
+        List<AdminUserDO> errorList = new ArrayList<>();
+        List<AdminUserDO> normalList = new ArrayList<>();
+
         for (AdminUserDO student : studentList) {
             if ("1".equals(student.getUserType())) {
                 List<StudentAttendanceDO> attendanceList = studentAttendanceService.getStudentAttendanceInRange(student.getUserNumber(), startDate, endDate);
-                boolean hasWarning = false; // 标志位,表示是否有未打卡
-                if (attendanceList != null && !attendanceList.isEmpty()) {
-                    for (StudentAttendanceDO attendance : attendanceList) {
-                        if ("1".equals(attendance.getClockInStatus())) { // 有一个未打卡就添加
-                            errorList.add(student);
-                            errorNameList.add(student.getNickname());
-                            hasWarning = true; // 设置标志为 true
-                            System.out.println("异常的" + student.getUsername());
-                            break; // 跳出循环
-                        }
-                    }
-                    // 只有在没有警告的情况下才添加到正常列表
-                    if (!hasWarning) {
-                        normalList.add(student);
-                        normalNameList.add(student.getNickname());
-                        System.out.println("正常的: " + student.getUsername());
-                    }
+                boolean hasWarning = attendanceList != null && attendanceList.stream().anyMatch(attendance -> "1".equals(attendance.getClockInStatus()));
+
+                if (hasWarning) {
+                    errorList.add(student); // 有未打卡记录
+                } else {
+                    normalList.add(student); // 没有未打卡记录
                 }
             }
         }
-        Integer errorNum =errorList.size();
-        Integer normalNum =normalList.size();
+        // 创建结果对象并设置属性
         weekendAttendanceResVO result = new weekendAttendanceResVO();
-        result.setErrorNum(errorNum);
-        result.setNormalNum(normalNum);
-        result.setErrorNameList(errorNameList);
-        result.setNormalNameList(normalNameList);
+        result.setErrorNum(errorList.size());
+        result.setNormalNum(normalList.size());
+        result.setErrorNameList(errorList.stream().map(AdminUserDO::getNickname).collect(Collectors.toList()));
+        result.setNormalNameList(normalList.stream().map(AdminUserDO::getNickname).collect(Collectors.toList()));
+
         return success(result);
     }
 

+ 54 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/studentAttendance/vo/StudentAttendanceEmailVO.java

@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 学生考勤记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class StudentAttendanceEmailVO {
+
+    @Schema(description = "自增id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30731")
+    private Integer id;
+
+//    @Schema(description = "学生id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8981")
+//    @ExcelProperty("学生id")
+//    private Integer studentId;
+
+    @Schema(description = "学生名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+    private String studentName;
+
+    @Schema(description = "学生学号", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+    @ExcelProperty("学生学号")
+    private String userNumber;
+
+    @Schema(description = "工作间id", requiredMode = Schema.RequiredMode.REQUIRED, example = "22266")
+    @ExcelProperty("工作间id")
+    private String deptId;
+
+    @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("日期")
+    private String date;
+
+    @Schema(description = "打卡时间")
+    @ExcelProperty("打卡时间")
+    private String clockInTime;
+
+    @Schema(description = "打卡状态 0正常,1未打卡", example = "1")
+    @ExcelProperty("打卡状态 0正常,1未打卡")
+    private String clockInStatus;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private String createTime;
+
+    @Schema(description = "备注原因", example = "你猜")
+    @ExcelProperty("备注原因")
+    private String remark;
+
+}

+ 2 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/studentAttendance/vo/StudentAttendanceRespVO.java

@@ -42,8 +42,8 @@ public class StudentAttendanceRespVO {
     @ExcelProperty("打卡时间")
     private LocalDateTime clockInTime;
 
-    @Schema(description = "打卡状态 0正常,1迟到、2早退、3缺勤、4请假", example = "1")
-    @ExcelProperty("打卡状态 0正常,1迟到、2早退、3缺勤、4请假")
+    @Schema(description = "打卡状态 0正常,1未打卡", example = "1")
+    @ExcelProperty("打卡状态 0正常,1未打卡")
     private String clockInStatus;
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)

+ 42 - 17
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java

@@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.permission.PermissionService;
 import cn.iocoder.yudao.module.system.service.user.AdminUserService;
 
+import com.baomidou.mybatisplus.generator.IFill;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameters;
@@ -172,7 +173,24 @@ public class UserController {
                 pageResult.getTotal()));
     }
 
-    //lsq
+//    @GetMapping("/SchoolStudentPage")
+//    @Operation(summary = "获得在校学生分页列表")
+//    @PreAuthorize("@ss.hasPermission('system:user:SchoolStudentList')")
+//    public CommonResult<PageResult<UserRespVO>> getSchoolStudentPage(@Valid UserPageReqVO pageReqVO) {
+//        // 获得用户分页列表
+//        pageReqVO.setUserType("1");
+//        PageResult<AdminUserDO> pageResult = userService.getUserPage1(pageReqVO);
+//        if (CollUtil.isEmpty(pageResult.getList())) {
+//            return success(new PageResult<>(pageResult.getTotal()));
+//        }
+//        // 拼接数据
+//        Map<Long, DeptDO> deptMap = deptService.getDeptMap(
+//                convertList(pageResult.getList(), AdminUserDO::getDeptId));
+//        return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap),
+//                pageResult.getTotal()));
+//    }
+
+
     @GetMapping("/DeptTeacherPage")
     @Operation(summary = "获得工作间教师分页列表")
     @PreAuthorize("@ss.hasPermission('system:workroom:teacherList')")
@@ -189,7 +207,7 @@ public class UserController {
                 pageResult.getTotal()));
     }
 
-    //lsq
+
     @GetMapping("/DeptStudentPage")
     @Operation(summary = "获得工作间学生分页列表")//学院,导师
     @PreAuthorize("@ss.hasPermission('system:workroom:studentlist')")
@@ -207,6 +225,8 @@ public class UserController {
                 pageResult.getTotal()));
     }
 
+
+
     //lsq
     @GetMapping("/DeptUser")
     @Operation(summary = "获得工作间人员")
@@ -223,6 +243,19 @@ public class UserController {
         return success(deptUser);
     }
 
+    @GetMapping("/DeptSupervisor")
+    @Operation(summary = "获得工作间下的导师")
+    public CommonResult<List<AdminUserDO>> getDeptSupervisor(Long deptId) {
+        if (deptId ==null){
+            deptId =SecurityFrameworkUtils.getLoginUserDeptId();
+        }
+        UserPageReqVO reqVO =new UserPageReqVO();
+        reqVO.setDeptId(deptId);
+        reqVO.setUserType("3");
+        List<AdminUserDO> deptUser = userService.getUserPage(reqVO).getList();
+        return success(deptUser);
+    }
+
     //lsq学院和导师
     @GetMapping("/graduateStudentPage")
     @Operation(summary = "根据登录人获得毕业生分页列表")
@@ -293,7 +326,7 @@ public class UserController {
     public void importTemplate(HttpServletResponse response) throws IOException {
         // 手动创建导出 demo
         List<UserImportExcelVO> list = Arrays.asList(
-                UserImportExcelVO.builder().username("ceshi000").password("123456").deptId(1L).email("2456125438@qq.com").mobile("15601691300").deptId(114L)
+                UserImportExcelVO.builder().username("ceshi000").password("123456").email("2456125438@qq.com").mobile("15601691300").deptName("2#601")
                         .nickname("测试000").grade("2023级").userType("在校生").supervisor("教师01").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex())
                         .build()
         );
@@ -330,27 +363,19 @@ public class UserController {
     }
 
 
-
-
     @GetMapping("/getDetail")
     @Operation(summary = "基本信息展示")
     @PreAuthorize("@ss.hasPermission('system:user:homeDetail')")
     public CommonResult<Map<String,Integer>> getDetail() throws Exception {
-       List<AdminUserDO> userList =userService.getAllUserList();
-       List<AdminUserDO> studnetList = new ArrayList<>();
-       List<AdminUserDO> teacherList = new ArrayList<>();
-       DeptListReqVO reqVO =null;
-       for (AdminUserDO user :userList){
-           if ("1".equals(user.getUserType())){
-               studnetList.add(user);
-           }else if ("3".equals(user.getUserType())){
-               teacherList.add(user);
-           }
-       }
+        UserPageReqVO reqVO= new UserPageReqVO();
+        DeptListReqVO deptVO =new DeptListReqVO();
+       List<AdminUserDO> studnetList = userService.getUserPage(reqVO.setUserType("1")).getList();
+       List<AdminUserDO> teacherList =  userService.getUserPage(reqVO.setUserType("3")).getList();
+
        Integer studentNum =studnetList.size();
        Integer teacherNum =teacherList.size();
 
-      List<DeptDO>deptList= deptService.getDeptList(reqVO);
+      List<DeptDO>deptList= deptService.getDeptList(deptVO);
       Integer deptNum =deptList.size();
 
         Map<String, Integer> result = new HashMap<>();

+ 2 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserImportExcelVO.java

@@ -54,8 +54,8 @@ public class UserImportExcelVO {
     @ExcelProperty("专硕名称")
     private String masterType;
 
-    @ExcelProperty("工作间ID")
-    private Long deptId;
+    @ExcelProperty("工作间名称")
+    private String deptName;
 
     @ExcelProperty("学生导师名称")
     private String supervisor;

+ 0 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserRespVO.java

@@ -112,5 +112,4 @@ public class UserRespVO{
     private Long isGraduate;
 
 
-
 }

+ 3 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java

@@ -38,5 +38,8 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
     default List<DeptDO> selectListByParentId(Collection<Long> parentIds) {
         return selectList(DeptDO::getParentId, parentIds);
     }
+    default DeptDO selectByDeptName(String deptName) {
+        return selectOne(DeptDO::getName, deptName);
+    }
 
 }

+ 2 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/studentAttendance/StudentAttendanceMapper.java

@@ -38,6 +38,7 @@ public interface StudentAttendanceMapper extends BaseMapperX<StudentAttendanceDO
 
         // 添加查询条件
         queryWrapper.betweenIfPresent(StudentAttendanceDO::getClockInTime,reqVO.getCreateTime())
+                .eqIfPresent(StudentAttendanceDO::getDate,reqVO.getDate())
                 .selectAll(StudentAttendanceDO.class)
                 .selectAs(DeptDO::getName, StudentAttendanceDO::getDeptName)
                 .selectAs(AdminUserDO::getUserNumber, StudentAttendanceDO::getUserNumber)
@@ -71,6 +72,7 @@ public interface StudentAttendanceMapper extends BaseMapperX<StudentAttendanceDO
         MPJLambdaWrapperX<StudentAttendanceDO> queryWrapperX =new MPJLambdaWrapperX<>();
 
         queryWrapperX.betweenIfPresent(StudentAttendanceDO::getClockInTime,reqVO.getCreateTime())
+                .eqIfPresent(StudentAttendanceDO::getDate,reqVO.getDate())
                 .selectAll(StudentAttendanceDO.class)
                 .selectAs(DeptDO::getName, StudentAttendanceDO::getDeptName)
                 .selectAs(AdminUserDO::getUserNumber, StudentAttendanceDO::getUserNumber)
@@ -122,6 +124,4 @@ public interface StudentAttendanceMapper extends BaseMapperX<StudentAttendanceDO
     List<StudentAttendanceDO> getStudentAttendanceInRange(@Param("userNumber") String userNumber,
                                                           @Param("startDate") LocalDate startDate,
                                                           @Param("endDate") LocalDate endDate);
-
-
 }

+ 8 - 4
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.system.dal.mysql.user;
 
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
@@ -72,10 +73,11 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
         queryWrapperX.likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername())
                 .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile())
                 .likeIfPresent(AdminUserDO::getUserNumber,reqVO.getUserNumber())//学号查询
+                .eqIfPresent(AdminUserDO::getUserType,reqVO.getUserType())//类型查询
                 .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime())
                 .inIfPresent(AdminUserDO::getDeptId, deptIds)
-                .inSql(AdminUserDO::getId, "SELECT id FROM system_users WHERE user_type =1")
+                .inSql(AdminUserDO::getId, "SELECT id FROM system_users WHERE user_type IN (1,2)")
                 .orderByDesc(AdminUserDO::getId);
 
         if (roleIds.contains(113L)){//如果是教师,只找导师是登录的
@@ -112,18 +114,19 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
         PageResult<AdminUserDO> result = selectPage(reqVO, new LambdaQueryWrapperX<AdminUserDO>()
                 .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername())
                 .likeIfPresent(AdminUserDO::getUserNumber,reqVO.getUserNumber())//学号查询
+                .eqIfPresent(AdminUserDO::getUserType,reqVO.getUserType())//类型查询
                 .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile())
                 .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime())
                 .inIfPresent(AdminUserDO::getDeptId, deptIds)
-                .inSql(AdminUserDO::getId, "SELECT id FROM system_users WHERE user_type = 1")
+                .inSql(AdminUserDO::getId, "SELECT id FROM system_users WHERE user_type IN (1,2)")
                 .inSql(AdminUserDO::getDeptId, String.format("SELECT dept_id FROM system_users WHERE id = %d", loginID))
                 .orderByDesc(AdminUserDO::getId));
 
         return result;
     }
 
-    // lsq  根据登录人员查所有毕业学生
+    //   根据登录人员查所有毕业学生
     default PageResult<AdminUserDO> selectGraduateStudentPage(UserPageReqVO reqVO, Collection<Long> deptIds, Set<Long> roleIds,Long loginId) {
         LambdaQueryWrapperX<AdminUserDO> queryWrapper = new LambdaQueryWrapperX<AdminUserDO>()
                 // 找毕业生: 1. 本校, 2. 毕业生, 3. 老师
@@ -151,7 +154,7 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
         return selectList(queryWrapper);
     }
 
-    // lsq  查工作间下的用户列表
+    //  查工作间下的用户列表
     default List<AdminUserDO> selectDeptUser() {
         Long loginID = SecurityFrameworkUtils.getLoginUserId();
         LambdaQueryWrapperX<AdminUserDO> queryWrapper = (LambdaQueryWrapperX<AdminUserDO>) new LambdaQueryWrapperX<AdminUserDO>()
@@ -200,4 +203,5 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
         return success ? entity.getId() : null; // 返回插入的 ID 或 null
     }
 
+
 }

+ 2 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java

@@ -102,4 +102,6 @@ public interface DeptService {
 
     DeptDO getUserDept();
 
+    DeptDO getDeptByDeptName(String deptName);
+
 }

+ 4 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java

@@ -220,4 +220,8 @@ public class DeptServiceImpl implements DeptService {
         return deptMapper.selectLoginDept();
    }
 
+    @Override
+    public DeptDO getDeptByDeptName(String deptName){
+        return deptMapper.selectByDeptName(deptName);
+    }
 }

+ 31 - 12
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java

@@ -14,6 +14,7 @@ import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
 import cn.iocoder.yudao.module.infra.api.file.FileApi;
+import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO;
@@ -254,16 +255,18 @@ public class AdminUserServiceImpl implements AdminUserService {
     @Override
     public PageResult<AdminUserDO> getUserPage(UserPageReqVO reqVO) {
         PageResult<AdminUserDO> pageResult = userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId()));
-        // 循环处理每个毕业
+        // 循环处理每个
         for (AdminUserDO student : pageResult.getList()) {
-            // 根据 supervisorId 查询导师信息
-            if (student.getSupervisorId() != null) {
-                AdminUserDO supervisorUser = getUser(student.getSupervisorId());
-                String supervisor = supervisorUser.getNickname();
-                String mobile = supervisorUser.getMobile();
-                // 赋值给 对应 字段
-                student.setSupervisor(supervisor);
-                student.setSupervisorMobile(mobile);
+            // 根据 supervisorId
+            if ("1".equals(student.getUserType()) ||"2".equals(student.getUserType())) {
+                if (student.getSupervisorId() != null) {
+                    AdminUserDO supervisorUser = getUser(student.getSupervisorId());
+                    String supervisor = supervisorUser.getNickname();
+                    String mobile = supervisorUser.getMobile();
+                    // 赋值给 对应 字段
+                    student.setSupervisor(supervisor);
+                    student.setSupervisorMobile(mobile);
+                }
             }
         }
         return pageResult;
@@ -344,7 +347,6 @@ public class AdminUserServiceImpl implements AdminUserService {
 
     //<>
 
-
     @Override
     public AdminUserDO getUser(Long id) {
         return userMapper.selectById(id);
@@ -533,6 +535,18 @@ public class AdminUserServiceImpl implements AdminUserService {
         return userType;
     }
 
+    Long TransformDept(String deptName){
+        if (deptName==null){
+            return null;
+        }
+        DeptDO dept =  deptService.getDeptByDeptName(deptName);
+        Long deptId =null;
+        if (dept!=null) {
+             deptId = dept.getId();
+        }
+        return deptId;
+    }
+
     /**
      * 校验旧密码
      * @param id          用户 id
@@ -574,9 +588,14 @@ public class AdminUserServiceImpl implements AdminUserService {
 //                return;
 //            }
             // 2.1.2 校验,判断是否有不符合的原因
+
+            Long deptId = null; //工作间名称转id
+            if (importUser.getDeptName() != null && !importUser.getDeptName().isEmpty()) {
+                deptId = TransformDept(importUser.getDeptName());
+            }
             try {
                 validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(),
-                        importUser.getDeptId(), null, importUser.getSupervisor());
+                        deptId , null, importUser.getSupervisor());
             } catch (ServiceException ex) {
                 respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
                 return;
@@ -596,7 +615,7 @@ public class AdminUserServiceImpl implements AdminUserService {
                 }// 导师名称转id
                 newUser.setUserType(transformUserType); // 插入学生类型
                 newUser.setTenantId(1L);//设置租户编号
-
+                newUser.setDeptId(deptId);//设置工作间id
 
                 Long insertUserId = userMapper.insertAndGetId(newUser); // 执行插入用户数据