Explorar o código

Merge remote-tracking branch 'origin/dev' into dev

大数据与最优化研究所 hai 8 meses
pai
achega
ec43a3de91

+ 4 - 0
src/main/java/com/xjrsoft/module/courseTable/service/ICourseTableService.java

@@ -7,6 +7,7 @@ import com.xjrsoft.module.courseTable.entity.CourseTable;
 import com.xjrsoft.module.courseTable.vo.ClassListVo;
 import com.xjrsoft.module.schedule.dto.ClassOptionDto;
 import com.xjrsoft.module.schedule.dto.CourseTableDto;
+import com.xjrsoft.module.schedule.dto.CourseTableExportQueryDto;
 import com.xjrsoft.module.schedule.dto.ScheduleWeekExportQueryDto;
 import com.xjrsoft.module.schedule.entity.WfCourseAdjust;
 import com.xjrsoft.module.schedule.vo.ClassOptionVo;
@@ -60,4 +61,7 @@ public interface ICourseTableService extends IService<CourseTable> {
     Integer getSubstituteTeacherCourseCountByParams(ClassTeacherDto dto);
 
 
+    ByteArrayOutputStream exportQuery(CourseTableExportQueryDto dto) throws IOException;
+
+
 }

+ 61 - 3
src/main/java/com/xjrsoft/module/courseTable/service/impl/CourseTableServiceImpl.java

@@ -22,6 +22,7 @@ import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.xjrsoft.common.enums.CourseAdjustTypeEnum;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.TimeNumberEnum;
 import com.xjrsoft.common.enums.TimePeriodEnum;
 import com.xjrsoft.common.enums.WeekEnum;
@@ -49,10 +50,12 @@ import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.schedule.dto.ClassOptionDto;
 import com.xjrsoft.module.schedule.dto.CourseTableAdjustDto;
 import com.xjrsoft.module.schedule.dto.CourseTableDto;
+import com.xjrsoft.module.schedule.dto.CourseTableExportQueryDto;
 import com.xjrsoft.module.schedule.dto.ScheduleWeekExportQueryDto;
 import com.xjrsoft.module.schedule.entity.CourseTableBak;
 import com.xjrsoft.module.schedule.entity.WfCourseAdjust;
 import com.xjrsoft.module.schedule.mapper.CourseTableBakMapper;
+import com.xjrsoft.module.schedule.util.CourseTableExportQueryUtil;
 import com.xjrsoft.module.schedule.util.ScheduleUtil;
 import com.xjrsoft.module.schedule.vo.*;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
@@ -60,6 +63,7 @@ import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
+import com.xjrsoft.module.veb.util.ImportExcelUtil;
 import lombok.AllArgsConstructor;
 import me.zhyd.oauth.log.Log;
 import org.apache.poi.ss.usermodel.*;
@@ -995,7 +999,7 @@ public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, Cours
 
             createFirstTitle(workbook, sheet, data, dto);
 
-            createSecondTitle(workbook, sheet);
+            createSecondTitle(workbook, sheet, 1);
 
             Map<Integer, ClassTime> timeNumberMap = data.getClassTimeList().stream().collect(Collectors.toMap(ClassTime::getNumber, x -> x));
             Map<String, List<CourseDetailVo>> timeNumberDataMap = data.getCourseList().stream().collect(Collectors.groupingBy(CourseDetailVo::getTimeNumber));
@@ -1122,7 +1126,7 @@ public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, Cours
         }
     }
 
-    void createSecondTitle(Workbook workbook, Sheet sheet) {
+    void createSecondTitle(Workbook workbook, Sheet sheet, int rowNumber) {
         // 创建一个字体对象
         Font font = workbook.createFont();
         font.setBold(true);// 设置为粗体
@@ -1140,7 +1144,6 @@ public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, Cours
         cellStyle.setBorderLeft(BorderStyle.THIN);
         cellStyle.setBorderRight(BorderStyle.THIN);
 
-        int rowNumber = 1;
         Row row = sheet.createRow(rowNumber);
 
         int cellNumber = 0;
@@ -1249,4 +1252,59 @@ public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, Cours
         return this.baseMapper.getSubstituteTeacherCourseCountByParams(dto);
     }
 
+    /**
+     * 课表导出
+     *
+     * @param dto
+     * @return
+     */
+    @Override
+    public ByteArrayOutputStream exportQuery(CourseTableExportQueryDto dto) throws IOException {
+        BaseSemester semester = baseSemesterMapper.selectById(dto.getSemesterId());
+        //根据年级、专业部,查询需要导出的班级
+        List<BaseClass> classList = baseClassService.list(
+                new QueryWrapper<BaseClass>().lambda()
+                        .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseClass::getIsGraduate, 1)
+                        .in(BaseClass::getGradeId, dto.getGradeIds())
+                        .in(BaseClass::getOrgId, dto.getDeptIds())
+        );
+        CourseTableExportQueryUtil exportQueryUtil = new CourseTableExportQueryUtil();
+        String schoolName = "重庆市铜梁职业教育中心";
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        if("calss".equals(dto.getCourseType())){
+            Workbook workbook = new XSSFWorkbook();
+            String sheetName = "班级课表";
+            Sheet sheet = workbook.createSheet(sheetName);
+            String bigHead = "课程表";
+
+            int classTableRowCount = 16;//每个班的课表占用的总行数
+            for(int i = 0; i < classList.size(); i ++){
+                BaseClass baseClass = classList.get(i);
+                //查询数据
+                CourseTableDto dataDto = new CourseTableDto();
+                dataDto.setSemesterId(dto.getSemesterId());
+                dataDto.setClassId(baseClass.getId());
+                dataDto.setWeek(dto.getWeek());
+                CourseTableVo tableVo = this.getList(dataDto);
+                String rightName = "班主任:" + tableVo.getTeacherName() + " 行政班:" + tableVo.getClassName();
+
+                int bigHeadRow = (classTableRowCount + 2) * i;
+                //生成第一行title
+                ImportExcelUtil.createBigHead(workbook, sheet, bigHead, bigHeadRow, 9);
+                //生成副标题,展示所属学期
+                ImportExcelUtil.createSubtitle(workbook, sheet, semester.getName(), bigHeadRow + 1, 9);
+                //生成第三行,显示学校名字、班主任和班级名字
+                exportQueryUtil.createThirdTitle(workbook, sheet, bigHeadRow + 2, schoolName, rightName);
+                //生成表头
+                createSecondTitle(workbook, sheet, bigHeadRow + 3);
+                //生成内容
+                exportQueryUtil.createContent(workbook, sheet, bigHeadRow + 4, tableVo, dto.getCourseType());
+            }
+            workbook.write(bot);
+        }
+
+        return bot;
+    }
+
 }

+ 10 - 0
src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java

@@ -43,6 +43,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.time.DayOfWeek;
 import java.time.Duration;
 import java.time.LocalDateTime;
@@ -495,4 +496,13 @@ public class ScheduleController {
         return RT.ok(false);
     }
 
+    @PostMapping("/export-query")
+    @ApiOperation(value = "导出课表")
+    @SaCheckPermission("schedule:detail")
+    @XjrLog(value = "导出课表")
+    public ResponseEntity<byte[]> exportQuery(@Valid @RequestBody CourseTableExportQueryDto dto) throws IOException {
+        ByteArrayOutputStream bot = courseTableService.exportQuery(dto);
+        return RT.fileStream(bot.toByteArray(), "scheduleWeek" + ExcelTypeEnum.XLSX.getValue());
+    }
+
 }

+ 37 - 0
src/main/java/com/xjrsoft/module/schedule/dto/CourseTableExportQueryDto.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.schedule.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+/**
+ * @title: 寝室
+ * @Author dzx
+ * @Date: 2023-12-27
+ * @Version 1.0
+ */
+@Data
+public class CourseTableExportQueryDto {
+
+
+    @ApiModelProperty("学期id")
+    private Long semesterId;
+
+    @ApiModelProperty("课表类型(teacher:教师,class:班级,classroom:教室, all:总课表)")
+    private String courseType;
+
+    @ApiModelProperty("周次")
+    private Integer week;
+
+    @ApiModelProperty("年级id")
+    private List<Long> gradeIds;
+
+    @ApiModelProperty("专业部id")
+    private List<Long> deptIds;
+
+}

+ 172 - 0
src/main/java/com/xjrsoft/module/schedule/util/CourseTableExportQueryUtil.java

@@ -0,0 +1,172 @@
+package com.xjrsoft.module.schedule.util;
+
+import com.xjrsoft.module.courseTable.entity.ClassTime;
+import com.xjrsoft.module.schedule.vo.CourseDetailVo;
+import com.xjrsoft.module.schedule.vo.CourseTableVo;
+import org.apache.poi.ss.usermodel.BorderStyle;
+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.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 java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author dzx
+ * @date 2025/4/9
+ */
+public class CourseTableExportQueryUtil {
+
+    /**
+     * 合并9列
+     * @param rowNumber 写入的行号
+     */
+    public void createThirdTitle(Workbook workbook, Sheet sheet, int rowNumber, String leftTitle, String rightTitle){
+        Font font = workbook.createFont();
+        font.setBold(true);// 设置为粗体
+        font.setFontName("宋体");
+        //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
+        font.setFontHeightInPoints((short) 18);
+
+        //设置样式
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+
+        //创建一行
+        Row row = sheet.createRow(rowNumber);
+    }
+
+
+    public void createContent(Workbook workbook, Sheet sheet, int rowNumber, CourseTableVo data, String courseType){
+        Map<Integer, ClassTime> timeNumberMap = data.getClassTimeList().stream().collect(Collectors.toMap(ClassTime::getNumber, x -> x));
+        Map<String, List<CourseDetailVo>> timeNumberDataMap = data.getCourseList().stream().collect(Collectors.groupingBy(CourseDetailVo::getTimeNumber));
+
+        List<Integer> weekList = new ArrayList<>();
+        weekList.add(1);
+        weekList.add(2);
+        weekList.add(3);
+        weekList.add(4);
+        weekList.add(5);
+        weekList.add(6);
+        weekList.add(7);
+        Collections.sort(weekList);
+
+        List<Integer> timeNumberList = data.getClassTimeList().stream().map(ClassTime::getNumber).collect(Collectors.toList());
+        Collections.sort(timeNumberList);
+
+        Map<Integer, Integer> timePeriodMap = data.getClassTimeList().stream().collect(Collectors.toMap(ClassTime::getNumber, ClassTime::getTimePeriod));
+
+        ArrayList<ArrayList<String>> dataList = new ArrayList<>();
+
+        for (Integer timeNumber : timeNumberList) {
+            ArrayList<String> rowData = new ArrayList<>();
+            Integer timePeriod = timePeriodMap.get(timeNumber);
+            String timePeriodStr = "";
+            if (timePeriod == 1) {
+                timePeriodStr = "上午";
+            } else if (timePeriod == 2) {
+                timePeriodStr = "下午";
+            } else if (timePeriod == 3) {
+                timePeriodStr = "晚上";
+            }
+            rowData.add(timePeriodStr);
+            ClassTime classTime = timeNumberMap.get(timeNumber);
+            String timeNumberStr = classTime.getShortName() + "\r\n" + classTime.getSummerStartTime() + "-" + classTime.getSummerEndTime();
+            rowData.add(timeNumberStr);
+            List<CourseDetailVo> list1 = timeNumberDataMap.get(timeNumber.toString());
+            if (list1 == null) {
+                for (Integer week : weekList) {
+                    rowData.add("");
+                }
+                dataList.add(rowData);
+                continue;
+            }
+            Map<Integer, List<CourseDetailVo>> weeksMap = list1.stream().collect(Collectors.groupingBy(CourseDetailVo::getWeeks));
+            for (Integer week : weekList) {
+                String content = "";
+                List<CourseDetailVo> list = weeksMap.get(week);
+                if (list != null && !list.isEmpty()) {
+                    if (list.size() == 1) {
+                        CourseDetailVo courseDetailVo = list.get(0);
+                        content += courseDetailVo.getCourseName() + "\r\n";
+                        content += courseDetailVo.getClassroomName() + "\r\n";
+                        if ("teacher".equals(courseType)) {
+                            content += courseDetailVo.getClassName();
+                        } else if ("class".equals(courseType)) {
+                            content += courseDetailVo.getTeacherName();
+                        }
+                    } else {
+                        CourseDetailVo courseDetailVo = list.get(0);
+                        content += courseDetailVo.getCourseName() + "\r\n";
+                        content += courseDetailVo.getClassroomName() + "\r\n";
+                        if ("teacher".equals(courseType)) {
+                            content += courseDetailVo.getClassName();
+                        } else if ("class".equals(courseType)) {
+                            Set<String> classNames = list.stream().map(CourseDetailVo::getTeacherName).collect(Collectors.toSet());
+                            content += classNames.toString().replace("]", "").replace("[", "").replace(" ", "");
+                        }
+                    }
+                }
+                rowData.add(content);
+            }
+            dataList.add(rowData);
+        }
+
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short) 9);
+
+        // 创建一个单元格样式对象
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setWrapText(true);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+
+        for (ArrayList<String> strings : dataList) {
+            Row row = sheet.createRow(rowNumber);
+            int cellNumber = 0;
+            for (String string : strings) {
+                Cell row1cell1 = row.createCell(cellNumber);
+                row1cell1.setCellValue(string);
+                row1cell1.setCellStyle(cellStyle);
+                cellNumber++;
+            }
+            rowNumber++;
+            row.setHeightInPoints(48);
+        }
+        //合并
+        Map<Integer, List<Integer>> collect = data.getClassTimeList().stream()
+                .collect(Collectors.groupingBy(ClassTime::getTimePeriod, Collectors.mapping(ClassTime::getNumber, Collectors.toList())));
+        int firstRow = 2;
+        for (Integer i : collect.keySet()) {
+            int lastRow = firstRow + collect.get(i).size() - 1;
+            if (lastRow == firstRow) {
+                continue;
+            }
+            sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, 0, 0));
+
+            firstRow = firstRow + collect.get(i).size();
+        }
+    }
+}

+ 4 - 0
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentSchoolRollServiceImpl.java

@@ -138,6 +138,10 @@ public class BaseStudentSchoolRollServiceImpl extends MPJBaseServiceImpl<BaseStu
                         2
                 );
             }
+            if((dto.getArchivesStatus() != null && !ArchivesStatusEnum.FB2901.getCode().equals(dto.getArchivesStatus())
+                    || (dto.getStduyStatus() != null && !StudyStatusEnum.InResidence.getCode().equals(dto.getStduyStatus())))){
+                roomBedMapper.clearBedInfoByStudentUserId(id, StpUtil.getLoginIdAsLong());
+            }
 
             baseStudentSchoolRollMapper.updateInfoByUserId(dto, id);
         }

+ 42 - 0
src/main/java/com/xjrsoft/module/veb/util/ImportExcelUtil.java

@@ -225,6 +225,45 @@ public class ImportExcelUtil {
         }
     }
 
+    /**
+     * 写入副标题,字号14,合并为一个单元格
+     * @param workbook
+     * @param sheet
+     * @param rowNumber
+     * @param lastCol
+     */
+    public static void createSubtitle(Workbook workbook, Sheet sheet, String bigHead, int rowNumber, int lastCol) {
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short) 14);
+
+        // 正常样式
+        CellStyle normalCellStyle = workbook.createCellStyle();
+        normalCellStyle.setFont(font); // 将字体应用到样式
+        normalCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        normalCellStyle.setAlignment(HorizontalAlignment.CENTER);
+        // 设置边框样式为细线
+        normalCellStyle.setBorderTop(BorderStyle.THIN);
+        normalCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 设置顶部边框颜色
+
+        normalCellStyle.setBorderBottom(BorderStyle.THIN);
+        normalCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 设置底部边框颜色
+
+        normalCellStyle.setBorderLeft(BorderStyle.THIN);
+        normalCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 设置左边框颜色
+
+        normalCellStyle.setBorderRight(BorderStyle.THIN);
+        normalCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 设置右边框颜色
+
+        // 所在行
+        Row row = sheet.createRow(rowNumber);
+
+        Cell cell = row.createCell(0);
+        cell.setCellValue(bigHead);
+        cell.setCellStyle(normalCellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, lastCol));
+    }
+
     /**
      * 写单格
      *
@@ -273,6 +312,9 @@ public class ImportExcelUtil {
         sheet.addMergedRegion(new CellRangeAddress(starRow, endRow, startcol, lastCol));
     }
 
+
+
+
     /**
      * 写提示行
      *

+ 9 - 9
src/main/resources/application-dev.yml

@@ -5,9 +5,9 @@ spring:
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://10.150.10.139:3306/tl?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&autoReconnect=true&failOverReadOnly=false&testWhileIdle=true
-    username: root
-    password: Zwr~-f6H,u6QE^]C-AD_
+    url: jdbc:mysql://10.150.10.136:3308/tl?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&autoReconnect=true&failOverReadOnly=false&testWhileIdle=true
+    username: data_tl
+    password: qwe123QWE
     druid:
       # 验证连接的有效性
       test-while-idle: true
@@ -23,15 +23,15 @@ spring:
         datasource:
           master:
             driver-class-name: com.mysql.cj.jdbc.Driver
-            url: jdbc:mysql://10.150.10.139:3306/tl?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&autoReconnect=true&failOverReadOnly=false
-            username: root
-            password: Zwr~-f6H,u6QE^]C-AD_
+            url: jdbc:mysql://10.150.10.136:3308/tl?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&autoReconnect=true&failOverReadOnly=false&testWhileIdle=true
+            username: data_tl
+            password: qwe123QWE
 
   redis:
-    database: 10
-    host: 10.150.10.139
+    database: 11
+    host: 10.150.10.136
     port: 6379
-    password: wa3re~86Hu&ifniyM   # 密码(默认为空)
+    password: 9mwar,BNq}oMa63cUd?R   # 密码(默认为空)
     timeout: 36000ms  # 连接超时时长(毫秒)
     jedis:
       pool:

+ 3 - 0
src/main/resources/mapper/room/RoomBedMapper.xml

@@ -362,6 +362,9 @@
             and t2.floor_number = #{dto.floorNumber}
         </if>
         <if test="dto.classId != null and dto.isTeacher != null and dto.isTeacher == 1">
+            AND t8.id = #{dto.classId}
+        </if>
+        <if test="dto.classId != null and dto.isTeacher == null">
             AND (t2.id IN (
             SELECT DISTINCT c1.room_id FROM room_bed c1
             INNER JOIN base_student_school_roll c2 ON c1.student_user_id = c2.user_id

+ 2 - 2
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -15,8 +15,8 @@ import java.util.List;
 
 public class FreeMarkerGeneratorTest {
 
-    private static final DataSource ds = new SimpleDataSource("jdbc:mysql://10.150.10.139:3306/tl?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true",
-            "root" , "Zwr~-f6H,u6QE^]C-AD_" );
+    private static final DataSource ds = new SimpleDataSource("jdbc:mysql://10.150.10.136:3306/tl?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true",
+            "data_tl" , "qwe123QWE" );
 
     @Test
     public void generateCodesTest() throws IOException {