dzx 1 рік тому
батько
коміт
941ff409f8
27 змінених файлів з 1025 додано та 89 видалено
  1. 58 0
      src/main/java/com/xjrsoft/common/enums/ConsumeTypeEnum.java
  2. 7 1
      src/main/java/com/xjrsoft/common/enums/EvaluateTypeEnum.java
  3. 24 0
      src/main/java/com/xjrsoft/config/TransactionConfig.java
  4. 2 1
      src/main/java/com/xjrsoft/module/attendance/controller/TeacherStatisticsController.java
  5. 75 6
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java
  6. 33 0
      src/main/java/com/xjrsoft/module/courseTable/dto/ClassTeacherDto.java
  7. 4 0
      src/main/java/com/xjrsoft/module/courseTable/mapper/CourseTableMapper.java
  8. 21 0
      src/main/java/com/xjrsoft/module/courseTable/vo/ClassTeacherVo.java
  9. 2 0
      src/main/java/com/xjrsoft/module/evaluate/controller/EvaluateManageController.java
  10. 0 13
      src/main/java/com/xjrsoft/module/evaluate/controller/EvaluateTemplateController.java
  11. 3 0
      src/main/java/com/xjrsoft/module/evaluate/dto/EvaluateObjectListDto.java
  12. 49 4
      src/main/java/com/xjrsoft/module/evaluate/service/impl/EvaluateObjectServiceImpl.java
  13. 5 0
      src/main/java/com/xjrsoft/module/evaluate/vo/EvaluateTemplatePageVo.java
  14. 208 10
      src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java
  15. 156 17
      src/main/java/com/xjrsoft/module/job/AttendanceRecordTask.java
  16. 20 12
      src/main/java/com/xjrsoft/module/schedule/service/impl/WfCourseAdjustServiceImpl.java
  17. 15 0
      src/main/java/com/xjrsoft/module/student/controller/StudentConsumeDateController.java
  18. 36 0
      src/main/java/com/xjrsoft/module/student/dto/StudentConsumeDateExcelImportDto.java
  19. 6 0
      src/main/java/com/xjrsoft/module/student/service/IStudentConsumeDateService.java
  20. 160 5
      src/main/java/com/xjrsoft/module/student/service/impl/StudentConsumeDateServiceImpl.java
  21. 64 0
      src/main/java/com/xjrsoft/module/student/vo/StuConsumeImportStuInfoVo.java
  22. 15 1
      src/main/resources/mapper/courseTable/CourseTable.xml
  23. 40 2
      src/main/resources/mapper/evaluate/EvaluateObjectMapper.xml
  24. 1 0
      src/main/resources/mapper/evaluate/EvaluateTemplateMapper.xml
  25. 1 1
      src/main/resources/mapper/outin/TeacherOutInRecordMapper.xml
  26. 2 2
      src/test/java/com/xjrsoft/module/job/AttendanceRecordTaskTest.java
  27. 18 14
      src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest2.java

+ 58 - 0
src/main/java/com/xjrsoft/common/enums/ConsumeTypeEnum.java

@@ -0,0 +1,58 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @author dzx
+ * @date 2024/2/3
+ */
+public enum ConsumeTypeEnum {
+    /**
+     * 超市
+     * */
+    CONSUME_TYPE_2("consume_type_2", "超市"),
+    /**
+     * 食堂
+     * */
+    CONSUME_TYPE_1("consume_type_1", "食堂"),
+    /**
+     * 其他
+     * */
+    CONSUME_TYPE_4("consume_type_4", "其他"),
+    /**
+     * 图书馆
+     * */
+    CONSUME_TYPE_3("consume_type_3", "图书馆");
+
+    final String code;
+    final String value;
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    ConsumeTypeEnum(final String code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+
+    public static String getCode(String value){
+        for (ConsumeTypeEnum item : values()) {
+            if (item.getValue().equals(value)) {
+                return  item.getCode();
+            }
+        }
+        return "consume_type_4";
+    }
+
+    public static String getValue(String code) {
+        for (ConsumeTypeEnum item : values()) {
+            if (item.getCode().equals(code)) {
+                return  item.getValue();
+            }
+        }
+        return "consume_type_4";
+    }
+}

+ 7 - 1
src/main/java/com/xjrsoft/common/enums/EvaluateTypeEnum.java

@@ -14,7 +14,13 @@ public enum EvaluateTypeEnum {
     /**
      *  教官评价班级
      */
-    DRILLMASTER_EVALUATE_CLASS("dm_evaluate_class", "教官评价班级");
+    DRILLMASTER_EVALUATE_CLASS("dm_evaluate_class", "教官评价班级"),
+
+    STUDENT_EVALUATE_COURSE_TEACHER("stu_evaluate_tea", "学生评价任课教师"),
+
+    TEACHER_EVALUATE_CLASS("tea_evaluate_class", "任课教师对班级评价"),
+
+    TEACHER_EVALUATE("teacher_evaluate", "任课教师对班级评价");
 
     final String code;
     final String value;

+ 24 - 0
src/main/java/com/xjrsoft/config/TransactionConfig.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.sql.DataSource;
+
+@Configuration
+@EnableTransactionManagement
+public class TransactionConfig {
+
+    @Autowired
+    private DataSource dataSource;
+
+    @Bean
+    public PlatformTransactionManager transactionManager() {
+        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
+        return transactionManager;
+    }
+}

+ 2 - 1
src/main/java/com/xjrsoft/module/attendance/controller/TeacherStatisticsController.java

@@ -197,7 +197,8 @@ public class TeacherStatisticsController {
                     }
                     TeacherOutInRecordDto outInDto = new TeacherOutInRecordDto();
                     outInDto.setQueryDate(startTime.toLocalDate());
-                    outInDto.setRecordTime(endTime);
+                    outInDto.setStartTime(startTime);
+                    outInDto.setEndTime(endTime);
                     outInDto.setStatus(OutInStatusEnum.enter.getCode());
                     outInDto.setUserId(record.getUserId());
                     List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.getListByParam(outInDto);

+ 75 - 6
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java

@@ -26,14 +26,21 @@ import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
 import com.xjrsoft.module.attendance.service.IAttendanceStatisticsRecordService;
 import com.xjrsoft.module.attendance.service.IAttendanceStatisticsService;
 import com.xjrsoft.module.attendance.service.ITeacherAttendanceRecordService;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
 import com.xjrsoft.module.attendance.vo.AttendanceStatisticsPageVo;
 import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo;
+import com.xjrsoft.module.hikvision.util.OutInRecordUtil;
 import com.xjrsoft.module.holiday.entity.HolidayDate;
 import com.xjrsoft.module.holiday.service.IHolidayDateService;
+import com.xjrsoft.module.job.AttendanceRecordTask;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.vo.UserIdDeptNameVo;
+import com.xjrsoft.module.outint.service.ICarOutInRecordService;
+import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
+import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
+import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import lombok.AllArgsConstructor;
 import me.zhyd.oauth.log.Log;
 import org.apache.poi.ss.usermodel.Cell;
@@ -52,7 +59,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.text.ParseException;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
@@ -86,16 +95,65 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
 
     private final IHolidayDateService holidayDateService;
 
+    private final FaceImportMapper faceImportMapper;
+
+    private final IWfTeacherleaveService wfTeacherleaveService;
+
+    private final ITeacherOutInRecordService outInRecordService;
+
+    private final ICarOutInRecordService carOutInRecordService;
+
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(AddAttendanceStatisticsDto dto) {
-        AttendanceStatistics attendanceStatistics = BeanUtil.toBean(dto, AttendanceStatistics.class);
-        attendanceStatistics.setCreateDate(new Date());
-        attendanceStatistics.setStatus(0);
-        statisticsMapper.insert(attendanceStatistics);
-        refreshRecord(attendanceStatistics.getId());
-        return true;
+        try {
+            AttendanceStatistics statistics = BeanUtil.toBean(dto, AttendanceStatistics.class);
+            statistics.setCreateDate(new Date());
+            statistics.setStatus(0);
+            statisticsMapper.insert(statistics);
+
+            CompletableFuture.runAsync(() -> {
+                List<LocalDate> dateList = getDatesBetween(dto.getStartDate(), dto.getEndDate());
+                LocalDateTime now = LocalDateTime.now();
+                if(dateList.contains(now.toLocalDate())){
+                    OutInRecordUtil outInRecordUtil = new OutInRecordUtil();
+                    LocalDateTime startDateTime = now.withHour(0).withMinute(0).withSecond(0).withNano(0);
+                    LocalDateTime endDateTime = startDateTime.plusDays(1).plusSeconds(-1);
+
+                    Map<Long, AttendanceRuleDetailsUserVo> teacherRules = ruleCategoryService.getAllTeacherTodyRule(now.getDayOfWeek().name());
+
+                    try {
+                        //教师
+                        outInRecordUtil.getTeacherRecords(faceImportMapper, startDateTime, endDateTime, teacherRules);
+                        //拉取车辆数据
+                        outInRecordUtil.GetVehicleRecord(faceImportMapper, startDateTime, endDateTime);
+                    } catch (ParseException e) {
+                        Log.error(e.getMessage(), e);
+                    }
+
+                    AttendanceRecordTask recordTask = new AttendanceRecordTask();
+                    recordTask.teacherAttendanceRecord(startDateTime, statistics.getTimePeriod(),
+                            userService,
+                            ruleCategoryService,
+                            holidayDateService,
+                            wfTeacherleaveService,
+                            outInRecordService,
+                            carOutInRecordService,
+                            recordService
+                    );
+                }
+                //1、同步出入记录的数据
+                //2、固化考勤数据
+                refreshRecord(statistics.getId());
+            });
+
+            return true;
+        } catch (Exception e) {
+            Log.error(e.getMessage(), e);
+            throw new MyException("添加报错,请联系管理员");
+        }
     }
 
     @Override
@@ -345,6 +403,17 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
         return dates;
     }
 
+    private List<LocalDate> getDatesBetween(LocalDate startDate, LocalDate endDate) {
+        List<LocalDate> dates = new ArrayList<>();
+        long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate) + 1; // +1 包含结束日期
+        for (long i = 0; i < numOfDaysBetween; i++) {
+            LocalDate localDate = startDate.plusDays(i);
+            dates.add(localDate);
+        }
+
+        return dates;
+    }
+
     private Map<String, String> initWeekCn() {
         Map<String, String> result = new HashMap<>();
 

+ 33 - 0
src/main/java/com/xjrsoft/module/courseTable/dto/ClassTeacherDto.java

@@ -0,0 +1,33 @@
+package com.xjrsoft.module.courseTable.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+
+
+/**
+* @title: 活动信息
+* @Author dzx
+* @Date: 2024-07-19
+* @Version 1.0
+*/
+@Data
+public class ClassTeacherDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("年级id")
+    private Long gradeId;
+
+    @ApiModelProperty("班级id")
+    private List<Long> classIds;
+
+    @ApiModelProperty("开始日期")
+    private LocalDate startDate;
+
+    @ApiModelProperty("结束日期")
+    private LocalDate endDate;
+}

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

@@ -1,6 +1,8 @@
 package com.xjrsoft.module.courseTable.mapper;
 
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.courseTable.dto.ClassTeacherDto;
+import com.xjrsoft.module.courseTable.vo.ClassTeacherVo;
 import com.xjrsoft.module.schedule.dto.ClassOptionDto;
 import com.xjrsoft.module.courseTable.entity.CourseTable;
 import com.xjrsoft.module.schedule.entity.WfCourseAdjust;
@@ -32,4 +34,6 @@ public interface CourseTableMapper extends MPJBaseMapper<CourseTable> {
 
     //查询流程正在进行中或者已经完成的调课或者顶课申请
     List<WfCourseAdjust> getExceptCourseList(@Param("userId") Long userId);
+
+    List<ClassTeacherVo> getClassTeacherIds(@Param("dto") ClassTeacherDto dto);
 }

+ 21 - 0
src/main/java/com/xjrsoft/module/courseTable/vo/ClassTeacherVo.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.courseTable.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 第二课堂分页列表出参
+* @Author dzx
+* @Date: 2024-07-29
+* @Version 1.0
+*/
+@Data
+public class ClassTeacherVo {
+
+    @ApiModelProperty("班级id")
+    private Long classId;
+
+    @ApiModelProperty("教师id(多个以“,”隔开)")
+    private String teacherId;
+
+}

+ 2 - 0
src/main/java/com/xjrsoft/module/evaluate/controller/EvaluateManageController.java

@@ -13,6 +13,7 @@ import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.evaluate.dto.AddEvaluateManageDto;
 import com.xjrsoft.module.evaluate.dto.EvaluateManageChangeStatusDto;
 import com.xjrsoft.module.evaluate.dto.EvaluateManagePageDto;
+import com.xjrsoft.module.evaluate.dto.MakeEvaluateItemDto;
 import com.xjrsoft.module.evaluate.dto.UpdateEvaluateManageDto;
 import com.xjrsoft.module.evaluate.entity.EvaluateManage;
 import com.xjrsoft.module.evaluate.entity.EvaluateTemplate;
@@ -20,6 +21,7 @@ import com.xjrsoft.module.evaluate.service.IEvaluateManageService;
 import com.xjrsoft.module.evaluate.service.IEvaluateTemplateService;
 import com.xjrsoft.module.evaluate.vo.EvaluateManagePageVo;
 import com.xjrsoft.module.evaluate.vo.EvaluateManageVo;
+import com.xjrsoft.module.evaluate.vo.MakeEvaluateItemVo;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;

+ 0 - 13
src/main/java/com/xjrsoft/module/evaluate/controller/EvaluateTemplateController.java

@@ -7,23 +7,18 @@ import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
-import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.evaluate.dto.AddEvaluateTemplateDto;
 import com.xjrsoft.module.evaluate.dto.EvaluateTemplatePageDto;
 import com.xjrsoft.module.evaluate.dto.UpdateEvaluateTemplateDto;
 import com.xjrsoft.module.evaluate.dto.UpdateEvaluateTemplateStatusDto;
-import com.xjrsoft.module.evaluate.entity.EvaluateManage;
 import com.xjrsoft.module.evaluate.entity.EvaluateTemplate;
 import com.xjrsoft.module.evaluate.service.IEvaluateManageService;
 import com.xjrsoft.module.evaluate.service.IEvaluateTemplateService;
 import com.xjrsoft.module.evaluate.vo.EvaluateTemplatePageVo;
 import com.xjrsoft.module.evaluate.vo.EvaluateTemplateVo;
-import com.xjrsoft.module.organization.entity.User;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -127,14 +122,6 @@ public class EvaluateTemplateController {
     @ApiOperation(value = "删除评价模版")
     @SaCheckPermission("evaluatetemplate:delete")
     public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
-        List<EvaluateManage> list = evaluateManageService.list(
-                new QueryWrapper<EvaluateManage>().lambda()
-                        .in(EvaluateManage::getEvaluateTemplateId, ids)
-                        .eq(EvaluateManage::getDeleteMark, DeleteMark.NODELETE.getCode())
-        );
-        if(!list.isEmpty()){
-            return RT.error("该模板已经被使用,无法删除");
-        }
         return RT.ok(evaluateTemplateService.removeBatchByIds(ids));
 
     }

+ 3 - 0
src/main/java/com/xjrsoft/module/evaluate/dto/EvaluateObjectListDto.java

@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
 
 
 /**
@@ -35,4 +37,5 @@ public class EvaluateObjectListDto implements Serializable {
 
     @ApiModelProperty("评价类型")
     private String evaluateType;
+
 }

+ 49 - 4
src/main/java/com/xjrsoft/module/evaluate/service/impl/EvaluateObjectServiceImpl.java

@@ -11,6 +11,9 @@ import com.xjrsoft.common.enums.EvaluateTypeEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.courseTable.dto.ClassTeacherDto;
+import com.xjrsoft.module.courseTable.mapper.CourseTableMapper;
+import com.xjrsoft.module.courseTable.vo.ClassTeacherVo;
 import com.xjrsoft.module.evaluate.dto.AddEvaluateExecuterDto;
 import com.xjrsoft.module.evaluate.dto.AddEvaluateObjectDto;
 import com.xjrsoft.module.evaluate.dto.EvaluateObjectGradeListDto;
@@ -29,12 +32,17 @@ import com.xjrsoft.module.evaluate.vo.EvaluateExecuterVo;
 import com.xjrsoft.module.evaluate.vo.EvaluateManageVo;
 import com.xjrsoft.module.evaluate.vo.EvaluateObjectGradeListVo;
 import com.xjrsoft.module.evaluate.vo.EvaluateObjectListVo;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
@@ -53,6 +61,8 @@ public class EvaluateObjectServiceImpl extends MPJBaseServiceImpl<EvaluateObject
 
     private final EvaluateObjectMapper evaluateObjectMapper;
     private final EvaluateExecuterMapper evaluateExecuterMapper;
+    private final CourseTableMapper courseTableMapper;
+    private final IUserService userService;
 
 
     @Override
@@ -228,10 +238,7 @@ public class EvaluateObjectServiceImpl extends MPJBaseServiceImpl<EvaluateObject
                 objectListVo.setExecuterCount(executerList.size());
                 objectListVo.setExecuterList(executerList);
             }
-        }
-
-        //入参评价类型是教官评价班级
-        if(dto.getEvaluateType() != null && dto.getEvaluateType().equals(EvaluateTypeEnum.DRILLMASTER_EVALUATE_CLASS.getCode())) {
+        }else if(dto.getEvaluateType() != null && dto.getEvaluateType().equals(EvaluateTypeEnum.DRILLMASTER_EVALUATE_CLASS.getCode())) {//入参评价类型是教官评价班级
             newObjectList = evaluateObjectMapper.getNewObjectList(dto);
             List<EvaluateExecuterVo> newExecuterList = evaluateObjectMapper.getNewExecuterList(dto);
 
@@ -239,6 +246,44 @@ public class EvaluateObjectServiceImpl extends MPJBaseServiceImpl<EvaluateObject
                 objectListVo.setExecuterCount(newExecuterList.size());
                 objectListVo.setExecuterList(newExecuterList);
             }
+        }else if(dto.getEvaluateType() != null && dto.getEvaluateType().equals(EvaluateTypeEnum.TEACHER_EVALUATE_CLASS.getCode())) {//任课教师对班级评价
+            EvaluateManage manage = evaluateManageMapper.selectById(dto.getEvaluateManageId());
+            newObjectList = evaluateObjectMapper.getNewObjectList(dto);
+
+            List<ClassTeacherVo> classTeacher = courseTableMapper.getClassTeacherIds(
+                    new ClassTeacherDto() {{
+                        setStartDate(manage.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
+                        setGradeId(dto.getGradeId());
+                        setEndDate(manage.getEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
+                    }}
+            );
+
+            List<User> userList = userService.list(
+                    new MPJLambdaWrapper<User>()
+                            .select(User::getId)
+                            .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                            .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
+            );
+            Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(User::getId, User::getName));
+            for (EvaluateObjectListVo objectListVo : newObjectList) {
+                List<EvaluateExecuterVo> currentExecuterList = new ArrayList<>();
+                for (ClassTeacherVo executerVo : classTeacher) {
+                    if(!objectListVo.getObjectId().equals(executerVo.getClassId().toString())){
+                        continue;
+                    }
+
+                    String[] teacherIds = executerVo.getTeacherId().split(",");
+                    for (String teacherId : teacherIds) {
+                        EvaluateExecuterVo evaluateExecuterVo = new EvaluateExecuterVo();
+                        evaluateExecuterVo.setEvaluateObjectId(teacherId);
+                        evaluateExecuterVo.setExecuterName(userMap.get(Long.parseLong(teacherId)));
+                        evaluateExecuterVo.setEvaluateManageId(dto.getEvaluateManageId().toString());
+                        currentExecuterList.add(evaluateExecuterVo);
+                    }
+                }
+                objectListVo.setExecuterCount(currentExecuterList.size());
+                objectListVo.setExecuterList(currentExecuterList);
+            }
         }
 
         return newObjectList;

+ 5 - 0
src/main/java/com/xjrsoft/module/evaluate/vo/EvaluateTemplatePageVo.java

@@ -76,4 +76,9 @@ public class EvaluateTemplatePageVo {
     @ApiModelProperty("状态(0:禁用 1:启用)")
     private Integer status;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("使用状态(0:未使用 1:使用中)")
+    @ApiModelProperty("使用状态(0:未使用 1:使用中)")
+    private Integer useStatus;
+
 }

+ 208 - 10
src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java

@@ -9,6 +9,7 @@ import com.xjrsoft.common.enums.OutInStatusEnum;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.utils.SqlRunnerAdapterUtil;
 import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -19,10 +20,10 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 
 
@@ -38,12 +39,12 @@ public class OutInRecordUtil {
                 " WHERE NOT EXISTS (SELECT 1 FROM teacher_out_in_record WHERE eventId = '" + eventId + "')";
         SqlRunnerAdapter.db().insert(sql);
 
-        String updSql = "UPDATE attendance_user_relation SET " +
-                "attendance_status = '" + attendanceStatus + "', " +
-                "attendance_time = '" + recordTime + "', " +
-                "attendance_mode = '人脸' " +
-                "WHERE user_id = '" + userId + "' AND delete_mark = 0";
-        SqlRunnerAdapter.db().update(updSql);
+//        String updSql = "UPDATE attendance_user_relation SET " +
+//                "attendance_status = '" + attendanceStatus + "', " +
+//                "attendance_time = '" + recordTime + "', " +
+//                "attendance_mode = '人脸' " +
+//                "WHERE user_id = '" + userId + "' AND delete_mark = 0";
+//        SqlRunnerAdapter.db().update(updSql);
     }
 
     private void studentInsertRecord(Long userId, Long teacherId, Long classId, String facePhoto, String recordTime, int status, String eventId, String attendanceStatus){
@@ -438,8 +439,6 @@ public class OutInRecordUtil {
 
             if (visit_id_list.contains(eventId)) continue;
 
-
-
             visitInsertRecord(Long.parseLong(reservationSchoolId), eventTime, picUri, status + "", eventId);
         }
 
@@ -578,6 +577,7 @@ public class OutInRecordUtil {
             JsonObject paramsObject = data.getAsJsonObject("params");
             JsonArray eventsArray = paramsObject.getAsJsonArray("events");
 
+            List<Long> teacherUserIds = faceImportMapper.getTeacherUserIds();
             for (JsonElement eventElement : eventsArray) {
                 JsonObject eventObject = eventElement.getAsJsonObject();
                 JsonObject dataObject = eventObject.getAsJsonObject("data");
@@ -606,7 +606,7 @@ public class OutInRecordUtil {
 
                 if (idNum == null) continue;
 
-                if (!Objects.equals(faceImportMapper.IsStudentTypeByPersonId(Long.valueOf(idNum)), "学生")) {
+                if (teacherUserIds.contains(Long.valueOf(idNum))) {
                     // 老师记录
                     LocalDateTime recordTimeDate = LocalDateTime.parse(recordTimeStr, formatter);
                     String attendanceStatus = discernTeacherStatus(recordTimeDate, status, Long.valueOf(idNum));
@@ -812,4 +812,202 @@ public class OutInRecordUtil {
             }
         }
     }
+
+    public void getTeacherRecords(FaceImportMapper faceImportMapper, LocalDateTime startDateTime, LocalDateTime endDateTime,
+                                 Map<Long, AttendanceRuleDetailsUserVo> teacherRules) throws ParseException {
+        JsonArray responseBuilder = new JsonArray();
+
+        AtomicInteger pageNo = new AtomicInteger(1);
+        int pageSize = 1000;
+        boolean hasMorePages = true;
+
+        while (hasMorePages) {
+            String response = GetDoorEvent(pageNo, pageSize, startDateTime, endDateTime);
+
+            JsonElement responseElement = new Gson().fromJson(response, JsonElement.class);
+            JsonArray dataList = responseElement.getAsJsonObject().getAsJsonObject("data").getAsJsonArray("list");
+            responseBuilder.addAll(dataList);
+            JsonObject responseJson = new Gson().fromJson(response, JsonObject.class);
+            int totalCount = responseJson.getAsJsonObject("data").get("totalPage").getAsInt();
+            hasMorePages = pageNo.getAndIncrement() < totalCount;
+        }
+        //存数据
+        if(responseBuilder.size() > 0){
+            return;
+        }
+        InsertTeacherStudentRecords(responseBuilder, faceImportMapper);
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        List<Long> teacherUserIds = faceImportMapper.getTeacherUserIds();
+        List<String> insertSqls = new ArrayList<>();
+        for (JsonElement element : responseBuilder) {
+            JsonObject item = element.getAsJsonObject();
+
+            Long personId;
+            try {
+                personId = item.get("personId").isJsonNull() ? null : item.get("personId").getAsLong();
+            }catch (Exception e){
+                continue;
+            }
+            if (personId == null) continue;
+
+            int statusInt = item.get("inAndOutType").getAsInt();
+            int status = 1;
+            switch (statusInt){
+                case 0:
+                    status = 1;
+                    break;
+                case 1:
+                    status = 0;
+                    break;
+            }
+
+            String uri = item.get("picUri").isJsonNull() ? null : item.get("picUri").getAsString();
+            String recordTime = item.get("eventTime").isJsonNull() ? null : item.get("eventTime").getAsString();
+            String eventId = item.get("eventId").isJsonNull() ? null : item.get("eventId").getAsString();
+            String recordTimeStr = ChangeTime(recordTime);
+            if (teacherUserIds.contains(personId)) {
+                // 老师记录
+                LocalDateTime recordTimeDate = LocalDateTime.parse(recordTimeStr, formatter);
+                String attendanceStatus = discernTeacherStatus(recordTimeDate, status, teacherRules.get(personId));
+                String insSql = "INSERT INTO teacher_out_in_record(create_date, user_id, record_time, face_photo, eventId, status,delete_mark,enabled_mark, attendance_status) "
+                        + "select now(), '"  + personId + "', '" + recordTimeStr + "', '" +
+                        ApiUtil.GetRedirectURL(uri) + "', '" + eventId + "', '" +status + "',0,1,'" + attendanceStatus + "'" +
+                        " WHERE NOT EXISTS (SELECT 1 FROM teacher_out_in_record WHERE eventId = '" + eventId + "')";
+                insertSqls.add(insSql);
+            }
+            if(!insertSqls.isEmpty()){
+                for (String insertSql : insertSqls) {
+                    SqlRunnerAdapter.db().insert(insertSql);
+                }
+            }
+        }
+    }
+
+    String discernTeacherStatus(LocalDateTime recordTime, int status, AttendanceRuleDetailsUserVo ruleDetails){
+        String attendanceStatus = "";
+        if (ruleDetails != null) {
+            if (ruleDetails.getIsAttendance() != null && ruleDetails.getIsAttendance() == 0) {
+                attendanceStatus = "不考勤";
+            } else {
+                LocalDateTime amStartTime = null, amEndTime = null, pmStartTime = null, pmEndTime = null, eveningStartTime = null, eveningEndTime = null;
+                if (ruleDetails.getAmStatus() != null && ruleDetails.getAmStatus() == 1
+                        && ruleDetails.getAmStartTime() != null && ruleDetails.getAmEndTime() != null) {
+                    amStartTime = recordTime.withHour(ruleDetails.getAmStartTime().getHour())
+                            .withMinute(ruleDetails.getAmStartTime().getMinute())
+                            .withSecond(ruleDetails.getAmStartTime().getSecond());
+                    amEndTime = recordTime.withHour(ruleDetails.getAmEndTime().getHour())
+                            .withMinute(ruleDetails.getAmEndTime().getMinute())
+                            .withSecond(ruleDetails.getAmEndTime().getSecond());
+                }
+                if (ruleDetails.getPmStatus() != null && ruleDetails.getPmStatus() == 1
+                        && ruleDetails.getPmEndTime() != null && ruleDetails.getPmStartTime() != null) {
+                    pmStartTime = recordTime.withHour(ruleDetails.getPmStartTime().getHour())
+                            .withMinute(ruleDetails.getPmStartTime().getMinute())
+                            .withSecond(ruleDetails.getPmStartTime().getSecond());
+                    pmEndTime = recordTime.withHour(ruleDetails.getPmEndTime().getHour())
+                            .withMinute(ruleDetails.getPmEndTime().getMinute())
+                            .withSecond(ruleDetails.getPmEndTime().getSecond());
+                }
+                if (status == OutInStatusEnum.goOut.getCode()) {//出
+                    if (recordTime.isBefore(amEndTime) && recordTime.isAfter(amStartTime)) {
+                        attendanceStatus = "早退";
+                    } else if (recordTime.isBefore(pmEndTime) && recordTime.isAfter(pmStartTime)) {
+                        attendanceStatus = "早退";
+                    } else {
+                        attendanceStatus = "离校";
+                    }
+                } else {//进
+                    if (recordTime.isBefore(amEndTime) && recordTime.isAfter(amStartTime)) {
+                        attendanceStatus = "迟到";
+                    } else if (recordTime.isBefore(pmEndTime) && recordTime.isAfter(pmStartTime)) {
+                        attendanceStatus = "迟到";
+                    } else {
+                        attendanceStatus = "到校";
+                    }
+                }
+            }
+        }
+        return attendanceStatus;
+    }
+
+    String discernStudentStatus(LocalDateTime recordTime, int status, AttendanceRuleDetailsUserVo ruleDetails){
+        String attendanceStatus = "";
+        if(ruleDetails.getIsAllowInOutSchool() != null && ruleDetails.getIsAllowInOutSchool() == 0){
+            attendanceStatus = "不考勤";
+        }else{
+            LocalDateTime amStartTime = null, amEndTime = null, pmStartTime = null, pmEndTime = null, eveningStartTime = null, eveningEndTime = null;
+            if(ruleDetails.getAmStatus() != null && ruleDetails.getAmStatus() == 1 && ruleDetails.getAmStartTime() != null
+                    &&  ruleDetails.getAmEndTime() != null){
+                amStartTime = recordTime.withHour(ruleDetails.getAmStartTime().getHour())
+                        .withMinute(ruleDetails.getAmStartTime().getMinute())
+                        .withSecond(ruleDetails.getAmStartTime().getSecond());
+                amEndTime = recordTime.withHour(ruleDetails.getAmEndTime().getHour())
+                        .withMinute(ruleDetails.getAmEndTime().getMinute())
+                        .withSecond(ruleDetails.getAmEndTime().getSecond());
+            }
+            if(ruleDetails.getPmStatus() != null && ruleDetails.getPmStatus() == 1 && ruleDetails.getPmStartTime() != null
+                    &&  ruleDetails.getPmEndTime() != null){
+                pmStartTime = recordTime.withHour(ruleDetails.getPmStartTime().getHour())
+                        .withMinute(ruleDetails.getPmStartTime().getMinute())
+                        .withSecond(ruleDetails.getPmStartTime().getSecond());
+                pmEndTime = recordTime.withHour(ruleDetails.getPmEndTime().getHour())
+                        .withMinute(ruleDetails.getPmEndTime().getMinute())
+                        .withSecond(ruleDetails.getPmEndTime().getSecond());
+            }
+            if(ruleDetails.getEveningStatus() != null && ruleDetails.getEveningStatus() == 1
+                    && ruleDetails.getEveningStartTime() != null
+                    &&  ruleDetails.getEveningEndTime() != null){
+                eveningStartTime = recordTime.withHour(ruleDetails.getEveningStartTime().getHour())
+                        .withMinute(ruleDetails.getEveningStartTime().getMinute())
+                        .withSecond(ruleDetails.getEveningStartTime().getSecond());
+                eveningEndTime = recordTime.withHour(ruleDetails.getEveningEndTime().getHour())
+                        .withMinute(ruleDetails.getEveningEndTime().getMinute())
+                        .withSecond(ruleDetails.getEveningEndTime().getSecond());
+            }
+            if(status == OutInStatusEnum.goOut.getCode()){//出
+                if(amEndTime != null && amStartTime != null && recordTime.isBefore(amEndTime) && recordTime.isAfter(amStartTime)){
+                    attendanceStatus = "早退";
+                }else if(pmEndTime != null && pmStartTime != null && recordTime.isBefore(pmEndTime) && recordTime.isAfter(pmStartTime)){
+                    attendanceStatus = "早退";
+                }else if(eveningEndTime != null && recordTime.isBefore(eveningEndTime) && recordTime.isAfter(eveningStartTime)){
+                    attendanceStatus = "早退";
+                }else{
+                    attendanceStatus = "离校";
+                }
+            }else{//进
+                if(amEndTime != null && amStartTime != null && recordTime.isBefore(amEndTime) && recordTime.isAfter(amStartTime)){
+                    attendanceStatus = "迟到";
+                    LocalDateTime localDateTime = amStartTime;
+                    if(ruleDetails.getOverMinutes() != null){
+                        localDateTime = amStartTime.plusMinutes(ruleDetails.getOverMinutes());
+                    }
+                    if(recordTime.isAfter(localDateTime)){
+                        attendanceStatus = "旷课";
+                    }
+                }else if(pmEndTime != null && pmStartTime != null && recordTime.isBefore(pmEndTime) && recordTime.isAfter(pmStartTime)){
+                    attendanceStatus = "迟到";
+                    LocalDateTime localDateTime = pmStartTime;
+                    if(ruleDetails.getOverMinutes() != null){
+                        localDateTime = pmStartTime.plusMinutes(ruleDetails.getOverMinutes());
+                    }
+                    if(recordTime.isAfter(localDateTime)){
+                        attendanceStatus = "旷课";
+                    }
+                }else if(eveningEndTime != null && recordTime.isBefore(eveningEndTime) && recordTime.isAfter(eveningStartTime)){
+                    attendanceStatus = "迟到";
+                    LocalDateTime localDateTime = eveningStartTime;
+                    if(ruleDetails.getOverMinutes() != null){
+                        localDateTime = eveningStartTime.plusMinutes(ruleDetails.getOverMinutes());
+                    }
+                    if(recordTime.isAfter(localDateTime)){
+                        attendanceStatus = "旷课";
+                    }
+                }else{
+                    attendanceStatus = "到校";
+                }
+            }
+        }
+        return attendanceStatus;
+    }
 }

+ 156 - 17
src/main/java/com/xjrsoft/module/job/AttendanceRecordTask.java

@@ -21,10 +21,7 @@ import com.xjrsoft.module.outint.service.ICarOutInRecordService;
 import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
 import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
-import com.xjrsoft.module.teacher.entity.WfHeadTeacherLeave;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
-import com.xjrsoft.module.teacher.entity.XjrUser;
-import com.xjrsoft.module.teacher.service.IWfHeadTeacherLeaveService;
 import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -58,9 +55,6 @@ public class AttendanceRecordTask {
     @Autowired
     private IWfTeacherleaveService wfTeacherleaveService;
 
-    @Autowired
-    private IWfHeadTeacherLeaveService headTeacherLeaveService;
-
     @Autowired
     private ITeacherOutInRecordService teacherOutInRecordService;
 
@@ -190,16 +184,156 @@ public class AttendanceRecordTask {
                 continue;
             }
 
-            WfHeadTeacherLeave teacherLeave = headTeacherLeaveService.selectJoinOne(WfHeadTeacherLeave.class,
-                    new MPJLambdaWrapper<WfHeadTeacherLeave>()
-                            .select(WfHeadTeacherLeave.class, x -> VoToColumnUtil.fieldsToColumns(WfHeadTeacherLeave.class).contains(x.getProperty()))
-                            .innerJoin(XjrUser.class, XjrUser::getId, WfHeadTeacherLeave::getApplicantUserId)
-                            .eq(WfHeadTeacherLeave::getStatus, 1)
-                            .eq(WfHeadTeacherLeave::getApplicantUserId, record.getUserId())
-                            .between(WfHeadTeacherLeave::getStartTime, startTime, endTime)
-            );
-            if(teacherLeave != null){
-                record.setAttendanceStatus(teacherLeave.getLeaveReason());
+            TeacherOutInRecordDto outInDto = new TeacherOutInRecordDto();
+            outInDto.setQueryDate(startTime.toLocalDate());
+            outInDto.setEndTime(endTime);
+            outInDto.setStartTime(startTime);
+            outInDto.setStatus(OutInStatusEnum.enter.getCode());
+            outInDto.setUserId(record.getUserId());
+            List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.getListByParam(outInDto);
+            if(!outInRecords.isEmpty()){
+                TeacherOutInRecord outInRecord = outInRecords.get(0);
+                if(outInRecord != null){
+                    record.setRecordTime(outInRecord.getRecordTime());
+                    record.setAttendanceStatus(outInRecord.getAttendanceStatus());
+                    record.setAttendanceMode(1);
+                }
+            }else{
+                //查询该教师是否通过车辆进入
+                List<CarOutInRecord> list = carOutInRecordService.list(
+                        new MPJLambdaWrapper<CarOutInRecord>()
+                                .select(CarOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(CarOutInRecord.class).contains(x.getProperty()))
+                                .leftJoin(CarMessageApply.class, CarMessageApply::getId, CarOutInRecord::getCarMessageApplyId)
+                                .le(CarOutInRecord::getRecordTime, endTime)
+                                .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
+                                .eq(CarMessageApply::getUserId, record.getUserId())
+                                .ge(timePeriod != null && timePeriod == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
+                                .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
+                                .orderByAsc(CarOutInRecord::getRecordTime)
+                );
+                if(!list.isEmpty()){
+                    CarOutInRecord outInRecord = list.get(0);
+                    if(outInRecord != null && outInRecord.getRecordTime().isBefore(startTime)){
+                        record.setRecordTime(outInRecord.getRecordTime());
+                        record.setAttendanceStatus("到校");
+                        record.setAttendanceMode(2);
+                        record.setCarNumber(outInRecord.getPlanNo());
+                    }else if(outInRecord != null && outInRecord.getRecordTime().isAfter(startTime)){
+                        record.setRecordTime(outInRecord.getRecordTime());
+                        record.setAttendanceStatus("迟到");
+                        record.setAttendanceMode(1);
+                        record.setCarNumber(outInRecord.getPlanNo());
+                    }
+                }
+            }
+
+            if(record.getAttendanceStatus() == null){
+                record.setAttendanceStatus("缺勤");
+            }
+
+            insertList.add(record);
+        }
+
+        if(!insertList.isEmpty()){
+            recordService.saveBatch(insertList);
+        }
+    }
+
+    public void teacherAttendanceRecord(LocalDateTime startDateTime, Integer timePeriod,
+                                        IUserService userService,
+                                        IAttendanceRuleCategoryService ruleCategoryService,
+                                        IHolidayDateService holidayDateService,
+                                        IWfTeacherleaveService wfTeacherleaveService,
+                                        ITeacherOutInRecordService teacherOutInRecordService,
+                                        ICarOutInRecordService carOutInRecordService,
+                                        ITeacherAttendanceRecordService recordService){
+        List<User> teacherList = userService.list(
+                new MPJLambdaWrapper<User>()
+                        .select(User::getId)
+                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                        .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
+        );
+        List<Long> userIds = teacherList.stream().map(User::getId).collect(Collectors.toList());
+        Map<Long, AttendanceRuleDetailsUserVo> teacherTodyRuleByUserId = ruleCategoryService.getTeacherTodyRuleByUserId(userIds);
+
+        List<Integer> holidayTypes = Arrays.asList(1, 3);
+        List<HolidayDate> holidayDates = holidayDateService.list(
+                new QueryWrapper<HolidayDate>().lambda()
+                        .in(HolidayDate::getStatus, holidayTypes)
+        );
+        List<String> holidayDateList = holidayDates.stream().map(HolidayDate::getDate).collect(Collectors.toList());
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate queryDate = startDateTime.toLocalDate();
+        List<TeacherAttendanceRecord> insertList = new ArrayList<>();
+        List<String> weekList =Arrays.asList("SUNDAY", "SATURDAY");
+
+        List<HolidayDate> workHolidayDates = holidayDateService.list(
+                new QueryWrapper<HolidayDate>().lambda()
+                        .eq(HolidayDate::getStatus, 2)
+        );
+        List<String> workHolidayDateListg = workHolidayDates.stream().map(HolidayDate::getDate).collect(Collectors.toList());
+
+        for (User user : teacherList) {
+            TeacherAttendanceRecord record = new TeacherAttendanceRecord();
+            record.setCreateDate(LocalDateTime.now());
+            record.setAttendanceDate(queryDate);
+            record.setUserId(user.getId());
+            record.setTimeInterval(timePeriod);
+            AttendanceRuleDetailsUserVo detailsUserVo = teacherTodyRuleByUserId.get(user.getId());
+
+            if(detailsUserVo == null){
+                record.setAttendanceStatus("不考勤");
+                insertList.add(record);
+                continue;
+            }
+            AttendanceRuleDetails holidayRule = ruleCategoryService.getHolidayRuleByParam(user.getId());
+            if(((!workHolidayDateListg.contains(queryDate.format(formatter)) && weekList.contains(queryDate.getDayOfWeek().name()))
+                    || holidayDateList.contains(queryDate.format(formatter))) && (holidayRule.getIsAttendance() == null || holidayRule.getIsAttendance() == 0)){
+                record.setAttendanceStatus("不考勤");
+                insertList.add(record);
+                continue;
+            }
+
+            LocalDateTime startTime, endTime, amEndTime = null;
+
+            if(timePeriod == 1){
+                startTime = queryDate.atTime(5, 0, 0);
+                if(detailsUserVo.getAmStartTime() != null){
+                    startTime = queryDate.atTime(detailsUserVo.getAmStartTime());
+                }
+                endTime = queryDate.atTime(12, 0, 0);
+                if(detailsUserVo.getAmEndTime() != null){
+                    endTime = queryDate.atTime(detailsUserVo.getAmEndTime());
+                }
+            }else if(timePeriod == 2){
+                startTime = queryDate.atTime(12, 0, 0);
+                if(detailsUserVo.getPmStartTime() != null){
+                    startTime = queryDate.atTime(detailsUserVo.getPmStartTime());
+                }
+                endTime = queryDate.atTime(18, 0, 0);
+                if(detailsUserVo.getPmEndTime() != null){
+                    endTime = queryDate.atTime(detailsUserVo.getPmEndTime());
+                }
+                amEndTime  = queryDate.atTime(12, 0, 0);
+                if(detailsUserVo.getAmEndTime() != null){
+                    amEndTime = queryDate.atTime(detailsUserVo.getAmEndTime());
+                }
+            }else{
+                startTime = queryDate.atTime(0, 0, 0);
+                if(detailsUserVo.getEveningStartTime() != null){
+                    startTime = queryDate.atTime(detailsUserVo.getEveningStartTime());
+                }
+                endTime = queryDate.atTime(23, 59, 59);
+                if(detailsUserVo.getEveningEndTime() != null){
+                    endTime = queryDate.atTime(detailsUserVo.getEveningEndTime());
+                }
+            }
+            record.setStartTime(startTime);
+            record.setEndTime(endTime);
+
+            WfTeacherleave studentLeave = wfTeacherleaveService.getLeaveByUserId(startTime, endTime, user.getId());
+            if(studentLeave != null){
+                record.setAttendanceStatus(studentLeave.getLeaveType());
                 continue;
             }
             TeacherOutInRecordDto outInDto = new TeacherOutInRecordDto();
@@ -225,7 +359,7 @@ public class AttendanceRecordTask {
                                 .le(CarOutInRecord::getRecordTime, endTime)
                                 .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
                                 .eq(CarMessageApply::getUserId, record.getUserId())
-                                .ge(timePeriod != null && timePeriod == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
+                                .ge(timePeriod == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
                                 .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
                                 .orderByAsc(CarOutInRecord::getRecordTime)
                 );
@@ -253,6 +387,11 @@ public class AttendanceRecordTask {
         }
 
         if(!insertList.isEmpty()){
+            recordService.remove(
+                    new QueryWrapper<TeacherAttendanceRecord>().lambda()
+                            .eq(TeacherAttendanceRecord::getAttendanceDate, startDateTime.toLocalDate())
+                            .eq(TeacherAttendanceRecord::getTimeInterval, timePeriod)
+            );
             recordService.saveBatch(insertList);
         }
     }

+ 20 - 12
src/main/java/com/xjrsoft/module/schedule/service/impl/WfCourseAdjustServiceImpl.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.schedule.service.impl;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.enums.CourseAdjustTypeEnum;
 import com.xjrsoft.common.enums.EnabledMark;
@@ -10,6 +11,7 @@ import com.xjrsoft.module.courseTable.entity.CourseTable;
 import com.xjrsoft.module.courseTable.service.ICourseTableService;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.room.entity.RoomBed;
 import com.xjrsoft.module.schedule.dto.WfCourseAdjustDto;
 import com.xjrsoft.module.schedule.entity.CourseTableBak;
 import com.xjrsoft.module.schedule.entity.WfCourseAdjust;
@@ -62,9 +64,12 @@ public class WfCourseAdjustServiceImpl extends MPJBaseServiceImpl<WfCourseAdjust
                 if(tableBak == null){
                     continue;
                 }
-                courseTable.setTeacherId(tableBak.getTeacherId());
-                courseTable.setTeacherName(tableBak.getTeacherName());
-                courseTableService.updateById(courseTable);
+                UpdateWrapper<CourseTable> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.eq("id", courseTable.getId());
+                updateWrapper.setSql("adjust_type = null");
+                updateWrapper.setSql("teacher_id = '" + tableBak.getTeacherId() + "'");
+                updateWrapper.setSql("teacher_name = '" + tableBak.getTeacherName() + "'");
+                courseTableService.update(courseTable, updateWrapper);
             }
         }else if(CourseAdjustTypeEnum.courseExchange.getCode().equals(courseAdjust.getAdjustType())){
             for (CourseTable courseTable : list) {
@@ -72,15 +77,18 @@ public class WfCourseAdjustServiceImpl extends MPJBaseServiceImpl<WfCourseAdjust
                 if(tableBak == null){
                     continue;
                 }
-                courseTable.setTeacherId(tableBak.getTeacherId());
-                courseTable.setTeacherName(tableBak.getTeacherName());
-                courseTable.setScheduleDate(tableBak.getScheduleDate());
-                courseTable.setTimePeriod(tableBak.getTimePeriod());
-                courseTable.setTimeNumber(tableBak.getTimeNumber());
-                courseTable.setWeek(tableBak.getWeek());
-                courseTable.setWeeks(tableBak.getWeeks());
-                courseTable.setWeeksCn(tableBak.getWeeksCn());
-                courseTableService.updateById(courseTable);
+                UpdateWrapper<CourseTable> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.eq("id", courseTable.getId());
+                updateWrapper.setSql("adjust_type = null");
+                updateWrapper.setSql("teacher_id = '" + tableBak.getTeacherId() + "'");
+                updateWrapper.setSql("teacher_name = '" + tableBak.getTeacherName() + "'");
+                updateWrapper.setSql("schedule_date = '" + tableBak.getScheduleDate() + "'");
+                updateWrapper.setSql("time_period = " + tableBak.getTimePeriod());
+                updateWrapper.setSql("time_number = " + tableBak.getTimeNumber());
+                updateWrapper.setSql("week = '" + tableBak.getWeek() + "'");
+                updateWrapper.setSql("weeks = '" + tableBak.getWeeks() + "'");
+                updateWrapper.setSql("week_cn = '" + tableBak.getWeeksCn() + "'");
+                courseTableService.update(courseTable, updateWrapper);
             }
         }
         courseAdjust.setEnabledMark(EnabledMark.DISABLED.getCode());

+ 15 - 0
src/main/java/com/xjrsoft/module/student/controller/StudentConsumeDateController.java

@@ -6,6 +6,8 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.toolkit.MPJWrappers;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -29,8 +31,11 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 
 /**
@@ -106,4 +111,14 @@ public class StudentConsumeDateController {
 
     }
 
+    @PostMapping("/excel-import")
+    @ApiOperation(value = "excel消费记录导入")
+    @SaCheckPermission("coursetable:excelimport")
+    public RT<Boolean> excelImport(@RequestParam("file") MultipartFile file) throws IOException {
+        String result = studentConsumeDateService.excelImport(file);
+        if (result.length() > 0) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
 }

+ 36 - 0
src/main/java/com/xjrsoft/module/student/dto/StudentConsumeDateExcelImportDto.java

@@ -0,0 +1,36 @@
+package com.xjrsoft.module.student.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class StudentConsumeDateExcelImportDto {
+    /**
+     * 学生学号
+     */
+    @ExcelProperty("学号")
+    @ApiModelProperty("学号")
+    private String studentUserName;
+    /**
+     * 消费时间
+     */
+    @ExcelProperty("消费时间")
+    @ApiModelProperty("消费时间")
+    private Date consumeTime;
+    /**
+     * 消费金额
+     */
+    @ExcelProperty("消费金额(元)")
+    @ApiModelProperty("消费金额")
+    private BigDecimal consumeMoney;
+    /**
+     * 消费类型
+     */
+    @ExcelProperty("消费类型")
+    @ApiModelProperty("消费类型")
+    private String consumeType;
+}

+ 6 - 0
src/main/java/com/xjrsoft/module/student/service/IStudentConsumeDateService.java

@@ -2,6 +2,10 @@ package com.xjrsoft.module.student.service;
 
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.student.entity.StudentConsumeDate;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
 
 /**
 * @title: 学生消费数据
@@ -11,4 +15,6 @@ import com.xjrsoft.module.student.entity.StudentConsumeDate;
 */
 
 public interface IStudentConsumeDateService extends MPJBaseService<StudentConsumeDate> {
+
+    String excelImport( MultipartFile file) throws IOException;
 }

+ 160 - 5
src/main/java/com/xjrsoft/module/student/service/impl/StudentConsumeDateServiceImpl.java

@@ -1,19 +1,174 @@
 package com.xjrsoft.module.student.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.EasyExcel;
+import com.github.yulichang.base.MPJBaseService;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.ConsumeTypeEnum;
+import com.xjrsoft.config.TransactionConfig;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.entity.BaseMajorSet;
+import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.student.dto.StudentConsumeDateExcelImportDto;
+import com.xjrsoft.module.student.entity.BaseMajor;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.StudentConsumeDate;
 import com.xjrsoft.module.student.mapper.StudentConsumeDateMapper;
 import com.xjrsoft.module.student.service.IStudentConsumeDateService;
+import com.xjrsoft.module.student.vo.StuConsumeImportStuInfoVo;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
+import com.xjrsoft.module.textbook.entity.SubjectGroup;
+import com.xjrsoft.module.textbook.service.ITextbookCoreAttributeService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
-* @title: 学生消费数据
-* @Author dzx
-* @Date: 2024-08-26
-* @Version 1.0
-*/
+ * @title: 学生消费数据
+ * @Author dzx
+ * @Date: 2024-08-26
+ * @Version 1.0
+ */
 @Service
 @AllArgsConstructor
 public class StudentConsumeDateServiceImpl extends MPJBaseServiceImpl<StudentConsumeDateMapper, StudentConsumeDate> implements IStudentConsumeDateService {
+
+    private final XjrUserMapper xjrUserMapper;
+
+    @Autowired
+    private PlatformTransactionManager transactionManager;
+
+    @Override
+    public String excelImport(MultipartFile file) throws IOException {
+        List<StudentConsumeDateExcelImportDto> excelDataList = EasyExcel.read(file.getInputStream()).headRowNumber(1).head(StudentConsumeDateExcelImportDto.class).sheet().doReadSync();
+        StringBuilder sb = new StringBuilder();
+
+        // 获取所有学生id和其他信息
+        MPJLambdaWrapper<XjrUser> xjrUserMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        xjrUserMPJLambdaWrapper
+                .distinct()
+                .disableSubLogicDel()
+                .selectAs(BaseStudentSchoolRoll::getClassId, StuConsumeImportStuInfoVo::getClassId)
+                .selectAs(BaseClass::getName, StuConsumeImportStuInfoVo::getClassName)
+                .selectAs(XjrUser::getId, StuConsumeImportStuInfoVo::getStudentId)
+                .selectAs(XjrUser::getName, StuConsumeImportStuInfoVo::getStudentName)
+                .selectAs(XjrUser::getCredentialNumber, StuConsumeImportStuInfoVo::getStudentUserName)
+                .selectAs(BaseGrade::getId, StuConsumeImportStuInfoVo::getGradeId)
+                .selectAs(BaseGrade::getName, StuConsumeImportStuInfoVo::getGradeName)
+                .selectAs(BaseMajor::getId, StuConsumeImportStuInfoVo::getMajorId)
+                .selectAs(BaseMajor::getName, StuConsumeImportStuInfoVo::getMajorName)
+                .innerJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
+                .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
+                .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
+                .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId)
+                .leftJoin(BaseMajorSet.class, BaseMajorSet::getId, BaseClass::getMajorSetId)
+                .leftJoin(BaseMajor.class, BaseMajor::getId, BaseMajorSet::getMajorId)
+                .eq(UserRoleRelation::getRoleId, 3)
+        ;
+
+        List<StuConsumeImportStuInfoVo> stuConsumeImportStuInfoVos = xjrUserMapper.selectJoinList(StuConsumeImportStuInfoVo.class, xjrUserMPJLambdaWrapper);
+
+        Map<String, StuConsumeImportStuInfoVo> stringStuConsumeImportStuInfoVoMap = stuConsumeImportStuInfoVos.stream()
+                .filter(x -> ObjectUtil.isNotNull(x.getStudentUserName()))
+                .collect(Collectors.toMap(data -> data.getStudentUserName(), data -> data, (e1, e2) -> e1));
+
+        int batchSize = 1000;
+        int processedCount = 0;
+        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
+        TransactionStatus status = transactionManager.getTransaction(def);
+
+        try {
+            for (StudentConsumeDateExcelImportDto dto : excelDataList) {
+                String studentUserName = dto.getStudentUserName();
+                // 处理学生信息
+                StuConsumeImportStuInfoVo stuConsumeImportStuInfoVo = stringStuConsumeImportStuInfoVoMap.get(studentUserName);
+                if (ObjectUtils.isEmpty(stuConsumeImportStuInfoVo)) {
+                    sb.append(dto.getStudentUserName())
+                            .append("学号无效,导入失败。")
+                    ;
+                    continue;
+                }
+
+                StudentConsumeDate studentConsumeDate = BeanUtil.toBean(stuConsumeImportStuInfoVo, StudentConsumeDate.class);
+                studentConsumeDate.setConsumeTime(dto.getConsumeTime());
+
+                // 处理消费数据
+//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//
+//            try {
+//                // 解析字符串为Date对象
+//                Date date = sdf.parse(dto.getConsumeTime());
+//                System.out.println("解析后的日期:" + date);
+//            } catch (ParseException e) {
+//                sb.append(dto.getStudentUserName())
+//                        .append("学号无效,添加失败。")
+//                ;
+//                continue;
+//            }
+
+//                try {
+//                    // 解析字符串为BigDecimal对象
+//                    if (ObjectUtils.isEmpty(dto.getConsumeMoney())) {
+//                        sb.append(dto.getStudentUserName())
+//                                .append("消费金额无效,导入失败。")
+//                        ;
+//                        continue;
+//                    }
+//                    BigDecimal consumeMoney = new BigDecimal(dto.getConsumeMoney());
+//                    studentConsumeDate.setConsumeMoney(consumeMoney);
+//                } catch (NumberFormatException e) {
+//                    sb.append(dto.getStudentUserName())
+//                            .append("消费金额无效,导入失败。")
+//                    ;
+//                    continue;
+//                }
+
+                studentConsumeDate.setConsumeMoney(dto.getConsumeMoney());
+
+                if (ObjectUtil.isNotNull(dto.getConsumeType())) {
+                    String consumeType = ConsumeTypeEnum.getCode(dto.getConsumeType());
+                    studentConsumeDate.setConsumeType(consumeType);
+                }
+                this.save(studentConsumeDate);
+
+                processedCount++;
+                if (processedCount % batchSize == 0) {
+                    // 每处理1000条记录时提交一次事务
+                    transactionManager.commit(status);
+                    status = transactionManager.getTransaction(def); // 开始新事务
+                }
+            }
+
+            // 最后处理剩余不足1000条的数据
+            if (processedCount % batchSize != 0) {
+                transactionManager.commit(status);
+            }
+
+        } catch (Exception e) {
+            // 如果发生异常,则回滚事务
+            transactionManager.rollback(status);
+            throw e;
+        }
+        return sb.toString();
+    }
 }

+ 64 - 0
src/main/java/com/xjrsoft/module/student/vo/StuConsumeImportStuInfoVo.java

@@ -0,0 +1,64 @@
+package com.xjrsoft.module.student.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 学生消费数据导入学上信息出参
+* @Author szs
+* @Date: 2023-12-28
+* @Version 1.0
+*/
+@Data
+public class StuConsumeImportStuInfoVo {
+
+    /**
+     * 班级主键id
+     */
+    @ApiModelProperty("班级主键id")
+    private Long classId;
+    /**
+     * 班级名称
+     */
+    @ApiModelProperty("班级名称")
+    private String className;
+    /**
+     * 学生id
+     */
+    @ApiModelProperty("学生id")
+    private Long studentId;
+    /**
+     * 学生姓名
+     */
+    @ApiModelProperty("学生姓名")
+    private String studentName;
+    /**
+     * 学生学号
+     */
+    @ApiModelProperty("学生学号")
+    private String studentUserName;
+    /**
+     * 年级名称
+     */
+    @ApiModelProperty("年级名称")
+    private String gradeName;
+    /**
+     * 年级id
+     */
+    @ApiModelProperty("年级id")
+    private String gradeId;
+    /**
+     * 专业名称
+     */
+    @ApiModelProperty("专业名称")
+    private String majorName;
+    /**
+     * 专业id
+     */
+    @ApiModelProperty("专业id")
+    private String majorId;
+
+}

+ 15 - 1
src/main/resources/mapper/courseTable/CourseTable.xml

@@ -73,7 +73,7 @@
     <select id="getExceptCourseList" parameterType="java.lang.Long" resultType="com.xjrsoft.module.schedule.entity.WfCourseAdjust">
         SELECT a1.* FROM wf_course_adjust a1
         INNER JOIN xjr_workflow_form_relation a2 ON a1.id = a2.form_key_value
-        WHERE a1.delete_mark = 0 AND a2.current_state IN ('COMPLETED','ACTIVE')
+        WHERE a1.delete_mark = 0 and a1.enabled_mark = 1 AND a2.current_state IN ('COMPLETED','ACTIVE')
         and a1.user_id = #{userId}
     </select>
 
@@ -82,4 +82,18 @@
             SELECT DISTINCT class_id FROM course_table WHERE teacher_id like concat('%', #{dto.userId},'%')
         )
     </select>
+
+    <select id="getClassTeacherIds" parameterType="com.xjrsoft.module.courseTable.dto.ClassTeacherDto" resultType="com.xjrsoft.module.courseTable.vo.ClassTeacherVo">
+        SELECT DISTINCT t1.class_id,t1.teacher_id FROM course_table t1
+        WHERE t1.class_id IN (SELECT id FROM base_class WHERE grade_id = #{dto.gradeId})
+        AND t1.schedule_date BETWEEN #{dto.startDate} AND #{dto.endDate}
+        AND (t1.adjust_type = 'course_exchange' OR t1.adjust_type = 'course_replace' OR t1.adjust_type IS NULL)
+        UNION
+        SELECT DISTINCT t1.class_id,t1.teacher_id FROM course_table_bak t1
+        WHERE t1.class_id IN (SELECT id FROM base_class WHERE grade_id = #{dto.gradeId})
+        AND t1.schedule_date BETWEEN #{dto.startDate} AND #{dto.endDate}
+        AND (t1.adjust_type = 'course_exchange' OR t1.adjust_type = 'course_replace' OR t1.adjust_type IS NULL)
+    </select>
+
+
 </mapper>

+ 40 - 2
src/main/resources/mapper/evaluate/EvaluateObjectMapper.xml

@@ -41,14 +41,25 @@
             FROM base_class t1
             LEFT JOIN xjr_user t2 ON t1.teacher_id = t2.id
             WHERE t1.delete_mark = 0
+            <if test="dto.gradeId != null">
+                and t1.grade_id = #{dto.gradeId}
+            </if>
         </if>
         <if test="dto.evaluateType != null and dto.evaluateType.equals('dm_evaluate_class')">
             SELECT t1.id AS object_id,t1.name AS object_name,t1.grade_id
             FROM base_class t1
             WHERE t1.delete_mark = 0
+            <if test="dto.gradeId != null">
+                and t1.grade_id = #{dto.gradeId}
+            </if>
         </if>
-        <if test="dto.gradeId != null">
-            and t1.grade_id = #{dto.gradeId}
+        <if test="dto.evaluateType != null and dto.evaluateType.equals('tea_evaluate_class')">
+            SELECT t1.id AS object_id,t1.name AS object_name,t1.grade_id
+            FROM base_class t1
+            WHERE t1.delete_mark = 0
+            <if test="dto.gradeId != null">
+                and t1.grade_id = #{dto.gradeId}
+            </if>
         </if>
     </select>
 
@@ -69,6 +80,33 @@
             where t1.post_id = 1742726034814464002
             and t.delete_mark = 0
         </if>
+        <if test="dto.evaluateType != null and dto.evaluateType.equals('tea_evaluate_class')">
+            SELECT DISTINCT t2.class_id,t1.id,t1.name FROM xjr_user t1
+            INNER JOIN course_table t2 ON t2.teacher_id LIKE CONCAT('%', t1.id,'%')
+            WHERE 1 = 1
+            <if test="dto.classIds != null and !dto.classIds.isEmpty()">
+                and t2.class_id in
+                <foreach item="id" index="index" collection="dto.classIds" open="(" close=")"
+                         separator=",">
+                    #{id}
+                </foreach>
+            </if>
+            AND t2.schedule_date BETWEEN #{dto.startDate} AND #{dto.endDate}
+            AND (t2.adjust_type = 'course_exchange' OR t2.adjust_type = 'course_replace' OR t2.adjust_type IS NULL)
+            UNION
+            SELECT DISTINCT t2.class_id,t1.id,t1.name FROM xjr_user t1
+            INNER JOIN course_table_bak t2 ON t2.teacher_id LIKE CONCAT('%', t1.id,'%')
+            WHERE 1 = 1
+            <if test="dto.classIds != null and !dto.classIds.isEmpty()">
+                and t2.class_id in
+                <foreach item="id" index="index" collection="dto.classIds" open="(" close=")"
+                         separator=",">
+                    #{id}
+                </foreach>
+            </if>
+            AND t2.schedule_date BETWEEN #{dto.startDate} AND #{dto.endDate}
+            AND (t2.adjust_type = 'course_exchange' OR t2.adjust_type = 'course_replace' OR t2.adjust_type IS NULL)
+        </if>
     </select>
 
     <delete id="objectGradeDeleteExecuter" parameterType="com.xjrsoft.module.evaluate.dto.ObjectGradeDeleteDto">

+ 1 - 0
src/main/resources/mapper/evaluate/EvaluateTemplateMapper.xml

@@ -7,6 +7,7 @@
         SELECT t.id, t.name, t.sort_code,
         t2.name AS evaluate_type,
         t.dept_ids, t.total, t.remark, t.status
+        ,((SELECT COUNT(*) FROM evaluate_manage WHERE evaluate_template_id = t.id AND delete_mark = 0) > 0) AS use_status
         FROM evaluate_template t
         left join xjr_dictionary_detail t2 on t.evaluate_type = t2.code and t2.item_id = 1746831039385366530
         WHERE t.delete_mark = 0

+ 1 - 1
src/main/resources/mapper/outin/TeacherOutInRecordMapper.xml

@@ -6,7 +6,7 @@
     <select id="getListByParam" parameterType="com.xjrsoft.module.outint.dto.TeacherOutInRecordDto" resultType="com.xjrsoft.module.outint.entity.TeacherOutInRecord">
         SELECT * FROM teacher_out_in_record
         WHERE delete_mark = 0
-        AND record_time between #{dto.startTime} and #{dto.endTime}
+        AND  #{dto.endTime} >= record_time
         AND status = #{dto.status}
         AND DATE_FORMAT(record_time, '%Y-%m-%d') = #{dto.queryDate}
         AND user_id = #{dto.userId}

+ 2 - 2
src/test/java/com/xjrsoft/module/job/AttendanceRecordTaskTest.java

@@ -75,8 +75,8 @@ class AttendanceRecordTaskTest {
     @Test
     public void execute() {
 
-        LocalDateTime now = LocalDateTime.of(2024, 9, 1, 0, 0, 0);
-        for (int i = 0; i < 30; i ++){
+        LocalDateTime now = LocalDateTime.of(2024, 10, 1, 0, 0, 0);
+        for (int i = 0; i < 21; i ++){
             LocalDateTime startDateTime = now.plusDays(i).withHour(0).withMinute(0).withSecond(0).withNano(0);
             LocalDateTime endDateTime = startDateTime.plusDays(i).withHour(23).withMinute(59).withSecond(59);
 

+ 18 - 14
src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest2.java

@@ -129,7 +129,7 @@ class JianyuekbScheduleTaskTest2 {
         doExecute();
     }
     public void doExecute() {
-        String sql = "SELECT * FROM course_receive_msg WHERE delete_mark = 0 AND is_callback IS NULL";
+        String sql = "SELECT * FROM course_receive_msg WHERE delete_mark = 0 AND is_callback = -1";
         List<Map<String, Object>> receiveMsgs = SqlRunnerAdapter.db().selectList(sql);
         if(receiveMsgs.isEmpty()){
             return;
@@ -206,19 +206,19 @@ class JianyuekbScheduleTaskTest2 {
                 long between = ChronoUnit.DAYS.between(startDateObj, endDateObj);
                 int times = Integer.parseInt(((between / 7) + 1) + "");
 
-                for (int index = 0; index < times; index ++) {
-                    LocalDate statrTime = startDateObj.plusDays(index * 7L);
-                    String startDate = statrTime.format(formatter);
-                    LocalDate endTime = statrTime.plusDays(6L);
-                    if(endTime.isAfter(endDateObj)){
-                        endTime = endDateObj;
-                    }
-
-                    String endDate = endTime.format(formatter);
-                    //获取课表并存到数据库
-                    JsonArray scheduleInfo = dataUtil.getScheduleInfoByGrade(eduYearSerialNo, startDate, endDate);
-                    allScheduleInfo.addAll(scheduleInfo);
-                }
+//                for (int index = 0; index < times; index ++) {
+//                    LocalDate statrTime = startDateObj.plusDays(index * 7L);
+//                    String startDate = statrTime.format(formatter);
+//                    LocalDate endTime = statrTime.plusDays(6L);
+//                    if(endTime.isAfter(endDateObj)){
+//                        endTime = endDateObj;
+//                    }
+//
+//                    String endDate = endTime.format(formatter);
+//                    //获取课表并存到数据库
+//                    JsonArray scheduleInfo = dataUtil.getScheduleInfoByGrade(eduYearSerialNo, startDate, endDate);
+//                    allScheduleInfo.addAll(scheduleInfo);
+//                }
 
                 updSql = "update course_receive_msg set is_callback = 1 where id = " + receiveMsg.get("id").toString();
                 SqlRunnerAdapter.db().update(updSql);
@@ -327,6 +327,9 @@ class JianyuekbScheduleTaskTest2 {
         }
 
         for (WfCourseAdjust courseAdjust : list) {
+            if(courseAdjust.getUserId() == 14954805813957L){
+                System.out.println(courseAdjust.getId());
+            }
             List<CourseTable> courseList = courseTableService.list(
                     new MPJLambdaWrapper<CourseTable>()
                             .select(CourseTable::getId)
@@ -345,6 +348,7 @@ class JianyuekbScheduleTaskTest2 {
             if(courseList.size() != courseCount){
                 //表明课程变化了,需要重新申请,需要将原来的申请作废并进行微信消息通知
                 courseAdjust.setEnabledMark(EnabledMark.DISABLED.getCode());
+
                 courseAdjust.setCancelReason("由于课表更新,当前调/顶课课程发生变化,该调顶课已失效,请重新发起调顶课");
                 cancelList.add(courseAdjust);
                 List<String> thing16Str = new ArrayList<>();