ソースを参照

Merge branch 'pre'

dzx 1 年間 前
コミット
f641bdd8ba
21 ファイル変更409 行追加244 行削除
  1. 54 0
      src/main/java/com/xjrsoft/common/enums/UseSemesterTypeEnum.java
  2. 14 7
      src/main/java/com/xjrsoft/common/mybatis/SqlRunnerAdapter.java
  3. 5 2
      src/main/java/com/xjrsoft/common/utils/WeChatUtil.java
  4. 14 5
      src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java
  5. 33 8
      src/main/java/com/xjrsoft/module/attendance/controller/StudentStatisticsController.java
  6. 1 1
      src/main/java/com/xjrsoft/module/attendance/controller/TeacherStatisticsController.java
  7. 22 16
      src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java
  8. 89 38
      src/main/java/com/xjrsoft/module/job/AttendanceMessageTask.java
  9. 3 2
      src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java
  10. 5 5
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookController.java
  11. 12 0
      src/main/java/com/xjrsoft/module/textbook/controller/WfTextbookSubscriptionController.java
  12. 25 62
      src/main/java/com/xjrsoft/module/textbook/dto/TextbookImportDto.java
  13. 4 0
      src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookSubscriptionService.java
  14. 21 65
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImpl.java
  15. 88 1
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookSubscriptionServiceImpl.java
  16. 7 22
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookStandingExportQueryVo.java
  17. 2 1
      src/main/resources/application-pre.yml
  18. 2 1
      src/main/resources/application-prod.yml
  19. 1 1
      src/main/resources/application.yml
  20. 2 7
      src/main/resources/mapper/textbook/TextbookMapper.xml
  21. 5 0
      src/test/java/com/xjrsoft/module/job/HikvisionBaseDataTaskTest.java

+ 54 - 0
src/main/java/com/xjrsoft/common/enums/UseSemesterTypeEnum.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.common.enums;
+
+public enum UseSemesterTypeEnum {
+    /**
+     * 周一
+     */
+    SEMESTER_ONE(1, "一学期"),
+
+    /**
+     * 周二
+     */
+    SEMESTER_TWO(2, "二学期"),
+    /**
+     * 周三
+     */
+    SEMESTER_THREE(3, "三学期"),
+    /**
+     * 周四
+     */
+    SEMESTER_FOUR(4, "四学期"),
+    /**
+     * 周五
+     */
+    SEMESTER_FIVE(5, "五学期"),
+    /**
+     * 周六
+     */
+    SEMESTER_SIX(6, "六学期");
+
+    final int code;
+    final String value;
+
+    public int getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    UseSemesterTypeEnum(final int code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+
+    public static int getCode(String value) {
+        for (UseSemesterTypeEnum c : UseSemesterTypeEnum.values()) {
+            if (c.getValue().equals(value)) {
+                return c.getCode();
+            }
+        }
+        return 0;
+    }
+}

+ 14 - 7
src/main/java/com/xjrsoft/common/mybatis/SqlRunnerAdapter.java

@@ -25,10 +25,7 @@ import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 
 
 public class SqlRunnerAdapter implements ISqlRunner, Closeable {
 public class SqlRunnerAdapter implements ISqlRunner, Closeable {
 
 
@@ -367,12 +364,21 @@ public class SqlRunnerAdapter implements ISqlRunner, Closeable {
      * @return
      * @return
      */
      */
     public Map<String, Object> dynamicSelectOne(String tableName, Entity where) {
     public Map<String, Object> dynamicSelectOne(String tableName, Entity where) {
+        if (where == null) {
+            throw new IllegalArgumentException("Where entity cannot be null");
+        }
+
         SQL sql = new SQL().FROM(tableName);
         SQL sql = new SQL().FROM(tableName);
         List<String> args = new ArrayList<>();
         List<String> args = new ArrayList<>();
         int i = 0;
         int i = 0;
-        // 查询列
-        for (String field : where.getFieldNames()) {
-            sql.SELECT(field);
+
+        Set<String> fieldNames = where.getFieldNames();
+        if (fieldNames != null && !fieldNames.isEmpty()) {
+            for (String field : fieldNames) {
+                sql.SELECT(field);
+            }
+        } else {
+            sql.SELECT("*"); // 如果没有指定字段,选择所有字段
         }
         }
 
 
         // 循环where条件
         // 循环where条件
@@ -386,6 +392,7 @@ public class SqlRunnerAdapter implements ISqlRunner, Closeable {
             args.add(strValue);
             args.add(strValue);
             i++;
             i++;
         }
         }
+
         return this.selectOne(sql.toString(), args.toArray());
         return this.selectOne(sql.toString(), args.toArray());
     }
     }
 
 

+ 5 - 2
src/main/java/com/xjrsoft/common/utils/WeChatUtil.java

@@ -58,8 +58,11 @@ public class WeChatUtil {
     public String assessmentTemplate;
     public String assessmentTemplate;
 
 
     //考勤结果通知模板
     //考勤结果通知模板
-    @Value("${xjrsoft.weChatMessageTemplate.attendanceMessageTemplate}")
-    public String attendanceMessageTemplate;
+    @Value("${xjrsoft.weChatMessageTemplate.attendanceMsgLateTemplate}")
+    public String attendanceMsgLateTemplate;
+
+    @Value("${xjrsoft.weChatMessageTemplate.attendanceMsgAbsenceTemplate}")
+    public String attendanceMsgAbsenceTemplate;
 
 
     @Value("${xjrsoft.weChatMessageTemplate.outInTemplate}")
     @Value("${xjrsoft.weChatMessageTemplate.outInTemplate}")
     public String outInTemplate;
     public String outInTemplate;

+ 14 - 5
src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java

@@ -5,12 +5,14 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.OutInStatusEnum;
 import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.vo.TeacherStatisticsVo;
 import com.xjrsoft.module.attendance.vo.TeacherStatisticsVo;
 import com.xjrsoft.module.attendance.vo.VisitorInfoVo;
 import com.xjrsoft.module.attendance.vo.VisitorInfoVo;
+import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.concat.service.IXjrUserService;
 import com.xjrsoft.module.concat.service.IXjrUserService;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.outint.entity.CarOutInRecord;
 import com.xjrsoft.module.outint.entity.CarOutInRecord;
@@ -115,7 +117,7 @@ public class StatisticsController {
                             .le(CarOutInRecord::getRecordTime, endTime)
                             .le(CarOutInRecord::getRecordTime, endTime)
                             .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
                             .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
                             .ge(dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
                             .ge(dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
-                            .eq(CarOutInRecord::getStatus, 0)
+                            .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
                             .orderByAsc(CarOutInRecord::getRecordTime)
                             .orderByAsc(CarOutInRecord::getRecordTime)
             );
             );
 
 
@@ -165,10 +167,11 @@ public class StatisticsController {
         MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
         MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
                 .disableSubLogicDel()
                 .disableSubLogicDel()
                 .distinct()
                 .distinct()
-                .eq(ObjectUtil.isNotNull(dto.getGradeId()), BaseStudentSchoolRoll::getGradeId, dto.getGradeId())
+                .eq(ObjectUtil.isNotNull(dto.getGradeId()), BaseClass::getGradeId, dto.getGradeId())
                 .eq(BaseStudentSchoolRoll::getArchivesStatus, "FB2901")
                 .eq(BaseStudentSchoolRoll::getArchivesStatus, "FB2901")
                 .eq(ObjectUtil.isNotNull(dto.getClassId()), BaseStudentSchoolRoll::getClassId, dto.getClassId())
                 .eq(ObjectUtil.isNotNull(dto.getClassId()), BaseStudentSchoolRoll::getClassId, dto.getClassId())
                 .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
                 .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
+                .innerJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
                 .innerJoin(BaseStudent.class, BaseStudent::getUserId, XjrUser::getId);
                 .innerJoin(BaseStudent.class, BaseStudent::getUserId, XjrUser::getId);
         long allCount = xjrUserService.count(queryWrapper);
         long allCount = xjrUserService.count(queryWrapper);
 
 
@@ -191,9 +194,15 @@ public class StatisticsController {
             }
             }
 
 
             List<StudentOutInRecord> outInRecords = studentOutInRecordService.list(
             List<StudentOutInRecord> outInRecords = studentOutInRecordService.list(
-                    new QueryWrapper<StudentOutInRecord>().lambda()
-                            .between(StudentOutInRecord::getRecordTime, startTime, endTime)
-                            .eq(StudentOutInRecord::getStatus, 1)
+                    new MPJLambdaWrapper<StudentOutInRecord>()
+                            .select(StudentOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(StudentOutInRecord.class).contains(x.getProperty()))
+                            .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, StudentOutInRecord::getUserId)
+                            .innerJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
+                            .le(StudentOutInRecord::getRecordTime, endTime)
+                            .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
+                            .eq(StudentOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
+                            .eq(ObjectUtil.isNotNull(dto.getClassId()), BaseStudentSchoolRoll::getClassId, dto.getClassId())
+                            .eq(ObjectUtil.isNotNull(dto.getGradeId()), BaseClass::getGradeId, dto.getGradeId())
             );
             );
             //实到人数
             //实到人数
             Set<Long> collect = outInRecords.stream().map(StudentOutInRecord::getUserId).collect(Collectors.toSet());
             Set<Long> collect = outInRecords.stream().map(StudentOutInRecord::getUserId).collect(Collectors.toSet());

+ 33 - 8
src/main/java/com/xjrsoft/module/attendance/controller/StudentStatisticsController.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.attendance.controller;
 package com.xjrsoft.module.attendance.controller;
 
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -13,6 +14,7 @@ import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.dto.StudentDetailsDto;
 import com.xjrsoft.module.attendance.dto.StudentDetailsDto;
 import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
 import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
@@ -24,6 +26,7 @@ import com.xjrsoft.module.holiday.entity.HolidayDate;
 import com.xjrsoft.module.holiday.service.IHolidayDateService;
 import com.xjrsoft.module.holiday.service.IHolidayDateService;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.outint.entity.CarOutInRecord;
 import com.xjrsoft.module.outint.entity.StudentOutInRecord;
 import com.xjrsoft.module.outint.entity.StudentOutInRecord;
 import com.xjrsoft.module.outint.service.IStudentOutInRecordService;
 import com.xjrsoft.module.outint.service.IStudentOutInRecordService;
 import com.xjrsoft.module.outint.vo.StudentOutInRecordVo;
 import com.xjrsoft.module.outint.vo.StudentOutInRecordVo;
@@ -75,11 +78,23 @@ public class StudentStatisticsController {
     private final IBaseClassService classService;
     private final IBaseClassService classService;
     private final IHolidayDateService holidayDateService;
     private final IHolidayDateService holidayDateService;
     private final IAttendanceRuleCategoryService ruleCategoryService;
     private final IAttendanceRuleCategoryService ruleCategoryService;
-
+    private final IBaseClassService baseClassService;
     @GetMapping(value = "/class-statistics")
     @GetMapping(value = "/class-statistics")
     @ApiOperation(value="班级考勤统计")
     @ApiOperation(value="班级考勤统计")
     @SaCheckPermission("statistics:detail")
     @SaCheckPermission("statistics:detail")
     public RT<PageOutput<ClassStatisticsVo>> classStatistics(@Valid AttendanceStatisticDto dto){
     public RT<PageOutput<ClassStatisticsVo>> classStatistics(@Valid AttendanceStatisticDto dto){
+
+        List<String> roleList = StpUtil.getRoleList();
+        long teacherId = StpUtil.getLoginIdAsLong();
+        List<BaseClass> classList = baseClassService.list(
+                new QueryWrapper<BaseClass>().lambda().eq(BaseClass::getTeacherId, teacherId)
+        );
+        if(roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER")){
+            if(classList != null && !classList.isEmpty()){
+                dto.setClassId(classList.get(0).getId());
+            }
+        }
+        
         Page<ClassStatisticsVo> attendancePage = classService.getAttendancePage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         Page<ClassStatisticsVo> attendancePage = classService.getAttendancePage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         List<Long> classIds = new ArrayList<>();
         List<Long> classIds = new ArrayList<>();
         for (ClassStatisticsVo record : attendancePage.getRecords()) {
         for (ClassStatisticsVo record : attendancePage.getRecords()) {
@@ -172,6 +187,17 @@ public class StudentStatisticsController {
     @ApiOperation(value="学生考勤")
     @ApiOperation(value="学生考勤")
     @SaCheckPermission("statistics:detail")
     @SaCheckPermission("statistics:detail")
     public RT<PageOutput<StudentStatisticsPageVo>> studentDetails(@Valid StudentDetailsDto dto){
     public RT<PageOutput<StudentStatisticsPageVo>> studentDetails(@Valid StudentDetailsDto dto){
+        List<String> roleList = StpUtil.getRoleList();
+        long teacherId = StpUtil.getLoginIdAsLong();
+        List<BaseClass> classList = baseClassService.list(
+                new QueryWrapper<BaseClass>().lambda().eq(BaseClass::getTeacherId, teacherId)
+        );
+        if(roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER")){
+            if(classList != null && !classList.isEmpty()){
+                dto.setClassId(classList.get(0).getId());
+            }
+        }
+
         MPJLambdaWrapper<User> queryUser = new MPJLambdaWrapper<>();
         MPJLambdaWrapper<User> queryUser = new MPJLambdaWrapper<>();
         queryUser.disableSubLogicDel().distinct()
         queryUser.disableSubLogicDel().distinct()
                 .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
                 .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
@@ -224,9 +250,11 @@ public class StudentStatisticsController {
             Map<Long, StudentLeave> leaveList = studentLeaveService.getLeaveList(startTime, endTime);
             Map<Long, StudentLeave> leaveList = studentLeaveService.getLeaveList(startTime, endTime);
             //查询进入记录
             //查询进入记录
             List<StudentOutInRecord> outInRecords = studentOutInRecordService.list(
             List<StudentOutInRecord> outInRecords = studentOutInRecordService.list(
-                    new QueryWrapper<StudentOutInRecord>().lambda()
-                            .between(StudentOutInRecord::getRecordTime, startTime, endTime)
-                            .eq(StudentOutInRecord::getStatus, 1)
+                    new MPJLambdaWrapper<StudentOutInRecord>()
+                            .select(StudentOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(StudentOutInRecord.class).contains(x.getProperty()))
+                            .eq(StudentOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
+                            .le(StudentOutInRecord::getRecordTime, endTime)
+                            .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
             );
             );
             Map<Long, StudentOutInRecord> outInMap = new HashMap<>();
             Map<Long, StudentOutInRecord> outInMap = new HashMap<>();
             for (StudentOutInRecord inRecord : outInRecords) {
             for (StudentOutInRecord inRecord : outInRecords) {
@@ -260,10 +288,7 @@ public class StudentStatisticsController {
     @SaCheckPermission("statistics:detail")
     @SaCheckPermission("statistics:detail")
     public RT<PageOutput<ClassStatisticsVo>> classHistory(@Valid AttendanceStatisticDto dto){
     public RT<PageOutput<ClassStatisticsVo>> classHistory(@Valid AttendanceStatisticDto dto){
         Page<ClassStatisticsVo> attendancePage = classService.getAttendancePage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         Page<ClassStatisticsVo> attendancePage = classService.getAttendancePage(new Page<>(dto.getLimit(), dto.getSize()), dto);
-        List<Long> classIds = new ArrayList<>();
-        for (ClassStatisticsVo record : attendancePage.getRecords()) {
-            classIds.add(record.getId());
-        }
+        List<Long> classIds = attendancePage.getRecords().stream().map(ClassStatisticsVo::getId).collect(Collectors.toList());
         if(dto.getStartTime() != null && !"".equals(dto.getStartTime()) && dto.getEndTime() != null && !"".equals(dto.getEndTime())){
         if(dto.getStartTime() != null && !"".equals(dto.getStartTime()) && dto.getEndTime() != null && !"".equals(dto.getEndTime())){
             DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
             DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
             LocalDateTime startTime = LocalDate.parse(dto.getStartTime(), formatter).atTime(0, 0, 0);
             LocalDateTime startTime = LocalDate.parse(dto.getStartTime(), formatter).atTime(0, 0, 0);

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

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

+ 22 - 16
src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java

@@ -12,16 +12,14 @@ import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
+import org.springframework.transaction.annotation.Transactional;
 
 
 import java.sql.Types;
 import java.sql.Types;
 import java.text.ParseException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicInteger;
 
 
 
 
@@ -37,8 +35,10 @@ public class OutInRecordUtil {
         SqlRunnerAdapter.db().insert(sql);
         SqlRunnerAdapter.db().insert(sql);
 
 
         String updSql = "UPDATE attendance_user_relation SET " +
         String updSql = "UPDATE attendance_user_relation SET " +
-                "attendance_status = '" + attendanceStatus + "', attendance_time = '" + recordTime + "' " +
-                "WHERE user_id = '" + userId + "', attendance_mode = '人脸' AND delete_mark = 0";
+                "attendance_status = '" + attendanceStatus + "', " +
+                "attendance_time = '" + recordTime + "', " +
+                "attendance_mode = '人脸' " +
+                "WHERE user_id = '" + userId + "' AND delete_mark = 0";
         SqlRunnerAdapter.db().update(updSql);
         SqlRunnerAdapter.db().update(updSql);
     }
     }
 
 
@@ -51,8 +51,10 @@ public class OutInRecordUtil {
         SqlRunnerAdapter.db().insert(sql);
         SqlRunnerAdapter.db().insert(sql);
 
 
         String updSql = "UPDATE attendance_user_relation SET " +
         String updSql = "UPDATE attendance_user_relation SET " +
-                "attendance_status = '" + attendanceStatus + "', attendance_time = '" + recordTime + "' " +
-                "WHERE user_id = '" + userId + "', attendance_mode = '人脸' AND delete_mark = 0";
+                "attendance_status = '" + attendanceStatus + "', " +
+                "attendance_time = '" + recordTime + "', " +
+                "attendance_mode = '人脸' " +
+                "WHERE user_id = '" + userId + "' AND delete_mark = 0";
         SqlRunnerAdapter.db().update(updSql);
         SqlRunnerAdapter.db().update(updSql);
     }
     }
 
 
@@ -65,7 +67,7 @@ public class OutInRecordUtil {
     }
     }
 
 
     private void vehicleInsertRecord(Long carMessageApplyId, String recordTime, int releaseReason, int category, String facePhoto, int status, String planNo, String crossRecordSyscode,
     private void vehicleInsertRecord(Long carMessageApplyId, String recordTime, int releaseReason, int category, String facePhoto, int status, String planNo, String crossRecordSyscode,
-                                     int releaseResult, int releaseWay, int vehicleType, String phone, String name){
+                                    int releaseResult, int releaseWay, int vehicleType, String phone, String name){
         String phoneValue = (phone != null && !phone.equals("null")) ? phone : "";
         String phoneValue = (phone != null && !phone.equals("null")) ? phone : "";
         String nameValue = (name != null && !name.equals("null")) ? name : "";
         String nameValue = (name != null && !name.equals("null")) ? name : "";
         String photoValue = (facePhoto != null && !facePhoto.equals("null")) ? facePhoto : "";
         String photoValue = (facePhoto != null && !facePhoto.equals("null")) ? facePhoto : "";
@@ -95,16 +97,20 @@ public class OutInRecordUtil {
         if(carMessageApplyId != 0){
         if(carMessageApplyId != 0){
             String selectTable = "car_message_apply";
             String selectTable = "car_message_apply";
             Entity selectWhere = Entity.create(selectTable);
             Entity selectWhere = Entity.create(selectTable);
-            selectWhere.set("car_message_apply_id", carMessageApplyId);
-            selectWhere.set("plan_no", planNo);
+            selectWhere.set("id", carMessageApplyId);
+            selectWhere.set("car_number", planNo);
             Map<String, Object> objectMap = SqlRunnerAdapter.db().dynamicSelectOne(selectTable, selectWhere);
             Map<String, Object> objectMap = SqlRunnerAdapter.db().dynamicSelectOne(selectTable, selectWhere);
             Long userId = Long.parseLong(objectMap.get("user_id").toString());
             Long userId = Long.parseLong(objectMap.get("user_id").toString());
-            LocalDateTime recordTimeDate = LocalDateTime.parse(recordTime);
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            LocalDateTime recordTimeDate = LocalDateTime.parse(recordTime, formatter);
             String attendanceStatus = discernTeacherStatus(recordTimeDate, status, userId);
             String attendanceStatus = discernTeacherStatus(recordTimeDate, status, userId);
 
 
             String updSql = "UPDATE attendance_user_relation SET " +
             String updSql = "UPDATE attendance_user_relation SET " +
-                    "attendance_status = '" + attendanceStatus + "', attendance_time = '" + recordTime + "' " +
-                    "WHERE user_id = '" + userId + "', attendance_mode = '车辆', car_number = '" + planNo + "' AND delete_mark = 0";
+                    "attendance_status = '" + attendanceStatus + "', " +
+                    "attendance_time = '" + recordTime + "', " +
+                    "attendance_mode = '车辆', " +
+                    "car_number = '" + planNo + "' " +
+                    "WHERE user_id = '" + userId + "' AND delete_mark = 0";
             SqlRunnerAdapter.db().update(updSql);
             SqlRunnerAdapter.db().update(updSql);
         }
         }
     }
     }
@@ -430,8 +436,8 @@ public class OutInRecordUtil {
             JsonObject paramJson = new JsonObject();
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("pageNo", pageNo.getAndIncrement());
             paramJson.addProperty("pageNo", pageNo.getAndIncrement());
             paramJson.addProperty("pageSize", pageSize);
             paramJson.addProperty("pageSize", pageSize);
-//            paramJson.addProperty("startTime", "2024-06-18T00:00:00+08:00");
-//            paramJson.addProperty("endTime", "2024-06-19T16:00:00+08:00");
+//            paramJson.addProperty("startTime", "2024-06-20T00:00:00+08:00");
+//            paramJson.addProperty("endTime", "2024-06-21T16:00:00+08:00");
 
 
             String response = apiUtil.doPost(apiPath, String.valueOf(paramJson), null);
             String response = apiUtil.doPost(apiPath, String.valueOf(paramJson), null);
             JsonElement responseElement = new Gson().fromJson(response, JsonElement.class);
             JsonElement responseElement = new Gson().fromJson(response, JsonElement.class);

+ 89 - 38
src/main/java/com/xjrsoft/module/job/AttendanceMessageTask.java

@@ -106,32 +106,20 @@ public class AttendanceMessageTask {
         }
         }
         //查询今天的考勤规则
         //查询今天的考勤规则
         List<AttendanceRuleDetails> ruleDetails = ruleCategoryService.getTodayRules();
         List<AttendanceRuleDetails> ruleDetails = ruleCategoryService.getTodayRules();
-        //获取最近的时间
-        LocalDateTime recentlyTime = getRecentlyTime(ruleDetails, now);
-        if(now.isBefore(recentlyTime)){
-            log.info("未到时间,不需要提醒");
-            return;
-        }
 
 
 
 
-        String wechatTemplate = weChatUtil.getAttendanceMessageTemplate();
-        WechatMessageLog log = wechatMessageLogService.getOne(
-                new QueryWrapper<WechatMessageLog>().lambda()
-                        .select(WechatMessageLog.class, x -> VoToColumnUtil.fieldsToColumns(WechatMessageLog.class).contains(x.getProperty()))
-                        .eq(WechatMessageLog::getSendTime, recentlyTime)
-                        .eq(WechatMessageLog::getTemplateId, wechatTemplate)
-        );
-        if(log != null){//已经推送过,不再进行推送
-            return;
-        }
+//        WechatMessageLog log = wechatMessageLogService.getOne(
+//                new QueryWrapper<WechatMessageLog>().lambda()
+//                        .select(WechatMessageLog.class, x -> VoToColumnUtil.fieldsToColumns(WechatMessageLog.class).contains(x.getProperty()))
+//                        .eq(WechatMessageLog::getSendTime, recentlyTime)
+//                        .eq(WechatMessageLog::getTemplateId, wechatTemplate)
+//        );
+//        if(log != null){//已经推送过,不再进行推送
+//            return;
+//        }
 
 
-        WechatMessageLog messageLog = new WechatMessageLog();
-        messageLog.setTemplateId(wechatTemplate);
-        messageLog.setSendTime(recentlyTime);
 
 
-        List<AttendanceMessageSet> list = messageSetService.list(
-                new QueryWrapper<AttendanceMessageSet>().lambda()
-        );
+        List<AttendanceMessageSet> list = messageSetService.list();
         //判断是上午还是下午
         //判断是上午还是下午
         Integer timePeriod = null;
         Integer timePeriod = null;
         String timePeriodStr = null;
         String timePeriodStr = null;
@@ -147,25 +135,43 @@ public class AttendanceMessageTask {
         }
         }
 
 
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        String format = recentlyTime.format(formatter);
 
 
         int userCount = 0;
         int userCount = 0;
         Set<Integer> roleTypes = list.stream().map(AttendanceMessageSet::getRoleType).collect(Collectors.toSet());
         Set<Integer> roleTypes = list.stream().map(AttendanceMessageSet::getRoleType).collect(Collectors.toSet());
-        Set<Long> setIds = list.stream().map(AttendanceMessageSet::getId).collect(Collectors.toSet());
 
 
         //查询需要通知的人
         //查询需要通知的人
-        List<XjrUser> userList = userService.list(
-                new MPJLambdaWrapper<XjrUser>().distinct()
-                        .select(XjrUser::getId)
-                        .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
-                        .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
-                        .leftJoin(AttendanceMessageUserRelation.class, AttendanceMessageUserRelation::getUserId, XjrUser::getId)
-                        .in(UserRoleRelation::getRoleId, roleTypes)
-                        .in(AttendanceMessageUserRelation::getAttendanceMessageSetId, setIds)
-        );
-
 
 
         for (AttendanceMessageSet messageSet : list) {
         for (AttendanceMessageSet messageSet : list) {
+            List<XjrUser> userList = userService.list(
+                new MPJLambdaWrapper<XjrUser>().distinct()
+                .select(XjrUser::getId)
+                .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
+                .leftJoin(AttendanceMessageUserRelation.class, AttendanceMessageUserRelation::getUserId, XjrUser::getId)
+                .in(UserRoleRelation::getRoleId, roleTypes)
+                .eq(AttendanceMessageUserRelation::getAttendanceMessageSetId, messageSet.getId())
+            );
+
+            LocalDateTime recentlyTime = null;
+            String wechatTemplate = weChatUtil.getAttendanceMsgLateTemplate();
+            if(messageSet.getMessageCategory() != null && messageSet.getMessageCategory() == 1){
+                wechatTemplate = weChatUtil.getAttendanceMsgLateTemplate();
+
+                //获取最近的时间
+                recentlyTime = getRecentlyTime(ruleDetails, now);
+                if(now.isBefore(recentlyTime)){
+                    log.info("未到时间,不需要提醒");
+                    continue;
+                }
+            }else if(messageSet.getMessageCategory() != null && messageSet.getMessageCategory() == 3){
+                wechatTemplate = weChatUtil.getAttendanceMsgAbsenceTemplate();
+                recentlyTime = getRecentlyOverTime(ruleDetails, now);
+                if(now.isBefore(recentlyTime)){
+                    log.info("未到时间,不需要提醒");
+                    continue;
+                }
+            }
+
             if(!messageSet.getTimePeriod().contains(timePeriod + "")){
             if(!messageSet.getTimePeriod().contains(timePeriod + "")){
                 continue;
                 continue;
             }
             }
@@ -174,6 +180,12 @@ public class AttendanceMessageTask {
             if(userList.isEmpty()){
             if(userList.isEmpty()){
                 continue;
                 continue;
             }
             }
+            if(recentlyTime == null){
+                continue;
+            }
+
+            String format = recentlyTime.format(formatter);
+
             userCount += userList.size();
             userCount += userList.size();
             if(messageSet.getRoleType() != null && messageSet.getRoleType() == 2){
             if(messageSet.getRoleType() != null && messageSet.getRoleType() == 2){
                 //教师总人数
                 //教师总人数
@@ -236,7 +248,7 @@ public class AttendanceMessageTask {
                 );
                 );
 
 
                 WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
                 WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
-                weChatSendMessageDto.setTemplateId(weChatUtil.getAttendanceMessageTemplate());
+                weChatSendMessageDto.setTemplateId(wechatTemplate);
                 JSONObject paramJson = new JSONObject();
                 JSONObject paramJson = new JSONObject();
 
 
                 JSONObject thing6 = new JSONObject();
                 JSONObject thing6 = new JSONObject();
@@ -268,10 +280,15 @@ public class AttendanceMessageTask {
                     weChatService.sendTemplateMessage(weChatSendMessageDto);
                     weChatService.sendTemplateMessage(weChatSendMessageDto);
                 }
                 }
             }
             }
+
+            WechatMessageLog messageLog = new WechatMessageLog();
+            messageLog.setTemplateId(wechatTemplate);
+            messageLog.setSendTime(recentlyTime);
+
+            messageLog.setCreateDate(new Date());
+            messageLog.setContent("消息推送人数:" + userCount);
+            wechatMessageLogService.save(messageLog);
         }
         }
-        messageLog.setCreateDate(new Date());
-        messageLog.setContent("消息推送人数:" + userCount);
-        wechatMessageLogService.save(messageLog);
     }
     }
 
 
     LocalDateTime getRecentlyTime(List<AttendanceRuleDetails> ruleDetails, LocalDateTime now){
     LocalDateTime getRecentlyTime(List<AttendanceRuleDetails> ruleDetails, LocalDateTime now){
@@ -308,5 +325,39 @@ public class AttendanceMessageTask {
         return timeMap.get(collect.get(0));
         return timeMap.get(collect.get(0));
     }
     }
 
 
+    LocalDateTime getRecentlyOverTime(List<AttendanceRuleDetails> ruleDetails, LocalDateTime now){
+        List<LocalDateTime> result = new ArrayList<>();
+        for (AttendanceRuleDetails ruleDetail : ruleDetails) {
+            if(ruleDetail.getIsAllowInOutSchool() != null && ruleDetail.getIsAllowInOutSchool() == 1
+                    && ruleDetail.getIsAttendance() != null && ruleDetail.getIsAttendance() == 1){
+                if(ruleDetail.getAmStartTime() != null){
+                    LocalDateTime amStartTime = now.with(ruleDetail.getAmStartTime().toLocalTime()).plusMinutes(ruleDetail.getOverMinutes());
+                    result.add(amStartTime);
+                }
+                if(ruleDetail.getPmStartTime() != null){
+                    LocalDateTime pmStartTime = now.with(ruleDetail.getPmStartTime().toLocalTime()).plusMinutes(ruleDetail.getOverMinutes());
+                    result.add(pmStartTime);
+                }
+
+                if(ruleDetail.getEveningStartTime() != null){
+                    LocalDateTime eveningStartTime = now.with(ruleDetail.getEveningStartTime().toLocalTime()).plusMinutes(ruleDetail.getOverMinutes());
+                    result.add(eveningStartTime);
+                }
+            }
+        }
+        if(result.isEmpty()){
+            return null;
+        }
+        Map<Long, LocalDateTime> timeMap = new HashMap<>();
+        for (LocalDateTime localDateTime : result) {
+            long between = ChronoUnit.SECONDS.between(now, localDateTime);
+            timeMap.put(Math.abs(between), localDateTime);
+        }
+        List<Long> collect = timeMap.keySet().stream().collect(Collectors.toList());
+        Collections.sort(collect, Long::compare);
+
+        return timeMap.get(collect.get(0));
+    }
+
 
 
 }
 }

+ 3 - 2
src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java

@@ -26,6 +26,7 @@ import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.vo.StudentClassVo;
 import com.xjrsoft.module.base.vo.StudentClassVo;
+import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
 import com.xjrsoft.module.personnel.dto.AddStundentFaceProcessDto;
 import com.xjrsoft.module.personnel.dto.AddStundentFaceProcessDto;
 import com.xjrsoft.module.personnel.dto.StundentFaceProcessPageDto;
 import com.xjrsoft.module.personnel.dto.StundentFaceProcessPageDto;
@@ -89,7 +90,7 @@ public class StundentFaceProcessController {
     private final IFileService fileService;
     private final IFileService fileService;
     private final IFaceManagementService faceManagementService;
     private final IFaceManagementService faceManagementService;
     private final IBaseClassService classService;
     private final IBaseClassService classService;
-
+    private final HikvisionDataMapper hikvisionDataMapper;
     @GetMapping(value = "/page")
     @GetMapping(value = "/page")
     @ApiOperation(value="学生人脸信息审核列表(分页)")
     @ApiOperation(value="学生人脸信息审核列表(分页)")
     @SaCheckPermission("stundentfaceprocess:detail")
     @SaCheckPermission("stundentfaceprocess:detail")
@@ -302,7 +303,7 @@ public class StundentFaceProcessController {
 
 
                 //将人脸上传海康
                 //将人脸上传海康
                 JsonObject paramJson = new JsonObject();
                 JsonObject paramJson = new JsonObject();
-                paramJson.addProperty("personId", studentUser.getId());
+                paramJson.addProperty("personId", hikvisionDataMapper.getStudentHikvisionId(studentUser.getId()));
                 paramJson.addProperty("faceData", base64String);
                 paramJson.addProperty("faceData", base64String);
 
 
                 Map<String, String> querys = new HashMap<>();
                 Map<String, String> querys = new HashMap<>();

+ 5 - 5
src/main/java/com/xjrsoft/module/textbook/controller/TextbookController.java

@@ -399,12 +399,12 @@ public class TextbookController {
         return RT.fileStream(bot.toByteArray(), "TextbookSubscription" + ExcelTypeEnum.XLSX.getValue());
         return RT.fileStream(bot.toByteArray(), "TextbookSubscription" + ExcelTypeEnum.XLSX.getValue());
     }
     }
 
 
-//    @PostMapping("/textbook-claim-export-query")
-//    @ApiOperation(value = "教材发放记录条件导出")
-//    public ResponseEntity<byte[]> textbookClaimExportQuery(@Valid @RequestBody TextbookClaimExportQueryDto dto) {
-    @GetMapping("/textbook-claim-export-query")
+    @PostMapping("/textbook-claim-export-query")
     @ApiOperation(value = "教材发放记录条件导出")
     @ApiOperation(value = "教材发放记录条件导出")
-    public ResponseEntity<byte[]> textbookClaimExportQuery(@Valid TextbookClaimExportQueryDto dto) {
+    public ResponseEntity<byte[]> textbookClaimExportQuery(@Valid @RequestBody TextbookClaimExportQueryDto dto) {
+//    @GetMapping("/textbook-claim-export-query")
+//    @ApiOperation(value = "教材发放记录条件导出")
+//    public ResponseEntity<byte[]> textbookClaimExportQuery(@Valid TextbookClaimExportQueryDto dto) {
         ByteArrayOutputStream bot = textbookService.listTextbookClaimExportQuery(dto);
         ByteArrayOutputStream bot = textbookService.listTextbookClaimExportQuery(dto);
         return RT.fileStream(bot.toByteArray(), "TextbookClaim" + ExcelTypeEnum.XLSX.getValue());
         return RT.fileStream(bot.toByteArray(), "TextbookClaim" + ExcelTypeEnum.XLSX.getValue());
     }
     }

+ 12 - 0
src/main/java/com/xjrsoft/module/textbook/controller/WfTextbookSubscriptionController.java

@@ -6,6 +6,7 @@ import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.page.PageOutput;
@@ -28,9 +29,12 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.validation.Valid;
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 import java.util.*;
 
 
 /**
 /**
@@ -257,4 +261,12 @@ public class WfTextbookSubscriptionController {
 
 
         return RT.fileStream(bot.toByteArray(), "TextbookSubscription" + ExcelTypeEnum.XLSX.getValue());
         return RT.fileStream(bot.toByteArray(), "TextbookSubscription" + ExcelTypeEnum.XLSX.getValue());
     }
     }
+
+    @PostMapping("/instockroom-excel-import")
+    @ApiOperation(value = "教材征订入库数量导入")
+    @SaCheckPermission("coursetable:excelimport")
+    public R excelImport(@RequestParam("file") MultipartFile file) throws IOException {
+        InputStream inputStream = file.getInputStream();
+        return R.ok(wfTextbookSubscriptionService.excelImport(inputStream));
+    }
 }
 }

+ 25 - 62
src/main/java/com/xjrsoft/module/textbook/dto/TextbookImportDto.java

@@ -13,7 +13,7 @@ public class TextbookImportDto {
      * 国际标准刊号
      * 国际标准刊号
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("国际标准刊号")
+    @ExcelProperty("书号(ISSN)")
     @ApiModelProperty("国际标准刊号")
     @ApiModelProperty("国际标准刊号")
     private String issn;
     private String issn;
     /**
     /**
@@ -34,100 +34,63 @@ public class TextbookImportDto {
      * 主编
      * 主编
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("主编")
+    @ExcelProperty("作者(主编")
     @ApiModelProperty("主编")
     @ApiModelProperty("主编")
     private String editorInChief;
     private String editorInChief;
     /**
     /**
-     * 学科组名称
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("学科组名称")
-    @ApiModelProperty("学科组名称")
-    private String groupName;
-    /**
-     * 使用年级
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用年级")
-    @ApiModelProperty("使用年级")
-    private String useGrade;
-    /**
-     * 使用年级
+     * 版本
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用学期")
-    @ApiModelProperty("使用学期")
-    private String useSemester;
-
-    /**
-     * 使用班级
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用班级")
-    @ApiModelProperty("使用班级")
-    private String useClass;
-    /**
-     * 课程
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("对应课程")
-    @ApiModelProperty("对应课程")
-    private String courseName;
+    @ExcelProperty("版次")
+    @ApiModelProperty("版本")
+    private String version;
     /**
     /**
      * 是否为规划教材
      * 是否为规划教材
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("是否为规划教材")
+    @ExcelProperty("规划教材(是或否)")
     @ApiModelProperty("是否为规划教材")
     @ApiModelProperty("是否为规划教材")
     private String isTextbookPlanCn;
     private String isTextbookPlanCn;
-
     /**
     /**
-     * 教材类型(xjr_dictionary_item[textbook_type])
+     * 使用类型(单位:学期)
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("教材类型")
-    @ApiModelProperty("教材类型-中文")
-    private String textbookTypeCn;
+    @ExcelProperty("使用类型(一学期~六学期)")
+    @ApiModelProperty("使用类型(单位:学期)")
+    private String useTypeCn;
     /**
     /**
-     * 规格型号
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("规格型号")
-    @ApiModelProperty("规格型号")
-    private String specificationsModels;
-    /**
-     * 估价(元)
+     * 教材类型(xjr_dictionary_item[textbook_type])
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("估价(元)")
-    @ApiModelProperty("估价(元)")
-    private BigDecimal appraisalPrice;
+    @ExcelProperty("类型(教材、教辅、作业本)")
+    @ApiModelProperty("教材类型-中文")
+    private String textbookTypeCn;
     /**
     /**
      * 定价(元)
      * 定价(元)
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("定价(元)")
+    @ExcelProperty("定价(元)")
     @ApiModelProperty("定价(元)")
     @ApiModelProperty("定价(元)")
     private BigDecimal price;
     private BigDecimal price;
     /**
     /**
      * 折扣
      * 折扣
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("折扣")
+    @ExcelProperty("折扣(折)")
     @ApiModelProperty("折扣")
     @ApiModelProperty("折扣")
     private Double discount;
     private Double discount;
     /**
     /**
-     * 小计(元)
+     * 学科组名称
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("小计(元)")
-    @ApiModelProperty("小计(元)")
-    private BigDecimal subtotal;
+    @ExcelProperty("学科组(必须是系统中已有的学科组名称)")
+    @ApiModelProperty("学科组名称")
+    private String groupName;
     /**
     /**
-     * 库存
+     * 课程
      */
      */
     @ContentStyle(dataFormat = 49)
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("库存")
-    @ApiModelProperty("库存")
-    private Integer stock;
+    @ExcelProperty("对应课程(必须是系统中已有的课程名称)")
+    @ApiModelProperty("对应课程")
+    private String courseName;
 }
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookSubscriptionService.java

@@ -7,6 +7,7 @@ import com.xjrsoft.module.textbook.vo.TextbookInstockroomListVo;
 import com.xjrsoft.module.textbook.vo.TextbookSubscriptionExportQueryListVo;
 import com.xjrsoft.module.textbook.vo.TextbookSubscriptionExportQueryListVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookSubscriptionVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookSubscriptionVo;
 
 
+import java.io.InputStream;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -53,4 +54,7 @@ public interface IWfTextbookSubscriptionService extends MPJBaseService<WfTextboo
     List<TextbookInstockroomListVo> instockroomList(TextbookInstockroomListDto dto);
     List<TextbookInstockroomListVo> instockroomList(TextbookInstockroomListDto dto);
 
 
     Boolean instockroom(List<TextbookInstockroomDto> dtos);
     Boolean instockroom(List<TextbookInstockroomDto> dtos);
+
+
+    Boolean excelImport(InputStream inputStream);
 }
 }

+ 21 - 65
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.textbook.service.impl;
 package com.xjrsoft.module.textbook.service.impl;
 
 
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
@@ -20,6 +21,7 @@ import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.ExerciseBookeTypeEnum;
 import com.xjrsoft.common.enums.ExerciseBookeTypeEnum;
 import com.xjrsoft.common.enums.TextbookTypeEnum;
 import com.xjrsoft.common.enums.TextbookTypeEnum;
+import com.xjrsoft.common.enums.UseSemesterTypeEnum;
 import com.xjrsoft.common.enums.WarehouseModeEnum;
 import com.xjrsoft.common.enums.WarehouseModeEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.excel.ExcelFillCellMergePrevColUtil;
 import com.xjrsoft.common.utils.excel.ExcelFillCellMergePrevColUtil;
@@ -32,6 +34,7 @@ import com.xjrsoft.module.base.mapper.BaseCourseSubjectMapper;
 import com.xjrsoft.module.base.mapper.BaseGradeMapper;
 import com.xjrsoft.module.base.mapper.BaseGradeMapper;
 import com.xjrsoft.module.base.mapper.BaseSemesterMapper;
 import com.xjrsoft.module.base.mapper.BaseSemesterMapper;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.base.vo.BaseClassCoursePageVo;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.textbook.dto.AddTextbookWarehouseRecordDto;
 import com.xjrsoft.module.textbook.dto.AddTextbookWarehouseRecordDto;
 import com.xjrsoft.module.textbook.dto.TextbookClaimExportQueryDto;
 import com.xjrsoft.module.textbook.dto.TextbookClaimExportQueryDto;
@@ -841,7 +844,7 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                 throw new MyException("导入数据为空");
                 throw new MyException("导入数据为空");
             }
             }
             saveData(dataList);
             saveData(dataList);
-        })).sheet().doRead();
+        })).sheet().headRowNumber(3).doRead();
 
 
         return true;
         return true;
     }
     }
@@ -852,22 +855,10 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
         List<SubjectGroup> subjectGroupList = subjectGroupMapper.selectList(new LambdaQueryWrapper<>());
         List<SubjectGroup> subjectGroupList = subjectGroupMapper.selectList(new LambdaQueryWrapper<>());
         Map<String, Long> subjectGroupNameAndIdMap = subjectGroupList.stream().collect(Collectors.toMap(SubjectGroup::getGroupName, SubjectGroup::getId, (k1, k2) -> k1));
         Map<String, Long> subjectGroupNameAndIdMap = subjectGroupList.stream().collect(Collectors.toMap(SubjectGroup::getGroupName, SubjectGroup::getId, (k1, k2) -> k1));
 
 
-        //使用年级
-        List<BaseGrade> baseGradeList = baseGradeMapper.selectList(new LambdaQueryWrapper<>());
-        Map<String, Long> baseGradeNameAndIdMap = baseGradeList.stream().collect(Collectors.toMap(BaseGrade::getName, BaseGrade::getId, (k1, k2) -> k1));
-
-        //使用班级
-        List<BaseClass> baseClassList = baseClassService.list();
-        Map<String, Long> baseClassNameAndIdMap = baseClassList.stream().collect(Collectors.toMap(BaseClass::getName, BaseClass::getId, (k1, k2) -> k1));
-
         //使用课程
         //使用课程
         List<BaseCourseSubject> baseCourseSubjectList = baseCourseSubjectMapper.selectList(new LambdaQueryWrapper<>());
         List<BaseCourseSubject> baseCourseSubjectList = baseCourseSubjectMapper.selectList(new LambdaQueryWrapper<>());
         Map<String, Long> baseCourseSubjectNameAndIdMap = baseCourseSubjectList.stream().collect(Collectors.toMap(BaseCourseSubject::getName, BaseCourseSubject::getId, (k1, k2) -> k1));
         Map<String, Long> baseCourseSubjectNameAndIdMap = baseCourseSubjectList.stream().collect(Collectors.toMap(BaseCourseSubject::getName, BaseCourseSubject::getId, (k1, k2) -> k1));
 
 
-        //使用学期
-        List<BaseSemester> baseSemesterList = baseSemesterMapper.selectList(new LambdaQueryWrapper<>());
-        Map<String, Long> baseSemesterNameAndIdMap = baseSemesterList.stream().collect(Collectors.toMap(BaseSemester::getName, BaseSemester::getId, (k1, k2) -> k1));
-
         //批量插入或更新数据
         //批量插入或更新数据
         for (TextbookImportDto textbookImportDto : dataList) {
         for (TextbookImportDto textbookImportDto : dataList) {
             TextbookCoreAttribute textbookCoreAttribute = new TextbookCoreAttribute();
             TextbookCoreAttribute textbookCoreAttribute = new TextbookCoreAttribute();
@@ -890,13 +881,6 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                     .orElse(null);
                     .orElse(null);
             textbook.setCourseSubjectId(courseSubjectId);
             textbook.setCourseSubjectId(courseSubjectId);
 
 
-            // 处理年级映射
-            String useGrade = textbookImportDto.getUseGrade();
-            Long gradeId = Optional.ofNullable(useGrade)
-                    .map(baseGradeNameAndIdMap::get)
-                    .orElse(null);
-            textbook.setGradeId(gradeId);
-
             // 处理是否教材计划字段
             // 处理是否教材计划字段
             String isTextbookPlanCn = textbookImportDto.getIsTextbookPlanCn();
             String isTextbookPlanCn = textbookImportDto.getIsTextbookPlanCn();
             String isTextbookPlan = Optional.ofNullable(isTextbookPlanCn)
             String isTextbookPlan = Optional.ofNullable(isTextbookPlanCn)
@@ -912,69 +896,41 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                     .orElse(null);
                     .orElse(null);
             textbook.setTextbookType(textbookTypeCode);
             textbook.setTextbookType(textbookTypeCode);
 
 
-            // 处理学期映射
-            String useSemester = textbookImportDto.getUseSemester();
-            Long baseSemesterId = Optional.ofNullable(useSemester)
-                    .map(baseSemesterNameAndIdMap::get)
-                    .orElse(null);
-            textbook.setBaseSemesterId(baseSemesterId);
-
-            // 处理班级映射
-            List<Long> classIdList = Optional.ofNullable(textbookImportDto.getUseClass())
-                    .map(classNames -> Arrays.stream(classNames.split(","))
-                            .map(String::trim)
-                            .map(baseClassNameAndIdMap::get)
-                            .filter(Objects::nonNull)
-                            .collect(Collectors.toList()))
-                    .orElse(Collections.emptyList());
-
+            //处理使用类型
+            textbook.setUseType(UseSemesterTypeEnum.getCode(textbookImportDto.getUseTypeCn()));
 
 
             // 判断导入的教材是否已经存在,根据教材的 ISBN 码和使用的学期判断
             // 判断导入的教材是否已经存在,根据教材的 ISBN 码和使用的学期判断
             LambdaQueryWrapper<Textbook> textbookLambdaQueryWrapper = new LambdaQueryWrapper<>();
             LambdaQueryWrapper<Textbook> textbookLambdaQueryWrapper = new LambdaQueryWrapper<>();
             textbookLambdaQueryWrapper
             textbookLambdaQueryWrapper
                     .eq(Textbook::getIssn, textbook.getIssn())
                     .eq(Textbook::getIssn, textbook.getIssn())
-                    .eq(Textbook::getBaseSemesterId, textbook.getBaseSemesterId())
             ;
             ;
 
 
             Textbook oldTextbook = this.getOne(textbookLambdaQueryWrapper);
             Textbook oldTextbook = this.getOne(textbookLambdaQueryWrapper);
 
 
-
-
+            Date now = new Date();
+            Long loginId = StpUtil.getLoginIdAsLong();
             // 已经存在,更新数据
             // 已经存在,更新数据
             if (oldTextbook != null) {
             if (oldTextbook != null) {
                 // 更新教材数据
                 // 更新教材数据
+                textbookCoreAttribute.setId(oldTextbook.getTextbookCoreAttributeId());
+                textbookCoreAttribute.setModifyDate(now);
+                textbookCoreAttribute.setModifyUserId(loginId);
+                textbookCoreAttributeService.updateById(textbookCoreAttribute);
+
+                textbook.setId(oldTextbook.getId());
+                textbook.setModifyDate(now);
+                textbook.setModifyUserId(loginId);
                 textbookTextbookMapper.updateById(textbook);
                 textbookTextbookMapper.updateById(textbook);
-
-                // 先删除使用班级的信息,再新增
-                LambdaQueryWrapper<TextbookClassRelation> textbookClassRelationLambdaQueryWrapper = new LambdaQueryWrapper<>();
-                textbookClassRelationLambdaQueryWrapper
-                        .eq(TextbookClassRelation::getTextbookId, textbook.getId());
-
-                textbookTextbookClassRelationMapper.delete(textbookClassRelationLambdaQueryWrapper);
-
-                // 批量插入班级关系
-                for (Long classId : classIdList) {
-                    textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
-                        setCreateDate(new Date());
-                        setTextbookId(textbook.getId());
-                        setClassId(classId);
-                    }});
-                }
             } else {
             } else {
+                textbookCoreAttribute.setCreateDate(now);
+                textbookCoreAttribute.setCreateUserId(loginId);
                 textbookCoreAttributeService.save(textbookCoreAttribute);
                 textbookCoreAttributeService.save(textbookCoreAttribute);
 
 
-                textbook.setTextbookCoreAttributeId(textbookCoreAttribute.getId());
                 // 插入教材数据
                 // 插入教材数据
+                textbook.setCreateDate(now);
+                textbook.setCreateUserId(loginId);
+                textbook.setTextbookCoreAttributeId(textbookCoreAttribute.getId());
                 textbookTextbookMapper.insert(textbook);
                 textbookTextbookMapper.insert(textbook);
-
-                //插入班级和教材关系
-                for (Long classId : classIdList) {
-                    textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
-                        setCreateDate(new Date());
-                        setTextbookId(textbook.getId());
-                        setClassId(classId);
-                    }});
-                }
             }
             }
         }
         }
     }
     }

+ 88 - 1
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookSubscriptionServiceImpl.java

@@ -2,11 +2,15 @@ package com.xjrsoft.module.textbook.service.impl;
 
 
 import cn.dev33.satoken.stp.StpUtil;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.read.listener.PageReadListener;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.TextbookTypeEnum;
+import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
@@ -29,6 +33,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import java.io.InputStream;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -179,7 +184,7 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
 
 
 
 
         //点击完成征订
         //点击完成征订
-        if (wfTextbookSubscription.getStatus() == 3 && dto.getStatus() == 4) {
+        if (wfTextbookSubscription.getStatus() == 2 && dto.getStatus() == 4) {
             WfTextbookSubscription newW = BeanUtil.toBean(dto, WfTextbookSubscription.class);
             WfTextbookSubscription newW = BeanUtil.toBean(dto, WfTextbookSubscription.class);
             return this.updateById(newW);
             return this.updateById(newW);
         }
         }
@@ -374,4 +379,86 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
         }
         }
         return true;
         return true;
     }
     }
+
+    @Override
+    public Boolean excelImport(InputStream inputStream) {
+        EasyExcel.read(inputStream, TextbookImportDto.class, new PageReadListener<TextbookImportDto>(dataList -> {
+            if (dataList.isEmpty()) {
+                throw new MyException("导入数据为空");
+            }
+            saveData(dataList);
+        })).sheet().headRowNumber(3).doRead();
+
+        return true;
+    }
+
+    private void saveData(List<TextbookImportDto> dataList) {
+        /*//查询所有需要的数据
+        //学科组
+        List<SubjectGroup> subjectGroupList = subjectGroupMapper.selectList(new LambdaQueryWrapper<>());
+        Map<String, Long> subjectGroupNameAndIdMap = subjectGroupList.stream().collect(Collectors.toMap(SubjectGroup::getGroupName, SubjectGroup::getId, (k1, k2) -> k1));
+
+        //使用课程
+        List<BaseCourseSubject> baseCourseSubjectList = baseCourseSubjectMapper.selectList(new LambdaQueryWrapper<>());
+        Map<String, Long> baseCourseSubjectNameAndIdMap = baseCourseSubjectList.stream().collect(Collectors.toMap(BaseCourseSubject::getName, BaseCourseSubject::getId, (k1, k2) -> k1));
+
+        //批量插入或更新数据
+        for (TextbookImportDto textbookImportDto : dataList) {
+            TextbookCoreAttribute textbookCoreAttribute = new TextbookCoreAttribute();
+            BeanUtils.copyProperties(textbookImportDto, textbookCoreAttribute);
+
+            Textbook textbook = new Textbook();
+            BeanUtils.copyProperties(textbookImportDto, textbook);
+
+            // 处理学科组映射
+            String groupName = textbookImportDto.getGroupName();
+            Long subjectGroupId = Optional.ofNullable(groupName)
+                    .map(subjectGroupNameAndIdMap::get)
+                    .orElse(null);
+            textbook.setSubjectGroupId(subjectGroupId);
+
+            // 处理课程映射
+            String courseName = textbookImportDto.getCourseName();
+            Long courseSubjectId = Optional.ofNullable(courseName)
+                    .map(baseCourseSubjectNameAndIdMap::get)
+                    .orElse(null);
+            textbook.setCourseSubjectId(courseSubjectId);
+
+            // 处理是否教材计划字段
+            String isTextbookPlanCn = textbookImportDto.getIsTextbookPlanCn();
+            String isTextbookPlan = Optional.ofNullable(isTextbookPlanCn)
+                    .filter("是"::equals)
+                    .map(s -> "yes")
+                    .orElse("no");
+            textbook.setIsTextbookPlan(isTextbookPlan);
+
+            // 处理教材类型映射
+            String textbookTypeCn = textbookImportDto.getTextbookTypeCn();
+            String textbookTypeCode = Optional.ofNullable(textbookTypeCn)
+                    .map(TextbookTypeEnum::getCode)
+                    .orElse(null);
+            textbook.setTextbookType(textbookTypeCode);
+
+            // 判断导入的教材是否已经存在,根据教材的 ISBN 码和使用的学期判断
+            LambdaQueryWrapper<Textbook> textbookLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            textbookLambdaQueryWrapper
+                    .eq(Textbook::getIssn, textbook.getIssn())
+            ;
+
+            Textbook oldTextbook = this.getOne(textbookLambdaQueryWrapper);
+
+            // 已经存在,更新数据
+            if (oldTextbook != null) {
+                // 更新教材数据
+                textbook.setId(oldTextbook.getId());
+                textbookTextbookMapper.updateById(textbook);
+            } else {
+                textbookCoreAttributeService.save(textbookCoreAttribute);
+
+                textbook.setTextbookCoreAttributeId(textbookCoreAttribute.getId());
+                // 插入教材数据
+                textbookTextbookMapper.insert(textbook);
+            }
+        }*/
+    }
 }
 }

+ 7 - 22
src/main/java/com/xjrsoft/module/textbook/vo/TextbookStandingExportQueryVo.java

@@ -44,6 +44,13 @@ public class TextbookStandingExportQueryVo {
     @ExcelProperty("主编")
     @ExcelProperty("主编")
     @ApiModelProperty("主编")
     @ApiModelProperty("主编")
     private String editorInChief;
     private String editorInChief;
+    /**
+     * 版本
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("版次")
+    @ApiModelProperty("版本")
+    private String version;
     /**
     /**
      * 学科组名称
      * 学科组名称
      */
      */
@@ -51,27 +58,6 @@ public class TextbookStandingExportQueryVo {
     @ExcelProperty("学科组名称")
     @ExcelProperty("学科组名称")
     @ApiModelProperty("学科组名称")
     @ApiModelProperty("学科组名称")
     private String groupName;
     private String groupName;
-    /**
-     * 使用年级
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用年级")
-    @ApiModelProperty("使用年级")
-    private String useGrade;
-    /**
-     * 使用年级
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用学期")
-    @ApiModelProperty("使用学期")
-    private String semesterCn;
-    /**
-     * 使用班级
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用班级")
-    @ApiModelProperty("使用班级")
-    private String useClass;
     /**
     /**
     * 课程
     * 课程
     */
     */
@@ -86,7 +72,6 @@ public class TextbookStandingExportQueryVo {
     @ExcelProperty("是否为规划教材")
     @ExcelProperty("是否为规划教材")
     @ApiModelProperty("是否为规划教材")
     @ApiModelProperty("是否为规划教材")
     private String isTextbookPlanCn;
     private String isTextbookPlanCn;
-
     /**
     /**
      * 教材类型(xjr_dictionary_item[textbook_type])
      * 教材类型(xjr_dictionary_item[textbook_type])
      */
      */

+ 2 - 1
src/main/resources/application-pre.yml

@@ -118,7 +118,8 @@ xjrsoft:
   weChatMessageTemplate:
   weChatMessageTemplate:
     commonTemplate: qmpXORPM1Cocqn503Qa4OkNNQ0uxlj2-ed9m6uWO-v4
     commonTemplate: qmpXORPM1Cocqn503Qa4OkNNQ0uxlj2-ed9m6uWO-v4
     assessmentTemplate: ehYfXni7exZUmt6dJX4Ukbm9ETarFfKLfXVYwNnjKMc
     assessmentTemplate: ehYfXni7exZUmt6dJX4Ukbm9ETarFfKLfXVYwNnjKMc
-    attendanceMessageTemplate: o-KboOcqcJ3YpjPN2xwgM_NcjN-0yzwWlDDXYfTM0Q4
+    attendanceMsgLateTemplate: o-KboOcqcJ3YpjPN2xwgM_NcjN-0yzwWlDDXYfTM0Q4 # 迟到消息
+    attendanceMsgAbsenceTemplate: uPPJkWOSronnB_GJolcnarbl8qosDvsadxl0qL_4jdQ # 缺勤
     outInTemplate: ERkMebHjsziZO6WBrlzsbENiEuRR4vrlhJw5LR4aDr8
     outInTemplate: ERkMebHjsziZO6WBrlzsbENiEuRR4vrlhJw5LR4aDr8
     attenDanceWarnTemplate: vdFsy-QUk5L56OmGgBsRC_RB-45qRTkLzMPQotV2A4Y
     attenDanceWarnTemplate: vdFsy-QUk5L56OmGgBsRC_RB-45qRTkLzMPQotV2A4Y
   appletWeChat:
   appletWeChat:

+ 2 - 1
src/main/resources/application-prod.yml

@@ -114,7 +114,8 @@ xjrsoft:
   weChatMessageTemplate:
   weChatMessageTemplate:
     commonTemplate: qmpXORPM1Cocqn503Qa4OkNNQ0uxlj2-ed9m6uWO-v4
     commonTemplate: qmpXORPM1Cocqn503Qa4OkNNQ0uxlj2-ed9m6uWO-v4
     assessmentTemplate: ehYfXni7exZUmt6dJX4Ukbm9ETarFfKLfXVYwNnjKMc
     assessmentTemplate: ehYfXni7exZUmt6dJX4Ukbm9ETarFfKLfXVYwNnjKMc
-    attendanceMessageTemplate: uPPJkWOSronnB_GJolcnajRSdnIf8GCoCk4c0v1szPA
+    attendanceMsgLateTemplate: uPPJkWOSronnB_GJolcnajRSdnIf8GCoCk4c0v1szPA # 迟到消息
+    attendanceMsgAbsenceTemplate: uPPJkWOSronnB_GJolcnarbl8qosDvsadxl0qL_4jdQ # 缺勤
     outInTemplate: ERkMebHjsziZO6WBrlzsbENiEuRR4vrlhJw5LR4aDr8
     outInTemplate: ERkMebHjsziZO6WBrlzsbENiEuRR4vrlhJw5LR4aDr8
     attenDanceWarnTemplate: Fg4AWVQRGernl0PiJQ8gRgCUFHEGZuizlClQNuVhqu4
     attenDanceWarnTemplate: Fg4AWVQRGernl0PiJQ8gRgCUFHEGZuizlClQNuVhqu4
   appletWeChat:
   appletWeChat:

+ 1 - 1
src/main/resources/application.yml

@@ -5,7 +5,7 @@ server:
 spring:
 spring:
   # 环境 dev|pre|prod
   # 环境 dev|pre|prod
   profiles:
   profiles:
-    active: dev
+    active: pre
   # jackson时间格式化
   # jackson时间格式化
   jackson:
   jackson:
     time-zone: GMT+8
     time-zone: GMT+8

+ 2 - 7
src/main/resources/mapper/textbook/TextbookMapper.xml

@@ -157,12 +157,8 @@
         t1.book_name,
         t1.book_name,
         t1.publishing_house,
         t1.publishing_house,
         t1.editor_in_chief,
         t1.editor_in_chief,
+        t1.version,
         t2.group_name,
         t2.group_name,
-        t6.name AS use_grade,
-        (SELECT GROUP_CONCAT(c2.name)
-        FROM textbook_class_relation c1
-        LEFT JOIN base_class c2 ON c1.class_id = c2.id
-        WHERE c1.textbook_id = t1.id) AS use_class,
         t4.name AS course_name,
         t4.name AS course_name,
         t7.name AS is_textbook_plan_cn,
         t7.name AS is_textbook_plan_cn,
         t5.name AS textbook_type_cn,
         t5.name AS textbook_type_cn,
@@ -171,8 +167,7 @@
         t1.price,
         t1.price,
         t1.discount,
         t1.discount,
         t1.subtotal,
         t1.subtotal,
-        t1.stock,
-        t8.name as use_semester
+        t1.stock
         FROM textbook t1
         FROM textbook t1
         LEFT JOIN subject_group t2 ON t1.subject_group_id = t2.id
         LEFT JOIN subject_group t2 ON t1.subject_group_id = t2.id
         LEFT JOIN base_course_subject t4 ON t1.course_subject_id = t4.id
         LEFT JOIN base_course_subject t4 ON t1.course_subject_id = t4.id

+ 5 - 0
src/test/java/com/xjrsoft/module/job/HikvisionBaseDataTaskTest.java

@@ -138,6 +138,11 @@ class HikvisionBaseDataTaskTest {
 //        selectResource(use);
 //        selectResource(use);
     }
     }
 
 
+    @Test
+    void testCarInsert() throws Exception {
+        outInRecordUtil.GetVehicleRecord(faceImportMapper);
+    }
+
     public static void selectCar(Db db, String tableName) throws SQLException {
     public static void selectCar(Db db, String tableName) throws SQLException {
         String sql = "SELECT * FROM " + tableName + " WHERE delete_mark = 0";
         String sql = "SELECT * FROM " + tableName + " WHERE delete_mark = 0";
         List<Department> dataList = db.query(sql, Department.class);
         List<Department> dataList = db.query(sql, Department.class);