فهرست منبع

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

# Conflicts:
#	src/test/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImplTest.java
大数据与最优化研究所 1 سال پیش
والد
کامیت
58bc56502b

+ 19 - 9
src/main/java/com/xjrsoft/module/base/controller/BaseClassCourseController.java

@@ -88,16 +88,16 @@ public class BaseClassCourseController {
     @GetMapping("/getAllCoursesAndTextbooks")
     @ApiOperation(value="获取所有课程教材")
     @SaCheckPermission("baseclasscourse:detail")
-    public RT<List<CourseBookInfo>> getAllCoursesAndTextbooks(@RequestParam(required = false) Long subjectGroupId) {
-        List<CourseBookInfo> data = baseClassCourseService.getAllCourseBook(subjectGroupId);
+    public RT<List<CourseBookInfo>> getAllCoursesAndTextbooks(@RequestParam(required = false) Long[] classIds, @RequestParam(required = false) Long subjectGroupId, @RequestParam Long semester) {
+        List<CourseBookInfo> data = baseClassCourseService.getAllCourseBook(classIds, subjectGroupId, semester);
         return RT.ok(data);
     }
 
     @GetMapping("/getAllSelectedCoursesAndTextbooks")
     @ApiOperation(value="获取所有以选择课程教材")
     @SaCheckPermission("baseclasscourse:detail")
-    public RT<List<CourseBookInfo>> getAllSelectedCoursesAndTextbooks(@RequestParam(required = false) Long[] classIds) {
-        List<CourseBookInfo> data = baseClassCourseService.getSelectedCourseBook(classIds);
+    public RT<List<CourseBookInfo>> getAllSelectedCoursesAndTextbooks(@RequestParam(required = false) Long[] classIds, @RequestParam(required = false) Long semester) {
+        List<CourseBookInfo> data = baseClassCourseService.getSelectedCourseBook(classIds, semester);
         return RT.ok(data);
     }
 
@@ -105,7 +105,11 @@ public class BaseClassCourseController {
     @ApiOperation(value="更新增加课程教材")
     @SaCheckPermission("baseclasscourse:detail")
     public RT updateAddCoursesAndTextbooks(@Valid ClassCourseTextbook list) {
-        baseClassCourseService.updateAddCourseBook(list.getClassId(), list.getCourseId(), list.getTextbookId());
+        for (Long classId : list.getClassId()){
+            for (Long i = 0L ;i < list.getCourseId().length; i++){
+                baseClassCourseService.updateAddCourseBook(classId, list.getCourseId()[Math.toIntExact(i)], list.getTextbookId()[Math.toIntExact(i)]);
+            }
+        }
         return RT.ok();
     }
 
@@ -113,16 +117,22 @@ public class BaseClassCourseController {
     @ApiOperation(value="更新减少课程教材")
     @SaCheckPermission("baseclasscourse:detail")
     public RT updateRemoveCoursesAndTextbooks(@Valid ClassCourseTextbook list) {
-        baseClassCourseService.updateRemoveCourseBook(list.getClassId(), list.getCourseId(), list.getTextbookId());
+        for (Long classId : list.getClassId()){
+            for (Long i = 0L ;i < list.getCourseId().length; i++){
+                baseClassCourseService.updateRemoveCourseBook(classId, list.getCourseId()[Math.toIntExact(i)], list.getTextbookId()[Math.toIntExact(i)]);
+            }
+        }
         return RT.ok();
     }
 
     @GetMapping("/insertClassCourseTextbookCombinations")
     @ApiOperation(value="复用课程教材")
     @SaCheckPermission("baseclasscourse:detail")
-    public RT insertClassCourseTextbookCombinations(@RequestParam  Long newClassId, @RequestParam Long sourceClassId) {
-        baseClassCourseService.markExistingRecordsAsDeleted(newClassId, sourceClassId);
-        baseClassCourseService.duplicateCourseBook(newClassId, sourceClassId);
+    public RT insertClassCourseTextbookCombinations(@RequestParam Long newClassId, @RequestParam Long[] sourceClassIds, @RequestParam Long semester) {
+//        baseClassCourseService.markExistingRecordsAsDeleted(newClassId, sourceClassId);
+        for (Long sourceId : sourceClassIds){
+            baseClassCourseService.duplicateCourseBook(newClassId, sourceId, semester);
+        }
         return RT.ok();
     }
 

+ 3 - 3
src/main/java/com/xjrsoft/module/base/entity/ClassCourseTextbook.java

@@ -7,11 +7,11 @@ import lombok.Data;
 @Data
 public class ClassCourseTextbook {
     @ApiModelProperty("班级id")
-    private Long classId;
+    private Long[] classId;
 
     @ApiModelProperty("课程id")
-    private Long courseId;
+    private Long[] courseId;
 
     @ApiModelProperty("教材id")
-    private Long textbookId;
+    private Long[] textbookId;
 }

+ 30 - 0
src/main/java/com/xjrsoft/module/base/entity/CourseTextbookPair.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.base.entity;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class CourseTextbookPair {
+
+
+        private Long courseId;
+        private Long textbookId;
+
+        public CourseTextbookPair( Long courseId, Long textbookId) {
+
+            this.courseId = courseId;
+            this.textbookId = textbookId;
+        }
+
+
+
+        public Long getCourseId() {
+            return courseId;
+        }
+
+        public Long getTextbookId() {
+            return textbookId;
+        }
+
+}

+ 3 - 4
src/main/java/com/xjrsoft/module/base/mapper/BaseClassCourseMapper.java

@@ -25,15 +25,14 @@ public interface BaseClassCourseMapper extends MPJBaseMapper<BaseClassCourse> {
     @Select("SELECT id, name FROM base_semester")
     List<Map<String, Object>> getAllSemesterNames();
 
-    List<CourseBookInfo> getAllCourseBook(Long subjectGroupId);
-    List<CourseBookInfo> getSelectedCourseBook(Long[] classIds);
-
+    List<CourseBookInfo> getAllCourseBook(Long[] classIds, Long subjectGroupId, Long semester);
+    List<CourseBookInfo> getSelectedCourseBook(Long[] classIds, Long semester);
 
     void updateAddClassCourseTextbooks(Long classId,Long courseId,Long textbookId);
     void updateRemoveClassCourseTextbooks(Long classId,Long courseId,Long textbookId);
 
     void markExistingRecordsAsDeleted(Long newClassId, Long sourceClassId);
-    void insertClassCourseTextbookCombinations(Long newClassId, Long sourceClassId);
+    void insertClassCourseTextbookCombinations(Long newClassId, Long sourceClassId, Long semester);
 
     Long getClassIdByName(String name);
     Long getCourseIdByName(String name);

+ 3 - 3
src/main/java/com/xjrsoft/module/base/service/IBaseClassCourseService.java

@@ -23,9 +23,9 @@ public interface IBaseClassCourseService extends MPJBaseService<BaseClassCourse>
     Page<BaseClassCoursePageVo> getPage(Page<BaseClassCoursePageVo> objectPage, BaseClassCoursePageDto dto);
 
 
-    List<CourseBookInfo> getAllCourseBook(Long subjectGroupId);
+    List<CourseBookInfo> getAllCourseBook(Long[] classIds, Long subjectGroupId, Long semester);
 
-    List<CourseBookInfo> getSelectedCourseBook(Long[] subjectGroupId);
+    List<CourseBookInfo> getSelectedCourseBook(Long[] subjectGroupId, Long semester);
 
 
     void updateAddCourseBook(Long classId,Long courseId,Long textbookId);
@@ -33,7 +33,7 @@ public interface IBaseClassCourseService extends MPJBaseService<BaseClassCourse>
 
     void markExistingRecordsAsDeleted(Long newClassId, Long sourceClassId);
 
-    void duplicateCourseBook(Long newClassId, Long sourceClassId);
+    void duplicateCourseBook(Long newClassId, Long sourceClassId, Long semester);
 
     Map<String, Map<String, Object>> getSemesterTree();
 

+ 6 - 6
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassCourseServiceImpl.java

@@ -30,13 +30,13 @@ public class BaseClassCourseServiceImpl extends MPJBaseServiceImpl<BaseClassCour
     }
 
     @Override
-    public List<CourseBookInfo> getAllCourseBook(Long subjectGroupId){
-        return baseClassCourseMapper.getAllCourseBook(subjectGroupId);
+    public List<CourseBookInfo> getAllCourseBook(Long[] classIds, Long subjectGroupId, Long semester){
+        return baseClassCourseMapper.getAllCourseBook(classIds, subjectGroupId, semester);
     }
 
     @Override
-    public List<CourseBookInfo> getSelectedCourseBook(Long[] subjectGroupId){
-        return baseClassCourseMapper.getSelectedCourseBook(subjectGroupId);
+    public List<CourseBookInfo> getSelectedCourseBook(Long[] subjectGroupId, Long semester){
+        return baseClassCourseMapper.getSelectedCourseBook(subjectGroupId, semester);
     }
 
     @Override
@@ -55,8 +55,8 @@ public class BaseClassCourseServiceImpl extends MPJBaseServiceImpl<BaseClassCour
     }
 
     @Override
-    public void duplicateCourseBook(Long newClassId, Long sourceClassId){
-        baseClassCourseMapper.insertClassCourseTextbookCombinations(newClassId, sourceClassId);
+    public void duplicateCourseBook(Long newClassId, Long sourceClassId, Long semester){
+        baseClassCourseMapper.insertClassCourseTextbookCombinations(newClassId, sourceClassId, semester);
     }
 
     @Override

+ 1 - 1
src/main/java/com/xjrsoft/module/base/vo/BaseClassCoursePageVo.java

@@ -111,6 +111,6 @@ public class BaseClassCoursePageVo {
     @ExcelProperty("对应教材")
     private String textbookName;
 
-    @ExcelProperty("年级")
+    @ExcelProperty("学期")
     private String semester;
 }

+ 69 - 12
src/main/java/com/xjrsoft/module/hikvision/util/FaceImportUtil.java

@@ -1,6 +1,8 @@
 package com.xjrsoft.module.hikvision.util;
 
+import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import com.xjrsoft.module.personnel.entity.TeacherFaceProcess;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 
@@ -18,29 +20,84 @@ public class FaceImportUtil {
     private static ApiUtil apiUtil = new ApiUtil();
 
     public static String ImportTeacherFace(String personId, String fileUrl) {
+        JsonParser parser = new JsonParser();
+
+        String apiUrl = "/api/resource/v1/person/condition/personInfo";
+        JsonObject paramsJson = new JsonObject();
+        paramsJson.addProperty("paramName", "personId");
+        JsonArray array = new JsonArray();
+        array.add(personId);
+        paramsJson.add("paramValue", array);
+        String personInfoRes = apiUtil.doPost(apiUrl, paramsJson.toString(), null);
+        JsonObject personInfoData = parser.parse(personInfoRes).getAsJsonObject();
+        String faceId = null;
+        if("0".equals(personInfoData.get("code").getAsString()) && "success".equals(personInfoData.get("msg").getAsString())){
+            JsonObject dataJson = personInfoData.get("data").getAsJsonObject();
+            if(dataJson.get("total").getAsInt() > 0){
+                faceId = dataJson.get("list").getAsJsonArray().get(0)
+                        .getAsJsonObject().get("personPhoto").getAsJsonObject().get("personPhotoIndexCode").getAsString();
+            }
+        }
+        String response = null;
+        String base64String = ImageToBase64(fileUrl);
         JsonObject paramJson = new JsonObject();
-        paramJson.addProperty("personId", personId);
-        paramJson.addProperty("faceData", ImageToBase64(fileUrl));
+        if(faceId == null){
+            paramJson.addProperty("personId", personId);
+            paramJson.addProperty("faceData", base64String);
 
-        Map<String, String> querys = new HashMap<>();
-        querys.put("tagId", "frs");
+            Map<String, String> querys = new HashMap<>();
+            querys.put("tagId", "frs");
 
-        String apiPath = "/api/resource/v1/face/single/add";
-        String response = apiUtil.doPost(apiPath, String.valueOf(paramJson), querys);
+            String apiPath = "/api/resource/v1/face/single/add";
+            response = apiUtil.doPost(apiPath, String.valueOf(paramJson), querys);
+        }else{
+            String apiPath = "/api/resource/v1/face/single/update";
+            paramJson.addProperty("faceId", faceId);
+            paramJson.addProperty("faceData", base64String);
+            response = apiUtil.doPost(apiPath, paramJson.toString(), null);
+        }
 
         return response;
     }
 
     public static String ImportStudentFace(String personId, String fileUrl) {
+
+        JsonParser parser = new JsonParser();
+
+        String apiUrl = "/api/resource/v1/person/condition/personInfo";
+        JsonObject paramsJson = new JsonObject();
+        paramsJson.addProperty("paramName", "personId");
+        JsonArray array = new JsonArray();
+        array.add(personId);
+        paramsJson.add("paramValue", array);
+        String personInfoRes = apiUtil.doPost(apiUrl, paramsJson.toString(), null);
+        JsonObject personInfoData = parser.parse(personInfoRes).getAsJsonObject();
+        String faceId = null;
+        if("0".equals(personInfoData.get("code").getAsString()) && "success".equals(personInfoData.get("msg").getAsString())){
+            JsonObject dataJson = personInfoData.get("data").getAsJsonObject();
+            if(dataJson.get("total").getAsInt() > 0){
+                faceId = dataJson.get("list").getAsJsonArray().get(0)
+                        .getAsJsonObject().get("personPhoto").getAsJsonObject().get("personPhotoIndexCode").getAsString();
+            }
+        }
+        String response = null;
+        String base64String = ImageToBase64(fileUrl);
         JsonObject paramJson = new JsonObject();
-        paramJson.addProperty("personId", personId);
-        paramJson.addProperty("faceData", ImageToBase64(fileUrl));
+        if(faceId == null){
+            paramJson.addProperty("personId", personId);
+            paramJson.addProperty("faceData", base64String);
 
-        Map<String, String> querys = new HashMap<>();
-        querys.put("tagId", "frs");
+            Map<String, String> querys = new HashMap<>();
+            querys.put("tagId", "frs");
 
-        String apiPath = "/api/resource/v1/face/single/add";
-        String response = apiUtil.doPost(apiPath, String.valueOf(paramJson), querys);
+            String apiPath = "/api/resource/v1/face/single/add";
+            response = apiUtil.doPost(apiPath, String.valueOf(paramJson), querys);
+        }else{
+            String apiPath = "/api/resource/v1/face/single/update";
+            paramJson.addProperty("faceId", faceId);
+            paramJson.addProperty("faceData", base64String);
+            response = apiUtil.doPost(apiPath, paramJson.toString(), null);
+        }
 
         return response;
     }

+ 35 - 20
src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java

@@ -166,9 +166,13 @@ public class StundentFaceProcessController {
     @ApiOperation(value = "批量新增学生人脸")
     @SaCheckPermission("stundentfaceprocess:batch-upload")
     public RT<Boolean> batchUpload(@RequestParam("file") MultipartFile file) throws Exception {
+
+
+
         List<BaseStudentUser> list = studentManagerService.list(
             new MPJLambdaWrapper<BaseStudentUser>().distinct()
             .select(BaseStudentUser::getId)
+            .select(BaseStudentUser.class, user -> !user.getColumn().equals("avatar"))
             .select(BaseStudentUser.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudentUser.class).contains(x.getProperty()))
             .leftJoin(BaseStudent.class, BaseStudent::getUserId, BaseStudentUser::getId)
             .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
@@ -196,6 +200,8 @@ public class StundentFaceProcessController {
 
         List<FaceManagement> faceManagementList = faceManagementService.list(
             new QueryWrapper<FaceManagement>().lambda()
+            .select(FaceManagement.class, face -> !face.getColumn().equals("registerBase64"))
+            .select(FaceManagement.class, face -> !face.getColumn().equals("register_base64"))
             .eq(FaceManagement::getDeleteMark, DeleteMark.NODELETE.getCode())
             .eq(FaceManagement::getUserType, 2)
         );
@@ -311,26 +317,31 @@ public class StundentFaceProcessController {
                 process.setFacePhoto(folderId);
 
                 String faceId = null;
-                if(process.getHikvisionResult() != null){
+                if(process.getHikvisionResult() != null && process.getHikvisionResult().startsWith("{") && process.getHikvisionResult().endsWith("}")){
                     JsonObject object = parser.parse(process.getHikvisionResult()).getAsJsonObject();
                     if("0".equals(object.get("code").getAsString()) && "success".equals(object.get("msg").getAsString())){
                         faceId = object.get("data").getAsJsonObject().get("faceId").getAsString();
-                    }else{//查询
-                        String apiUrl = "/api/resource/v1/person/condition/personInfo";
-                        JsonObject paramsJson = new JsonObject();
-                        paramsJson.addProperty("paramName", "personId");
-                        JsonArray array = new JsonArray();
-                        array.add(studentUser.getId());
-                        paramsJson.add("paramValue", array);
-                        String personInfoRes = apiUtil.doPost(apiUrl, paramsJson.toString(), null);
-
-                        JsonObject personInfoData = parser.parse(process.getHikvisionResult()).getAsJsonObject();
-                        if("0".equals(personInfoData.get("code").getAsString()) && "success".equals(personInfoData.get("msg").getAsString())){
-                            JsonObject dataJson = personInfoData.get("data").getAsJsonObject();
-                            if(dataJson.get("total").getAsInt() > 0){
-                                faceId = dataJson.get("list").getAsJsonArray().get(0)
-                                        .getAsJsonObject().get("personPhoto").getAsJsonObject().get("personPhotoIndexCode").getAsString();
+                    }
+                }
+                if(faceId == null){
+                    String apiUrl = "/api/resource/v1/person/condition/personInfo";
+                    JsonObject paramsJson = new JsonObject();
+                    paramsJson.addProperty("paramName", "personId");
+                    JsonArray array = new JsonArray();
+                    array.add(studentUser.getId());
+                    paramsJson.add("paramValue", array);
+                    String personInfoRes = apiUtil.doPost(apiUrl, paramsJson.toString(), null);
+
+                    JsonObject personInfoData = parser.parse(personInfoRes).getAsJsonObject();
+                    if("0".equals(personInfoData.get("code").getAsString()) && "success".equals(personInfoData.get("msg").getAsString())){
+                        JsonObject dataJson = personInfoData.get("data").getAsJsonObject();
+                        if(dataJson.get("total").getAsInt() > 0){
+                            JsonArray personPhoto = dataJson.get("list").getAsJsonArray().get(0)
+                                    .getAsJsonObject().get("personPhoto").getAsJsonArray();
+                            if(personPhoto.size() > 0){
+                                faceId = personPhoto.get(0).getAsJsonObject().get("personPhotoIndexCode").getAsString();
                             }
+
                         }
                     }
                 }
@@ -339,19 +350,23 @@ public class StundentFaceProcessController {
                 JsonObject paramJson = new JsonObject();
                 String apiPath;
                 if(faceId != null){
-                    apiPath = "api/resource/v1/face/single/update";
+                    apiPath = "/api/resource/v1/face/single/update";
                     paramJson.addProperty("faceId", faceId);
                     paramJson.addProperty("faceData", base64String);
 
                 }else{
-                    apiPath = "api/resource/v1/face/single/add";
+                    apiPath = "/api/resource/v1/face/single/add";
                     paramJson.addProperty("personId", studentUser.getId());
                     paramJson.addProperty("faceData", base64String);
                 }
                 String result = apiUtil.doPost(apiPath, paramJson.toString(), null);
+                if(result.startsWith("{") && result.endsWith("}")){
+                    JsonObject object = parser.parse(result).getAsJsonObject();
+                    if("0".equals(object.get("code").getAsString()) && "success".equals(object.get("msg").getAsString())){
+                        process.setHikvisionResult(result);
+                    }
+                }
 
-
-                process.setHikvisionResult(result);
                 stundentFaceProcessService.updateById(process);
 
                 FaceManagement faceManagement = faceManagementMap.get(studentUser.getId());

+ 54 - 26
src/main/resources/mapper/base/BaseClassCourse.xml

@@ -8,11 +8,24 @@
         (SELECT GROUP_CONCAT(DISTINCT t6.name SEPARATOR '、')
             FROM base_class_course t5
             LEFT JOIN base_course_subject t6 ON t6.id = t5.course_id
-            WHERE t5.class_id = t.id AND t5.delete_mark = 0) AS course_name,
+            WHERE t5.class_id = t.id
+            AND t5.delete_mark = 0
+            <if test="dto.semester != null">
+                AND EXISTS (
+                SELECT 1
+                FROM textbook tb
+                WHERE tb.id = t5.textbook_id
+                AND tb.base_semester_id = #{dto.semester}
+                )
+            </if>) AS course_name,
         (SELECT GROUP_CONCAT(DISTINCT t7.book_name SEPARATOR '、')
             FROM base_class_course t5
             LEFT JOIN textbook t7 ON t7.id = t5.textbook_id
-            WHERE t5.class_id = t.id AND t5.delete_mark = 0) AS textbook_name
+            WHERE t5.class_id = t.id
+            AND t5.delete_mark = 0
+            <if test="dto.semester != null">
+                AND t7.base_semester_id = #{dto.semester}
+            </if>) AS textbook_name
         FROM base_class t
         LEFT JOIN xjr_user t1 ON t1.id = t.teacher_id
         LEFT JOIN base_class_major_set t2 ON t2.class_id = t.id
@@ -25,15 +38,6 @@
         <if test="dto.deptId != null">
             and t4.id = #{dto.deptId}
         </if>
-<!--  关联学期      <if test="dto.semester != null">-->
-<!--            AND EXISTS (-->
-<!--            SELECT 1-->
-<!--            FROM base_class_course bcc-->
-<!--            JOIN textbook tb ON bcc.textbook_id = tb.id-->
-<!--            WHERE bcc.class_id = t.id-->
-<!--            AND tb.base_semester_id = #{dto.semester}-->
-<!--            )-->
-<!--        </if>-->
         GROUP BY t.id, t.name, t1.name, t3.name, t4.name
         <if test="dto.courseSet == 1">
             HAVING LENGTH(course_name) > 0
@@ -45,14 +49,22 @@
 
 
     <select id="getAllCourseBook" resultType="com.xjrsoft.module.base.entity.CourseBookInfo">
-        select t1.id as courseId, t1.name as courseName,t.book_name as bookName
-        from textbook t
-        left join base_course_subject t1 on t.course_subject_id = t1.id
-        left join subject_group t2 on t2.id = t.subject_group_id
-        where t.delete_mark = 0
+        SELECT t1.id AS courseId, t1.name AS courseName, t.book_name AS bookName
+        FROM textbook t
+        LEFT JOIN base_course_subject t1 ON t.course_subject_id = t1.id
+        LEFT JOIN subject_group t2 ON t2.id = t.subject_group_id
+        WHERE t.delete_mark = 0
         <if test="subjectGroupId != null">
             AND t2.id = #{subjectGroupId}
         </if>
+        <if test="semester != null">
+            AND EXISTS (
+            SELECT 1
+            FROM textbook tb
+            WHERE tb.id = t.id
+            AND tb.base_semester_id = #{semester}
+            )
+        </if>
     </select>
 
     <select id="getSelectedCourseBook" resultType="com.xjrsoft.module.base.entity.CourseBookInfo">
@@ -67,6 +79,14 @@
                 #{classIds}
             </foreach>
         </if>
+        <if test="semester != null">
+            AND EXISTS (
+            SELECT 1
+            FROM textbook tb
+            WHERE tb.id = t.textbook_id
+            AND tb.base_semester_id = #{semester}
+            )
+        </if>
 <!--        <if test="subjectGroupId != null">-->
 <!--            AND-->
 <!--        </if>-->
@@ -97,16 +117,24 @@
     </update>
 
     <insert id="insertClassCourseTextbookCombinations" parameterType="map">
-        INSERT INTO base_class_course (class_id, course_id, textbook_id, create_date, delete_mark,enabled_mark)
-        SELECT #{newClassId}, t.course_id, t.textbook_id, now(), 0, 1
-        FROM (
-                 SELECT course_id, textbook_id
-                 FROM base_class_course
-                 WHERE class_id = #{sourceClassId}
-                   AND delete_mark = 0
-                 GROUP BY course_id, textbook_id
-             ) t
-            ON DUPLICATE KEY UPDATE delete_mark = 0
+        INSERT INTO base_class_course (class_id, course_id, textbook_id, create_date, delete_mark, enabled_mark)
+        SELECT #{newClassId}, t.course_id, t.textbook_id, NOW(), 0, 1
+        FROM (SELECT course_id, textbook_id FROM base_class_course WHERE class_id = #{sourceClassId} AND delete_mark = 0
+            <if test="semester != null">
+                AND EXISTS (
+                SELECT 1
+                FROM textbook tb
+                WHERE tb.id = textbook_id
+                AND tb.base_semester_id = #{semester}
+                )
+            </if>
+        GROUP BY
+            course_id, textbook_id
+        ) t
+        ON DUPLICATE KEY UPDATE
+        delete_mark = 0,
+        enabled_mark = 1,
+        create_date = NOW()
     </insert>
 
     <select id="getClassIdByName" resultType="java.lang.Long">

+ 51 - 16
src/test/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessControllerTest.java

@@ -1,9 +1,16 @@
 package com.xjrsoft.module.personnel.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.xjrsoft.XjrSoftApplication;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.utils.UploadUtil;
+import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
+import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
+import com.xjrsoft.module.student.service.IStudentManagerService;
+import org.apache.commons.io.FileUtils;
 import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.test.context.junit4.SpringRunner;
@@ -14,8 +21,15 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 import java.util.zip.ZipInputStream;
 
 import static org.junit.jupiter.api.Assertions.*;
@@ -28,28 +42,49 @@ import static org.junit.jupiter.api.Assertions.*;
 @SpringBootTest(classes = XjrSoftApplication.class)
 class StundentFaceProcessControllerTest {
 
+    @Autowired
+    private IStundentFaceProcessService stundentFaceProcessService;
+    @Autowired
+    private IStudentManagerService studentManagerService;
+
     @Test
     void test() throws Exception {
-        String filePath = "C:\\Users\\14263\\Downloads\\face.rar";
+        String filePath = "C:\\Users\\14263\\Downloads\\2023级全部学籍照.zip";
         File file = new File(filePath);
-        FileInputStream input = new FileInputStream(file);
-        MultipartFile multipartFile = new MockMultipartFile("file",
-                file.getName(), "text/plain", input);
-        String uploadedFile = UploadUtil.uploadFile(multipartFile);
-
-        InputStream download = UploadUtil.download(uploadedFile);
+        ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));
 
-        readZipEntries(download);
-    }
+        List<StundentFaceProcess> faceList = stundentFaceProcessService.list(
+                new QueryWrapper<StundentFaceProcess>().lambda()
+                        .eq(StundentFaceProcess::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Set<String> idNumberSet = new HashSet<>();
+        for (StundentFaceProcess faceProcess : faceList) {
+            if(faceProcess.getHikvisionResult() != null && faceProcess.getHikvisionResult().contains("{\"code\":\"0\",\"msg\":\"success\",")){
+                idNumberSet.add(faceProcess.getIdentityCard());
+            }
+        }
 
-    public static void readZipEntries(InputStream inputStream) throws IOException {
-        try (ZipInputStream zipInputStream = new ZipInputStream(inputStream)) {
-            ZipEntry zipEntry;
-            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
-                // 处理每个zip条目
-                System.out.println("Zip Entry: " + zipEntry.getName());
-                zipInputStream.closeEntry();
+        Set<String> notIntSet = new HashSet<>();
+        Enumeration<? extends ZipEntry> entries = zipFile.entries();
+        while (entries.hasMoreElements()){
+            ZipEntry entry = entries.nextElement();
+            String filename = entry.getName();
+            String[] split = filename.split("\\.");
+            String idNumber = split[0].substring(split[0].length() - 18);
+            if(!idNumberSet.contains(idNumber)){
+                notIntSet.add(filename);
+                System.out.println(filename);
             }
         }
+
+        for (String fileName : notIntSet) {
+            String newFilePath = "C:\\Users\\14263\\Downloads\\2023级全部学籍照\\" + fileName;
+            File sourceFile = new File(newFilePath);
+            File destinationDir = new File("C:\\Users\\14263\\Downloads\\2023级全部学籍照2");
+            FileUtils.moveFileToDirectory(sourceFile, destinationDir, true);
+
+        }
+
     }
+
 }