Browse Source

Merge branch 'pre'

dzx 1 year ago
parent
commit
f641bdd8ba
21 changed files with 409 additions and 244 deletions
  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.ResultSet;
 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 {
 
@@ -367,12 +364,21 @@ public class SqlRunnerAdapter implements ISqlRunner, Closeable {
      * @return
      */
     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);
         List<String> args = new ArrayList<>();
         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条件
@@ -386,6 +392,7 @@ public class SqlRunnerAdapter implements ISqlRunner, Closeable {
             args.add(strValue);
             i++;
         }
+
         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;
 
     //考勤结果通知模板
-    @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}")
     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.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.OutInStatusEnum;
 import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.vo.TeacherStatisticsVo;
 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.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.outint.entity.CarOutInRecord;
@@ -115,7 +117,7 @@ public class StatisticsController {
                             .le(CarOutInRecord::getRecordTime, endTime)
                             .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
                             .ge(dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
-                            .eq(CarOutInRecord::getStatus, 0)
+                            .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
                             .orderByAsc(CarOutInRecord::getRecordTime)
             );
 
@@ -165,10 +167,11 @@ public class StatisticsController {
         MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
                 .disableSubLogicDel()
                 .distinct()
-                .eq(ObjectUtil.isNotNull(dto.getGradeId()), BaseStudentSchoolRoll::getGradeId, dto.getGradeId())
+                .eq(ObjectUtil.isNotNull(dto.getGradeId()), BaseClass::getGradeId, dto.getGradeId())
                 .eq(BaseStudentSchoolRoll::getArchivesStatus, "FB2901")
                 .eq(ObjectUtil.isNotNull(dto.getClassId()), BaseStudentSchoolRoll::getClassId, dto.getClassId())
                 .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
+                .innerJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
                 .innerJoin(BaseStudent.class, BaseStudent::getUserId, XjrUser::getId);
         long allCount = xjrUserService.count(queryWrapper);
 
@@ -191,9 +194,15 @@ public class StatisticsController {
             }
 
             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());

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

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.attendance.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 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.page.ConventPage;
 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.StudentDetailsDto;
 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.organization.entity.User;
 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.service.IStudentOutInRecordService;
 import com.xjrsoft.module.outint.vo.StudentOutInRecordVo;
@@ -75,11 +78,23 @@ public class StudentStatisticsController {
     private final IBaseClassService classService;
     private final IHolidayDateService holidayDateService;
     private final IAttendanceRuleCategoryService ruleCategoryService;
-
+    private final IBaseClassService baseClassService;
     @GetMapping(value = "/class-statistics")
     @ApiOperation(value="班级考勤统计")
     @SaCheckPermission("statistics:detail")
     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);
         List<Long> classIds = new ArrayList<>();
         for (ClassStatisticsVo record : attendancePage.getRecords()) {
@@ -172,6 +187,17 @@ public class StudentStatisticsController {
     @ApiOperation(value="学生考勤")
     @SaCheckPermission("statistics:detail")
     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<>();
         queryUser.disableSubLogicDel().distinct()
                 .like(StrUtil.isNotEmpty(dto.getName()), User::getName, dto.getName())
@@ -224,9 +250,11 @@ public class StudentStatisticsController {
             Map<Long, StudentLeave> leaveList = studentLeaveService.getLeaveList(startTime, endTime);
             //查询进入记录
             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<>();
             for (StudentOutInRecord inRecord : outInRecords) {
@@ -260,10 +288,7 @@ public class StudentStatisticsController {
     @SaCheckPermission("statistics:detail")
     public RT<PageOutput<ClassStatisticsVo>> classHistory(@Valid AttendanceStatisticDto 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())){
             DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
             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();
                 outInDto.setQueryDate(startTime.toLocalDate());
-                outInDto.setRecordTime(startTime);
+                outInDto.setRecordTime(endTime);
                 outInDto.setStatus(OutInStatusEnum.enter.getCode());
                 outInDto.setUserId(record.getUserId());
                 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 org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.sql.Types;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 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;
 
 
@@ -37,8 +35,10 @@ public class OutInRecordUtil {
         SqlRunnerAdapter.db().insert(sql);
 
         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);
     }
 
@@ -51,8 +51,10 @@ public class OutInRecordUtil {
         SqlRunnerAdapter.db().insert(sql);
 
         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);
     }
 
@@ -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,
-                                     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 nameValue = (name != null && !name.equals("null")) ? name : "";
         String photoValue = (facePhoto != null && !facePhoto.equals("null")) ? facePhoto : "";
@@ -95,16 +97,20 @@ public class OutInRecordUtil {
         if(carMessageApplyId != 0){
             String selectTable = "car_message_apply";
             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);
             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 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);
         }
     }
@@ -430,8 +436,8 @@ public class OutInRecordUtil {
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("pageNo", pageNo.getAndIncrement());
             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);
             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();
-        //获取最近的时间
-        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;
         String timePeriodStr = null;
@@ -147,25 +135,43 @@ public class AttendanceMessageTask {
         }
 
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        String format = recentlyTime.format(formatter);
 
         int userCount = 0;
         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) {
+            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 + "")){
                 continue;
             }
@@ -174,6 +180,12 @@ public class AttendanceMessageTask {
             if(userList.isEmpty()){
                 continue;
             }
+            if(recentlyTime == null){
+                continue;
+            }
+
+            String format = recentlyTime.format(formatter);
+
             userCount += userList.size();
             if(messageSet.getRoleType() != null && messageSet.getRoleType() == 2){
                 //教师总人数
@@ -236,7 +248,7 @@ public class AttendanceMessageTask {
                 );
 
                 WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
-                weChatSendMessageDto.setTemplateId(weChatUtil.getAttendanceMessageTemplate());
+                weChatSendMessageDto.setTemplateId(wechatTemplate);
                 JSONObject paramJson = new JSONObject();
 
                 JSONObject thing6 = new JSONObject();
@@ -268,10 +280,15 @@ public class AttendanceMessageTask {
                     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){
@@ -308,5 +325,39 @@ public class AttendanceMessageTask {
         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.service.IBaseClassService;
 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.personnel.dto.AddStundentFaceProcessDto;
 import com.xjrsoft.module.personnel.dto.StundentFaceProcessPageDto;
@@ -89,7 +90,7 @@ public class StundentFaceProcessController {
     private final IFileService fileService;
     private final IFaceManagementService faceManagementService;
     private final IBaseClassService classService;
-
+    private final HikvisionDataMapper hikvisionDataMapper;
     @GetMapping(value = "/page")
     @ApiOperation(value="学生人脸信息审核列表(分页)")
     @SaCheckPermission("stundentfaceprocess:detail")
@@ -302,7 +303,7 @@ public class StundentFaceProcessController {
 
                 //将人脸上传海康
                 JsonObject paramJson = new JsonObject();
-                paramJson.addProperty("personId", studentUser.getId());
+                paramJson.addProperty("personId", hikvisionDataMapper.getStudentHikvisionId(studentUser.getId()));
                 paramJson.addProperty("faceData", base64String);
 
                 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());
     }
 
-//    @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 = "教材发放记录条件导出")
-    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);
         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.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+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;
@@ -28,9 +29,12 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 
 /**
@@ -257,4 +261,12 @@ public class WfTextbookSubscriptionController {
 
         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)
-    @ExcelProperty("国际标准刊号")
+    @ExcelProperty("书号(ISSN)")
     @ApiModelProperty("国际标准刊号")
     private String issn;
     /**
@@ -34,100 +34,63 @@ public class TextbookImportDto {
      * 主编
      */
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("主编")
+    @ExcelProperty("作者(主编")
     @ApiModelProperty("主编")
     private String editorInChief;
     /**
-     * 学科组名称
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("学科组名称")
-    @ApiModelProperty("学科组名称")
-    private String groupName;
-    /**
-     * 使用年级
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用年级")
-    @ApiModelProperty("使用年级")
-    private String useGrade;
-    /**
-     * 使用年级
+     * 版本
      */
     @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)
-    @ExcelProperty("是否为规划教材")
+    @ExcelProperty("规划教材(是或否)")
     @ApiModelProperty("是否为规划教材")
     private String isTextbookPlanCn;
-
     /**
-     * 教材类型(xjr_dictionary_item[textbook_type])
+     * 使用类型(单位:学期)
      */
     @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)
-    @ExcelProperty("估价(元)")
-    @ApiModelProperty("估价(元)")
-    private BigDecimal appraisalPrice;
+    @ExcelProperty("类型(教材、教辅、作业本)")
+    @ApiModelProperty("教材类型-中文")
+    private String textbookTypeCn;
     /**
      * 定价(元)
      */
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("定价(元)")
+    @ExcelProperty("定价(元)")
     @ApiModelProperty("定价(元)")
     private BigDecimal price;
     /**
      * 折扣
      */
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("折扣")
+    @ExcelProperty("折扣(折)")
     @ApiModelProperty("折扣")
     private Double discount;
     /**
-     * 小计(元)
+     * 学科组名称
      */
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("小计(元)")
-    @ApiModelProperty("小计(元)")
-    private BigDecimal subtotal;
+    @ExcelProperty("学科组(必须是系统中已有的学科组名称)")
+    @ApiModelProperty("学科组名称")
+    private String groupName;
     /**
-     * 库存
+     * 课程
      */
     @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.WfTextbookSubscriptionVo;
 
+import java.io.InputStream;
 import java.util.List;
 
 /**
@@ -53,4 +54,7 @@ public interface IWfTextbookSubscriptionService extends MPJBaseService<WfTextboo
     List<TextbookInstockroomListVo> instockroomList(TextbookInstockroomListDto dto);
 
     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;
 
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -20,6 +21,7 @@ import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.ExerciseBookeTypeEnum;
 import com.xjrsoft.common.enums.TextbookTypeEnum;
+import com.xjrsoft.common.enums.UseSemesterTypeEnum;
 import com.xjrsoft.common.enums.WarehouseModeEnum;
 import com.xjrsoft.common.exception.MyException;
 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.BaseSemesterMapper;
 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.textbook.dto.AddTextbookWarehouseRecordDto;
 import com.xjrsoft.module.textbook.dto.TextbookClaimExportQueryDto;
@@ -841,7 +844,7 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                 throw new MyException("导入数据为空");
             }
             saveData(dataList);
-        })).sheet().doRead();
+        })).sheet().headRowNumber(3).doRead();
 
         return true;
     }
@@ -852,22 +855,10 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
         List<SubjectGroup> subjectGroupList = subjectGroupMapper.selectList(new LambdaQueryWrapper<>());
         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<>());
         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) {
             TextbookCoreAttribute textbookCoreAttribute = new TextbookCoreAttribute();
@@ -890,13 +881,6 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                     .orElse(null);
             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 isTextbookPlan = Optional.ofNullable(isTextbookPlanCn)
@@ -912,69 +896,41 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                     .orElse(null);
             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 码和使用的学期判断
             LambdaQueryWrapper<Textbook> textbookLambdaQueryWrapper = new LambdaQueryWrapper<>();
             textbookLambdaQueryWrapper
                     .eq(Textbook::getIssn, textbook.getIssn())
-                    .eq(Textbook::getBaseSemesterId, textbook.getBaseSemesterId())
             ;
 
             Textbook oldTextbook = this.getOne(textbookLambdaQueryWrapper);
 
-
-
+            Date now = new Date();
+            Long loginId = StpUtil.getLoginIdAsLong();
             // 已经存在,更新数据
             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);
-
-                // 先删除使用班级的信息,再新增
-                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 {
+                textbookCoreAttribute.setCreateDate(now);
+                textbookCoreAttribute.setCreateUserId(loginId);
                 textbookCoreAttributeService.save(textbookCoreAttribute);
 
-                textbook.setTextbookCoreAttributeId(textbookCoreAttribute.getId());
                 // 插入教材数据
+                textbook.setCreateDate(now);
+                textbook.setCreateUserId(loginId);
+                textbook.setTextbookCoreAttributeId(textbookCoreAttribute.getId());
                 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.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.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 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.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
@@ -29,6 +33,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.InputStream;
 import java.util.*;
 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);
             return this.updateById(newW);
         }
@@ -374,4 +379,86 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
         }
         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("主编")
     @ApiModelProperty("主编")
     private String editorInChief;
+    /**
+     * 版本
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("版次")
+    @ApiModelProperty("版本")
+    private String version;
     /**
      * 学科组名称
      */
@@ -51,27 +58,6 @@ public class TextbookStandingExportQueryVo {
     @ExcelProperty("学科组名称")
     @ApiModelProperty("学科组名称")
     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("是否为规划教材")
     @ApiModelProperty("是否为规划教材")
     private String isTextbookPlanCn;
-
     /**
      * 教材类型(xjr_dictionary_item[textbook_type])
      */

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

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

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

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

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

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

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

@@ -157,12 +157,8 @@
         t1.book_name,
         t1.publishing_house,
         t1.editor_in_chief,
+        t1.version,
         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,
         t7.name AS is_textbook_plan_cn,
         t5.name AS textbook_type_cn,
@@ -171,8 +167,7 @@
         t1.price,
         t1.discount,
         t1.subtotal,
-        t1.stock,
-        t8.name as use_semester
+        t1.stock
         FROM textbook t1
         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

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

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