Browse Source

考勤统计

dzx 4 months ago
parent
commit
b1701abb11

+ 2 - 7
src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceStatisticsDto.java

@@ -60,9 +60,9 @@ public class AddAttendanceStatisticsDto implements Serializable {
     @ApiModelProperty("统计人数")
     private Integer personCount;
     /**
-    * 状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)
+    * 状态(0:数据统计中 1:统计完成 2:已解锁)
     */
-    @ApiModelProperty("状态(0:数据统计中 1:统计完成 2:已解锁 3:已锁定)")
+    @ApiModelProperty("状态(0:数据统计中 1:统计完成 2:已解锁)")
     private Integer status;
     /**
     * 是否需要刷新(0:否 1:是)
@@ -80,9 +80,4 @@ public class AddAttendanceStatisticsDto implements Serializable {
     @ApiModelProperty("应出勤天数")
     private Integer attendanceDays;
 
-    /**
-    * attendanceStatisticsRecord
-    */
-    @ApiModelProperty("attendanceStatisticsRecord子表")
-    private List<AttendanceStatisticsRecordDto> attendanceStatisticsRecordList;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceStatisticsRecord.java

@@ -105,5 +105,8 @@ public class AttendanceStatisticsRecord implements Serializable {
     @ApiModelProperty("每天数据")
     private String daysData;
 
+    @ApiModelProperty("所在部门(存在多个,用“,”隔开)")
+    private String deptName;
+
 
 }

+ 285 - 8
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java

@@ -7,7 +7,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AddAttendanceStatisticsDto;
@@ -27,11 +29,24 @@ import com.xjrsoft.module.attendance.vo.AttendanceStatisticsPageVo;
 import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.organization.vo.UserIdDeptNameVo;
 import lombok.AllArgsConstructor;
 import me.zhyd.oauth.log.Log;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -42,6 +57,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 /**
@@ -70,7 +86,9 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
         AttendanceStatistics attendanceStatistics = BeanUtil.toBean(dto, AttendanceStatistics.class);
         attendanceStatistics.setCreateDate(new Date());
         statisticsMapper.insert(attendanceStatistics);
-
+        CompletableFuture.runAsync(() -> {
+            refreshRecord(attendanceStatistics.getId());
+        });
         return true;
     }
 
@@ -176,17 +194,22 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
                             .in(TeacherAttendanceRecord::getUserId, userIds)
                             .between(TeacherAttendanceRecord::getCreateDate, statistics.getStartDate(), statistics.getEndDate())
             );
-            //3.2、计算出所有的天数
-            List<LocalDate> dateList = getDatesBetween(statistics.getStartDate(), statistics.getEndDate());
-            //3.3、循环用户进行统计查询
+
+            //3.2、准备相关需要的数据
             DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
             DateTimeFormatter timeDtf = DateTimeFormatter.ofPattern("HH:mm");
             Map<String, String> weekCnMap = initWeekCn();
             Map<String, String> weekEnMap = initWeekEn();
+            List<UserIdDeptNameVo> teacherDeptName = userService.getTeacherDeptName();
+            Map<Long, UserIdDeptNameVo> userDeptMap = teacherDeptName.stream().collect(Collectors.toMap(UserIdDeptNameVo::getId, x -> x));
 
-            //3.4、查询这个考勤规则下面的所有细则并转换成map
+            //3.3、查询这个考勤规则下面的所有细则并转换成map
             List<AttendanceRuleDetails> ruleList = ruleCategoryService.getRules(statistics.getAttendanceRuleCategoryId());
             Map<String, AttendanceRuleDetails> ruleMap = ruleList.stream().collect(Collectors.toMap(AttendanceRuleDetails::getDateType, x -> x));
+
+            //3.4、计算出所有的天数
+            List<LocalDate> dateList = getDatesBetween(statistics.getStartDate(), statistics.getEndDate(), ruleMap, weekEnMap);
+
             //3.5、循环计算,并存入insertList,方便后续批量入库
             List<AttendanceStatisticsRecord> insertList = new ArrayList<>();
             for (User user : userList) {
@@ -196,9 +219,13 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
                 Long leaveCount = 0L;
                 Long absenteeCount = 0L;
                 JsonArray daysData = new JsonArray();
+                int sortCode = 1;
                 for (LocalDate localDate : dateList) {
                     String dayOfWeekName = localDate.getDayOfWeek().name();
                     AttendanceRuleDetails ruleDetails = ruleMap.get(weekEnMap.get(dayOfWeekName));
+                    if(ruleDetails != null && (ruleDetails.getIsAttendance() == null || ruleDetails.getIsAttendance() == 0)){
+                        continue;
+                    }
                     JsonObject daysJson = new JsonObject();
                     daysJson.addProperty("date", localDate.format(dtf));
                     daysJson.addProperty("week", weekCnMap.get(dayOfWeekName));
@@ -216,18 +243,28 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
                         }else if("请假".equals(attendanceRecord.getAttendanceStatus())){
                             leaveCount ++;
                             content += "请假";
+                        }else if("不考勤".equals(attendanceRecord.getAttendanceStatus())){
+
                         }else{
                             absenteeCount ++;
                             content += "缺勤";
                         }
                     }
                     daysJson.addProperty("content", content);
+                    daysJson.addProperty("sortCode", sortCode);
                     daysData.add(daysJson);
+                    sortCode ++;
                 }
                 record.setNormalCount(normalCount);
                 record.setLeaveCount(leaveCount);
                 record.setAbsenteeCount(absenteeCount);
                 record.setDaysData(daysData.toString());
+                UserIdDeptNameVo deptNameVo = userDeptMap.get(record.getUserId());
+                if(deptNameVo != null){
+                    record.setDeptIds(deptNameVo.getDeptIds());
+                    record.setDeptName(deptNameVo.getDeptName());
+                }
+
                 insertList.add(record);
             }
 
@@ -240,6 +277,7 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
             statistics = this.getById(id);
             statistics.setStatus(1);
             statistics.setModifyDate(new Date());
+            statistics.setAttendanceDays(dateList.size());
             this.updateById(statistics);
         }catch (Exception e){
             Log.error(e.getMessage(), e);
@@ -255,12 +293,16 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
 
 
 
-    private List<LocalDate> getDatesBetween(LocalDate startDate, LocalDate endDate) {
+    private List<LocalDate> getDatesBetween(LocalDate startDate, LocalDate endDate, Map<String, AttendanceRuleDetails> ruleMap, Map<String, String> weekEnMap) {
         List<LocalDate> dates = new ArrayList<>();
 
         long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate) + 1; // +1 包含结束日期
         for (long i = 0; i < numOfDaysBetween; i++) {
-            dates.add(startDate.plusDays(i));
+            LocalDate localDate = startDate.plusDays(i);
+            AttendanceRuleDetails ruleDetails = ruleMap.get(weekEnMap.get(localDate.getDayOfWeek().name()));
+            if(ruleDetails != null && ruleDetails.getIsAttendance() != null && ruleDetails.getIsAttendance() == 1){
+                dates.add(localDate);
+            }
         }
 
         return dates;
@@ -296,6 +338,241 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
 
     @Override
     public byte[] recordExport(Long id) throws IOException {
-        return new byte[0];
+        AttendanceStatistics statistics = this.getById(id);
+        List<AttendanceStatisticsRecordVo> recordList = this.getRecordList(new AttendanceStatisticsRecordDto() {{
+            setId(id);
+        }});
+
+        List<ArrayList<String>> dataList = new ArrayList<>();
+        int sortCode = 1;
+        JsonParser parser = new JsonParser();
+        List<String> dateList = new ArrayList<>();
+        List<String> weekList = new ArrayList<>();
+        for (AttendanceStatisticsRecordVo recordVo : recordList) {
+            ArrayList<String> data = new ArrayList<>();
+            data.add(sortCode + "");
+            data.add(recordVo.getName());
+            data.add(recordVo.getUserName());
+            data.add(recordVo.getDeptName());
+            data.add(recordVo.getNormalCount() + "");
+            data.add(recordVo.getLeaveCount() + "");
+            data.add(recordVo.getAbsenteeCount() + "");
+            JsonArray daysData = parser.parse(recordVo.getDaysData()).getAsJsonArray();
+            for (JsonElement daysDatum : daysData) {
+                JsonObject daysJson = daysDatum.getAsJsonObject();
+                data.add(daysJson.get("content").getAsString());
+                if(!dateList.contains(daysJson.get("date").getAsString())){
+                    dateList.add(daysJson.get("date").getAsString());
+                }
+                if(!weekList.contains(daysJson.get("week").getAsString())){
+                    weekList.add(daysJson.get("week").getAsString());
+                }
+            }
+
+            dataList.add(data);
+        }
+
+        int allColumn = 7 + statistics.getAttendanceDays();//总列数
+        Workbook workbook = new XSSFWorkbook();
+        // 创建一个工作表(sheet)
+        String sheetName = "数据";
+        Sheet sheet = workbook.createSheet(sheetName);
+
+        // 第一行表头
+        createFirstTitle(workbook, sheet, allColumn - 1);
+        // 第二行表头
+        createSecondTitle(workbook, sheet, statistics, 3);
+        // 第三行表头
+        createThirdTitle(workbook, sheet, weekList);
+        // 第四行表头
+        createFourthTitle(workbook, sheet, 7, dateList);
+        //生成数据
+        int dataRowNumber = 4;
+
+        for (ArrayList<String> rowData : dataList) {
+            Row dataRow = sheet.createRow(dataRowNumber);
+            for (int i = 0; i < rowData.size(); i ++){
+                String content = rowData.get(i);
+                Font font = workbook.createFont();
+                font.setBold(false);// 设置为粗体
+                font.setFontName("宋体");
+                if(content.contains("缺勤")){
+                    font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
+                }else if(content.contains("正常")){
+                    font.setColor(IndexedColors.BLUE.getIndex()); // 设置字体颜色为蓝色
+                }else if(content.contains("请假")){
+                    font.setColor(IndexedColors.YELLOW.getIndex()); // 设置字体颜色为黄色
+                }
+                font.setFontHeightInPoints((short)12);
+
+                CellStyle cellStyle = workbook.createCellStyle();
+                cellStyle.setFont(font); // 将字体应用到样式
+                cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+
+                Cell row1cell2 = dataRow.createCell(i);
+                row1cell2.setCellValue(content);
+                row1cell2.setCellStyle(cellStyle);
+            }
+
+            dataRowNumber ++;
+        }
+        //写入文件
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        workbook.write(bot);
+        return bot.toByteArray();
+    }
+
+    /**
+     * 创建第一行表头
+     * @param workbook
+     * @param sheet
+     * @param mergeCoulmn 合并后面多少列(不包含自己)
+     */
+    void createFirstTitle(Workbook workbook, Sheet sheet, int mergeCoulmn) {
+        int rowNumber = 0;
+        Font font = workbook.createFont();
+        font.setBold(true);// 设置为粗体
+        font.setFontName("宋体");
+        //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
+        font.setFontHeightInPoints((short)24);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        Row row = sheet.createRow(rowNumber);
+        //合并第一行的列
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, mergeCoulmn));
+
+        //3、处理表头
+        String title1 = "坐班考勤 - 汇总统计";
+        // 创建单元格并设置值
+        Cell cell = row.createCell(0);
+        cell.setCellValue(title1);
+        cell.setCellStyle(cellStyle);
+    }
+
+    /**
+     * 生成第二行表头
+     * @param workbook
+     * @param sheet
+     * @param statistics
+     * @param mergeCoulmn 合并后面多少列(不包含自己)
+     */
+    void createSecondTitle(Workbook workbook, Sheet sheet, AttendanceStatistics statistics, int mergeCoulmn) {
+        int rowNumber = 1;
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short)12);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        Row row1 = sheet.createRow(rowNumber);
+        Cell row1cell1 = row1.createCell(0);
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String content = "查询的考勤日期范围:" + statistics.getStartDate().format(dtf) + "至" + statistics.getEndDate() + ";";
+        if(statistics.getTimePeriod() == 1){
+            content += "时间段:上午";
+        }else if(statistics.getTimePeriod() == 2){
+            content += "时间段:下午";
+        }
+        row1cell1.setCellValue(content);
+        row1cell1.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, mergeCoulmn));
+    }
+
+    /**
+     * 生成第三行表头
+     * 表头:序号、姓名、工号、部门、正常考勤次数、请假次数、缺勤次数,后续周几
+     * @param workbook
+     * @param sheet
+     * @param weekList 周几
+     */
+    void createThirdTitle(Workbook workbook, Sheet sheet, List<String> weekList) {
+        int rowNumber = 2;
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short)12);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        Row row1 = sheet.createRow(rowNumber);
+        Cell row1cell1 = row1.createCell(0);
+        row1cell1.setCellValue("序号");
+        row1cell1.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber + 1, 0, 0));
+
+        Cell row1cell2 = row1.createCell(1);
+        row1cell2.setCellValue("姓名");
+        row1cell2.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber + 1, 1, 1));
+
+        Cell row1cell3 = row1.createCell(2);
+        row1cell3.setCellValue("工号");
+        row1cell3.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber + 1, 2, 2));
+
+        Cell row1cell4 = row1.createCell(3);
+        row1cell4.setCellValue("组织机构");
+        row1cell4.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber + 1, 3, 3));
+
+        Cell row1cell5 = row1.createCell(4);
+        row1cell5.setCellValue("正常考勤次数");
+        row1cell5.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber + 1, 4, 4));
+
+        Cell row1cell6 = row1.createCell(5);
+        row1cell6.setCellValue("请假次数");
+        row1cell6.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber + 1, 5, 5));
+
+        Cell row1cell7 = row1.createCell(6);
+        row1cell7.setCellValue("缺勤次数");
+        row1cell7.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber + 1, 6, 6));
+
+        int cellNumber = 7;
+        for (String dayOfWeek : weekList) {
+            Cell row1cell = row1.createCell(cellNumber);
+            row1cell.setCellValue(dayOfWeek);
+            row1cell.setCellStyle(cellStyle);
+            cellNumber ++;
+        }
+    }
+
+    /**
+     *
+     * @param workbook
+     * @param sheet
+     * @param startColumn 开始列
+     * @param dateList 2024年10月20日
+     */
+    void createFourthTitle(Workbook workbook, Sheet sheet, int startColumn, List<String> dateList) {
+        int rowNumber = 3;
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short)12);
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        Row row1 = sheet.createRow(rowNumber);
+
+        for (String date : dateList) {
+            Cell row1cell = row1.createCell(startColumn);
+            row1cell.setCellValue(date);
+            row1cell.setCellStyle(cellStyle);
+            startColumn ++;
+        }
     }
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/organization/mapper/UserMapper.java

@@ -7,6 +7,7 @@ import com.xjrsoft.module.organization.dto.UserPageDto;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.vo.PersonPageVo;
 import com.xjrsoft.module.organization.vo.ResetUserPageVo;
+import com.xjrsoft.module.organization.vo.UserIdDeptNameVo;
 import com.xjrsoft.module.student.dto.BaseStudentSimpleInfoDto;
 import com.xjrsoft.module.student.vo.BaseStudentSompleInfoVo;
 import org.apache.ibatis.annotations.Mapper;
@@ -29,4 +30,6 @@ public interface UserMapper extends MPJBaseMapper<User> {
     List<BaseStudentSompleInfoVo> getInfosByParam(@Param("dto") BaseStudentSimpleInfoDto dto);
 
     Page<PersonPageVo> personPage(Page<PersonPageVo> page, @Param("dto") PersonPageDto dto);
+
+    List<UserIdDeptNameVo> getTeacherDeptName();
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/organization/service/IUserService.java

@@ -14,6 +14,7 @@ import com.xjrsoft.module.organization.dto.WeChatPageDto;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.vo.PersonPageVo;
 import com.xjrsoft.module.organization.vo.ResetUserPageVo;
+import com.xjrsoft.module.organization.vo.UserIdDeptNameVo;
 import com.xjrsoft.module.organization.vo.UserInfoVo;
 import com.xjrsoft.module.organization.vo.WeChatPageVO;
 
@@ -85,4 +86,6 @@ public interface IUserService extends MPJBaseService<User> {
 
     Boolean recoveryStudentInfo(Long userId);
 
+    List<UserIdDeptNameVo> getTeacherDeptName();
+
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java

@@ -47,6 +47,7 @@ import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.vo.PersonPageVo;
 import com.xjrsoft.module.organization.vo.ResetUserPageVo;
+import com.xjrsoft.module.organization.vo.UserIdDeptNameVo;
 import com.xjrsoft.module.organization.vo.UserInfoVo;
 import com.xjrsoft.module.organization.vo.WeChatPageVO;
 import lombok.AllArgsConstructor;
@@ -426,4 +427,9 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         }
     }
 
+    @Override
+    public List<UserIdDeptNameVo> getTeacherDeptName(){
+        return userMapper.getTeacherDeptName();
+    }
+
 }

+ 19 - 0
src/main/java/com/xjrsoft/module/organization/vo/UserIdDeptNameVo.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.organization.vo;
+
+import lombok.Data;
+
+/**
+ * @Author: dzx
+ * @Date: 2024年10月20日
+ */
+@Data
+public class UserIdDeptNameVo {
+
+    private Long id;
+
+    private String deptName;
+
+    private String deptIds;
+
+}
+

+ 1 - 2
src/main/resources/mapper/attendance/AttendanceStatisticsMapper.xml

@@ -24,8 +24,7 @@
     </select>
 
     <select id="getRecordList" parameterType="com.xjrsoft.module.attendance.dto.AttendanceStatisticsRecordDto" resultType="com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo">
-        SELECT t1.id,t2.name,t2.user_name,t1.normal_count,t1.leave_count,t1.absentee_count,
-        (SELECT GROUP_CONCAT(NAME) FROM xjr_department WHERE t1.dept_ids LIKE CONCAT('%', id, '%')) AS dept_name FROM attendance_statistics_record t1
+        SELECT t1.id,t2.name,t2.user_name,t1.normal_count,t1.leave_count,t1.absentee_count,t1.dept_name FROM attendance_statistics_record t1
         INNER JOIN xjr_user t2 ON t1.user_id = t2.id
         WHERE t1.delete_mark = 0 AND t1.attendance_statistics_id = #{dto.id}
         <if test="dto.name != null and dto.name != ''">

+ 13 - 0
src/main/resources/mapper/organization/UserMapper.xml

@@ -66,4 +66,17 @@
             AND t4.dept_id = #{dto.departmentId}
         </if>
     </select>
+    <select id="getTeacherDeptName" resultType="com.xjrsoft.module.organization.vo.UserIdDeptNameVo">
+        SELECT t1.id,(
+            SELECT GROUP_CONCAT(c1.name) FROM xjr_department c1
+            INNER JOIN xjr_user_dept_relation c2 ON c1.id = c2.dept_id
+            WHERE c2.user_id = t1.id
+        ) AS dept_name,(
+            SELECT GROUP_CONCAT(c1.id) FROM xjr_department c1
+            INNER JOIN xjr_user_dept_relation c2 ON c1.id = c2.dept_id
+            WHERE c2.user_id = t1.id
+        ) as dept_ids FROM xjr_user t1
+        INNER JOIN xjr_user_role_relation t2 ON t1.id = t2.user_id
+        WHERE t2.role_id = 2
+    </select>
 </mapper>