Parcourir la source

海康出入记录调整

dzx il y a 1 an
Parent
commit
d44ba91f72

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

@@ -6,11 +6,13 @@ 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.exception.MyException;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.utils.SqlRunnerAdapterUtil;
 import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
 import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
+import me.zhyd.oauth.log.Log;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -22,6 +24,7 @@ import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -30,7 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 public class OutInRecordUtil {
     private static final Logger log = LoggerFactory.getLogger(OutInRecordUtil.class);
 
-    private void teacherInsertRecord(Long userId, String recordTime, String facePhoto, int status, String eventId, String attendanceStatus){
+    private void teacherInsertRecord(String userId, String recordTime, String facePhoto, int status, String eventId, String attendanceStatus){
         String photoValue = (facePhoto != null && !facePhoto.equals("null")) ? facePhoto : "";
 
         String sql = "INSERT INTO teacher_out_in_record(create_date, user_id, record_time, face_photo, eventId, status,delete_mark,enabled_mark, attendance_status) " +
@@ -47,7 +50,7 @@ public class OutInRecordUtil {
 //        SqlRunnerAdapter.db().update(updSql);
     }
 
-    private void studentInsertRecord(Long userId, Long teacherId, Long classId, String facePhoto, String recordTime, int status, String eventId, String attendanceStatus){
+    private void studentInsertRecord(String userId, Long teacherId, Long classId, String facePhoto, String recordTime, int status, String eventId, String attendanceStatus){
         String photoValue = (facePhoto != null && !facePhoto.equals("null")) ? facePhoto : "";
 
         String sql = "INSERT INTO student_out_in_record(create_date, user_id, teacher_id, class_id, face_photo, record_time , eventId,status,delete_mark,enabled_mark, attendance_status) " +
@@ -101,6 +104,13 @@ public class OutInRecordUtil {
 
         SqlRunnerAdapter.db().dynamicInsert(tableName, where);
 
+        String sql = "SELECT hikvision_id,source_id FROM hikvision_data WHERE table_name = 'base_teacher'";
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+        Map<String, Long> sourceIdMap = new HashMap<>();
+        for (Map<String, Object> objectMap : list) {
+            sourceIdMap.put(objectMap.get("hikvision_id").toString(), Long.parseLong(objectMap.get("source_id").toString()));
+        }
+
         //车辆入库后,判定教师考勤状态
         if(carMessageApplyId != 0){
             String selectTable = "car_message_apply";
@@ -108,7 +118,7 @@ public class OutInRecordUtil {
             selectWhere.set("id", carMessageApplyId);
             selectWhere.set("car_number", planNo);
             Map<String, Object> objectMap = SqlRunnerAdapter.db().dynamicSelectOne(selectTable, selectWhere);
-            Long userId = Long.parseLong(objectMap.get("user_id").toString());
+            Long userId = sourceIdMap.get(objectMap.get("user_id").toString());
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
             LocalDateTime recordTimeDate = LocalDateTime.parse(recordTime, formatter);
             String attendanceStatus = discernTeacherStatus(recordTimeDate, status, userId);
@@ -180,15 +190,21 @@ public class OutInRecordUtil {
         InsertTeacherStudentRecords(responseBuilder, faceImportMapper);
     }
 
-    private void InsertTeacherStudentRecords(JsonArray doorEventsResponse, FaceImportMapper faceImportMapper) throws ParseException {
+    public void InsertTeacherStudentRecords(JsonArray doorEventsResponse, FaceImportMapper faceImportMapper) throws ParseException {
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        List<Long> teacherUserIds = faceImportMapper.getTeacherUserIds();
+        String sql = "SELECT hikvision_id,source_id FROM hikvision_data WHERE table_name = 'base_teacher'";
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+        Map<String, Long> sourceIdMap = new HashMap<>();
+        for (Map<String, Object> objectMap : list) {
+            sourceIdMap.put(objectMap.get("hikvision_id").toString(), Long.parseLong(objectMap.get("source_id").toString()));
+        }
+
         for (JsonElement element : doorEventsResponse) {
             JsonObject item = element.getAsJsonObject();
 
-            Long personId;
+            String personId;
             try {
-                personId = item.get("personId").isJsonNull() ? null : item.get("personId").getAsLong();
+                personId = item.get("personId").isJsonNull() ? null : item.get("personId").getAsString();
             }catch (Exception e){
                 continue;
             }
@@ -209,15 +225,15 @@ public class OutInRecordUtil {
             String recordTime = item.get("eventTime").isJsonNull() ? null : item.get("eventTime").getAsString();
             String eventId = item.get("eventId").isJsonNull() ? null : item.get("eventId").getAsString();
             String recordTimeStr = ChangeTime(recordTime);
-            if (teacherUserIds.contains(personId)) {
+            if (sourceIdMap.containsKey(personId)) {
                 // 老师记录
                 LocalDateTime recordTimeDate = LocalDateTime.parse(recordTimeStr, formatter);
-                String attendanceStatus = discernTeacherStatus(recordTimeDate, status, personId);
+                String attendanceStatus = discernTeacherStatus(recordTimeDate, status, sourceIdMap.get(personId));
                 teacherInsertRecord(personId, recordTimeStr, ApiUtil.GetRedirectURL(uri),status,eventId, attendanceStatus);
             } else {
                 // 学生记录
                 LocalDateTime recordTimeDate = LocalDateTime.parse(recordTimeStr, formatter);
-                String attendanceStatus = discernStudentStatus(recordTimeDate, status, personId);
+                String attendanceStatus = discernStudentStatus(recordTimeDate, status, sourceIdMap.get(personId));
                 studentInsertRecord(personId, faceImportMapper.GetTeacherIdByPersonId(personId),
                     faceImportMapper.GetClassIdByPersonId(personId), ApiUtil.GetRedirectURL(uri), recordTimeStr, status, eventId, attendanceStatus);
             }
@@ -577,7 +593,12 @@ public class OutInRecordUtil {
             JsonObject paramsObject = data.getAsJsonObject("params");
             JsonArray eventsArray = paramsObject.getAsJsonArray("events");
 
-            List<Long> teacherUserIds = faceImportMapper.getTeacherUserIds();
+            String sql = "SELECT hikvision_id,source_id FROM hikvision_data WHERE table_name = 'base_teacher'";
+            List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+            Map<String, Long> sourceIdMap = new HashMap<>();
+            for (Map<String, Object> objectMap : list) {
+                sourceIdMap.put(objectMap.get("hikvision_id").toString(), Long.parseLong(objectMap.get("source_id").toString()));
+            }
             for (JsonElement eventElement : eventsArray) {
                 JsonObject eventObject = eventElement.getAsJsonObject();
                 JsonObject dataObject = eventObject.getAsJsonObject("data");
@@ -606,21 +627,22 @@ public class OutInRecordUtil {
 
                 if (idNum == null) continue;
 
-                if (teacherUserIds.contains(Long.valueOf(idNum))) {
+                if (sourceIdMap.containsKey(idNum)) {
                     // 老师记录
                     LocalDateTime recordTimeDate = LocalDateTime.parse(recordTimeStr, formatter);
-                    String attendanceStatus = discernTeacherStatus(recordTimeDate, status, Long.valueOf(idNum));
-                    teacherInsertRecord(Long.valueOf(idNum), recordTimeStr, ApiUtil.GetRedirectURL(extEventPictureURL), status, eventId, attendanceStatus);
+                    String attendanceStatus = discernTeacherStatus(recordTimeDate, status, sourceIdMap.get(idNum));
+                    teacherInsertRecord(idNum, recordTimeStr, ApiUtil.GetRedirectURL(extEventPictureURL), status, eventId, attendanceStatus);
                 } else {
                     // 学生记录
                     LocalDateTime recordTimeDate = LocalDateTime.parse(recordTimeStr, formatter);
-                    String attendanceStatus = discernStudentStatus(recordTimeDate, status, Long.valueOf(idNum));
-                    studentInsertRecord(Long.valueOf(idNum), faceImportMapper.GetTeacherIdByPersonId(Long.valueOf(idNum)),
-                            faceImportMapper.GetClassIdByPersonId(Long.valueOf(idNum)), ApiUtil.GetRedirectURL(extEventPictureURL), recordTimeStr, status, eventId, attendanceStatus);
+                    String attendanceStatus = discernStudentStatus(recordTimeDate, status, sourceIdMap.get(idNum));
+                    studentInsertRecord(idNum, faceImportMapper.GetTeacherIdByPersonId(idNum),
+                            faceImportMapper.GetClassIdByPersonId(idNum), ApiUtil.GetRedirectURL(extEventPictureURL), recordTimeStr, status, eventId, attendanceStatus);
                 }
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            Log.error(e.getMessage(), e);
+            throw new MyException("海康出入记录同步报错");
         }
     }
 
@@ -816,6 +838,12 @@ public class OutInRecordUtil {
     public void getTeacherRecords(FaceImportMapper faceImportMapper, LocalDateTime startDateTime, LocalDateTime endDateTime,
                                  Map<Long, AttendanceRuleDetailsUserVo> teacherRules) throws ParseException {
         JsonArray responseBuilder = new JsonArray();
+        String sql = "SELECT hikvision_id,source_id FROM hikvision_data WHERE table_name = 'base_teacher'";
+        List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
+        Map<String, Long> sourceIdMap = new HashMap<>();
+        for (Map<String, Object> objectMap : list) {
+            sourceIdMap.put(objectMap.get("hikvision_id").toString(), Long.parseLong(objectMap.get("source_id").toString()));
+        }
 
         AtomicInteger pageNo = new AtomicInteger(1);
         int pageSize = 1000;
@@ -838,14 +866,14 @@ public class OutInRecordUtil {
         InsertTeacherStudentRecords(responseBuilder, faceImportMapper);
 
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        List<Long> teacherUserIds = faceImportMapper.getTeacherUserIds();
+        List<String> teacherUserIds = faceImportMapper.getTeacherUserIds();
         List<String> insertSqls = new ArrayList<>();
         for (JsonElement element : responseBuilder) {
             JsonObject item = element.getAsJsonObject();
 
-            Long personId;
+            String personId;
             try {
-                personId = item.get("personId").isJsonNull() ? null : item.get("personId").getAsLong();
+                personId = item.get("personId").isJsonNull() ? null : item.get("personId").getAsString();
             }catch (Exception e){
                 continue;
             }
@@ -869,7 +897,7 @@ public class OutInRecordUtil {
             if (teacherUserIds.contains(personId)) {
                 // 老师记录
                 LocalDateTime recordTimeDate = LocalDateTime.parse(recordTimeStr, formatter);
-                String attendanceStatus = discernTeacherStatus(recordTimeDate, status, teacherRules.get(personId));
+                String attendanceStatus = discernTeacherStatus(recordTimeDate, status, teacherRules.get(sourceIdMap.get(personId)));
                 String insSql = "INSERT INTO teacher_out_in_record(create_date, user_id, record_time, face_photo, eventId, status,delete_mark,enabled_mark, attendance_status) "
                         + "select now(), '"  + personId + "', '" + recordTimeStr + "', '" +
                         ApiUtil.GetRedirectURL(uri) + "', '" + eventId + "', '" +status + "',0,1,'" + attendanceStatus + "'" +

+ 3 - 3
src/main/java/com/xjrsoft/module/teacher/mapper/FaceImportMapper.java

@@ -17,8 +17,8 @@ public interface FaceImportMapper {
     String GetHikvisonPersonId(@Param("id") String id);
 
     String IsStudentTypeByPersonId(@Param("id") Long id);
-    Long GetTeacherIdByPersonId(@Param("id") Long id);
-    Long GetClassIdByPersonId(@Param("id") Long id);
+    Long GetTeacherIdByPersonId(@Param("id") String id);
+    Long GetClassIdByPersonId(@Param("id") String id);
 
     List<String> GetStudentUrlList();
     List<String> GetTeacherUrlList();
@@ -35,6 +35,6 @@ public interface FaceImportMapper {
     List<String> GetVisitIdList();
 
 
-    List<Long> getTeacherUserIds();
+    List<String> getTeacherUserIds();
 }
 

+ 2 - 4
src/main/resources/mapper/teacher/TeacherFaceImportMapper.xml

@@ -142,9 +142,7 @@
         where delete_mark = 0
     </select>
 
-    <select id="getTeacherUserIds" resultType="java.lang.Long">
-        SELECT t1.id FROM xjr_user t1
-        INNER JOIN base_teacher t2 ON t1.id = t2.user_id
-        WHERE t1.delete_mark = 0
+    <select id="getTeacherUserIds" resultType="java.lang.String">
+        SELECT hikvision_id FROM hikvision_data WHERE table_name = 'base_teacher'
     </select>
 </mapper>

+ 48 - 0
src/test/java/com/xjrsoft/module/job/InsertOutInRecordTaskTest.java

@@ -1,8 +1,17 @@
 package com.xjrsoft.module.job;
 
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import com.xjrsoft.XjrSoftApplication;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.module.hikvision.service.IHikvisionDataService;
+import com.xjrsoft.module.hikvision.util.ApiUtil;
 import com.xjrsoft.module.hikvision.util.OutInRecordUtil;
+import com.xjrsoft.module.hikvision.vo.HikvisionOutinPageVo;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import jline.internal.Log;
 import org.junit.jupiter.api.Test;
@@ -15,6 +24,8 @@ import java.text.ParseException;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
 
 
 /**
@@ -33,6 +44,43 @@ class InsertOutInRecordTaskTest {
     @Autowired
     private IHikvisionDataService hikvisionDataService;
 
+    @Autowired
+    private IHikvisionDataService hkvisionDataService;
+    @Test
+    void test2() throws ParseException {
+        LocalDateTime startDateTime = LocalDateTime.of(2024,9,1,0,0,0);
+        LocalDateTime endDateTime = LocalDateTime.of(2024,9,30,23,59,59);
+        Integer limit = 1;
+        Integer size = 1000;
+        ApiUtil apiUtil = new ApiUtil();
+        String apiPath = "/api/acs/v2/door/events";
+
+        JsonObject paramJson = new JsonObject();
+        JsonArray eventList = new JsonArray();
+        eventList.add(196893); // 只获取人脸通过的
+        paramJson.addProperty("pageNo", limit);
+        paramJson.addProperty("pageSize", size);
+        paramJson.add("eventTypes", eventList);
+
+        JsonArray personIds = new JsonArray();
+        personIds.add("C137");
+        personIds.add("153310036502459");
+        personIds.add("C139");
+        personIds.add("14954809603013");
+
+        paramJson.add("personIds", personIds);
+        paramJson.addProperty("sort", "eventTime");
+        paramJson.addProperty("order", "desc");
+        paramJson.addProperty("startTime", startDateTime.atOffset(ZoneOffset.ofHours(8)).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
+        paramJson.addProperty("endTime", endDateTime.atOffset(ZoneOffset.ofHours(8)).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
+
+        String doPost = apiUtil.doPost(apiPath, paramJson.toString(), null);
+        JsonParser parser = new JsonParser();
+        JsonObject data = parser.parse(doPost).getAsJsonObject().get("data").getAsJsonObject();
+        JsonArray list = data.get("list").getAsJsonArray();
+        out_in_recordUtil.InsertTeacherStudentRecords(list, faceImportMapper);
+    }
+
     @Test
     void test() throws ParseException {
         //获取时间,并计算出前一天的开始时间和结束时间