Parcourir la source

Merge branch 'pre'

dzx il y a 1 an
Parent
commit
9cfaea158d
22 fichiers modifiés avec 628 ajouts et 158 suppressions
  1. 34 0
      src/main/java/com/xjrsoft/common/enums/OutInStatusEnum.java
  2. 23 3
      src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java
  3. 9 9
      src/main/java/com/xjrsoft/module/attendance/controller/TeacherStatisticsController.java
  4. 5 0
      src/main/java/com/xjrsoft/module/attendance/entity/AttendanceUserRelation.java
  5. 41 35
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceRuleCategoryServiceImpl.java
  6. 9 5
      src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java
  7. 16 10
      src/main/java/com/xjrsoft/module/job/AttendanceMessageTask.java
  8. 43 0
      src/main/java/com/xjrsoft/module/outint/dto/TeacherOutInRecordDto.java
  9. 5 0
      src/main/java/com/xjrsoft/module/outint/mapper/TeacherOutInRecordMapper.java
  10. 6 0
      src/main/java/com/xjrsoft/module/outint/service/ITeacherOutInRecordService.java
  11. 7 0
      src/main/java/com/xjrsoft/module/outint/service/impl/TeacherOutInRecordServiceImpl.java
  12. 20 27
      src/main/java/com/xjrsoft/module/textbook/controller/WfTextbookSubscriptionController.java
  13. 30 0
      src/main/java/com/xjrsoft/module/textbook/dto/TextbookInstockroomDto.java
  14. 20 0
      src/main/java/com/xjrsoft/module/textbook/dto/TextbookInstockroomListDto.java
  15. 5 0
      src/main/java/com/xjrsoft/module/textbook/entity/WfTextbookSubscriptionItem.java
  16. 7 0
      src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookSubscriptionService.java
  17. 100 49
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookSubscriptionServiceImpl.java
  18. 92 0
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookInstockroomListVo.java
  19. 15 0
      src/main/resources/mapper/outin/TeacherOutInRecordMapper.xml
  20. 1 0
      src/test/java/com/xjrsoft/module/hikvision/util/FaceImportUtilTest.java
  21. 139 20
      src/test/java/com/xjrsoft/module/job/HikvisionBaseDataTaskTest.java
  22. 1 0
      src/test/java/com/xjrsoft/xjrsoftboot/log.log

+ 34 - 0
src/main/java/com/xjrsoft/common/enums/OutInStatusEnum.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @description: 进出状态(0:进 1:出)
+ * @Author: dzx
+ * @Date: 2024年6月20日
+ */
+public enum OutInStatusEnum {
+
+    /**
+     * 春季招生
+     */
+    enter(0, "出场"),
+    /**
+     *  秋季招生
+     */
+    goOut(1, "进场");
+
+    final Integer code;
+    final String value;
+
+    public Integer getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    OutInStatusEnum(final Integer code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+}

+ 23 - 3
src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java

@@ -7,15 +7,19 @@ import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 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.concat.service.IXjrUserService;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.outint.entity.CarOutInRecord;
 import com.xjrsoft.module.outint.entity.StudentOutInRecord;
 import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+import com.xjrsoft.module.outint.service.ICarOutInRecordService;
 import com.xjrsoft.module.outint.service.IStudentOutInRecordService;
 import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
+import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import com.xjrsoft.module.personnel.service.IReservationSchoolService;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
@@ -60,6 +64,7 @@ public class StatisticsController {
     private final IWfTeacherleaveService wfTeacherleaveService;
     private final IStudentLeaveService studentLeaveService;
     private final IReservationSchoolService reservationSchoolService;
+    private final ICarOutInRecordService carOutInRecordService;
 
     @GetMapping(value = "/teacher-statistics")
     @ApiOperation(value="教职工考勤统计")
@@ -77,28 +82,43 @@ public class StatisticsController {
         if(dto.getDate() != null && !"".equals(dto.getDate())){
             DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
             LocalDate queryDate = LocalDate.parse(dto.getDate(), formatter);
-            LocalDateTime startTime, endTime;
+            LocalDateTime startTime, endTime, amEndTime = null;
             if(dto.getTimePeriod() != null && dto.getTimePeriod() == 1){
                 startTime = queryDate.atTime(5, 0, 0);
                 endTime = queryDate.atTime(12, 0, 0);
             }else if(dto.getTimePeriod() != null && dto.getTimePeriod() == 2){
                 startTime = queryDate.atTime(12, 0, 0);
                 endTime = queryDate.atTime(18, 0, 0);
+                amEndTime = queryDate.atTime(12, 0, 0);
             }else if(dto.getTimePeriod() != null && dto.getTimePeriod() == 3){
                 startTime = queryDate.atTime(18, 0, 0);
                 endTime = queryDate.atTime(23, 59, 59);
+                amEndTime = queryDate.atTime(18, 0, 0);
             }else{
                 startTime = queryDate.atTime(0, 0, 0);
                 endTime = queryDate.atTime(23, 59, 59);
             }
 
             List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.list(
-                    new QueryWrapper<TeacherOutInRecord>().lambda()
-                            .between(TeacherOutInRecord::getRecordTime, startTime, endTime)
+                    new MPJLambdaWrapper<TeacherOutInRecord>()
+                            .le(TeacherOutInRecord::getRecordTime, endTime)
                             .eq(TeacherOutInRecord::getStatus, 1)
+                            .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
+                            .ge(dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
                             .orderByAsc(TeacherOutInRecord::getRecordTime)
             );
 
+            List<CarOutInRecord> list = carOutInRecordService.list(
+                    new MPJLambdaWrapper<CarOutInRecord>()
+                            .select(CarOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(CarOutInRecord.class).contains(x.getProperty()))
+                            .leftJoin(CarMessageApply.class, CarMessageApply::getId, CarOutInRecord::getCarMessageApplyId)
+                            .le(CarOutInRecord::getRecordTime, endTime)
+                            .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
+                            .ge(dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
+                            .eq(CarOutInRecord::getStatus, 0)
+                            .orderByAsc(CarOutInRecord::getRecordTime)
+            );
+
             Set<Long> collect = outInRecords.stream().map(TeacherOutInRecord::getUserId).collect(Collectors.toSet());
             Set<Long> userIds = new HashSet<>(collect);
             //实到人数

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

@@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.OutInStatusEnum;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -20,6 +21,7 @@ import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.outint.dto.TeacherOutInRecordDto;
 import com.xjrsoft.module.outint.entity.CarOutInRecord;
 import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
 import com.xjrsoft.module.outint.service.ICarOutInRecordService;
@@ -171,14 +173,12 @@ public class TeacherStatisticsController {
                     record.setStatus(teacherLeave.getLeaveReason());
                     continue;
                 }
-                List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.list(
-                    new MPJLambdaWrapper<TeacherOutInRecord>()
-                            .le(TeacherOutInRecord::getRecordTime, startTime)
-                            .eq(TeacherOutInRecord::getStatus, 1)
-                            .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", startTime.toLocalDate())
-                            .eq(TeacherOutInRecord::getUserId, record.getUserId())
-                            .orderByAsc(TeacherOutInRecord::getRecordTime)
-                );
+                TeacherOutInRecordDto outInDto = new TeacherOutInRecordDto();
+                outInDto.setQueryDate(startTime.toLocalDate());
+                outInDto.setRecordTime(startTime);
+                outInDto.setStatus(OutInStatusEnum.enter.getCode());
+                outInDto.setUserId(record.getUserId());
+                List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.getListByParam(outInDto);
                 if(!outInRecords.isEmpty()){
                     TeacherOutInRecord outInRecord = outInRecords.get(0);
                     if(outInRecord != null){
@@ -196,7 +196,7 @@ public class TeacherStatisticsController {
                                     .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
                                     .eq(CarMessageApply::getUserId, record.getUserId())
                                     .ge(dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
-                                    .eq(CarOutInRecord::getStatus, 0)
+                                    .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
                                     .orderByAsc(CarOutInRecord::getRecordTime)
                     );
                     if(!list.isEmpty()){

+ 5 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceUserRelation.java

@@ -99,5 +99,10 @@ public class AttendanceUserRelation implements Serializable {
     @ApiModelProperty("最新考勤时间")
     private LocalDateTime attendanceTime;
 
+    @ApiModelProperty("考勤方式")
+    private String attendanceMode;
+
+    @ApiModelProperty("车牌号")
+    private String carNumber;
 
 }

+ 41 - 35
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceRuleCategoryServiceImpl.java

@@ -105,7 +105,7 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
                     .eq(BaseTeacher::getDeleteMark, DeleteMark.NODELETE.getCode())
                     .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
                     .in(!deptIds.isEmpty(), UserDeptRelation::getDeptId, deptIds)
-                    .in(!userIds.isEmpty(), XjrUser::getId, userIds).or()
+                    .in(!userIds.isEmpty(), XjrUser::getId, userIds)
                 );
                 //查询这部分人中是否已经有人有规则了
                 List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
@@ -297,25 +297,28 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
                 );
                 //查询这部分人中是否已经有人有规则了
                 List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
-                List<XjrUser> relations = xjrUserService.list(
-                    new MPJLambdaWrapper<XjrUser>()
-                    .select(XjrUser::getId)
-                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
-                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
-                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
-                    .in(AttendanceUserRelation::getUserId, relationUserIds)
-                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
-                );
-                String peopleName = "";
-                for (int i = 0; i < relations.size(); i ++){
-                    if(i > 0){
-                        peopleName += ",";
+                if(!relationUserIds.isEmpty()){
+                    List<XjrUser> relations = xjrUserService.list(
+                            new MPJLambdaWrapper<XjrUser>()
+                                    .select(XjrUser::getId)
+                                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
+                                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+                                    .in(AttendanceUserRelation::getUserId, relationUserIds)
+                                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
+                    );
+                    String peopleName = "";
+                    for (int i = 0; i < relations.size(); i ++){
+                        if(i > 0){
+                            peopleName += ",";
+                        }
+                        peopleName += relations.get(i).getName();
+                    }
+                    if(!relations.isEmpty()){
+                        throw new MyException("以下教职工:【" + peopleName + "】已绑定其他考勤规则,无法添加");
                     }
-                    peopleName += relations.get(i).getName();
-                }
-                if(!relations.isEmpty()){
-                    throw new MyException("以下教职工:【" + peopleName + "】已绑定其他考勤规则,无法添加");
                 }
+
                 insertList.addAll(userList);
             }
         }else if(attendanceRuleCategory.getRoleId() != null && attendanceRuleCategory.getRoleId() == 3){//学生
@@ -366,25 +369,28 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
                 );
                 //查询这部分人中是否已经有人有规则了
                 List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
-                List<XjrUser> relations = xjrUserService.list(
-                    new MPJLambdaWrapper<XjrUser>()
-                    .select(XjrUser::getId)
-                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
-                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
-                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
-                    .in(AttendanceUserRelation::getUserId, relationUserIds)
-                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
-                );
-                String peopleName = "";
-                for (int i = 0; i < relations.size(); i ++){
-                    if(i > 0){
-                        peopleName += ",";
+                if(!relationUserIds.isEmpty()){
+                    List<XjrUser> relations = xjrUserService.list(
+                            new MPJLambdaWrapper<XjrUser>()
+                                    .select(XjrUser::getId)
+                                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
+                                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+                                    .in(AttendanceUserRelation::getUserId, relationUserIds)
+                                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
+                    );
+                    String peopleName = "";
+                    for (int i = 0; i < relations.size(); i ++){
+                        if(i > 0){
+                            peopleName += ",";
+                        }
+                        peopleName += relations.get(i).getName();
+                    }
+                    if(!relations.isEmpty()){
+                        throw new MyException("以下学生:【" + peopleName + "】已绑定其他考勤规则,无法修改");
                     }
-                    peopleName += relations.get(i).getName();
-                }
-                if(!relations.isEmpty()){
-                    throw new MyException("以下学生:【" + peopleName + "】已绑定其他考勤规则,无法修改");
                 }
+
                 insertList.addAll(userList);
             }
         }

+ 9 - 5
src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java

@@ -5,6 +5,7 @@ import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import com.xjrsoft.common.enums.OutInStatusEnum;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.utils.SqlRunnerAdapterUtil;
 import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
@@ -37,7 +38,7 @@ public class OutInRecordUtil {
 
         String updSql = "UPDATE attendance_user_relation SET " +
                 "attendance_status = '" + attendanceStatus + "', attendance_time = '" + recordTime + "' " +
-                "WHERE user_id = '" + userId + "' AND delete_mark = 0";
+                "WHERE user_id = '" + userId + "', attendance_mode = '人脸' AND delete_mark = 0";
         SqlRunnerAdapter.db().update(updSql);
     }
 
@@ -51,7 +52,7 @@ public class OutInRecordUtil {
 
         String updSql = "UPDATE attendance_user_relation SET " +
                 "attendance_status = '" + attendanceStatus + "', attendance_time = '" + recordTime + "' " +
-                "WHERE user_id = '" + userId + "' AND delete_mark = 0";
+                "WHERE user_id = '" + userId + "', attendance_mode = '人脸' AND delete_mark = 0";
         SqlRunnerAdapter.db().update(updSql);
     }
 
@@ -103,7 +104,7 @@ public class OutInRecordUtil {
 
             String updSql = "UPDATE attendance_user_relation SET " +
                     "attendance_status = '" + attendanceStatus + "', attendance_time = '" + recordTime + "' " +
-                    "WHERE user_id = '" + userId + "' AND delete_mark = 0";
+                    "WHERE user_id = '" + userId + "', attendance_mode = '车辆', car_number = '" + planNo + "' AND delete_mark = 0";
             SqlRunnerAdapter.db().update(updSql);
         }
     }
@@ -248,7 +249,7 @@ public class OutInRecordUtil {
                                 .withMinute(ruleDetails.getPmEndTime().toLocalTime().getMinute())
                                 .withSecond(ruleDetails.getPmEndTime().toLocalTime().getSecond());
                     }
-                    if (status == 0) {//出
+                    if (status == OutInStatusEnum.goOut.getCode()) {//出
                         if (recordTime.isBefore(amEndTime) && recordTime.isAfter(amStartTime)) {
                             attendanceStatus = "早退";
                         } else if (recordTime.isBefore(pmEndTime) && recordTime.isAfter(pmStartTime)) {
@@ -310,7 +311,7 @@ public class OutInRecordUtil {
                             .withMinute(ruleDetails.getEveningEndTime().toLocalTime().getMinute())
                             .withSecond(ruleDetails.getEveningEndTime().toLocalTime().getSecond());
                 }
-                if(status == 0){//出
+                if(status == OutInStatusEnum.goOut.getCode()){//出
                     if(recordTime.isBefore(amEndTime) && recordTime.isAfter(amStartTime)){
                         attendanceStatus = "早退";
                     }else if(recordTime.isBefore(pmEndTime) && recordTime.isAfter(pmStartTime)){
@@ -631,6 +632,7 @@ public class OutInRecordUtil {
                                 releaseWayInt = rlsResultObject.get("releaseWay").getAsInt();
                                 releaseReasonInt = rlsResultObject.get("releaseReason").getAsInt();
                                 releaseResultInt = rlsResultObject.get("releaseResult").getAsInt();
+                                if (releaseResultInt == 13) releaseResultInt = 1;
                             }
                         }
 
@@ -700,6 +702,7 @@ public class OutInRecordUtil {
                                 releaseWayInt = rlsResultObject.get("releaseWay").getAsInt();
                                 releaseReasonInt = rlsResultObject.get("releaseReason").getAsInt();
                                 releaseResultInt = rlsResultObject.get("releaseResult").getAsInt();
+                                if (releaseResultInt == 13) releaseResultInt = 1;
                             }
                         }
 
@@ -744,6 +747,7 @@ public class OutInRecordUtil {
                                 releaseWayInt = rlsResultObject.get("releaseWay").getAsInt();
                                 releaseReasonInt = rlsResultObject.get("releaseReason").getAsInt();
                                 releaseResultInt = rlsResultObject.get("releaseResult").getAsInt();
+                                if (releaseResultInt == 13) releaseResultInt = 1;
                             }
                         }
 

+ 16 - 10
src/main/java/com/xjrsoft/module/job/AttendanceMessageTask.java

@@ -43,6 +43,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -149,21 +150,26 @@ public class AttendanceMessageTask {
         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) {
             if(!messageSet.getTimePeriod().contains(timePeriod + "")){
                 continue;
             }
-            //查询需要通知的人
-            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)
-                .eq(UserRoleRelation::getRoleId, messageSet.getRoleType())
-                .eq(AttendanceMessageUserRelation::getAttendanceMessageSetId, messageSet.getId())
-            );
+
             //没有需要通知的,直接跳过
             if(userList.isEmpty()){
                 continue;

+ 43 - 0
src/main/java/com/xjrsoft/module/outint/dto/TeacherOutInRecordDto.java

@@ -0,0 +1,43 @@
+package com.xjrsoft.module.outint.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+
+/**
+* @title: 教师出入记录分页查询入参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class TeacherOutInRecordDto implements Serializable {
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("海康记录时间")
+    private LocalDateTime recordTime;
+
+    /**
+     * 过车方向
+     */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private  Integer status;
+    /**
+     * 用户id
+     */
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("查询日期")
+    private LocalDate queryDate;
+
+}

+ 5 - 0
src/main/java/com/xjrsoft/module/outint/mapper/TeacherOutInRecordMapper.java

@@ -1,8 +1,12 @@
 package com.xjrsoft.module.outint.mapper;
 
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.outint.dto.TeacherOutInRecordDto;
 import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
 * @title: 教师出入记录
@@ -13,4 +17,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface TeacherOutInRecordMapper extends MPJBaseMapper<TeacherOutInRecord> {
 
+    List<TeacherOutInRecord> getListByParam(@Param("dto") TeacherOutInRecordDto dto);
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/outint/service/ITeacherOutInRecordService.java

@@ -1,7 +1,11 @@
 package com.xjrsoft.module.outint.service;
 
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.outint.dto.TeacherOutInRecordDto;
 import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
 * @title: 教师出入记录
@@ -11,4 +15,6 @@ import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
 */
 
 public interface ITeacherOutInRecordService extends MPJBaseService<TeacherOutInRecord> {
+
+    List<TeacherOutInRecord> getListByParam(TeacherOutInRecordDto dto);
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/outint/service/impl/TeacherOutInRecordServiceImpl.java

@@ -1,12 +1,15 @@
 package com.xjrsoft.module.outint.service.impl;
 
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.outint.dto.TeacherOutInRecordDto;
 import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
 import com.xjrsoft.module.outint.mapper.TeacherOutInRecordMapper;
 import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
 * @title: 教师出入记录
 * @Author dzx
@@ -16,4 +19,8 @@ import org.springframework.stereotype.Service;
 @Service
 @AllArgsConstructor
 public class TeacherOutInRecordServiceImpl extends MPJBaseServiceImpl<TeacherOutInRecordMapper, TeacherOutInRecord> implements ITeacherOutInRecordService {
+    @Override
+    public List<TeacherOutInRecord> getListByParam(TeacherOutInRecordDto dto) {
+        return this.baseMapper.getListByParam(dto);
+    }
 }

+ 20 - 27
src/main/java/com/xjrsoft/module/textbook/controller/WfTextbookSubscriptionController.java

@@ -17,42 +17,21 @@ import com.xjrsoft.module.base.entity.BaseSemester;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.student.entity.BaseClassMajorSet;
 import com.xjrsoft.module.teacher.entity.XjrUser;
-import com.xjrsoft.module.textbook.dto.AddWfTextbookSubscriptionDto;
-import com.xjrsoft.module.textbook.dto.BaseclassPageDto;
-import com.xjrsoft.module.textbook.dto.TextbookSubscriptionExportQueryListDto;
-import com.xjrsoft.module.textbook.dto.TextbookSubscriptionHistoryListDto;
-import com.xjrsoft.module.textbook.dto.UpdateWfTextbookSubscriptionDto;
-import com.xjrsoft.module.textbook.dto.WfTextbookSubscriptionPageDto;
+import com.xjrsoft.module.textbook.dto.*;
+import com.xjrsoft.module.textbook.entity.Textbook;
 import com.xjrsoft.module.textbook.entity.WfTextbookSubscription;
 import com.xjrsoft.module.textbook.entity.WfTextbookSubscriptionItem;
 import com.xjrsoft.module.textbook.service.IWfTextbookSubscriptionService;
-import com.xjrsoft.module.textbook.vo.BaseclassPageVo;
-import com.xjrsoft.module.textbook.vo.GradeClassListVo;
-import com.xjrsoft.module.textbook.vo.GradeClassTreeVo;
-import com.xjrsoft.module.textbook.vo.TextbookSubscriptionExportQueryListVo;
-import com.xjrsoft.module.textbook.vo.TextbookSubscriptionHistoryListVo;
-import com.xjrsoft.module.textbook.vo.WfTextbookSubscriptionPageVo;
-import com.xjrsoft.module.textbook.vo.WfTextbookSubscriptionVo;
+import com.xjrsoft.module.textbook.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
 * @title: 教材教辅征订
@@ -124,7 +103,6 @@ public class WfTextbookSubscriptionController {
     @ApiOperation(value="教材教辅征订列表(分页)")
     @SaCheckPermission("wftextbooksubscription:detail")
     public RT<PageOutput<WfTextbookSubscriptionPageVo>> page(@Valid WfTextbookSubscriptionPageDto dto){
-
         MPJLambdaWrapper<WfTextbookSubscription> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper
                 .select(WfTextbookSubscription::getId)
@@ -186,6 +164,21 @@ public class WfTextbookSubscriptionController {
         return RT.ok(list);
     }
 
+    @GetMapping(value = "/instockroom-list")
+    @ApiOperation(value="教材教辅征订入库列表")
+    @SaCheckPermission("wftextbooksubscription:detail")
+    public RT<List<TextbookInstockroomListVo>> instockroomList(@Valid TextbookInstockroomListDto dto){
+        List<TextbookInstockroomListVo> list =  wfTextbookSubscriptionService.instockroomList(dto);
+        return RT.ok(list);
+    }
+
+    @PostMapping(value = "/instockroom")
+    @ApiOperation(value="入库")
+    @SaCheckPermission("wftextbooksubscription:detail")
+    public RT<Boolean> instockroom(@Valid @RequestBody  List<TextbookInstockroomDto> dtos){
+        return RT.ok(wfTextbookSubscriptionService.instockroom(dtos));
+    }
+
     @GetMapping(value = "/info")
     @ApiOperation(value="根据id查询教材教辅征订信息")
     @SaCheckPermission("wftextbooksubscription:detail")

+ 30 - 0
src/main/java/com/xjrsoft/module/textbook/dto/TextbookInstockroomDto.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.textbook.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+* @title: 教材管理分页查询入参
+* @Author szs
+* @Date: 2023-12-25
+* @Version 1.0
+*/
+@Data
+public class TextbookInstockroomDto {
+    /**
+     * 教材教辅征订编号
+     */
+    @ApiModelProperty("教材教辅征订编号")
+    private Long wfTextbookSubscriptionId;
+    /**
+     * 教材教辅征订项编号
+     */
+    @ApiModelProperty("教材教辅征订项编号")
+    private Long id;
+    /**
+     * 本次入库数量
+     */
+    @ApiModelProperty("本次入库数量")
+    private Integer inNum;
+}

+ 20 - 0
src/main/java/com/xjrsoft/module/textbook/dto/TextbookInstockroomListDto.java

@@ -0,0 +1,20 @@
+package com.xjrsoft.module.textbook.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+* @title: 教材管理分页查询入参
+* @Author szs
+* @Date: 2023-12-25
+* @Version 1.0
+*/
+@Data
+public class TextbookInstockroomListDto {
+    /**
+     * 教材教辅征订编号
+     */
+    @ApiModelProperty("教材教辅征订编号")
+    private Long wfTextbookSubscriptionId;
+}

+ 5 - 0
src/main/java/com/xjrsoft/module/textbook/entity/WfTextbookSubscriptionItem.java

@@ -161,4 +161,9 @@ public class WfTextbookSubscriptionItem implements Serializable {
      */
     @ApiModelProperty("教材编号")
     private Long textbookId;
+    /**
+     * 已入库数量
+     */
+    @ApiModelProperty("已入库数量")
+    private Integer instockroomNum;
 }

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

@@ -1,9 +1,12 @@
 package com.xjrsoft.module.textbook.service;
 
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.textbook.dto.TextbookInstockroomDto;
+import com.xjrsoft.module.textbook.dto.TextbookInstockroomListDto;
 import com.xjrsoft.module.textbook.dto.TextbookSubscriptionExportQueryListDto;
 import com.xjrsoft.module.textbook.dto.UpdateWfTextbookSubscriptionDto;
 import com.xjrsoft.module.textbook.entity.WfTextbookSubscription;
+import com.xjrsoft.module.textbook.vo.TextbookInstockroomListVo;
 import com.xjrsoft.module.textbook.vo.TextbookSubscriptionExportQueryListVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookSubscriptionVo;
 
@@ -46,4 +49,8 @@ public interface IWfTextbookSubscriptionService extends MPJBaseService<WfTextboo
     WfTextbookSubscriptionVo getInfo(Long id);
 
     List<TextbookSubscriptionExportQueryListVo> textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto);
+
+    List<TextbookInstockroomListVo> instockroomList(TextbookInstockroomListDto dto);
+
+    Boolean instockroom(List<TextbookInstockroomDto> dtos);
 }

+ 100 - 49
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookSubscriptionServiceImpl.java

@@ -2,17 +2,17 @@ package com.xjrsoft.module.textbook.service.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
+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.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
-import com.xjrsoft.module.textbook.dto.AddTextbookWarehouseRecordDto;
-import com.xjrsoft.module.textbook.dto.TextbookSubscriptionExportQueryListDto;
-import com.xjrsoft.module.textbook.dto.UpdateWfTextbookSubscriptionDto;
+import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.Textbook;
 import com.xjrsoft.module.textbook.entity.TextbookSubscriptionRecord;
 import com.xjrsoft.module.textbook.entity.WfTextbookSubscription;
@@ -22,6 +22,7 @@ import com.xjrsoft.module.textbook.mapper.WfTextbookSubscriptionItemMapper;
 import com.xjrsoft.module.textbook.mapper.WfTextbookSubscriptionMapper;
 import com.xjrsoft.module.textbook.service.ITextbookService;
 import com.xjrsoft.module.textbook.service.IWfTextbookSubscriptionService;
+import com.xjrsoft.module.textbook.vo.TextbookInstockroomListVo;
 import com.xjrsoft.module.textbook.vo.TextbookSubscriptionExportQueryListVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookSubscriptionItemVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookSubscriptionVo;
@@ -29,20 +30,15 @@ import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
-* @title: 教材教辅征订
-* @Author szs
-* @Date: 2024-06-04
-* @Version 1.0
-*/
+ * @title: 教材教辅征订
+ * @Author szs
+ * @Date: 2024-06-04
+ * @Version 1.0
+ */
 @Service
 @AllArgsConstructor
 public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfTextbookSubscriptionMapper, WfTextbookSubscription> implements IWfTextbookSubscriptionService {
@@ -99,7 +95,7 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
                 }
             }
             //已经不存在的id 删除
-            if(wfTextbookSubscriptionItemRemoveIds.size() > 0){
+            if (wfTextbookSubscriptionItemRemoveIds.size() > 0) {
                 wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.deleteBatchIds(wfTextbookSubscriptionItemRemoveIds);
             }
         }
@@ -121,20 +117,15 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
     @Transactional(rollbackFor = Exception.class)
     public Boolean changeStatus(UpdateWfTextbookSubscriptionDto dto) {
         WfTextbookSubscription wfTextbookSubscription = this.getById(dto.getId());
-        if(wfTextbookSubscription == null){
+        if (wfTextbookSubscription == null) {
             return false;
         }
         //点击发起征订
-        if(wfTextbookSubscription.getStatus() == 1 && dto.getStatus() == 2){
+        if (wfTextbookSubscription.getStatus() == 1 && dto.getStatus() == 2) {
             WfTextbookSubscription newW = BeanUtil.toBean(dto, WfTextbookSubscription.class);
-            return this.updateById(newW);
-        }
-
-        //点击完成征订
-        if(wfTextbookSubscription.getStatus() == 2 && dto.getStatus() == 3){
             //添加征订记录
             List<WfTextbookSubscriptionItem> wfTextbookSubscriptionItemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectList(Wrappers.<WfTextbookSubscriptionItem>query().lambda().eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, wfTextbookSubscription.getId()));
-            for (WfTextbookSubscriptionItem w : wfTextbookSubscriptionItemList){
+            for (WfTextbookSubscriptionItem w : wfTextbookSubscriptionItemList) {
                 textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
                     setCreateDate(new Date());
                     setTextbookId(w.getTextbookId());
@@ -142,20 +133,12 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
                     setWfTextbookSubscriptionItemId(w.getId());//该字段存入征订项的id,征订项中有所属征订记录
                 }});
             }
-            WfTextbookSubscription newW = BeanUtil.toBean(dto, WfTextbookSubscription.class);
             return this.updateById(newW);
         }
 
-        //点击确认入库
-        if(wfTextbookSubscription.getStatus() == 3 && dto.getStatus() == 4){
-            List<WfTextbookSubscriptionItem> wfTextbookSubscriptionItemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectList(Wrappers.<WfTextbookSubscriptionItem>query().lambda().eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, wfTextbookSubscription.getId()));
-            for (WfTextbookSubscriptionItem w : wfTextbookSubscriptionItemList){
-                textbookService.deliverWarehouse(new AddTextbookWarehouseRecordDto(){{
-                    setTextbookId(w.getTextbookId());
-                    setWarehouseNumber((w.getStudentSubscriptionNumber() != null ? w.getStudentSubscriptionNumber() : 0) + (w.getTeacherSubscriptionNumber() != null ? w.getTeacherSubscriptionNumber() : 0));
-                    setSource("wm_manual");
-                }});
-            }
+
+        //点击完成征订
+        if (wfTextbookSubscription.getStatus() == 3 && dto.getStatus() == 4) {
             WfTextbookSubscription newW = BeanUtil.toBean(dto, WfTextbookSubscription.class);
             return this.updateById(newW);
         }
@@ -165,7 +148,7 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
     @Override
     public WfTextbookSubscriptionVo getInfo(Long id) {
         WfTextbookSubscription wfTextbookSubscription = this.getById(id);
-        if(wfTextbookSubscription == null){
+        if (wfTextbookSubscription == null) {
             return null;
         }
         WfTextbookSubscriptionVo wfTextbookSubscriptionVo = BeanUtil.toBean(wfTextbookSubscription, WfTextbookSubscriptionVo.class);
@@ -173,32 +156,32 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
         MPJLambdaWrapper<WfTextbookSubscriptionItem> mpjLambdaWrapper = new MPJLambdaWrapper<>();
         mpjLambdaWrapper
                 .selectAs(BaseCourseSubject::getName, WfTextbookSubscriptionItemVo::getCourseSubjectIdCn)
-                .select(WfTextbookSubscriptionItem.class,x -> VoToColumnUtil.fieldsToColumns(WfTextbookSubscriptionItemVo.class).contains(x.getProperty()))
+                .select(WfTextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(WfTextbookSubscriptionItemVo.class).contains(x.getProperty()))
                 .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(WfTextbookSubscriptionItemVo.class).contains(x.getProperty()))
                 .leftJoin(Textbook.class, Textbook::getId, WfTextbookSubscriptionItem::getTextbookId)
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
                         ext -> ext.selectAs(DictionaryDetail::getName, WfTextbookSubscriptionItemVo::getTextbookTypeCn))
                 .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId)
                 .eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, wfTextbookSubscription.getId())
-                ;
+        ;
         List<WfTextbookSubscriptionItemVo> itemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectJoinList(WfTextbookSubscriptionItemVo.class, mpjLambdaWrapper);
 
         //处理班级
         String classIds = "";
         List<String> classIdList = new ArrayList<>();
         StringBuilder sb = new StringBuilder();
-        if(!itemList.isEmpty() && itemList.get(0).getClassIds() != null && !itemList.get(0).getClassIds().equals("")){
+        if (!itemList.isEmpty() && itemList.get(0).getClassIds() != null && !itemList.get(0).getClassIds().equals("")) {
             classIds = itemList.get(0).getClassIds();
             String[] classIdArr = classIds.split(",");
             classIdList = Arrays.asList(classIdArr);
-            if(!classIdList.isEmpty()){
+            if (!classIdList.isEmpty()) {
                 List<BaseClass> baseClassList = baseClassMapper.selectList(Wrappers.<BaseClass>query().lambda().in(BaseClass::getId, classIdList));
                 Map<Long, BaseClass> baseClassMap = baseClassList.stream()
                         .collect(Collectors.toMap(BaseClass::getId, baseClass -> baseClass));
 
-                for (String classId : classIdList){
+                for (String classId : classIdList) {
                     BaseClass baseClass = baseClassMap.get(Long.parseLong(classId));
-                    if(baseClass != null){
+                    if (baseClass != null) {
                         sb.append(baseClass.getName());
                         sb.append(",");
                     }
@@ -210,14 +193,14 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
         //遍历处理所有项
         int stuSum = 0;
         int teaSum = 0;
-        for (WfTextbookSubscriptionItemVo w : itemList){
-            if(!classIdList.isEmpty()){
+        for (WfTextbookSubscriptionItemVo w : itemList) {
+            if (!classIdList.isEmpty()) {
                 w.setClassNum(classIdList.size());
             }
-            if(w.getStudentSubscriptionNumber() != null){
+            if (w.getStudentSubscriptionNumber() != null) {
                 stuSum += w.getStudentSubscriptionNumber();
             }
-            if(w.getTeacherSubscriptionNumber() != null){
+            if (w.getTeacherSubscriptionNumber() != null) {
                 teaSum += w.getTeacherSubscriptionNumber();
             }
         }
@@ -235,14 +218,14 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
     @Override
     public List<TextbookSubscriptionExportQueryListVo> textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto) {
         WfTextbookSubscription wfTextbookSubscription = this.getById(dto.getWfTextbookSubscriptionId());
-        if(wfTextbookSubscription == null){
+        if (wfTextbookSubscription == null) {
             return null;
         }
 
         MPJLambdaWrapper<WfTextbookSubscriptionItem> mpjLambdaWrapper = new MPJLambdaWrapper<>();
         mpjLambdaWrapper
                 .selectAs(BaseCourseSubject::getName, TextbookSubscriptionExportQueryListVo::getCourseName)
-                .select(WfTextbookSubscriptionItem.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
+                .select(WfTextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
                 .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
                 .leftJoin(Textbook.class, Textbook::getId, WfTextbookSubscriptionItem::getTextbookId)
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
@@ -256,7 +239,7 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
         String classIds = "";
         List<String> classIdList = new ArrayList<>();
         StringBuilder sb = new StringBuilder();
-        if(!itemList.isEmpty() && itemList.get(0).getClassIds() != null && !itemList.get(0).getClassIds().equals("")){
+        if (!itemList.isEmpty() && itemList.get(0).getClassIds() != null && !itemList.get(0).getClassIds().equals("")) {
             classIds = itemList.get(0).getClassIds();
             String[] classIdArr = classIds.split(",");
             classIdList = Arrays.asList(classIdArr);
@@ -276,10 +259,78 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
             }*/
         }
 
-        for (TextbookSubscriptionExportQueryListVo w : itemList){
+        for (TextbookSubscriptionExportQueryListVo w : itemList) {
             w.setClassNum(classIdList.size());
         }
 
         return itemList;
     }
+
+    @Override
+    public List<TextbookInstockroomListVo> instockroomList(TextbookInstockroomListDto dto) {
+        MPJLambdaWrapper<WfTextbookSubscriptionItem> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .select(WfTextbookSubscriptionItem::getId)
+                .selectAs(BaseCourseSubject::getName, TextbookInstockroomListVo::getCourseSubjectIdCn)
+                .selectAs(DictionaryDetail::getName, TextbookInstockroomListVo::getTextbookTypeCn)
+                .select("(t.student_subscription_number + t.teacher_subscription_number) as subscriptionNumber")
+                .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty()))
+                .select(WfTextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty()))
+                .leftJoin(Textbook.class, Textbook::getId, WfTextbookSubscriptionItem::getTextbookId)
+                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId)
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType)
+                .eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, dto.getWfTextbookSubscriptionId())
+                .orderByAsc(WfTextbookSubscriptionItem::getInstockroomNum)
+        ;
+        List<TextbookInstockroomListVo> list = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectJoinList(TextbookInstockroomListVo.class, queryWrapper);
+
+        return list;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean instockroom(List<TextbookInstockroomDto> dtos) {
+        if (dtos.isEmpty()) {
+            return false;
+        }
+
+        //获取需要修改的list
+        LambdaQueryWrapper<WfTextbookSubscriptionItem> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, dtos.get(0).getWfTextbookSubscriptionId())
+                .eq(WfTextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
+        ;
+        List<WfTextbookSubscriptionItem> wfTextbookSubscriptionItemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectList(queryWrapper);
+
+        if (wfTextbookSubscriptionItemList.isEmpty()) {
+            return false;
+        }
+
+        Map<Long, WfTextbookSubscriptionItem> itemMap = wfTextbookSubscriptionItemList
+                .stream()
+                .collect(Collectors.toMap(
+                        WfTextbookSubscriptionItem::getId,
+                        item -> item
+                ));
+
+        Date now = new Date();
+        Long loginId = StpUtil.getLoginIdAsLong();
+        for (TextbookInstockroomDto dto : dtos) {
+            WfTextbookSubscriptionItem old = itemMap.get(dto.getId());
+            WfTextbookSubscriptionItem updateItem = new WfTextbookSubscriptionItem();
+            updateItem.setId(old.getId());
+            updateItem.setInstockroomNum(old.getInstockroomNum() + dto.getInNum());
+            updateItem.setModifyDate(now);
+            updateItem.setModifyUserId(loginId);
+            wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.updateById(updateItem);
+
+            //新增入库记录
+            textbookService.deliverWarehouse(new AddTextbookWarehouseRecordDto() {{
+                setTextbookId(old.getTextbookId());
+                setWarehouseNumber(dto.getInNum());
+                setSource("wm_manual");
+            }});
+        }
+        return true;
+    }
 }

+ 92 - 0
src/main/java/com/xjrsoft/module/textbook/vo/TextbookInstockroomListVo.java

@@ -0,0 +1,92 @@
+package com.xjrsoft.module.textbook.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 教材管理表单出参
+* @Author szs
+* @Date: 2023-12-25
+* @Version 1.0
+*/
+@Data
+public class TextbookInstockroomListVo {
+
+    /**
+     * 教材教辅征订编号
+     */
+    @ApiModelProperty("教材教辅征订编号")
+    private Long wfTextbookSubscriptionId;
+    /**
+    * 征订项编号
+    */
+    @ApiModelProperty("征订项编号")
+    private String id;
+    /**
+     * 教材编号
+     */
+    @ApiModelProperty("教材编号")
+    private String textbookId;
+    /**
+     * 课程编号(base_course_subject)
+     */
+    @ApiModelProperty("课程编号(base_course_subject)")
+    private Long courseSubjectId;
+    /**
+     * 课程编号(base_course_subject)
+     */
+    @ApiModelProperty("课程编号(base_course_subject)")
+    private String courseSubjectIdCn;
+    /**
+     * 书名
+     */
+    @ApiModelProperty("书名")
+    private String bookName;
+    /**
+     * 国际标准刊号
+     */
+    @ApiModelProperty("国际标准刊号")
+    private String issn;
+    /**
+    * 出版社
+    */
+    @ApiModelProperty("出版社")
+    private String publishingHouse;
+    /**
+     * 主编
+     */
+    @ApiModelProperty("主编")
+    private String editorInChief;
+    /**
+    * 教材类型(xjr_dictionary_item[textbook_type])
+    */
+    @ApiModelProperty("教材类型(xjr_dictionary_item[textbook_type])")
+    private String textbookType;
+    /**
+     * 教材类型(xjr_dictionary_item[textbook_type])
+     */
+    @ApiModelProperty("教材类型(xjr_dictionary_item[textbook_type])")
+    private String textbookTypeCn;
+    /**
+     * 学生用书征订数量
+     */
+    @ApiModelProperty("学生用书征订数量")
+    private Integer studentSubscriptionNumber;
+    /**
+     * 教师教材征订数量
+     */
+    @ApiModelProperty("教师教材征订数量")
+    private Integer teacherSubscriptionNumber;
+    /**
+     * 教材征订总数量
+     */
+    @ApiModelProperty("教材征订总数量")
+    private Integer subscriptionNumber;
+    /**
+     * 已入库数量
+     */
+    @ApiModelProperty("已入库数量")
+    private Integer instockroomNum;
+}

+ 15 - 0
src/main/resources/mapper/outin/TeacherOutInRecordMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xjrsoft.module.outint.mapper.TeacherOutInRecordMapper">
+    <select id="getListByParam" parameterType="com.xjrsoft.module.outint.dto.TeacherOutInRecordDto" resultType="com.xjrsoft.module.outint.entity.TeacherOutInRecord">
+        SELECT * FROM teacher_out_in_record
+        WHERE delete_mark = 0
+        AND #{dto.recordTime} >= record_time
+        AND status = #{dto.status}
+        AND DATE_FORMAT(record_time, '%Y-%m-%d') = #{dto.queryDate}
+        AND user_id = #{dto.userId}
+        ORDER BY record_time ASC
+    </select>
+</mapper>

+ 1 - 0
src/test/java/com/xjrsoft/module/hikvision/util/FaceImportUtilTest.java

@@ -41,6 +41,7 @@ class FaceImportUtilTest {
         List<TeacherFaceProcess> list = teacherFaceProcessService.list(
             new QueryWrapper<TeacherFaceProcess>().lambda()
             .notLike(TeacherFaceProcess::getHikvisionResult, "{\"code\":\"0\",\"msg\":\"success\",")
+                    .orderByAsc(TeacherFaceProcess::getModifyDate)
         );
 
 

+ 139 - 20
src/test/java/com/xjrsoft/module/job/HikvisionBaseDataTaskTest.java

@@ -76,11 +76,6 @@ class HikvisionBaseDataTaskTest {
     }
 
 
-
-
-
-
-
     @Test
     void test() throws Exception {
         String sql = "SELECT distinct table_name FROM hikvision_data WHERE 1 = 1";
@@ -106,14 +101,14 @@ class HikvisionBaseDataTaskTest {
         }
 //        DataUtil dataUtil = new DataUtil();
         String tableName = "xjr_department";
-//        Map<String, String> department = dataUtil.insertDepartment(use, tableName, dataMap.get(tableName));
-//        if(department.isEmpty() && dataMap.get(tableName) != null){
-//            department = dataMap.get(tableName);
-//        }
+        Map<String, String> department = dataMap.get(tableName);//dataUtil.insertDepartment(use, tableName, dataMap.get(tableName));
+        if(department.isEmpty() && dataMap.get(tableName) != null){
+            department = dataMap.get(tableName);
+        }
 //
 //        //推送教职工
-//        tableName = "base_teacher";
-//        dataUtil.insertTeacher(use, tableName, dataMap.get(tableName), department);
+        tableName = "base_teacher";
+        insertTeacher(tableName, dataMap.get(tableName), department);
 //
         //推送车辆
 
@@ -129,7 +124,7 @@ class HikvisionBaseDataTaskTest {
 
         tableName = "base_student";
         Map<String, String> baseStudent = dataMap.get(tableName);
-        Map<String, String> student = insertStudentOne(tableName, baseStudent);
+       // Map<String, String> student = insertStudentOne(tableName, baseStudent);
 
 //        selectOrg(use, "base_class");
 
@@ -137,7 +132,7 @@ class HikvisionBaseDataTaskTest {
 //        String carTableName = "car_message_apply";
 //        selectCar(use, carTableName);
 
-        outInRecordUtil.GetVehicleRecord(faceImportMapper);
+//        outInRecordUtil.GetVehicleRecord(faceImportMapper);
 //        outInRecordUtil.GetTeacherAndStudentRecords(faceImportMapper);
 ////        selecAllPersonById(use);
 //        selectResource(use);
@@ -177,8 +172,8 @@ class HikvisionBaseDataTaskTest {
                 " INNER JOIN base_class t3 ON t2.class_id = t3.id" +
                 " INNER JOIN base_grade t4 ON t3.grade_id = t4.id" +
                 " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0" +
-                " AND t3.class_type IS NOT NULL";
-                //" AND t1.name IN ('宋成男','白江龙','李松阳')";
+                " AND t3.class_type IS NOT NULL" +
+                " AND t1.name IN ('陆晓峰','李星兴')";
         List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql, String[].class);
         Map<Integer, String> clientMap = new HashMap<>();
 
@@ -188,7 +183,7 @@ class HikvisionBaseDataTaskTest {
         Map<String, String> header = new HashMap<>();
         header.put("tagId", "insert_student");
 
-        for(int i = 1; i < list.size(); i ++){
+        for(int i = 0; i < list.size(); i ++){
             Map<String, Object> objectMap = list.get(i);
             String apiPath = "/api/resource/v2/person/single/add";
 
@@ -286,16 +281,30 @@ class HikvisionBaseDataTaskTest {
 
 
 
-    void selecAllPersonById(Db db) throws SQLException {
+    @Test
+    void selecAllPersonById() throws SQLException {
         String apiPath = "/api/resource/v2/person/advance/personList";
+
+        String sql = "SELECT * FROM xjr_user WHERE id IN (" +
+                " SELECT source_id FROM hikvision_data WHERE table_name IN( 'base_teacher','base_student')" +
+                " AND hikvision_id LIKE '%-%'" +
+                " )";
+        List<Map<String, Object>> maps = SqlRunnerAdapter.db().selectList(sql);
+        ApiUtil apiUtil = new ApiUtil();
         JsonObject jsonObject = new JsonObject();
         jsonObject.addProperty("pageNo", 1);
         jsonObject.addProperty("pageSize", 500);
-        jsonObject.addProperty("personIds", "654321987655613");
+        jsonObject.addProperty("personName", "胡玉");
+        String result = apiUtil.doPost(apiPath, jsonObject.toString(), null, null);
+        System.out.println(result);
 
 
-        ApiUtil apiUtil = new ApiUtil();
-        String result = apiUtil.doPost(apiPath, jsonObject.toString(), null, null);
+        for (Map<String, Object> map : maps) {
+            String name = map.get("name").toString();
+
+
+        }
+
     }
 
     void selecAllPerson(Db db) throws SQLException {
@@ -371,4 +380,114 @@ class HikvisionBaseDataTaskTest {
         System.out.println(result);
     }
 
+
+    public Map<String, String> insertTeacher(String tableName, Map<String, String> tableData, Map<String, String> deptMap){
+        String sql = "SELECT distinct t1.id,t1.name,t1.gender,t3.dept_id,t1.birth_date,t1.mobile,t1.email,t1.credential_type,t1.credential_number,t1.user_name FROM xjr_user t1" +
+                " INNER JOIN " + tableName + " t2 ON t1.id = t2.user_id" +
+                " INNER JOIN xjr_user_dept_relation t3 ON t1.id = t3.user_id" +
+                " INNER JOIN xjr_department t4 ON t3.dept_id = t4.id " +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t4.delete_mark = 0" +
+                " AND t1.name = '黄文宇'";
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql, String[].class);
+        JsonArray paramArray = new JsonArray();
+        Map<Integer, String> clientMap = new HashMap<>();
+        for(int i = 0; i < list.size(); i ++){
+            Map<String, Object> objectMap = list.get(i);
+            if(tableData != null && tableData.containsKey(objectMap.get("id").toString())){
+                //continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("clientId", i);
+            paramJson.addProperty("personId", objectMap.get("id").toString() + i);
+            paramJson.addProperty("personName", objectMap.get("name").toString());
+            paramJson.addProperty("orgIndexCode", objectMap.get("dept_id").toString());
+            paramJson.addProperty("phoneNo", objectMap.get("mobile")==null?"":objectMap.get("mobile").toString());
+            paramJson.addProperty("jobNo", objectMap.get("user_name").toString());
+            paramJson.addProperty("birthday", objectMap.get("birth_date")==null?"":objectMap.get("birth_date").toString());
+            paramJson.addProperty("personType", 1);
+
+            int gender;
+            switch (objectMap.get("gender").toString()) {
+                case "SB10001":
+                    gender = 1;
+                    break;
+                case "SB10002":
+                    gender = 2;
+                    break;
+                default:
+                    gender = 0;
+                    break;
+            }
+            paramJson.addProperty("gender", gender);
+            paramArray.add(paramJson);
+
+            clientMap.put(i, objectMap.get("id").toString());
+        }
+
+        String apiPath = "/api/resource/v1/person/batch/add";
+        Map<String, String> idMap = new HashMap<>();
+        JsonParser jsonParser = new JsonParser();
+        ApiUtil apiUtil = new ApiUtil();
+        Map<String, String> header = new HashMap<>();
+        header.put("tagId", "insert_teacher");
+
+        String result = apiUtil.doPost(apiPath, paramArray.toString(), null, header);
+        JsonElement parse = jsonParser.parse(result);
+        JsonObject resultJson = parse.getAsJsonObject();
+        if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
+            JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
+            for (JsonElement jsonElement : array) {
+                JsonObject jsonObject = jsonElement.getAsJsonObject();
+                idMap.put(clientMap.get(jsonObject.get("clientId").getAsInt()), jsonObject.get("personId").getAsString());
+            }
+        }else{
+
+        }
+        //插入记录表
+
+        insertRecord(tableName, idMap);
+        return idMap;
+    }
+
+    void insertRecord(String tableName, Map<?, String> idsMap){
+        if (idsMap.isEmpty()) {
+            return;
+        }
+        for (var entry : idsMap.entrySet()) {
+            var sourceId = entry.getKey();
+            String sql = "INSERT INTO hikvision_data(create_date, table_name, source_id, hikvision_id) " +
+                    "VALUES(now(), '" + tableName + "', '" + sourceId + "', '" + entry.getValue() + "')";
+            SqlRunnerAdapter.db().insert(sql);
+        }
+    }
+
+
+    @Test
+    void deletePerson() throws SQLException {
+        String sql = "SELECT * FROM xjr_user WHERE id IN (\n" +
+                "SELECT source_id FROM hikvision_data WHERE table_name IN( 'base_teacher','base_student')\n" +
+                "AND hikvision_id LIKE '%-%'\n" +
+                "AND hikvision_id NOT IN('14954805813957-14','14954812448325-19','14954812339909-17','14954812392774-18')\n" +
+                ") AND id NOT IN ('14954807016389', '14954806910277')\n";
+        List<Map<String, Object>> maps = SqlRunnerAdapter.db().selectList(sql);
+
+
+        String apiPath = "/api/resource/v1/person/batch/delete";
+        JsonObject paramJson = new JsonObject();
+        JsonArray personIds = new JsonArray();
+        for (Map<String, Object> map : maps) {
+
+            personIds.add(map.get("id").toString());
+        }
+        paramJson.add("personIds", personIds);
+
+        ApiUtil apiUtil = new ApiUtil();
+
+        Map<String, String> header = new HashMap<>();
+        header.put("tagId", "delete_teacher");
+        String result = apiUtil.doPost(apiPath, paramJson.toString(), null, header);
+
+        System.out.println(result);
+    }
+
 }

+ 1 - 0
src/test/java/com/xjrsoft/xjrsoftboot/log.log

@@ -0,0 +1 @@
+鑫怡","orgIndexCode":"567891198765191-2022-early_class-FB3001","orgName":"铜梁职教中心/走读学生/3+2班/2022级/22艺术设计1","doorName":"出门方向从右到左第4台进(进门方向)","doorIndexCode":"66a018915db34f359886642d71e7cb86","doorRegionIndexCode":"root000000","picUri":"/pic?fd00=e802l5f-do771a*63eb3017-460f647ba*022s=**812==*p317=8t1371273070=0l6*2419=4o2*062-144oe9-pi0cd4=00180","svrIndexCode":"30a36469-6434-4c95-9474-f935146cafd5","eventType":196893,"inAndOutType":1,"readerDevIndexCode":"e909e0b292984a10ba1358530359d100","readerDevName":"出门方向从右到左第4台进(进门方向)","devIndexCode":"65afb7ca6b4a4b189bb40f686551585c","devName":"出门方向从右到左第4台进(进门方向)","identityCardUri":null,"receiveTime":"2024-06-18T12:29:13.842+08:00","jobNo":"500225200612136228","studentId":null,"certNo":null,"temp":null},{"eventId":"5531c065102d41a4c0988de4597ffbd4","eventName":"acs.acs.eventType.successFace","eventTime":"2024-06-18T12:28:49+08:00","personId":"654321987655145","cardNo":null,"personName":"田慧淋","orgIndexCode":"567891198765135-2023-early_class-FB3001","orgName":"铜梁职教中心/走读学生/3+2班/2023级/23物联网","doorName":"出门方向从右到左第3台进(进门方向)","doorIndexCode":"4368606854fa4fc98740ea9605e68bd5","doorRegionIndexCode":"root000000","picUri":"/pic?fd00=e802l5f-do371a*52eb3617-460f647ba*022s=**812==*p017=8t1371972070=0l2*2514=3o2*952-180oe9-pi0cd4=00180","svrIndexCode":"30a36469-6434-4c95-9474-f935146cafd5","eventType":196893,"inAndOutType":1,"readerDevIndexCode":"8371a888128d420c9d2c2b4622b7c754","readerDevName":"出门方向从右到左第3台进(进门方向)","devIndexCode":"f2cae097aed349acb3e966622b73eaf6","devName":"出门方向从右到左第3台进(进门方向)","identityCardUri":null,"receiveTime":"2024-06-18T12:29:05.767+08:00","jobNo":"500224200801036940","studentId":null,"certNo":null,"temp":null}],"total":17060,"totalPage":171,"pageNo":9}}