浏览代码

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

fanxp 2 月之前
父节点
当前提交
4b8878c916

+ 6 - 6
src/main/java/com/xjrsoft/common/utils/UploadUtil.java

@@ -94,12 +94,12 @@ public class UploadUtil {
         }
 
         // 4. MIME类型校验
-        String contentType = file.getContentType();
-        if (!rule.getAllowedMimeTypes().isEmpty() &&
-                !rule.getAllowedMimeTypes().contains(contentType)) {
-            throw new MyException("文件类型不匹配,仅支持: " +
-                    String.join(", ", rule.getAllowedMimeTypes()));
-        }
+//        String contentType = file.getContentType();
+//        if (!rule.getAllowedMimeTypes().isEmpty() &&
+//                !rule.getAllowedMimeTypes().contains(contentType)) {
+//            throw new MyException("文件类型不匹配,仅支持: " + contentType +
+//                    String.join(", ", rule.getAllowedMimeTypes()));
+//        }
     }
 
     // 安全的获取扩展名方法

+ 18 - 4
src/main/java/com/xjrsoft/config/FileCheckRuleConfig.java

@@ -61,7 +61,8 @@ public final class FileCheckRuleConfig {
             .withExtensions(
                     "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt",
                     // WPS 文件扩展名
-                    "wps", "et", "dps", "wpt", "ett", "dpt", "vsd", "vsdx"
+                    "wps", "et", "dps", "wpt", "ett", "dpt", "vsd", "vsdx",
+                    "ofd","xml"
             )
             .withMimeTypes(
                     "application/pdf",
@@ -72,7 +73,7 @@ public final class FileCheckRuleConfig {
                     "application/vnd.ms-powerpoint",
                     "application/vnd.openxmlformats-officedocument.presentationml.presentation",
                     "text/plain",
-                    // WPS MIME 类型
+                    // WPS MIME 类型 - 补充更多可能的类型
                     "application/vnd.ms-works",
                     "application/wps-office.wps",
                     "application/wps-office.et",
@@ -80,14 +81,27 @@ public final class FileCheckRuleConfig {
                     "application/wps-office.wpt",
                     "application/wps-office.ett",
                     "application/wps-office.dpt",
-
                     "application/kswps",
+                    "application/kset",
+                    "application/ksdps",
+                    "application/x-wps",
+                    "application/x-et",
+                    "application/x-dps",
+                    "application/vnd.wps-office.wps",
+                    "application/vnd.wps-office.et",
+                    "application/vnd.wps-office.dps",
+                    "application/wpsofficevideo/x-matroska",
+
                     // OFD MIME 类型
                     "application/ofd",
                     "application/x-ofd",
 
+                    "application/xml",
+                    "text/xml",
+                    "application/xhtml+xml",
+
                     // 其他可能的 MIME 类型
-                    "application/octet-stream", // 某些 WPS 文件可能被识别为此类型
+                    "application/octet-stream",
                     "application/x-msdownload"
             )
             .build();

+ 7 - 0
src/main/java/com/xjrsoft/module/courseTable/entity/CourseTable.java

@@ -102,4 +102,11 @@ public class CourseTable implements Serializable {
     @ApiModelProperty("同步记录id")
     private Long courseReceiveMsgId;
 
+
+    @ApiModelProperty("开始时间")
+    private  String startTime;
+
+    @ApiModelProperty("结束时间")
+    private  String endTime;
+
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/courseTable/mapper/CourseTableMapper.java

@@ -34,6 +34,8 @@ public interface CourseTableMapper extends MPJBaseMapper<CourseTable> {
 
     List<CourseListVo> getAdjustList1(@Param("dto") CourseTableAdjustDto1 dto);
 
+    List<CourseListVo> getAdjustList2(@Param("dto") CourseTableAdjustDto1 dto);
+
     List<ClassOptionVo> getClassListByTeacherId(@Param("dto") ClassOptionDto dto);
 
     //查询流程正在进行中或者已经完成的调课或者顶课申请

+ 30 - 9
src/main/java/com/xjrsoft/module/courseTable/service/impl/CourseTableServiceImpl.java

@@ -339,33 +339,54 @@ public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, Cours
     @Override
     public List<CourseListVo> getAdjustList1(String classId,String teacherId, String adjustDate,String timeNumber,String applicantTeacherId,  String exchangeDate,  String adjustType) {
         CourseTableAdjustDto1 dto = new CourseTableAdjustDto1();
-        if (adjustDate != null && !"".equals(adjustDate)) {
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") ;
-            LocalDate localDateTime = LocalDate.parse(adjustDate, formatter);
+        if (exchangeDate != null && !exchangeDate.isEmpty()) {
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDate localDateTime = LocalDate.parse(exchangeDate, formatter);
             DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
-            dto.setAdjustDate(adjustDate);
+            dto.setExchangeDate(exchangeDate);
             dto.setWeek(dayOfWeek.getValue());
         }
 
-        if (exchangeDate != null && !"".equals(exchangeDate)) {
-            dto.setExchangeDate(exchangeDate);
+        if (adjustDate != null && !adjustDate.isEmpty()) {
+            dto.setAdjustDate(adjustDate);
         }
 
         dto.setTimeNumber(timeNumber);
 
-        if (applicantTeacherId != null && !"".equals(applicantTeacherId)) {
+        List<String> timeNumbers = timeNumber == null ? Collections.emptyList() : Arrays.asList(timeNumber.split(","));
+        dto.setTimeNumbers(timeNumbers);
+
+        if (applicantTeacherId != null && !applicantTeacherId.isEmpty()) {
             dto.setApplicantTeacherId(Long.parseLong(applicantTeacherId));
         }
 
         dto.setClassId(classId);
-        if (teacherId != null && !"".equals(teacherId)) {
+        if (teacherId != null && !teacherId.isEmpty()) {
             dto.setTeacherId(Long.parseLong(teacherId));
         }
         dto.setAdjustType(adjustType);
         //查询正在进行中或者已经完成
-        List<Long> courseIds = courseTableMapper.getExceptCourseIds(dto.getTeacherId());
+        List<Long> courseIds = courseTableMapper.getExceptCourseIds(dto.getApplicantTeacherId());
         dto.setExceptCourseList(courseIds);
         List<CourseListVo> list = courseTableMapper.getAdjustList1(dto);
+
+        if(!list.isEmpty()) {
+            List<String> idList = list.stream()
+                    .map(CourseListVo::getTimeNumber)
+                    .collect(Collectors.toList());
+            dto.setTimeNumbers(idList);
+            List<CourseListVo> excludeList = courseTableMapper.getAdjustList2(dto);
+
+//            list = list.stream()
+//                    .filter(vo -> excludeList.stream()
+//                            .noneMatch(ex -> ex.getTimeNumber().equals(vo.getTimeNumber()))
+//                    )
+//                    .collect(Collectors.toList());
+            list.removeIf(vo -> excludeList.stream()
+                    .anyMatch(ex -> ex.getTimeNumber().equals(vo.getTimeNumber()))
+            );
+        }
+
         for (CourseListVo courseListVo : list) {
             if (courseListVo.getTimePeriod() == 1) {
                 courseListVo.setTimePeriodCn("上午");

+ 2 - 1
src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java

@@ -478,12 +478,13 @@ public class OutInRecordUtil {
             JsonArray dataList = responseElement.getAsJsonObject().getAsJsonObject("data").getAsJsonArray("list");
 
             for (JsonElement item : dataList) {
+                JsonObject itemOjb = item.getAsJsonObject();
                 responseBuilder.add(item);
             }
 
             JsonObject responseJson = new Gson().fromJson(response, JsonObject.class);
             int totalCount = responseJson.getAsJsonObject("data").get("total").getAsInt();
-            hasMorePages = pageNo.getAndIncrement() * pageSize < totalCount;
+            hasMorePages = pageNo.get() * pageSize < totalCount;
         }
 
         InsertVehicleRecords(responseBuilder, faceImportMapper);

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

@@ -181,6 +181,21 @@ public class ScheduleController {
         return RT.ok();
     }
 
+    @GetMapping(value = "/adjust-list1")
+    @ApiOperation(value = "可以调课的课程")
+    @SaCheckPermission("schedule:adjustlist")
+    @XjrLog(value = "可以调课的课程")
+    public RT<List<CourseListVo>> adjustList1(CourseTableAdjustDto1 dto) {
+        if (dto.getAdjustDate() == null || dto.getTeacherId() == null) {
+            return RT.error("请传入调整日期和教师id");
+        }
+        List<CourseListVo> list = courseTableService.getAdjustList1(dto.getClassId(), dto.getTeacherId().toString(), dto.getAdjustDate(),dto.getTimeNumber(),dto.getApplicantTeacherId().toString(), dto.getExchangeDate(), dto.getAdjustType());
+        if (list.isEmpty()) {
+            return RT.error("暂无可调课程");
+        }
+        return RT.ok();
+    }
+
     @GetMapping(value = "/pre-check")
     @ApiOperation(value = "预检查")
     @SaCheckPermission("schedule:precheck")
@@ -298,6 +313,83 @@ public class ScheduleController {
         return RT.ok(resultVo);
     }
 
+    @GetMapping(value = "/getCourseInfo1")
+    @ApiOperation(value = "根据课程id获取课程相关信息")
+    @SaCheckPermission("schedule:getcourseinfo")
+    @XjrLog(value = "根据课程id获取课程相关信息", saveResponseData = true)
+    public RT<CourseNamesVo> getCourseInfo1(String id) {
+        String[] split = id.split(",");
+        List<CourseTable> list = courseTableService.list(
+                new QueryWrapper<CourseTable>().lambda()
+                        .in(CourseTable::getId, Arrays.asList(split))
+        );
+        CourseNamesVo resultVo = new CourseNamesVo();
+
+        Set<Long> classSets = list.stream().map(CourseTable::getClassId).collect(Collectors.toSet());
+        if(classSets.size() > 1){
+            resultVo.setStatus(0);
+            return RT.ok(resultVo);
+        }
+
+        // 定义日期和时间的格式
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
+
+        // 获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+
+        // 筛选出已过期的课程(schedule_date + start_time < 当前时间)
+        List<CourseTable> expiredCourses = list.stream()
+                .filter(course -> {
+                    // 解析日期和时间
+                    LocalDate courseDate =course.getScheduleDate();
+                    LocalTime courseTime = LocalTime.parse(course.getStartTime(), timeFormatter);
+
+                    // 合并成 LocalDateTime 进行比较
+                    LocalDateTime courseDateTime = LocalDateTime.of(courseDate, courseTime);
+                    return courseDateTime.isBefore(now);
+                })
+                .collect(Collectors.toList());
+
+        if(!expiredCourses.isEmpty()) {
+            resultVo.setStatus(2);
+            return RT.ok(resultVo);
+        }
+
+        List<ClassTime> classTimeList = classTimeService.list();
+        String courseNames = "";
+        String timeNumbers = "";
+        Set<Long> classIdSet = new HashSet<>();
+        Set<String> classNameSet = new HashSet<>();
+        for (int i = 0; i < list.size(); i++) {
+            if (i > 0) {
+                courseNames += ",";
+                timeNumbers += ",";
+            }
+            CourseTable courseTable = list.get(i);
+
+            String courseName = courseTable.getCourseName();
+
+            ClassTime classTime = classTimeList.stream().filter(u -> u.getNumber().equals(courseTable.getTimeNumber())).findAny().orElse(null);
+
+            if (classTime != null) {
+                courseName += "(" + classTime.getShortName() + ")";
+            }
+
+            courseNames += courseName;
+            timeNumbers += courseTable.getTimeNumber();
+            classIdSet.add(courseTable.getClassId());
+            classNameSet.add(courseTable.getClassName());
+        }
+        resultVo.setCourseNames(courseNames);
+        resultVo.setTimeNumbers(timeNumbers);
+        resultVo.setClassIds(classIdSet.toString().replace("[", "").replace("]", "").replace(" ", ""));
+        resultVo.setClassNames(classNameSet.toString().replace("[", "").replace("]", "").replace(" ", ""));
+        resultVo.setStatus(1);
+
+        return RT.ok(resultVo);
+    }
+
     /**
      * 顶课预检查
      *

+ 3 - 0
src/main/java/com/xjrsoft/module/schedule/dto/CourseTableAdjustDto1.java

@@ -46,4 +46,7 @@ public class CourseTableAdjustDto1 implements Serializable {
     @ApiModelProperty("除外的id")
     private List<Long> exceptCourseList;
 
+    @ApiModelProperty("课次")
+    private  List<String> timeNumbers;
+
 }

+ 3 - 1
src/main/java/com/xjrsoft/module/student/controller/BaseStudentCadreController.java

@@ -20,6 +20,7 @@ import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
 import com.xjrsoft.module.student.dto.AddBaseStudentCadreDto;
+import com.xjrsoft.module.student.dto.BaseStudentCadreClassDto;
 import com.xjrsoft.module.student.dto.BaseStudentCadrePageDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentCadreDto;
 import com.xjrsoft.module.student.entity.BaseStudent;
@@ -63,10 +64,11 @@ public class BaseStudentCadreController {
     @ApiOperation(value = "获取班主任管理的班级")
     @SaCheckPermission("basestudentcadre:classlist")
     @XjrLog(value = "获取班主任管理的班级")
-    public RT<List<BaseClass>> classList() {
+    public RT<List<BaseClass>> classList(@Valid BaseStudentCadreClassDto dto ) {
         List<BaseClass> pageOutput = baseClassMapper.selectJoinList(BaseClass.class, new MPJLambdaWrapper<BaseClass>()
                 .disableSubLogicDel()
                 .eq(BaseClass::getTeacherId, StpUtil.getLoginIdAsLong())
+                .eq(ObjectUtil.isNotNull(dto.getGradeId()), BaseClass::getGradeId, dto.getGradeId())
         );
 
         return RT.ok(pageOutput);

+ 15 - 0
src/main/java/com/xjrsoft/module/student/dto/BaseStudentCadreClassDto.java

@@ -0,0 +1,15 @@
+package com.xjrsoft.module.student.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseStudentCadreClassDto {
+    /**
+     * 年级id
+     */
+    @ApiModelProperty("年级id")
+    private Long gradeId;
+}

+ 26 - 8
src/main/resources/mapper/courseTable/CourseTable.xml

@@ -72,19 +72,19 @@
         order by t4.number asc
     </select>
 
-    <select id="getAdjustList1" parameterType="com.xjrsoft.module.schedule.dto.CourseTableAdjustDto" resultType="com.xjrsoft.module.schedule.vo.CourseListVo">
+    <select id="getAdjustList1" parameterType="com.xjrsoft.module.schedule.dto.CourseTableAdjustDto1" resultType="com.xjrsoft.module.schedule.vo.CourseListVo">
         SELECT t1.time_period,t4.short_name as time_number,t1.course_name,t2.name AS class_name,t3.name AS classroom_name,t1.id,t2.id as class_id FROM course_table t1
         LEFT JOIN base_class t2 ON t1.class_id = t2.id
         LEFT JOIN base_classroom t3 ON t1.site_id = t3.id
         left join class_time t4 on t1.time_number = t4.number and t1.time_period = t4.time_period
         WHERE t1.status = 1
         <if test="dto.adjustType != null and dto.adjustType == 'course_exchange'">
-            AND t1.teacher_id = #{dto.teacherId}
+            AND t1.teacher_id = #{dto.applicantTeacherId}
         </if>
         <if test="dto.adjustType != null and dto.adjustType == 'course_substitute'">
-            AND t1.teacher_id like concat('%', #{dto.teacherId},'%')
+            AND t1.teacher_id like concat('%', #{dto.applicantTeacherId},'%')
         </if>
-        AND t1.weeks = #{dto.week} AND t1.schedule_date = #{dto.adjustDate}
+        AND t1.weeks = #{dto.week} AND t1.schedule_date = #{dto.exchangeDate}
         <if test="dto.classId != null and dto.classId != ''">
             and t1.class_id = #{dto.classId}
         </if>
@@ -95,18 +95,36 @@
             </foreach>
         </if>
 
-        <if test="dto.applicantTeacherId != null and dto.applicantTeacherId != '' and dto.exchangeDate != null and dto.exchangeDate != '' and dto.timeNumber != null and dto.timeNumber != ''">
+        <if test="dto.adjustDate != null and dto.adjustDate != '' and dto.timeNumber != null and dto.timeNumber != ''">
             AND NOT EXISTS (
             SELECT 1
             FROM course_table t_prev
-            WHERE DATE(t_prev.schedule_date) = #{exchangeDate}
-            AND t_prev.time_number = #{timeNumber}
-            AND FIND_IN_SET(t_prev.teacher_id, #{applicantTeacherId}) > 0
+            WHERE DATE(t_prev.schedule_date) = #{dto.adjustDate}
+            AND t_prev.time_number in
+            <foreach item="timeNumber" collection="dto.timeNumbers" open="(" separator="," close=")">
+                #{timeNumber}
+            </foreach>
+            AND FIND_IN_SET(t_prev.teacher_id, #{dto.applicantTeacherId}) > 0
             )
         </if>
         order by t4.number asc
     </select>
 
+    <select id="getAdjustList2" parameterType="com.xjrsoft.module.schedule.dto.CourseTableAdjustDto1" resultType="com.xjrsoft.module.schedule.vo.CourseListVo">
+        SELECT t1.time_period,t4.short_name as time_number,t1.course_name,t2.name AS class_name,t3.name AS classroom_name,t1.id,t2.id as class_id FROM course_table t1
+        LEFT JOIN base_class t2 ON t1.class_id = t2.id
+        LEFT JOIN base_classroom t3 ON t1.site_id = t3.id
+        left join class_time t4 on t1.time_number = t4.number and t1.time_period = t4.time_period
+        WHERE t1.status = 1
+        AND FIND_IN_SET(t1.teacher_id, #{dto.teacherId}) > 0
+        AND DATE(t1.schedule_date) = #{dto.exchangeDate}
+        AND t4.short_name in
+        <foreach item="timeNumber" collection="dto.timeNumbers" open="(" separator="," close=")">
+            #{timeNumber}
+        </foreach>
+        order by t4.number asc
+    </select>
+
 
     <select id="getExceptCourseList" parameterType="java.lang.Long" resultType="com.xjrsoft.module.schedule.entity.WfCourseAdjust">
         SELECT a1.* FROM wf_course_adjust a1

+ 2 - 0
src/main/resources/mapper/teacher/TeacherFaceImportMapper.xml

@@ -112,6 +112,8 @@
         <if test="id != null">
             AND car_number = #{id}
         </if>
+        ORDER BY end_time DESC
+        LIMIT 1
     </select>
 
     <select id="GetVehicleIdList" resultType="java.lang.String">

+ 5 - 0
src/main/resources/sqlScript/20250924_sql.sql

@@ -0,0 +1,5 @@
+-- -------------------------------------------------------------------------------------------------------------------
+-- 公文收文,增加需要落实字段
+-- -------------------------------------------------------------------------------------------------------------------
+ALTER TABLE official_document_received
+    ADD COLUMN `use_handle` int null COMMENT '是否需要落实(0:不需要 1:需要)';