diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
new file mode 100644
index 0000000..80d9eff
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
@@ -0,0 +1,271 @@
+package com.casic.missiles.modular.system.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonInfo {
+
+ //@JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personID;
+
+ //@JSONField(name = "LastChange")
+ @SerializedName("LastChange")
+ private Long lastChange;
+
+ //@JSONField(name = "PersonCode")
+ @SerializedName("PersonCode")
+ private String personCode;
+
+ //@JSONField(name = "PersonName")
+ @SerializedName("PersonName")
+ private String personName;
+
+ //@JSONField(name = "Remarks")
+ @SerializedName("Remarks")
+ private String remarks;
+
+ //@JSONField(name = "TimeTemplateNum")
+ @SerializedName("TimeTemplateNum")
+ private Integer timeTemplateNum;
+
+ //@JSONField(name = "TimeTemplateList")
+ @SerializedName("TimeTemplateList")
+ private List timeTemplateList;
+
+ //@JSONField(name = "IdentificationNum")
+ @SerializedName("IdentificationNum")
+ private Integer identificationNum;
+
+ //@JSONField(name = "IdentificationList")
+ @SerializedName("IdentificationList")
+ private List identificationList;
+
+ //@JSONField(name = "ImageNum")
+ @SerializedName("ImageNum")
+ private Integer imageNum;
+
+ //@JSONField(name = "ImageList")
+ @SerializedName("ImageList")
+ private List imageList;
+
+ public Long getPersonID() {
+ return personID;
+ }
+
+ public void setPersonID(Long personID) {
+ this.personID = personID;
+ }
+
+ public Long getLastChange() {
+ return lastChange;
+ }
+
+ public void setLastChange(Long lastChange) {
+ this.lastChange = lastChange;
+ }
+
+ public String getPersonCode() {
+ return personCode;
+ }
+
+ public void setPersonCode(String personCode) {
+ this.personCode = personCode;
+ }
+
+ public String getPersonName() {
+ return personName;
+ }
+
+ public void setPersonName(String personName) {
+ this.personName = personName;
+ }
+
+ public String getRemarks() {
+ return remarks;
+ }
+
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ public Integer getTimeTemplateNum() {
+ return timeTemplateNum;
+ }
+
+ public void setTimeTemplateNum(Integer timeTemplateNum) {
+ this.timeTemplateNum = timeTemplateNum;
+ }
+
+ public List getTimeTemplateList() {
+ return timeTemplateList;
+ }
+
+ public void setTimeTemplateList(List timeTemplateList) {
+ this.timeTemplateList = timeTemplateList;
+ }
+
+ public Integer getIdentificationNum() {
+ return identificationNum;
+ }
+
+ public void setIdentificationNum(Integer identificationNum) {
+ this.identificationNum = identificationNum;
+ }
+
+ public List getIdentificationList() {
+ return identificationList;
+ }
+
+ public void setIdentificationList(List identificationList) {
+ this.identificationList = identificationList;
+ }
+
+ public Integer getImageNum() {
+ return imageNum;
+ }
+
+ public void setImageNum(Integer imageNum) {
+ this.imageNum = imageNum;
+ }
+
+ public List getImageList() {
+ return imageList;
+ }
+
+ public void setImageList(List imageList) {
+ this.imageList = imageList;
+ }
+
+ public class TimeTemplate{
+ @JSONField(name = "BeginTime")
+ private Long beginTime;
+ @JSONField(name = "EndTime")
+ private Long endTime;
+ @JSONField(name = "Index")
+ private Long index;
+
+ public TimeTemplate(Long beginTime, Long endTime, Long index) {
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ this.index = index;
+ }
+
+ public Long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(Long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getIndex() {
+ return index;
+ }
+
+ public void setIndex(Long index) {
+ this.index = index;
+ }
+ }
+
+ public TimeTemplate createTimeTemplate(Long beginTime, Long endTime, Long index){
+ return new TimeTemplate(beginTime, endTime, index);
+ }
+
+ public class IdentificationInfo {
+ @JSONField(name = "Type")
+ private Integer type;
+ @JSONField(name = "Number")
+ private String number;
+
+ public IdentificationInfo(Integer type, String number) {
+ this.type = type;
+ this.number = number;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+ }
+
+ public IdentificationInfo createIdentificationInfo(Integer type, String number){
+ return new IdentificationInfo(type,number);
+ }
+
+ public class ImageInfo{
+ @JSONField(name = "FaceID")
+ private Long faceID;
+ @JSONField(name = "Name")
+ private String name;
+ @JSONField(name = "Size")
+ private Long size;
+ @JSONField(name = "Data")
+ private String data;
+
+ public ImageInfo(Long faceID, String name, Long size, String data) {
+ this.faceID = faceID;
+ this.name = name;
+ this.size = size;
+ this.data = data;
+ }
+
+ public Long getFaceID() {
+ return faceID;
+ }
+
+ public void setFaceID(Long faceID) {
+ this.faceID = faceID;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+ }
+
+ public ImageInfo createImageInfo(Long faceID, String name, Long size, String data){
+ return new ImageInfo(faceID, name, size, data);
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
new file mode 100644
index 0000000..80d9eff
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
@@ -0,0 +1,271 @@
+package com.casic.missiles.modular.system.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonInfo {
+
+ //@JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personID;
+
+ //@JSONField(name = "LastChange")
+ @SerializedName("LastChange")
+ private Long lastChange;
+
+ //@JSONField(name = "PersonCode")
+ @SerializedName("PersonCode")
+ private String personCode;
+
+ //@JSONField(name = "PersonName")
+ @SerializedName("PersonName")
+ private String personName;
+
+ //@JSONField(name = "Remarks")
+ @SerializedName("Remarks")
+ private String remarks;
+
+ //@JSONField(name = "TimeTemplateNum")
+ @SerializedName("TimeTemplateNum")
+ private Integer timeTemplateNum;
+
+ //@JSONField(name = "TimeTemplateList")
+ @SerializedName("TimeTemplateList")
+ private List timeTemplateList;
+
+ //@JSONField(name = "IdentificationNum")
+ @SerializedName("IdentificationNum")
+ private Integer identificationNum;
+
+ //@JSONField(name = "IdentificationList")
+ @SerializedName("IdentificationList")
+ private List identificationList;
+
+ //@JSONField(name = "ImageNum")
+ @SerializedName("ImageNum")
+ private Integer imageNum;
+
+ //@JSONField(name = "ImageList")
+ @SerializedName("ImageList")
+ private List imageList;
+
+ public Long getPersonID() {
+ return personID;
+ }
+
+ public void setPersonID(Long personID) {
+ this.personID = personID;
+ }
+
+ public Long getLastChange() {
+ return lastChange;
+ }
+
+ public void setLastChange(Long lastChange) {
+ this.lastChange = lastChange;
+ }
+
+ public String getPersonCode() {
+ return personCode;
+ }
+
+ public void setPersonCode(String personCode) {
+ this.personCode = personCode;
+ }
+
+ public String getPersonName() {
+ return personName;
+ }
+
+ public void setPersonName(String personName) {
+ this.personName = personName;
+ }
+
+ public String getRemarks() {
+ return remarks;
+ }
+
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ public Integer getTimeTemplateNum() {
+ return timeTemplateNum;
+ }
+
+ public void setTimeTemplateNum(Integer timeTemplateNum) {
+ this.timeTemplateNum = timeTemplateNum;
+ }
+
+ public List getTimeTemplateList() {
+ return timeTemplateList;
+ }
+
+ public void setTimeTemplateList(List timeTemplateList) {
+ this.timeTemplateList = timeTemplateList;
+ }
+
+ public Integer getIdentificationNum() {
+ return identificationNum;
+ }
+
+ public void setIdentificationNum(Integer identificationNum) {
+ this.identificationNum = identificationNum;
+ }
+
+ public List getIdentificationList() {
+ return identificationList;
+ }
+
+ public void setIdentificationList(List identificationList) {
+ this.identificationList = identificationList;
+ }
+
+ public Integer getImageNum() {
+ return imageNum;
+ }
+
+ public void setImageNum(Integer imageNum) {
+ this.imageNum = imageNum;
+ }
+
+ public List getImageList() {
+ return imageList;
+ }
+
+ public void setImageList(List imageList) {
+ this.imageList = imageList;
+ }
+
+ public class TimeTemplate{
+ @JSONField(name = "BeginTime")
+ private Long beginTime;
+ @JSONField(name = "EndTime")
+ private Long endTime;
+ @JSONField(name = "Index")
+ private Long index;
+
+ public TimeTemplate(Long beginTime, Long endTime, Long index) {
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ this.index = index;
+ }
+
+ public Long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(Long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getIndex() {
+ return index;
+ }
+
+ public void setIndex(Long index) {
+ this.index = index;
+ }
+ }
+
+ public TimeTemplate createTimeTemplate(Long beginTime, Long endTime, Long index){
+ return new TimeTemplate(beginTime, endTime, index);
+ }
+
+ public class IdentificationInfo {
+ @JSONField(name = "Type")
+ private Integer type;
+ @JSONField(name = "Number")
+ private String number;
+
+ public IdentificationInfo(Integer type, String number) {
+ this.type = type;
+ this.number = number;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+ }
+
+ public IdentificationInfo createIdentificationInfo(Integer type, String number){
+ return new IdentificationInfo(type,number);
+ }
+
+ public class ImageInfo{
+ @JSONField(name = "FaceID")
+ private Long faceID;
+ @JSONField(name = "Name")
+ private String name;
+ @JSONField(name = "Size")
+ private Long size;
+ @JSONField(name = "Data")
+ private String data;
+
+ public ImageInfo(Long faceID, String name, Long size, String data) {
+ this.faceID = faceID;
+ this.name = name;
+ this.size = size;
+ this.data = data;
+ }
+
+ public Long getFaceID() {
+ return faceID;
+ }
+
+ public void setFaceID(Long faceID) {
+ this.faceID = faceID;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+ }
+
+ public ImageInfo createImageInfo(Long faceID, String name, Long size, String data){
+ return new ImageInfo(faceID, name, size, data);
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
new file mode 100644
index 0000000..fe93b8a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
@@ -0,0 +1,90 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+public class FaceBaseResponse {
+ @JSONField(name = "ResponseURL")
+ @SerializedName("ResponseURL")
+ private String responseUrl;
+
+ @JSONField(name = "CreatedID")
+ @SerializedName("CreatedID")
+ private int createdId;
+
+ @JSONField(name = "ResponseCode")
+ @SerializedName("ResponseCode")
+ private int responseCode;
+
+ @JSONField(name = "ResponseString")
+ @SerializedName("ResponseString")
+ private String responseString;
+
+ @JSONField(name = "StatusCode")
+ @SerializedName("StatusCode")
+ private int statusCode;
+
+ @JSONField(name = "StatusString")
+ @SerializedName("StatusString")
+ private String statusString;
+
+ //@JSONField(name = "Data")
+ @SerializedName("Data")
+ private T data;
+
+ public String getResponseUrl() {
+ return responseUrl;
+ }
+
+ public void setResponseUrl(String responseUrl) {
+ this.responseUrl = responseUrl;
+ }
+
+ public int getCreatedId() {
+ return createdId;
+ }
+
+ public void setCreatedId(int createdId) {
+ this.createdId = createdId;
+ }
+
+ public int getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(int responseCode) {
+ this.responseCode = responseCode;
+ }
+
+ public String getResponseString() {
+ return responseString;
+ }
+
+ public void setResponseString(String responseString) {
+ this.responseString = responseString;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(int statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusString() {
+ return statusString;
+ }
+
+ public void setStatusString(String statusString) {
+ this.statusString = statusString;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
new file mode 100644
index 0000000..80d9eff
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
@@ -0,0 +1,271 @@
+package com.casic.missiles.modular.system.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonInfo {
+
+ //@JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personID;
+
+ //@JSONField(name = "LastChange")
+ @SerializedName("LastChange")
+ private Long lastChange;
+
+ //@JSONField(name = "PersonCode")
+ @SerializedName("PersonCode")
+ private String personCode;
+
+ //@JSONField(name = "PersonName")
+ @SerializedName("PersonName")
+ private String personName;
+
+ //@JSONField(name = "Remarks")
+ @SerializedName("Remarks")
+ private String remarks;
+
+ //@JSONField(name = "TimeTemplateNum")
+ @SerializedName("TimeTemplateNum")
+ private Integer timeTemplateNum;
+
+ //@JSONField(name = "TimeTemplateList")
+ @SerializedName("TimeTemplateList")
+ private List timeTemplateList;
+
+ //@JSONField(name = "IdentificationNum")
+ @SerializedName("IdentificationNum")
+ private Integer identificationNum;
+
+ //@JSONField(name = "IdentificationList")
+ @SerializedName("IdentificationList")
+ private List identificationList;
+
+ //@JSONField(name = "ImageNum")
+ @SerializedName("ImageNum")
+ private Integer imageNum;
+
+ //@JSONField(name = "ImageList")
+ @SerializedName("ImageList")
+ private List imageList;
+
+ public Long getPersonID() {
+ return personID;
+ }
+
+ public void setPersonID(Long personID) {
+ this.personID = personID;
+ }
+
+ public Long getLastChange() {
+ return lastChange;
+ }
+
+ public void setLastChange(Long lastChange) {
+ this.lastChange = lastChange;
+ }
+
+ public String getPersonCode() {
+ return personCode;
+ }
+
+ public void setPersonCode(String personCode) {
+ this.personCode = personCode;
+ }
+
+ public String getPersonName() {
+ return personName;
+ }
+
+ public void setPersonName(String personName) {
+ this.personName = personName;
+ }
+
+ public String getRemarks() {
+ return remarks;
+ }
+
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ public Integer getTimeTemplateNum() {
+ return timeTemplateNum;
+ }
+
+ public void setTimeTemplateNum(Integer timeTemplateNum) {
+ this.timeTemplateNum = timeTemplateNum;
+ }
+
+ public List getTimeTemplateList() {
+ return timeTemplateList;
+ }
+
+ public void setTimeTemplateList(List timeTemplateList) {
+ this.timeTemplateList = timeTemplateList;
+ }
+
+ public Integer getIdentificationNum() {
+ return identificationNum;
+ }
+
+ public void setIdentificationNum(Integer identificationNum) {
+ this.identificationNum = identificationNum;
+ }
+
+ public List getIdentificationList() {
+ return identificationList;
+ }
+
+ public void setIdentificationList(List identificationList) {
+ this.identificationList = identificationList;
+ }
+
+ public Integer getImageNum() {
+ return imageNum;
+ }
+
+ public void setImageNum(Integer imageNum) {
+ this.imageNum = imageNum;
+ }
+
+ public List getImageList() {
+ return imageList;
+ }
+
+ public void setImageList(List imageList) {
+ this.imageList = imageList;
+ }
+
+ public class TimeTemplate{
+ @JSONField(name = "BeginTime")
+ private Long beginTime;
+ @JSONField(name = "EndTime")
+ private Long endTime;
+ @JSONField(name = "Index")
+ private Long index;
+
+ public TimeTemplate(Long beginTime, Long endTime, Long index) {
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ this.index = index;
+ }
+
+ public Long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(Long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getIndex() {
+ return index;
+ }
+
+ public void setIndex(Long index) {
+ this.index = index;
+ }
+ }
+
+ public TimeTemplate createTimeTemplate(Long beginTime, Long endTime, Long index){
+ return new TimeTemplate(beginTime, endTime, index);
+ }
+
+ public class IdentificationInfo {
+ @JSONField(name = "Type")
+ private Integer type;
+ @JSONField(name = "Number")
+ private String number;
+
+ public IdentificationInfo(Integer type, String number) {
+ this.type = type;
+ this.number = number;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+ }
+
+ public IdentificationInfo createIdentificationInfo(Integer type, String number){
+ return new IdentificationInfo(type,number);
+ }
+
+ public class ImageInfo{
+ @JSONField(name = "FaceID")
+ private Long faceID;
+ @JSONField(name = "Name")
+ private String name;
+ @JSONField(name = "Size")
+ private Long size;
+ @JSONField(name = "Data")
+ private String data;
+
+ public ImageInfo(Long faceID, String name, Long size, String data) {
+ this.faceID = faceID;
+ this.name = name;
+ this.size = size;
+ this.data = data;
+ }
+
+ public Long getFaceID() {
+ return faceID;
+ }
+
+ public void setFaceID(Long faceID) {
+ this.faceID = faceID;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+ }
+
+ public ImageInfo createImageInfo(Long faceID, String name, Long size, String data){
+ return new ImageInfo(faceID, name, size, data);
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
new file mode 100644
index 0000000..fe93b8a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
@@ -0,0 +1,90 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+public class FaceBaseResponse {
+ @JSONField(name = "ResponseURL")
+ @SerializedName("ResponseURL")
+ private String responseUrl;
+
+ @JSONField(name = "CreatedID")
+ @SerializedName("CreatedID")
+ private int createdId;
+
+ @JSONField(name = "ResponseCode")
+ @SerializedName("ResponseCode")
+ private int responseCode;
+
+ @JSONField(name = "ResponseString")
+ @SerializedName("ResponseString")
+ private String responseString;
+
+ @JSONField(name = "StatusCode")
+ @SerializedName("StatusCode")
+ private int statusCode;
+
+ @JSONField(name = "StatusString")
+ @SerializedName("StatusString")
+ private String statusString;
+
+ //@JSONField(name = "Data")
+ @SerializedName("Data")
+ private T data;
+
+ public String getResponseUrl() {
+ return responseUrl;
+ }
+
+ public void setResponseUrl(String responseUrl) {
+ this.responseUrl = responseUrl;
+ }
+
+ public int getCreatedId() {
+ return createdId;
+ }
+
+ public void setCreatedId(int createdId) {
+ this.createdId = createdId;
+ }
+
+ public int getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(int responseCode) {
+ this.responseCode = responseCode;
+ }
+
+ public String getResponseString() {
+ return responseString;
+ }
+
+ public void setResponseString(String responseString) {
+ this.responseString = responseString;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(int statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusString() {
+ return statusString;
+ }
+
+ public void setStatusString(String statusString) {
+ this.statusString = statusString;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
new file mode 100644
index 0000000..f128c92
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
@@ -0,0 +1,128 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class FaceInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "CapSrc")
+ private Long capSrc;
+ @JSONField(name = "FeatureNum")
+ private Long featureNum;
+ @JSONField(name = "FeatureList")
+ private List featureList;
+ @JSONField(name = "FeatureVersion")
+ private String featureVersion;
+ @JSONField(name = "Feature")
+ private String feature;
+ @JSONField(name = "Temperature")
+ private Float temperature;
+ @JSONField(name = "MaskFlag")
+ private Long maskFlag;
+ @JSONField(name = "PanoImage")
+ private Object panoImage;
+ @JSONField(name = "FaceImage")
+ private Object faceImage;
+ @JSONField(name = "FaceArea")
+ private Object faceArea;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public Long getCapSrc() {
+ return capSrc;
+ }
+
+ public void setCapSrc(Long capSrc) {
+ this.capSrc = capSrc;
+ }
+
+ public Long getFeatureNum() {
+ return featureNum;
+ }
+
+ public void setFeatureNum(Long featureNum) {
+ this.featureNum = featureNum;
+ }
+
+ public List getFeatureList() {
+ return featureList;
+ }
+
+ public void setFeatureList(List featureList) {
+ this.featureList = featureList;
+ }
+
+ public String getFeatureVersion() {
+ return featureVersion;
+ }
+
+ public void setFeatureVersion(String featureVersion) {
+ this.featureVersion = featureVersion;
+ }
+
+ public String getFeature() {
+ return feature;
+ }
+
+ public void setFeature(String feature) {
+ this.feature = feature;
+ }
+
+ public Float getTemperature() {
+ return temperature;
+ }
+
+ public void setTemperature(Float temperature) {
+ this.temperature = temperature;
+ }
+
+ public Long getMaskFlag() {
+ return maskFlag;
+ }
+
+ public void setMaskFlag(Long maskFlag) {
+ this.maskFlag = maskFlag;
+ }
+
+ public Object getPanoImage() {
+ return panoImage;
+ }
+
+ public void setPanoImage(Object panoImage) {
+ this.panoImage = panoImage;
+ }
+
+ public Object getFaceImage() {
+ return faceImage;
+ }
+
+ public void setFaceImage(Object faceImage) {
+ this.faceImage = faceImage;
+ }
+
+ public Object getFaceArea() {
+ return faceArea;
+ }
+
+ public void setFaceArea(Object faceArea) {
+ this.faceArea = faceArea;
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
new file mode 100644
index 0000000..80d9eff
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
@@ -0,0 +1,271 @@
+package com.casic.missiles.modular.system.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonInfo {
+
+ //@JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personID;
+
+ //@JSONField(name = "LastChange")
+ @SerializedName("LastChange")
+ private Long lastChange;
+
+ //@JSONField(name = "PersonCode")
+ @SerializedName("PersonCode")
+ private String personCode;
+
+ //@JSONField(name = "PersonName")
+ @SerializedName("PersonName")
+ private String personName;
+
+ //@JSONField(name = "Remarks")
+ @SerializedName("Remarks")
+ private String remarks;
+
+ //@JSONField(name = "TimeTemplateNum")
+ @SerializedName("TimeTemplateNum")
+ private Integer timeTemplateNum;
+
+ //@JSONField(name = "TimeTemplateList")
+ @SerializedName("TimeTemplateList")
+ private List timeTemplateList;
+
+ //@JSONField(name = "IdentificationNum")
+ @SerializedName("IdentificationNum")
+ private Integer identificationNum;
+
+ //@JSONField(name = "IdentificationList")
+ @SerializedName("IdentificationList")
+ private List identificationList;
+
+ //@JSONField(name = "ImageNum")
+ @SerializedName("ImageNum")
+ private Integer imageNum;
+
+ //@JSONField(name = "ImageList")
+ @SerializedName("ImageList")
+ private List imageList;
+
+ public Long getPersonID() {
+ return personID;
+ }
+
+ public void setPersonID(Long personID) {
+ this.personID = personID;
+ }
+
+ public Long getLastChange() {
+ return lastChange;
+ }
+
+ public void setLastChange(Long lastChange) {
+ this.lastChange = lastChange;
+ }
+
+ public String getPersonCode() {
+ return personCode;
+ }
+
+ public void setPersonCode(String personCode) {
+ this.personCode = personCode;
+ }
+
+ public String getPersonName() {
+ return personName;
+ }
+
+ public void setPersonName(String personName) {
+ this.personName = personName;
+ }
+
+ public String getRemarks() {
+ return remarks;
+ }
+
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ public Integer getTimeTemplateNum() {
+ return timeTemplateNum;
+ }
+
+ public void setTimeTemplateNum(Integer timeTemplateNum) {
+ this.timeTemplateNum = timeTemplateNum;
+ }
+
+ public List getTimeTemplateList() {
+ return timeTemplateList;
+ }
+
+ public void setTimeTemplateList(List timeTemplateList) {
+ this.timeTemplateList = timeTemplateList;
+ }
+
+ public Integer getIdentificationNum() {
+ return identificationNum;
+ }
+
+ public void setIdentificationNum(Integer identificationNum) {
+ this.identificationNum = identificationNum;
+ }
+
+ public List getIdentificationList() {
+ return identificationList;
+ }
+
+ public void setIdentificationList(List identificationList) {
+ this.identificationList = identificationList;
+ }
+
+ public Integer getImageNum() {
+ return imageNum;
+ }
+
+ public void setImageNum(Integer imageNum) {
+ this.imageNum = imageNum;
+ }
+
+ public List getImageList() {
+ return imageList;
+ }
+
+ public void setImageList(List imageList) {
+ this.imageList = imageList;
+ }
+
+ public class TimeTemplate{
+ @JSONField(name = "BeginTime")
+ private Long beginTime;
+ @JSONField(name = "EndTime")
+ private Long endTime;
+ @JSONField(name = "Index")
+ private Long index;
+
+ public TimeTemplate(Long beginTime, Long endTime, Long index) {
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ this.index = index;
+ }
+
+ public Long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(Long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getIndex() {
+ return index;
+ }
+
+ public void setIndex(Long index) {
+ this.index = index;
+ }
+ }
+
+ public TimeTemplate createTimeTemplate(Long beginTime, Long endTime, Long index){
+ return new TimeTemplate(beginTime, endTime, index);
+ }
+
+ public class IdentificationInfo {
+ @JSONField(name = "Type")
+ private Integer type;
+ @JSONField(name = "Number")
+ private String number;
+
+ public IdentificationInfo(Integer type, String number) {
+ this.type = type;
+ this.number = number;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+ }
+
+ public IdentificationInfo createIdentificationInfo(Integer type, String number){
+ return new IdentificationInfo(type,number);
+ }
+
+ public class ImageInfo{
+ @JSONField(name = "FaceID")
+ private Long faceID;
+ @JSONField(name = "Name")
+ private String name;
+ @JSONField(name = "Size")
+ private Long size;
+ @JSONField(name = "Data")
+ private String data;
+
+ public ImageInfo(Long faceID, String name, Long size, String data) {
+ this.faceID = faceID;
+ this.name = name;
+ this.size = size;
+ this.data = data;
+ }
+
+ public Long getFaceID() {
+ return faceID;
+ }
+
+ public void setFaceID(Long faceID) {
+ this.faceID = faceID;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+ }
+
+ public ImageInfo createImageInfo(Long faceID, String name, Long size, String data){
+ return new ImageInfo(faceID, name, size, data);
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
new file mode 100644
index 0000000..fe93b8a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
@@ -0,0 +1,90 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+public class FaceBaseResponse {
+ @JSONField(name = "ResponseURL")
+ @SerializedName("ResponseURL")
+ private String responseUrl;
+
+ @JSONField(name = "CreatedID")
+ @SerializedName("CreatedID")
+ private int createdId;
+
+ @JSONField(name = "ResponseCode")
+ @SerializedName("ResponseCode")
+ private int responseCode;
+
+ @JSONField(name = "ResponseString")
+ @SerializedName("ResponseString")
+ private String responseString;
+
+ @JSONField(name = "StatusCode")
+ @SerializedName("StatusCode")
+ private int statusCode;
+
+ @JSONField(name = "StatusString")
+ @SerializedName("StatusString")
+ private String statusString;
+
+ //@JSONField(name = "Data")
+ @SerializedName("Data")
+ private T data;
+
+ public String getResponseUrl() {
+ return responseUrl;
+ }
+
+ public void setResponseUrl(String responseUrl) {
+ this.responseUrl = responseUrl;
+ }
+
+ public int getCreatedId() {
+ return createdId;
+ }
+
+ public void setCreatedId(int createdId) {
+ this.createdId = createdId;
+ }
+
+ public int getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(int responseCode) {
+ this.responseCode = responseCode;
+ }
+
+ public String getResponseString() {
+ return responseString;
+ }
+
+ public void setResponseString(String responseString) {
+ this.responseString = responseString;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(int statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusString() {
+ return statusString;
+ }
+
+ public void setStatusString(String statusString) {
+ this.statusString = statusString;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
new file mode 100644
index 0000000..f128c92
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
@@ -0,0 +1,128 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class FaceInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "CapSrc")
+ private Long capSrc;
+ @JSONField(name = "FeatureNum")
+ private Long featureNum;
+ @JSONField(name = "FeatureList")
+ private List featureList;
+ @JSONField(name = "FeatureVersion")
+ private String featureVersion;
+ @JSONField(name = "Feature")
+ private String feature;
+ @JSONField(name = "Temperature")
+ private Float temperature;
+ @JSONField(name = "MaskFlag")
+ private Long maskFlag;
+ @JSONField(name = "PanoImage")
+ private Object panoImage;
+ @JSONField(name = "FaceImage")
+ private Object faceImage;
+ @JSONField(name = "FaceArea")
+ private Object faceArea;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public Long getCapSrc() {
+ return capSrc;
+ }
+
+ public void setCapSrc(Long capSrc) {
+ this.capSrc = capSrc;
+ }
+
+ public Long getFeatureNum() {
+ return featureNum;
+ }
+
+ public void setFeatureNum(Long featureNum) {
+ this.featureNum = featureNum;
+ }
+
+ public List getFeatureList() {
+ return featureList;
+ }
+
+ public void setFeatureList(List featureList) {
+ this.featureList = featureList;
+ }
+
+ public String getFeatureVersion() {
+ return featureVersion;
+ }
+
+ public void setFeatureVersion(String featureVersion) {
+ this.featureVersion = featureVersion;
+ }
+
+ public String getFeature() {
+ return feature;
+ }
+
+ public void setFeature(String feature) {
+ this.feature = feature;
+ }
+
+ public Float getTemperature() {
+ return temperature;
+ }
+
+ public void setTemperature(Float temperature) {
+ this.temperature = temperature;
+ }
+
+ public Long getMaskFlag() {
+ return maskFlag;
+ }
+
+ public void setMaskFlag(Long maskFlag) {
+ this.maskFlag = maskFlag;
+ }
+
+ public Object getPanoImage() {
+ return panoImage;
+ }
+
+ public void setPanoImage(Object panoImage) {
+ this.panoImage = panoImage;
+ }
+
+ public Object getFaceImage() {
+ return faceImage;
+ }
+
+ public void setFaceImage(Object faceImage) {
+ this.faceImage = faceImage;
+ }
+
+ public Object getFaceArea() {
+ return faceArea;
+ }
+
+ public void setFaceArea(Object faceArea) {
+ this.faceArea = faceArea;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
new file mode 100644
index 0000000..ce6dd33
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
@@ -0,0 +1,69 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+public class LibMatInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "LibID")
+ private Long libId;
+ @JSONField(name = "LibType")
+ private Long libType;
+ @JSONField(name = "MatchStatus")
+ private Long matchStatus;
+ @JSONField(name = "MatchPersonID")
+ private Long matchPersonId;
+ @JSONField(name = "MatchFaceID")
+ private Long matchFaceId;
+
+ // MatchPersonInfo 暂时忽略不用
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getLibId() {
+ return libId;
+ }
+
+ public void setLibId(Long libId) {
+ this.libId = libId;
+ }
+
+ public Long getLibType() {
+ return libType;
+ }
+
+ public void setLibType(Long libType) {
+ this.libType = libType;
+ }
+
+ public Long getMatchStatus() {
+ return matchStatus;
+ }
+
+ public void setMatchStatus(Long matchStatus) {
+ this.matchStatus = matchStatus;
+ }
+
+ public Long getMatchPersonId() {
+ return matchPersonId;
+ }
+
+ public void setMatchPersonId(Long matchPersonId) {
+ this.matchPersonId = matchPersonId;
+ }
+
+ public Long getMatchFaceId() {
+ return matchFaceId;
+ }
+
+ public void setMatchFaceId(Long matchFaceId) {
+ this.matchFaceId = matchFaceId;
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
new file mode 100644
index 0000000..80d9eff
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
@@ -0,0 +1,271 @@
+package com.casic.missiles.modular.system.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonInfo {
+
+ //@JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personID;
+
+ //@JSONField(name = "LastChange")
+ @SerializedName("LastChange")
+ private Long lastChange;
+
+ //@JSONField(name = "PersonCode")
+ @SerializedName("PersonCode")
+ private String personCode;
+
+ //@JSONField(name = "PersonName")
+ @SerializedName("PersonName")
+ private String personName;
+
+ //@JSONField(name = "Remarks")
+ @SerializedName("Remarks")
+ private String remarks;
+
+ //@JSONField(name = "TimeTemplateNum")
+ @SerializedName("TimeTemplateNum")
+ private Integer timeTemplateNum;
+
+ //@JSONField(name = "TimeTemplateList")
+ @SerializedName("TimeTemplateList")
+ private List timeTemplateList;
+
+ //@JSONField(name = "IdentificationNum")
+ @SerializedName("IdentificationNum")
+ private Integer identificationNum;
+
+ //@JSONField(name = "IdentificationList")
+ @SerializedName("IdentificationList")
+ private List identificationList;
+
+ //@JSONField(name = "ImageNum")
+ @SerializedName("ImageNum")
+ private Integer imageNum;
+
+ //@JSONField(name = "ImageList")
+ @SerializedName("ImageList")
+ private List imageList;
+
+ public Long getPersonID() {
+ return personID;
+ }
+
+ public void setPersonID(Long personID) {
+ this.personID = personID;
+ }
+
+ public Long getLastChange() {
+ return lastChange;
+ }
+
+ public void setLastChange(Long lastChange) {
+ this.lastChange = lastChange;
+ }
+
+ public String getPersonCode() {
+ return personCode;
+ }
+
+ public void setPersonCode(String personCode) {
+ this.personCode = personCode;
+ }
+
+ public String getPersonName() {
+ return personName;
+ }
+
+ public void setPersonName(String personName) {
+ this.personName = personName;
+ }
+
+ public String getRemarks() {
+ return remarks;
+ }
+
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ public Integer getTimeTemplateNum() {
+ return timeTemplateNum;
+ }
+
+ public void setTimeTemplateNum(Integer timeTemplateNum) {
+ this.timeTemplateNum = timeTemplateNum;
+ }
+
+ public List getTimeTemplateList() {
+ return timeTemplateList;
+ }
+
+ public void setTimeTemplateList(List timeTemplateList) {
+ this.timeTemplateList = timeTemplateList;
+ }
+
+ public Integer getIdentificationNum() {
+ return identificationNum;
+ }
+
+ public void setIdentificationNum(Integer identificationNum) {
+ this.identificationNum = identificationNum;
+ }
+
+ public List getIdentificationList() {
+ return identificationList;
+ }
+
+ public void setIdentificationList(List identificationList) {
+ this.identificationList = identificationList;
+ }
+
+ public Integer getImageNum() {
+ return imageNum;
+ }
+
+ public void setImageNum(Integer imageNum) {
+ this.imageNum = imageNum;
+ }
+
+ public List getImageList() {
+ return imageList;
+ }
+
+ public void setImageList(List imageList) {
+ this.imageList = imageList;
+ }
+
+ public class TimeTemplate{
+ @JSONField(name = "BeginTime")
+ private Long beginTime;
+ @JSONField(name = "EndTime")
+ private Long endTime;
+ @JSONField(name = "Index")
+ private Long index;
+
+ public TimeTemplate(Long beginTime, Long endTime, Long index) {
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ this.index = index;
+ }
+
+ public Long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(Long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getIndex() {
+ return index;
+ }
+
+ public void setIndex(Long index) {
+ this.index = index;
+ }
+ }
+
+ public TimeTemplate createTimeTemplate(Long beginTime, Long endTime, Long index){
+ return new TimeTemplate(beginTime, endTime, index);
+ }
+
+ public class IdentificationInfo {
+ @JSONField(name = "Type")
+ private Integer type;
+ @JSONField(name = "Number")
+ private String number;
+
+ public IdentificationInfo(Integer type, String number) {
+ this.type = type;
+ this.number = number;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+ }
+
+ public IdentificationInfo createIdentificationInfo(Integer type, String number){
+ return new IdentificationInfo(type,number);
+ }
+
+ public class ImageInfo{
+ @JSONField(name = "FaceID")
+ private Long faceID;
+ @JSONField(name = "Name")
+ private String name;
+ @JSONField(name = "Size")
+ private Long size;
+ @JSONField(name = "Data")
+ private String data;
+
+ public ImageInfo(Long faceID, String name, Long size, String data) {
+ this.faceID = faceID;
+ this.name = name;
+ this.size = size;
+ this.data = data;
+ }
+
+ public Long getFaceID() {
+ return faceID;
+ }
+
+ public void setFaceID(Long faceID) {
+ this.faceID = faceID;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+ }
+
+ public ImageInfo createImageInfo(Long faceID, String name, Long size, String data){
+ return new ImageInfo(faceID, name, size, data);
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
new file mode 100644
index 0000000..fe93b8a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
@@ -0,0 +1,90 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+public class FaceBaseResponse {
+ @JSONField(name = "ResponseURL")
+ @SerializedName("ResponseURL")
+ private String responseUrl;
+
+ @JSONField(name = "CreatedID")
+ @SerializedName("CreatedID")
+ private int createdId;
+
+ @JSONField(name = "ResponseCode")
+ @SerializedName("ResponseCode")
+ private int responseCode;
+
+ @JSONField(name = "ResponseString")
+ @SerializedName("ResponseString")
+ private String responseString;
+
+ @JSONField(name = "StatusCode")
+ @SerializedName("StatusCode")
+ private int statusCode;
+
+ @JSONField(name = "StatusString")
+ @SerializedName("StatusString")
+ private String statusString;
+
+ //@JSONField(name = "Data")
+ @SerializedName("Data")
+ private T data;
+
+ public String getResponseUrl() {
+ return responseUrl;
+ }
+
+ public void setResponseUrl(String responseUrl) {
+ this.responseUrl = responseUrl;
+ }
+
+ public int getCreatedId() {
+ return createdId;
+ }
+
+ public void setCreatedId(int createdId) {
+ this.createdId = createdId;
+ }
+
+ public int getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(int responseCode) {
+ this.responseCode = responseCode;
+ }
+
+ public String getResponseString() {
+ return responseString;
+ }
+
+ public void setResponseString(String responseString) {
+ this.responseString = responseString;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(int statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusString() {
+ return statusString;
+ }
+
+ public void setStatusString(String statusString) {
+ this.statusString = statusString;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
new file mode 100644
index 0000000..f128c92
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
@@ -0,0 +1,128 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class FaceInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "CapSrc")
+ private Long capSrc;
+ @JSONField(name = "FeatureNum")
+ private Long featureNum;
+ @JSONField(name = "FeatureList")
+ private List featureList;
+ @JSONField(name = "FeatureVersion")
+ private String featureVersion;
+ @JSONField(name = "Feature")
+ private String feature;
+ @JSONField(name = "Temperature")
+ private Float temperature;
+ @JSONField(name = "MaskFlag")
+ private Long maskFlag;
+ @JSONField(name = "PanoImage")
+ private Object panoImage;
+ @JSONField(name = "FaceImage")
+ private Object faceImage;
+ @JSONField(name = "FaceArea")
+ private Object faceArea;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public Long getCapSrc() {
+ return capSrc;
+ }
+
+ public void setCapSrc(Long capSrc) {
+ this.capSrc = capSrc;
+ }
+
+ public Long getFeatureNum() {
+ return featureNum;
+ }
+
+ public void setFeatureNum(Long featureNum) {
+ this.featureNum = featureNum;
+ }
+
+ public List getFeatureList() {
+ return featureList;
+ }
+
+ public void setFeatureList(List featureList) {
+ this.featureList = featureList;
+ }
+
+ public String getFeatureVersion() {
+ return featureVersion;
+ }
+
+ public void setFeatureVersion(String featureVersion) {
+ this.featureVersion = featureVersion;
+ }
+
+ public String getFeature() {
+ return feature;
+ }
+
+ public void setFeature(String feature) {
+ this.feature = feature;
+ }
+
+ public Float getTemperature() {
+ return temperature;
+ }
+
+ public void setTemperature(Float temperature) {
+ this.temperature = temperature;
+ }
+
+ public Long getMaskFlag() {
+ return maskFlag;
+ }
+
+ public void setMaskFlag(Long maskFlag) {
+ this.maskFlag = maskFlag;
+ }
+
+ public Object getPanoImage() {
+ return panoImage;
+ }
+
+ public void setPanoImage(Object panoImage) {
+ this.panoImage = panoImage;
+ }
+
+ public Object getFaceImage() {
+ return faceImage;
+ }
+
+ public void setFaceImage(Object faceImage) {
+ this.faceImage = faceImage;
+ }
+
+ public Object getFaceArea() {
+ return faceArea;
+ }
+
+ public void setFaceArea(Object faceArea) {
+ this.faceArea = faceArea;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
new file mode 100644
index 0000000..ce6dd33
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
@@ -0,0 +1,69 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+public class LibMatInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "LibID")
+ private Long libId;
+ @JSONField(name = "LibType")
+ private Long libType;
+ @JSONField(name = "MatchStatus")
+ private Long matchStatus;
+ @JSONField(name = "MatchPersonID")
+ private Long matchPersonId;
+ @JSONField(name = "MatchFaceID")
+ private Long matchFaceId;
+
+ // MatchPersonInfo 暂时忽略不用
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getLibId() {
+ return libId;
+ }
+
+ public void setLibId(Long libId) {
+ this.libId = libId;
+ }
+
+ public Long getLibType() {
+ return libType;
+ }
+
+ public void setLibType(Long libType) {
+ this.libType = libType;
+ }
+
+ public Long getMatchStatus() {
+ return matchStatus;
+ }
+
+ public void setMatchStatus(Long matchStatus) {
+ this.matchStatus = matchStatus;
+ }
+
+ public Long getMatchPersonId() {
+ return matchPersonId;
+ }
+
+ public void setMatchPersonId(Long matchPersonId) {
+ this.matchPersonId = matchPersonId;
+ }
+
+ public Long getMatchFaceId() {
+ return matchFaceId;
+ }
+
+ public void setMatchFaceId(Long matchFaceId) {
+ this.matchFaceId = matchFaceId;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
new file mode 100644
index 0000000..186faed
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
@@ -0,0 +1,31 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonResponseData {
+ @JSONField(name = "Num")
+ @SerializedName("Num")
+ private int num;
+ @JSONField(name = "PersonList")
+ @SerializedName("PersonList")
+ private List personList;
+
+ public int getNum() {
+ return num;
+ }
+
+ public void setNum(int num) {
+ this.num = num;
+ }
+
+ public List getPersonList() {
+ return personList;
+ }
+
+ public void setPersonList(List personList) {
+ this.personList = personList;
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
new file mode 100644
index 0000000..80d9eff
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
@@ -0,0 +1,271 @@
+package com.casic.missiles.modular.system.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonInfo {
+
+ //@JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personID;
+
+ //@JSONField(name = "LastChange")
+ @SerializedName("LastChange")
+ private Long lastChange;
+
+ //@JSONField(name = "PersonCode")
+ @SerializedName("PersonCode")
+ private String personCode;
+
+ //@JSONField(name = "PersonName")
+ @SerializedName("PersonName")
+ private String personName;
+
+ //@JSONField(name = "Remarks")
+ @SerializedName("Remarks")
+ private String remarks;
+
+ //@JSONField(name = "TimeTemplateNum")
+ @SerializedName("TimeTemplateNum")
+ private Integer timeTemplateNum;
+
+ //@JSONField(name = "TimeTemplateList")
+ @SerializedName("TimeTemplateList")
+ private List timeTemplateList;
+
+ //@JSONField(name = "IdentificationNum")
+ @SerializedName("IdentificationNum")
+ private Integer identificationNum;
+
+ //@JSONField(name = "IdentificationList")
+ @SerializedName("IdentificationList")
+ private List identificationList;
+
+ //@JSONField(name = "ImageNum")
+ @SerializedName("ImageNum")
+ private Integer imageNum;
+
+ //@JSONField(name = "ImageList")
+ @SerializedName("ImageList")
+ private List imageList;
+
+ public Long getPersonID() {
+ return personID;
+ }
+
+ public void setPersonID(Long personID) {
+ this.personID = personID;
+ }
+
+ public Long getLastChange() {
+ return lastChange;
+ }
+
+ public void setLastChange(Long lastChange) {
+ this.lastChange = lastChange;
+ }
+
+ public String getPersonCode() {
+ return personCode;
+ }
+
+ public void setPersonCode(String personCode) {
+ this.personCode = personCode;
+ }
+
+ public String getPersonName() {
+ return personName;
+ }
+
+ public void setPersonName(String personName) {
+ this.personName = personName;
+ }
+
+ public String getRemarks() {
+ return remarks;
+ }
+
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ public Integer getTimeTemplateNum() {
+ return timeTemplateNum;
+ }
+
+ public void setTimeTemplateNum(Integer timeTemplateNum) {
+ this.timeTemplateNum = timeTemplateNum;
+ }
+
+ public List getTimeTemplateList() {
+ return timeTemplateList;
+ }
+
+ public void setTimeTemplateList(List timeTemplateList) {
+ this.timeTemplateList = timeTemplateList;
+ }
+
+ public Integer getIdentificationNum() {
+ return identificationNum;
+ }
+
+ public void setIdentificationNum(Integer identificationNum) {
+ this.identificationNum = identificationNum;
+ }
+
+ public List getIdentificationList() {
+ return identificationList;
+ }
+
+ public void setIdentificationList(List identificationList) {
+ this.identificationList = identificationList;
+ }
+
+ public Integer getImageNum() {
+ return imageNum;
+ }
+
+ public void setImageNum(Integer imageNum) {
+ this.imageNum = imageNum;
+ }
+
+ public List getImageList() {
+ return imageList;
+ }
+
+ public void setImageList(List imageList) {
+ this.imageList = imageList;
+ }
+
+ public class TimeTemplate{
+ @JSONField(name = "BeginTime")
+ private Long beginTime;
+ @JSONField(name = "EndTime")
+ private Long endTime;
+ @JSONField(name = "Index")
+ private Long index;
+
+ public TimeTemplate(Long beginTime, Long endTime, Long index) {
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ this.index = index;
+ }
+
+ public Long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(Long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getIndex() {
+ return index;
+ }
+
+ public void setIndex(Long index) {
+ this.index = index;
+ }
+ }
+
+ public TimeTemplate createTimeTemplate(Long beginTime, Long endTime, Long index){
+ return new TimeTemplate(beginTime, endTime, index);
+ }
+
+ public class IdentificationInfo {
+ @JSONField(name = "Type")
+ private Integer type;
+ @JSONField(name = "Number")
+ private String number;
+
+ public IdentificationInfo(Integer type, String number) {
+ this.type = type;
+ this.number = number;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+ }
+
+ public IdentificationInfo createIdentificationInfo(Integer type, String number){
+ return new IdentificationInfo(type,number);
+ }
+
+ public class ImageInfo{
+ @JSONField(name = "FaceID")
+ private Long faceID;
+ @JSONField(name = "Name")
+ private String name;
+ @JSONField(name = "Size")
+ private Long size;
+ @JSONField(name = "Data")
+ private String data;
+
+ public ImageInfo(Long faceID, String name, Long size, String data) {
+ this.faceID = faceID;
+ this.name = name;
+ this.size = size;
+ this.data = data;
+ }
+
+ public Long getFaceID() {
+ return faceID;
+ }
+
+ public void setFaceID(Long faceID) {
+ this.faceID = faceID;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+ }
+
+ public ImageInfo createImageInfo(Long faceID, String name, Long size, String data){
+ return new ImageInfo(faceID, name, size, data);
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
new file mode 100644
index 0000000..fe93b8a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
@@ -0,0 +1,90 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+public class FaceBaseResponse {
+ @JSONField(name = "ResponseURL")
+ @SerializedName("ResponseURL")
+ private String responseUrl;
+
+ @JSONField(name = "CreatedID")
+ @SerializedName("CreatedID")
+ private int createdId;
+
+ @JSONField(name = "ResponseCode")
+ @SerializedName("ResponseCode")
+ private int responseCode;
+
+ @JSONField(name = "ResponseString")
+ @SerializedName("ResponseString")
+ private String responseString;
+
+ @JSONField(name = "StatusCode")
+ @SerializedName("StatusCode")
+ private int statusCode;
+
+ @JSONField(name = "StatusString")
+ @SerializedName("StatusString")
+ private String statusString;
+
+ //@JSONField(name = "Data")
+ @SerializedName("Data")
+ private T data;
+
+ public String getResponseUrl() {
+ return responseUrl;
+ }
+
+ public void setResponseUrl(String responseUrl) {
+ this.responseUrl = responseUrl;
+ }
+
+ public int getCreatedId() {
+ return createdId;
+ }
+
+ public void setCreatedId(int createdId) {
+ this.createdId = createdId;
+ }
+
+ public int getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(int responseCode) {
+ this.responseCode = responseCode;
+ }
+
+ public String getResponseString() {
+ return responseString;
+ }
+
+ public void setResponseString(String responseString) {
+ this.responseString = responseString;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(int statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusString() {
+ return statusString;
+ }
+
+ public void setStatusString(String statusString) {
+ this.statusString = statusString;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
new file mode 100644
index 0000000..f128c92
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
@@ -0,0 +1,128 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class FaceInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "CapSrc")
+ private Long capSrc;
+ @JSONField(name = "FeatureNum")
+ private Long featureNum;
+ @JSONField(name = "FeatureList")
+ private List featureList;
+ @JSONField(name = "FeatureVersion")
+ private String featureVersion;
+ @JSONField(name = "Feature")
+ private String feature;
+ @JSONField(name = "Temperature")
+ private Float temperature;
+ @JSONField(name = "MaskFlag")
+ private Long maskFlag;
+ @JSONField(name = "PanoImage")
+ private Object panoImage;
+ @JSONField(name = "FaceImage")
+ private Object faceImage;
+ @JSONField(name = "FaceArea")
+ private Object faceArea;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public Long getCapSrc() {
+ return capSrc;
+ }
+
+ public void setCapSrc(Long capSrc) {
+ this.capSrc = capSrc;
+ }
+
+ public Long getFeatureNum() {
+ return featureNum;
+ }
+
+ public void setFeatureNum(Long featureNum) {
+ this.featureNum = featureNum;
+ }
+
+ public List getFeatureList() {
+ return featureList;
+ }
+
+ public void setFeatureList(List featureList) {
+ this.featureList = featureList;
+ }
+
+ public String getFeatureVersion() {
+ return featureVersion;
+ }
+
+ public void setFeatureVersion(String featureVersion) {
+ this.featureVersion = featureVersion;
+ }
+
+ public String getFeature() {
+ return feature;
+ }
+
+ public void setFeature(String feature) {
+ this.feature = feature;
+ }
+
+ public Float getTemperature() {
+ return temperature;
+ }
+
+ public void setTemperature(Float temperature) {
+ this.temperature = temperature;
+ }
+
+ public Long getMaskFlag() {
+ return maskFlag;
+ }
+
+ public void setMaskFlag(Long maskFlag) {
+ this.maskFlag = maskFlag;
+ }
+
+ public Object getPanoImage() {
+ return panoImage;
+ }
+
+ public void setPanoImage(Object panoImage) {
+ this.panoImage = panoImage;
+ }
+
+ public Object getFaceImage() {
+ return faceImage;
+ }
+
+ public void setFaceImage(Object faceImage) {
+ this.faceImage = faceImage;
+ }
+
+ public Object getFaceArea() {
+ return faceArea;
+ }
+
+ public void setFaceArea(Object faceArea) {
+ this.faceArea = faceArea;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
new file mode 100644
index 0000000..ce6dd33
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
@@ -0,0 +1,69 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+public class LibMatInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "LibID")
+ private Long libId;
+ @JSONField(name = "LibType")
+ private Long libType;
+ @JSONField(name = "MatchStatus")
+ private Long matchStatus;
+ @JSONField(name = "MatchPersonID")
+ private Long matchPersonId;
+ @JSONField(name = "MatchFaceID")
+ private Long matchFaceId;
+
+ // MatchPersonInfo 暂时忽略不用
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getLibId() {
+ return libId;
+ }
+
+ public void setLibId(Long libId) {
+ this.libId = libId;
+ }
+
+ public Long getLibType() {
+ return libType;
+ }
+
+ public void setLibType(Long libType) {
+ this.libType = libType;
+ }
+
+ public Long getMatchStatus() {
+ return matchStatus;
+ }
+
+ public void setMatchStatus(Long matchStatus) {
+ this.matchStatus = matchStatus;
+ }
+
+ public Long getMatchPersonId() {
+ return matchPersonId;
+ }
+
+ public void setMatchPersonId(Long matchPersonId) {
+ this.matchPersonId = matchPersonId;
+ }
+
+ public Long getMatchFaceId() {
+ return matchFaceId;
+ }
+
+ public void setMatchFaceId(Long matchFaceId) {
+ this.matchFaceId = matchFaceId;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
new file mode 100644
index 0000000..186faed
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
@@ -0,0 +1,31 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonResponseData {
+ @JSONField(name = "Num")
+ @SerializedName("Num")
+ private int num;
+ @JSONField(name = "PersonList")
+ @SerializedName("PersonList")
+ private List personList;
+
+ public int getNum() {
+ return num;
+ }
+
+ public void setNum(int num) {
+ this.num = num;
+ }
+
+ public List getPersonList() {
+ return personList;
+ }
+
+ public void setPersonList(List personList) {
+ this.personList = personList;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java
new file mode 100644
index 0000000..7ba3edc
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java
@@ -0,0 +1,67 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonResponseInfo {
+ @JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personId;
+ @JSONField(name = "FaceNum")
+ @SerializedName("FaceNum")
+ private Long faceNum;
+ @JSONField(name = "FaceList")
+ @SerializedName("FaceList")
+ private List faceList;
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getFaceNum() {
+ return faceNum;
+ }
+
+ public void setFaceNum(Long faceNum) {
+ this.faceNum = faceNum;
+ }
+
+ public List getFaceList() {
+ return faceList;
+ }
+
+ public void setFaceList(List faceList) {
+ this.faceList = faceList;
+ }
+
+ public class PersonResponseFace{
+ @JSONField(name = "FaceID")
+ @SerializedName("FaceID")
+ private Long faceId;
+ @JSONField(name = "ResultCode")
+ @SerializedName("ResultCode")
+ private Long resultCode;
+
+ public Long getFaceId() {
+ return faceId;
+ }
+
+ public void setFaceId(Long faceId) {
+ this.faceId = faceId;
+ }
+
+ public Long getResultCode() {
+ return resultCode;
+ }
+
+ public void setResultCode(Long resultCode) {
+ this.resultCode = resultCode;
+ }
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
new file mode 100644
index 0000000..80d9eff
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
@@ -0,0 +1,271 @@
+package com.casic.missiles.modular.system.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonInfo {
+
+ //@JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personID;
+
+ //@JSONField(name = "LastChange")
+ @SerializedName("LastChange")
+ private Long lastChange;
+
+ //@JSONField(name = "PersonCode")
+ @SerializedName("PersonCode")
+ private String personCode;
+
+ //@JSONField(name = "PersonName")
+ @SerializedName("PersonName")
+ private String personName;
+
+ //@JSONField(name = "Remarks")
+ @SerializedName("Remarks")
+ private String remarks;
+
+ //@JSONField(name = "TimeTemplateNum")
+ @SerializedName("TimeTemplateNum")
+ private Integer timeTemplateNum;
+
+ //@JSONField(name = "TimeTemplateList")
+ @SerializedName("TimeTemplateList")
+ private List timeTemplateList;
+
+ //@JSONField(name = "IdentificationNum")
+ @SerializedName("IdentificationNum")
+ private Integer identificationNum;
+
+ //@JSONField(name = "IdentificationList")
+ @SerializedName("IdentificationList")
+ private List identificationList;
+
+ //@JSONField(name = "ImageNum")
+ @SerializedName("ImageNum")
+ private Integer imageNum;
+
+ //@JSONField(name = "ImageList")
+ @SerializedName("ImageList")
+ private List imageList;
+
+ public Long getPersonID() {
+ return personID;
+ }
+
+ public void setPersonID(Long personID) {
+ this.personID = personID;
+ }
+
+ public Long getLastChange() {
+ return lastChange;
+ }
+
+ public void setLastChange(Long lastChange) {
+ this.lastChange = lastChange;
+ }
+
+ public String getPersonCode() {
+ return personCode;
+ }
+
+ public void setPersonCode(String personCode) {
+ this.personCode = personCode;
+ }
+
+ public String getPersonName() {
+ return personName;
+ }
+
+ public void setPersonName(String personName) {
+ this.personName = personName;
+ }
+
+ public String getRemarks() {
+ return remarks;
+ }
+
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ public Integer getTimeTemplateNum() {
+ return timeTemplateNum;
+ }
+
+ public void setTimeTemplateNum(Integer timeTemplateNum) {
+ this.timeTemplateNum = timeTemplateNum;
+ }
+
+ public List getTimeTemplateList() {
+ return timeTemplateList;
+ }
+
+ public void setTimeTemplateList(List timeTemplateList) {
+ this.timeTemplateList = timeTemplateList;
+ }
+
+ public Integer getIdentificationNum() {
+ return identificationNum;
+ }
+
+ public void setIdentificationNum(Integer identificationNum) {
+ this.identificationNum = identificationNum;
+ }
+
+ public List getIdentificationList() {
+ return identificationList;
+ }
+
+ public void setIdentificationList(List identificationList) {
+ this.identificationList = identificationList;
+ }
+
+ public Integer getImageNum() {
+ return imageNum;
+ }
+
+ public void setImageNum(Integer imageNum) {
+ this.imageNum = imageNum;
+ }
+
+ public List getImageList() {
+ return imageList;
+ }
+
+ public void setImageList(List imageList) {
+ this.imageList = imageList;
+ }
+
+ public class TimeTemplate{
+ @JSONField(name = "BeginTime")
+ private Long beginTime;
+ @JSONField(name = "EndTime")
+ private Long endTime;
+ @JSONField(name = "Index")
+ private Long index;
+
+ public TimeTemplate(Long beginTime, Long endTime, Long index) {
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ this.index = index;
+ }
+
+ public Long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(Long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getIndex() {
+ return index;
+ }
+
+ public void setIndex(Long index) {
+ this.index = index;
+ }
+ }
+
+ public TimeTemplate createTimeTemplate(Long beginTime, Long endTime, Long index){
+ return new TimeTemplate(beginTime, endTime, index);
+ }
+
+ public class IdentificationInfo {
+ @JSONField(name = "Type")
+ private Integer type;
+ @JSONField(name = "Number")
+ private String number;
+
+ public IdentificationInfo(Integer type, String number) {
+ this.type = type;
+ this.number = number;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+ }
+
+ public IdentificationInfo createIdentificationInfo(Integer type, String number){
+ return new IdentificationInfo(type,number);
+ }
+
+ public class ImageInfo{
+ @JSONField(name = "FaceID")
+ private Long faceID;
+ @JSONField(name = "Name")
+ private String name;
+ @JSONField(name = "Size")
+ private Long size;
+ @JSONField(name = "Data")
+ private String data;
+
+ public ImageInfo(Long faceID, String name, Long size, String data) {
+ this.faceID = faceID;
+ this.name = name;
+ this.size = size;
+ this.data = data;
+ }
+
+ public Long getFaceID() {
+ return faceID;
+ }
+
+ public void setFaceID(Long faceID) {
+ this.faceID = faceID;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+ }
+
+ public ImageInfo createImageInfo(Long faceID, String name, Long size, String data){
+ return new ImageInfo(faceID, name, size, data);
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
new file mode 100644
index 0000000..fe93b8a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
@@ -0,0 +1,90 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+public class FaceBaseResponse {
+ @JSONField(name = "ResponseURL")
+ @SerializedName("ResponseURL")
+ private String responseUrl;
+
+ @JSONField(name = "CreatedID")
+ @SerializedName("CreatedID")
+ private int createdId;
+
+ @JSONField(name = "ResponseCode")
+ @SerializedName("ResponseCode")
+ private int responseCode;
+
+ @JSONField(name = "ResponseString")
+ @SerializedName("ResponseString")
+ private String responseString;
+
+ @JSONField(name = "StatusCode")
+ @SerializedName("StatusCode")
+ private int statusCode;
+
+ @JSONField(name = "StatusString")
+ @SerializedName("StatusString")
+ private String statusString;
+
+ //@JSONField(name = "Data")
+ @SerializedName("Data")
+ private T data;
+
+ public String getResponseUrl() {
+ return responseUrl;
+ }
+
+ public void setResponseUrl(String responseUrl) {
+ this.responseUrl = responseUrl;
+ }
+
+ public int getCreatedId() {
+ return createdId;
+ }
+
+ public void setCreatedId(int createdId) {
+ this.createdId = createdId;
+ }
+
+ public int getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(int responseCode) {
+ this.responseCode = responseCode;
+ }
+
+ public String getResponseString() {
+ return responseString;
+ }
+
+ public void setResponseString(String responseString) {
+ this.responseString = responseString;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(int statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusString() {
+ return statusString;
+ }
+
+ public void setStatusString(String statusString) {
+ this.statusString = statusString;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
new file mode 100644
index 0000000..f128c92
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
@@ -0,0 +1,128 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class FaceInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "CapSrc")
+ private Long capSrc;
+ @JSONField(name = "FeatureNum")
+ private Long featureNum;
+ @JSONField(name = "FeatureList")
+ private List featureList;
+ @JSONField(name = "FeatureVersion")
+ private String featureVersion;
+ @JSONField(name = "Feature")
+ private String feature;
+ @JSONField(name = "Temperature")
+ private Float temperature;
+ @JSONField(name = "MaskFlag")
+ private Long maskFlag;
+ @JSONField(name = "PanoImage")
+ private Object panoImage;
+ @JSONField(name = "FaceImage")
+ private Object faceImage;
+ @JSONField(name = "FaceArea")
+ private Object faceArea;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public Long getCapSrc() {
+ return capSrc;
+ }
+
+ public void setCapSrc(Long capSrc) {
+ this.capSrc = capSrc;
+ }
+
+ public Long getFeatureNum() {
+ return featureNum;
+ }
+
+ public void setFeatureNum(Long featureNum) {
+ this.featureNum = featureNum;
+ }
+
+ public List getFeatureList() {
+ return featureList;
+ }
+
+ public void setFeatureList(List featureList) {
+ this.featureList = featureList;
+ }
+
+ public String getFeatureVersion() {
+ return featureVersion;
+ }
+
+ public void setFeatureVersion(String featureVersion) {
+ this.featureVersion = featureVersion;
+ }
+
+ public String getFeature() {
+ return feature;
+ }
+
+ public void setFeature(String feature) {
+ this.feature = feature;
+ }
+
+ public Float getTemperature() {
+ return temperature;
+ }
+
+ public void setTemperature(Float temperature) {
+ this.temperature = temperature;
+ }
+
+ public Long getMaskFlag() {
+ return maskFlag;
+ }
+
+ public void setMaskFlag(Long maskFlag) {
+ this.maskFlag = maskFlag;
+ }
+
+ public Object getPanoImage() {
+ return panoImage;
+ }
+
+ public void setPanoImage(Object panoImage) {
+ this.panoImage = panoImage;
+ }
+
+ public Object getFaceImage() {
+ return faceImage;
+ }
+
+ public void setFaceImage(Object faceImage) {
+ this.faceImage = faceImage;
+ }
+
+ public Object getFaceArea() {
+ return faceArea;
+ }
+
+ public void setFaceArea(Object faceArea) {
+ this.faceArea = faceArea;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
new file mode 100644
index 0000000..ce6dd33
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
@@ -0,0 +1,69 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+public class LibMatInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "LibID")
+ private Long libId;
+ @JSONField(name = "LibType")
+ private Long libType;
+ @JSONField(name = "MatchStatus")
+ private Long matchStatus;
+ @JSONField(name = "MatchPersonID")
+ private Long matchPersonId;
+ @JSONField(name = "MatchFaceID")
+ private Long matchFaceId;
+
+ // MatchPersonInfo 暂时忽略不用
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getLibId() {
+ return libId;
+ }
+
+ public void setLibId(Long libId) {
+ this.libId = libId;
+ }
+
+ public Long getLibType() {
+ return libType;
+ }
+
+ public void setLibType(Long libType) {
+ this.libType = libType;
+ }
+
+ public Long getMatchStatus() {
+ return matchStatus;
+ }
+
+ public void setMatchStatus(Long matchStatus) {
+ this.matchStatus = matchStatus;
+ }
+
+ public Long getMatchPersonId() {
+ return matchPersonId;
+ }
+
+ public void setMatchPersonId(Long matchPersonId) {
+ this.matchPersonId = matchPersonId;
+ }
+
+ public Long getMatchFaceId() {
+ return matchFaceId;
+ }
+
+ public void setMatchFaceId(Long matchFaceId) {
+ this.matchFaceId = matchFaceId;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
new file mode 100644
index 0000000..186faed
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
@@ -0,0 +1,31 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonResponseData {
+ @JSONField(name = "Num")
+ @SerializedName("Num")
+ private int num;
+ @JSONField(name = "PersonList")
+ @SerializedName("PersonList")
+ private List personList;
+
+ public int getNum() {
+ return num;
+ }
+
+ public void setNum(int num) {
+ this.num = num;
+ }
+
+ public List getPersonList() {
+ return personList;
+ }
+
+ public void setPersonList(List personList) {
+ this.personList = personList;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java
new file mode 100644
index 0000000..7ba3edc
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java
@@ -0,0 +1,67 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonResponseInfo {
+ @JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personId;
+ @JSONField(name = "FaceNum")
+ @SerializedName("FaceNum")
+ private Long faceNum;
+ @JSONField(name = "FaceList")
+ @SerializedName("FaceList")
+ private List faceList;
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getFaceNum() {
+ return faceNum;
+ }
+
+ public void setFaceNum(Long faceNum) {
+ this.faceNum = faceNum;
+ }
+
+ public List getFaceList() {
+ return faceList;
+ }
+
+ public void setFaceList(List faceList) {
+ this.faceList = faceList;
+ }
+
+ public class PersonResponseFace{
+ @JSONField(name = "FaceID")
+ @SerializedName("FaceID")
+ private Long faceId;
+ @JSONField(name = "ResultCode")
+ @SerializedName("ResultCode")
+ private Long resultCode;
+
+ public Long getFaceId() {
+ return faceId;
+ }
+
+ public void setFaceId(Long faceId) {
+ this.faceId = faceId;
+ }
+
+ public Long getResultCode() {
+ return resultCode;
+ }
+
+ public void setResultCode(Long resultCode) {
+ this.resultCode = resultCode;
+ }
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/RecordNotification.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/RecordNotification.java
new file mode 100644
index 0000000..ca52d29
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/RecordNotification.java
@@ -0,0 +1,138 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class RecordNotification {
+ @JSONField(name = "Reference")
+ private String reference;
+ @JSONField(name = "Seq")
+ private int seq;
+ @JSONField(name = "DeviceCode")
+ private String deviceCode;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "NotificationType")
+ private int notificationType;
+ @JSONField(name = "FaceInfoNum")
+ private int faceInfoNum;
+ @JSONField(name = "FaceInfoList")
+ private List faceInfoList;
+ @JSONField(name = "CardInfoNum")
+ private int cardInfoNum;
+ @JSONField(name = "CardInfoList")
+ private List cardInfoList;
+ @JSONField(name = "GateInfoNum")
+ private int gateInfoNum;
+ @JSONField(name = "GateInfoList")
+ private List gateInfoList;
+ @JSONField(name = "LibMatInfoNum")
+ private int libMatInfoNum;
+ @JSONField(name = "LibMatInfoList")
+ private List libMatInfoList;
+
+ public String getReference() {
+ return reference;
+ }
+
+ public void setReference(String reference) {
+ this.reference = reference;
+ }
+
+ public int getSeq() {
+ return seq;
+ }
+
+ public void setSeq(int seq) {
+ this.seq = seq;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public int getNotificationType() {
+ return notificationType;
+ }
+
+ public void setNotificationType(int notificationType) {
+ this.notificationType = notificationType;
+ }
+
+ public int getFaceInfoNum() {
+ return faceInfoNum;
+ }
+
+ public void setFaceInfoNum(int faceInfoNum) {
+ this.faceInfoNum = faceInfoNum;
+ }
+
+ public List getFaceInfoList() {
+ return faceInfoList;
+ }
+
+ public void setFaceInfoList(List faceInfoList) {
+ this.faceInfoList = faceInfoList;
+ }
+
+ public int getCardInfoNum() {
+ return cardInfoNum;
+ }
+
+ public void setCardInfoNum(int cardInfoNum) {
+ this.cardInfoNum = cardInfoNum;
+ }
+
+ public List getCardInfoList() {
+ return cardInfoList;
+ }
+
+ public void setCardInfoList(List cardInfoList) {
+ this.cardInfoList = cardInfoList;
+ }
+
+ public int getGateInfoNum() {
+ return gateInfoNum;
+ }
+
+ public void setGateInfoNum(int gateInfoNum) {
+ this.gateInfoNum = gateInfoNum;
+ }
+
+ public List getGateInfoList() {
+ return gateInfoList;
+ }
+
+ public void setGateInfoList(List gateInfoList) {
+ this.gateInfoList = gateInfoList;
+ }
+
+ public int getLibMatInfoNum() {
+ return libMatInfoNum;
+ }
+
+ public void setLibMatInfoNum(int libMatInfoNum) {
+ this.libMatInfoNum = libMatInfoNum;
+ }
+
+ public List getLibMatInfoList() {
+ return libMatInfoList;
+ }
+
+ public void setLibMatInfoList(List libMatInfoList) {
+ this.libMatInfoList = libMatInfoList;
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
new file mode 100644
index 0000000..80d9eff
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
@@ -0,0 +1,271 @@
+package com.casic.missiles.modular.system.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonInfo {
+
+ //@JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personID;
+
+ //@JSONField(name = "LastChange")
+ @SerializedName("LastChange")
+ private Long lastChange;
+
+ //@JSONField(name = "PersonCode")
+ @SerializedName("PersonCode")
+ private String personCode;
+
+ //@JSONField(name = "PersonName")
+ @SerializedName("PersonName")
+ private String personName;
+
+ //@JSONField(name = "Remarks")
+ @SerializedName("Remarks")
+ private String remarks;
+
+ //@JSONField(name = "TimeTemplateNum")
+ @SerializedName("TimeTemplateNum")
+ private Integer timeTemplateNum;
+
+ //@JSONField(name = "TimeTemplateList")
+ @SerializedName("TimeTemplateList")
+ private List timeTemplateList;
+
+ //@JSONField(name = "IdentificationNum")
+ @SerializedName("IdentificationNum")
+ private Integer identificationNum;
+
+ //@JSONField(name = "IdentificationList")
+ @SerializedName("IdentificationList")
+ private List identificationList;
+
+ //@JSONField(name = "ImageNum")
+ @SerializedName("ImageNum")
+ private Integer imageNum;
+
+ //@JSONField(name = "ImageList")
+ @SerializedName("ImageList")
+ private List imageList;
+
+ public Long getPersonID() {
+ return personID;
+ }
+
+ public void setPersonID(Long personID) {
+ this.personID = personID;
+ }
+
+ public Long getLastChange() {
+ return lastChange;
+ }
+
+ public void setLastChange(Long lastChange) {
+ this.lastChange = lastChange;
+ }
+
+ public String getPersonCode() {
+ return personCode;
+ }
+
+ public void setPersonCode(String personCode) {
+ this.personCode = personCode;
+ }
+
+ public String getPersonName() {
+ return personName;
+ }
+
+ public void setPersonName(String personName) {
+ this.personName = personName;
+ }
+
+ public String getRemarks() {
+ return remarks;
+ }
+
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ public Integer getTimeTemplateNum() {
+ return timeTemplateNum;
+ }
+
+ public void setTimeTemplateNum(Integer timeTemplateNum) {
+ this.timeTemplateNum = timeTemplateNum;
+ }
+
+ public List getTimeTemplateList() {
+ return timeTemplateList;
+ }
+
+ public void setTimeTemplateList(List timeTemplateList) {
+ this.timeTemplateList = timeTemplateList;
+ }
+
+ public Integer getIdentificationNum() {
+ return identificationNum;
+ }
+
+ public void setIdentificationNum(Integer identificationNum) {
+ this.identificationNum = identificationNum;
+ }
+
+ public List getIdentificationList() {
+ return identificationList;
+ }
+
+ public void setIdentificationList(List identificationList) {
+ this.identificationList = identificationList;
+ }
+
+ public Integer getImageNum() {
+ return imageNum;
+ }
+
+ public void setImageNum(Integer imageNum) {
+ this.imageNum = imageNum;
+ }
+
+ public List getImageList() {
+ return imageList;
+ }
+
+ public void setImageList(List imageList) {
+ this.imageList = imageList;
+ }
+
+ public class TimeTemplate{
+ @JSONField(name = "BeginTime")
+ private Long beginTime;
+ @JSONField(name = "EndTime")
+ private Long endTime;
+ @JSONField(name = "Index")
+ private Long index;
+
+ public TimeTemplate(Long beginTime, Long endTime, Long index) {
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ this.index = index;
+ }
+
+ public Long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(Long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getIndex() {
+ return index;
+ }
+
+ public void setIndex(Long index) {
+ this.index = index;
+ }
+ }
+
+ public TimeTemplate createTimeTemplate(Long beginTime, Long endTime, Long index){
+ return new TimeTemplate(beginTime, endTime, index);
+ }
+
+ public class IdentificationInfo {
+ @JSONField(name = "Type")
+ private Integer type;
+ @JSONField(name = "Number")
+ private String number;
+
+ public IdentificationInfo(Integer type, String number) {
+ this.type = type;
+ this.number = number;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+ }
+
+ public IdentificationInfo createIdentificationInfo(Integer type, String number){
+ return new IdentificationInfo(type,number);
+ }
+
+ public class ImageInfo{
+ @JSONField(name = "FaceID")
+ private Long faceID;
+ @JSONField(name = "Name")
+ private String name;
+ @JSONField(name = "Size")
+ private Long size;
+ @JSONField(name = "Data")
+ private String data;
+
+ public ImageInfo(Long faceID, String name, Long size, String data) {
+ this.faceID = faceID;
+ this.name = name;
+ this.size = size;
+ this.data = data;
+ }
+
+ public Long getFaceID() {
+ return faceID;
+ }
+
+ public void setFaceID(Long faceID) {
+ this.faceID = faceID;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+ }
+
+ public ImageInfo createImageInfo(Long faceID, String name, Long size, String data){
+ return new ImageInfo(faceID, name, size, data);
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
new file mode 100644
index 0000000..fe93b8a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
@@ -0,0 +1,90 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+public class FaceBaseResponse {
+ @JSONField(name = "ResponseURL")
+ @SerializedName("ResponseURL")
+ private String responseUrl;
+
+ @JSONField(name = "CreatedID")
+ @SerializedName("CreatedID")
+ private int createdId;
+
+ @JSONField(name = "ResponseCode")
+ @SerializedName("ResponseCode")
+ private int responseCode;
+
+ @JSONField(name = "ResponseString")
+ @SerializedName("ResponseString")
+ private String responseString;
+
+ @JSONField(name = "StatusCode")
+ @SerializedName("StatusCode")
+ private int statusCode;
+
+ @JSONField(name = "StatusString")
+ @SerializedName("StatusString")
+ private String statusString;
+
+ //@JSONField(name = "Data")
+ @SerializedName("Data")
+ private T data;
+
+ public String getResponseUrl() {
+ return responseUrl;
+ }
+
+ public void setResponseUrl(String responseUrl) {
+ this.responseUrl = responseUrl;
+ }
+
+ public int getCreatedId() {
+ return createdId;
+ }
+
+ public void setCreatedId(int createdId) {
+ this.createdId = createdId;
+ }
+
+ public int getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(int responseCode) {
+ this.responseCode = responseCode;
+ }
+
+ public String getResponseString() {
+ return responseString;
+ }
+
+ public void setResponseString(String responseString) {
+ this.responseString = responseString;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(int statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusString() {
+ return statusString;
+ }
+
+ public void setStatusString(String statusString) {
+ this.statusString = statusString;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
new file mode 100644
index 0000000..f128c92
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
@@ -0,0 +1,128 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class FaceInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "CapSrc")
+ private Long capSrc;
+ @JSONField(name = "FeatureNum")
+ private Long featureNum;
+ @JSONField(name = "FeatureList")
+ private List featureList;
+ @JSONField(name = "FeatureVersion")
+ private String featureVersion;
+ @JSONField(name = "Feature")
+ private String feature;
+ @JSONField(name = "Temperature")
+ private Float temperature;
+ @JSONField(name = "MaskFlag")
+ private Long maskFlag;
+ @JSONField(name = "PanoImage")
+ private Object panoImage;
+ @JSONField(name = "FaceImage")
+ private Object faceImage;
+ @JSONField(name = "FaceArea")
+ private Object faceArea;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public Long getCapSrc() {
+ return capSrc;
+ }
+
+ public void setCapSrc(Long capSrc) {
+ this.capSrc = capSrc;
+ }
+
+ public Long getFeatureNum() {
+ return featureNum;
+ }
+
+ public void setFeatureNum(Long featureNum) {
+ this.featureNum = featureNum;
+ }
+
+ public List getFeatureList() {
+ return featureList;
+ }
+
+ public void setFeatureList(List featureList) {
+ this.featureList = featureList;
+ }
+
+ public String getFeatureVersion() {
+ return featureVersion;
+ }
+
+ public void setFeatureVersion(String featureVersion) {
+ this.featureVersion = featureVersion;
+ }
+
+ public String getFeature() {
+ return feature;
+ }
+
+ public void setFeature(String feature) {
+ this.feature = feature;
+ }
+
+ public Float getTemperature() {
+ return temperature;
+ }
+
+ public void setTemperature(Float temperature) {
+ this.temperature = temperature;
+ }
+
+ public Long getMaskFlag() {
+ return maskFlag;
+ }
+
+ public void setMaskFlag(Long maskFlag) {
+ this.maskFlag = maskFlag;
+ }
+
+ public Object getPanoImage() {
+ return panoImage;
+ }
+
+ public void setPanoImage(Object panoImage) {
+ this.panoImage = panoImage;
+ }
+
+ public Object getFaceImage() {
+ return faceImage;
+ }
+
+ public void setFaceImage(Object faceImage) {
+ this.faceImage = faceImage;
+ }
+
+ public Object getFaceArea() {
+ return faceArea;
+ }
+
+ public void setFaceArea(Object faceArea) {
+ this.faceArea = faceArea;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
new file mode 100644
index 0000000..ce6dd33
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
@@ -0,0 +1,69 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+public class LibMatInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "LibID")
+ private Long libId;
+ @JSONField(name = "LibType")
+ private Long libType;
+ @JSONField(name = "MatchStatus")
+ private Long matchStatus;
+ @JSONField(name = "MatchPersonID")
+ private Long matchPersonId;
+ @JSONField(name = "MatchFaceID")
+ private Long matchFaceId;
+
+ // MatchPersonInfo 暂时忽略不用
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getLibId() {
+ return libId;
+ }
+
+ public void setLibId(Long libId) {
+ this.libId = libId;
+ }
+
+ public Long getLibType() {
+ return libType;
+ }
+
+ public void setLibType(Long libType) {
+ this.libType = libType;
+ }
+
+ public Long getMatchStatus() {
+ return matchStatus;
+ }
+
+ public void setMatchStatus(Long matchStatus) {
+ this.matchStatus = matchStatus;
+ }
+
+ public Long getMatchPersonId() {
+ return matchPersonId;
+ }
+
+ public void setMatchPersonId(Long matchPersonId) {
+ this.matchPersonId = matchPersonId;
+ }
+
+ public Long getMatchFaceId() {
+ return matchFaceId;
+ }
+
+ public void setMatchFaceId(Long matchFaceId) {
+ this.matchFaceId = matchFaceId;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
new file mode 100644
index 0000000..186faed
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
@@ -0,0 +1,31 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonResponseData {
+ @JSONField(name = "Num")
+ @SerializedName("Num")
+ private int num;
+ @JSONField(name = "PersonList")
+ @SerializedName("PersonList")
+ private List personList;
+
+ public int getNum() {
+ return num;
+ }
+
+ public void setNum(int num) {
+ this.num = num;
+ }
+
+ public List getPersonList() {
+ return personList;
+ }
+
+ public void setPersonList(List personList) {
+ this.personList = personList;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java
new file mode 100644
index 0000000..7ba3edc
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java
@@ -0,0 +1,67 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonResponseInfo {
+ @JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personId;
+ @JSONField(name = "FaceNum")
+ @SerializedName("FaceNum")
+ private Long faceNum;
+ @JSONField(name = "FaceList")
+ @SerializedName("FaceList")
+ private List faceList;
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getFaceNum() {
+ return faceNum;
+ }
+
+ public void setFaceNum(Long faceNum) {
+ this.faceNum = faceNum;
+ }
+
+ public List getFaceList() {
+ return faceList;
+ }
+
+ public void setFaceList(List faceList) {
+ this.faceList = faceList;
+ }
+
+ public class PersonResponseFace{
+ @JSONField(name = "FaceID")
+ @SerializedName("FaceID")
+ private Long faceId;
+ @JSONField(name = "ResultCode")
+ @SerializedName("ResultCode")
+ private Long resultCode;
+
+ public Long getFaceId() {
+ return faceId;
+ }
+
+ public void setFaceId(Long faceId) {
+ this.faceId = faceId;
+ }
+
+ public Long getResultCode() {
+ return resultCode;
+ }
+
+ public void setResultCode(Long resultCode) {
+ this.resultCode = resultCode;
+ }
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/RecordNotification.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/RecordNotification.java
new file mode 100644
index 0000000..ca52d29
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/RecordNotification.java
@@ -0,0 +1,138 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class RecordNotification {
+ @JSONField(name = "Reference")
+ private String reference;
+ @JSONField(name = "Seq")
+ private int seq;
+ @JSONField(name = "DeviceCode")
+ private String deviceCode;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "NotificationType")
+ private int notificationType;
+ @JSONField(name = "FaceInfoNum")
+ private int faceInfoNum;
+ @JSONField(name = "FaceInfoList")
+ private List faceInfoList;
+ @JSONField(name = "CardInfoNum")
+ private int cardInfoNum;
+ @JSONField(name = "CardInfoList")
+ private List cardInfoList;
+ @JSONField(name = "GateInfoNum")
+ private int gateInfoNum;
+ @JSONField(name = "GateInfoList")
+ private List gateInfoList;
+ @JSONField(name = "LibMatInfoNum")
+ private int libMatInfoNum;
+ @JSONField(name = "LibMatInfoList")
+ private List libMatInfoList;
+
+ public String getReference() {
+ return reference;
+ }
+
+ public void setReference(String reference) {
+ this.reference = reference;
+ }
+
+ public int getSeq() {
+ return seq;
+ }
+
+ public void setSeq(int seq) {
+ this.seq = seq;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public int getNotificationType() {
+ return notificationType;
+ }
+
+ public void setNotificationType(int notificationType) {
+ this.notificationType = notificationType;
+ }
+
+ public int getFaceInfoNum() {
+ return faceInfoNum;
+ }
+
+ public void setFaceInfoNum(int faceInfoNum) {
+ this.faceInfoNum = faceInfoNum;
+ }
+
+ public List getFaceInfoList() {
+ return faceInfoList;
+ }
+
+ public void setFaceInfoList(List faceInfoList) {
+ this.faceInfoList = faceInfoList;
+ }
+
+ public int getCardInfoNum() {
+ return cardInfoNum;
+ }
+
+ public void setCardInfoNum(int cardInfoNum) {
+ this.cardInfoNum = cardInfoNum;
+ }
+
+ public List getCardInfoList() {
+ return cardInfoList;
+ }
+
+ public void setCardInfoList(List cardInfoList) {
+ this.cardInfoList = cardInfoList;
+ }
+
+ public int getGateInfoNum() {
+ return gateInfoNum;
+ }
+
+ public void setGateInfoNum(int gateInfoNum) {
+ this.gateInfoNum = gateInfoNum;
+ }
+
+ public List getGateInfoList() {
+ return gateInfoList;
+ }
+
+ public void setGateInfoList(List gateInfoList) {
+ this.gateInfoList = gateInfoList;
+ }
+
+ public int getLibMatInfoNum() {
+ return libMatInfoNum;
+ }
+
+ public void setLibMatInfoNum(int libMatInfoNum) {
+ this.libMatInfoNum = libMatInfoNum;
+ }
+
+ public List getLibMatInfoList() {
+ return libMatInfoList;
+ }
+
+ public void setLibMatInfoList(List libMatInfoList) {
+ this.libMatInfoList = libMatInfoList;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/runner/InitSubscribeRunner.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/runner/InitSubscribeRunner.java
new file mode 100644
index 0000000..c7d0565
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/runner/InitSubscribeRunner.java
@@ -0,0 +1,43 @@
+package com.casic.missiles.modular.system.runner;
+
+import com.casic.missiles.modular.system.model.Device;
+import com.casic.missiles.modular.system.service.IDeviceSupportService;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class InitSubscribeRunner implements ApplicationRunner {
+ private static Logger logger = LoggerFactory.getLogger(InitSubscribeRunner.class);
+
+ @Value("${iris.face.initSubscribe}")
+ private String initSubscribe;
+ @Autowired
+ private IDeviceSupportService deviceSupportService;
+ @Autowired
+ private IFaceSyncService faceSyncService;
+
+ /**
+ * 启动项目时,根据需要初始化设备订阅信息
+ * @param applicationArguments
+ * @throws Exception
+ */
+ @Override
+ public void run(ApplicationArguments applicationArguments) throws Exception {
+ logger.info("==================initSubscribe: ");
+ if(Boolean.valueOf(initSubscribe)){
+ List deviceList = deviceSupportService.selectDeviceByType("5");
+ List deviceIds = new ArrayList<>();
+ deviceList.forEach(device -> deviceIds.add(Long.valueOf(device.getId())));
+ faceSyncService.initSubscription(deviceIds);
+ }
+ }
+}
diff --git a/casic-face-sync/pom.xml b/casic-face-sync/pom.xml
new file mode 100644
index 0000000..24dc884
--- /dev/null
+++ b/casic-face-sync/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ com.casic
+ casic-iris-parent
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+ casic-face-sync
+ ${pro.version}
+ jar
+ casic-face-sync
+
+
+
+
+
+ com.casic
+ casic-core
+ ${core.version}
+
+
+
+ com.casic
+ casic-admin-support
+ ${admin.version}
+
+
+ com.casic
+ casic-iris-support
+ ${pro.version}
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.8
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.3
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
new file mode 100644
index 0000000..352d47d
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/constant/FaceSyncConst.java
@@ -0,0 +1,29 @@
+package com.casic.missiles.modular.system.constant;
+
+public class FaceSyncConst {
+
+ /**
+ * 单次最大批量上传人员数
+ */
+ public static final int UPLOAD_MAX_PERSON = 6;
+
+ /**
+ * 上传人员库
+ */
+ public static final String UPLOAD_STAFF_LIB = "3";
+ public static final String UPLOAD_VISITOR_LIB = "4";
+
+ public static final String UPLOAD_URL_PREFIX = "/LAPI/V1.0/PeopleLibraries/";
+
+ public static final String UPLOAD_URL_SUFFIX = "/People";
+
+ public static final int UPLOAD_PERSONCODE_MAXLENGTH = 15;
+
+ public static final int UPLOAD_REMARK_MAXLENGTH = 63;
+
+ public static final String SUBSCRIBE_URL = "/LAPI/V1.0/System/Event/Subscription/";
+
+ public static final String STAFF_PERSON_TYPE = "1";
+
+ public static final String VISITOR_PERSON_TYPE = "0";
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
new file mode 100644
index 0000000..1b35431
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/controller/FaceSyncController.java
@@ -0,0 +1,117 @@
+package com.casic.missiles.modular.system.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.casic.missiles.core.base.response.ResponseData;
+import com.casic.missiles.core.common.service.ICommonPermissionService;
+import com.casic.missiles.core.common.service.ICommonPersonService;
+import com.casic.missiles.core.datascope.DataScope;
+import com.casic.missiles.core.util.ToolUtil;
+import com.casic.missiles.modular.system.request.PersonInfo;
+import com.casic.missiles.modular.system.response.RecordNotification;
+import com.casic.missiles.modular.system.service.IFaceSyncService;
+import com.casic.missiles.modular.system.service.IIrisPersonSupportService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.casic.missiles.modular.system.constant.FaceSyncConst;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+@Controller
+public class FaceSyncController {
+ private final static Logger logger = LoggerFactory.getLogger(FaceSyncController.class);
+
+ @Autowired
+ private IFaceSyncService syncService;
+ @Autowired
+ private ICommonPersonService commonPersonService;
+ @Autowired
+ private IIrisPersonSupportService personSupportService;
+ @Autowired
+ private ICommonPermissionService permissionService;
+
+ @RequestMapping("/face/upload")
+ @ResponseBody
+ public Object upload(@RequestParam("personIds") List personIds,
+ @RequestParam("deviceIds") List deviceIds,
+ @RequestParam("personType")String personType ){
+ // 检查数量
+// if(personIds.size()>FaceSyncConst.UPLOAD_MAX_PERSON){
+// return ResponseData.error(String.format("每次最多上传%s个人",FaceSyncConst.UPLOAD_MAX_PERSON));
+// }
+ // 检查照片格式及大小
+ String photoCheck = syncService.checkPersonPhoto(personIds);
+ if(ToolUtil.isNotEmpty(photoCheck)){
+ return ResponseData.error(photoCheck);
+ }
+ else{
+ // 上传数据
+ String error = syncService.uploadPerson(personIds,deviceIds,personType);
+ if(ToolUtil.isNotEmpty(error)){
+ return ResponseData.error(error);
+ }
+ }
+ return ResponseData.success();
+ }
+
+ @RequestMapping("/face/uploadAll")
+ @ResponseBody
+ public Object uploadAll(@RequestParam("deviceIds") List deviceIds){
+ DataScope dataScope = permissionService.getCurrUserDataScope();
+
+ List staffPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.STAFF_PERSON_TYPE);
+ List visitorPersonIds = personSupportService.listIdsByType(dataScope,FaceSyncConst.VISITOR_PERSON_TYPE);
+ // 1.检查照片,分别检查员工、访客
+ String staffPhotoCheck = syncService.checkPersonPhoto(staffPersonIds);
+ if(ToolUtil.isNotEmpty(staffPhotoCheck)){
+ return ResponseData.error(staffPhotoCheck);
+ }
+ String visitorPhotoCheck = syncService.checkPersonPhoto(visitorPersonIds);
+ if(ToolUtil.isNotEmpty(visitorPhotoCheck)){
+ return ResponseData.error(visitorPhotoCheck);
+ }
+
+ // 2. 下发数据
+ String staffError = syncService.uploadPerson(staffPersonIds,deviceIds,FaceSyncConst.STAFF_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(staffError)){
+ return ResponseData.error(staffError);
+ }
+ String visitorError = syncService.uploadPerson(visitorPersonIds,deviceIds,FaceSyncConst.VISITOR_PERSON_TYPE);
+ if(ToolUtil.isNotEmpty(visitorError)){
+ return ResponseData.error(visitorError);
+ }
+
+ return ResponseData.success();
+ }
+
+ // 错误信息返回
+ @RequestMapping("/subsrcibe/init")
+ @ResponseBody
+ public Object upload(@RequestParam("deviceIds") List deviceIds){
+ String errorMsg = syncService.initSubscription(deviceIds);
+ if(ToolUtil.isNotEmpty(errorMsg)){
+ return ResponseData.error(errorMsg);
+ }
+ return ResponseData.success();
+ }
+
+
+ @RequestMapping(value = "/LAPI/V1.0/System/Event/Notification/PersonVerification", method = RequestMethod.POST)
+ @ResponseBody
+ public void verification(@RequestBody String recordNotification){
+ logger.info(recordNotification);
+ RecordNotification record = JSONObject.parseObject(recordNotification,RecordNotification.class);
+ syncService.receiveRecord(record);
+ //return ResponseData.success();
+ }
+
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
new file mode 100644
index 0000000..af53702
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FacePersonSyncMapper.java
@@ -0,0 +1,17 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FacePersonSync;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+public interface FacePersonSyncMapper extends BaseMapper {
+
+ Long getMaxSyncId();
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
new file mode 100644
index 0000000..0c6374a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/FaceSubscribeMapper.java
@@ -0,0 +1,16 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.casic.missiles.modular.system.model.FaceSubscribe;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+public interface FaceSubscribeMapper extends BaseMapper {
+
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
new file mode 100644
index 0000000..ac46ad0
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FacePersonSyncMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PERSON_ID AS personId, SYNC_ID AS syncId
+
+
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
new file mode 100644
index 0000000..16024e2
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/dao/mapping/FaceSubscribeMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SUBSCRIBE_ID AS subscribeId, DEVICE_CODE AS deviceCode, UPDATE_TIME AS updateTime
+
+
+
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
new file mode 100644
index 0000000..7cdb821
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FacePersonSync.java
@@ -0,0 +1,68 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-24
+ */
+@TableName("face_person_sync")
+public class FacePersonSync extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 人员id
+ */
+ @TableId("PERSON_ID")
+ private Long personId;
+ /**
+ * 人员同步id
+ */
+ @TableField("SYNC_ID")
+ private Long syncId;
+
+ public FacePersonSync(Long personId, Long syncId) {
+ this.personId = personId;
+ this.syncId = syncId;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getSyncId() {
+ return syncId;
+ }
+
+ public void setSyncId(Long syncId) {
+ this.syncId = syncId;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.personId;
+ }
+
+ @Override
+ public String toString() {
+ return "FacePersonSync{" +
+ "personId=" + personId +
+ ", syncId=" + syncId +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
new file mode 100644
index 0000000..ccc7792
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/model/FaceSubscribe.java
@@ -0,0 +1,79 @@
+package com.casic.missiles.modular.system.model;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author zyj123
+ * @since 2020-07-25
+ */
+@TableName("face_subscribe")
+public class FaceSubscribe extends Model {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订阅id
+ */
+ @TableId("SUBSCRIBE_ID")
+ private Long subscribeId;
+ /**
+ * 设备编号
+ */
+ @TableField("DEVICE_CODE")
+ private String deviceCode;
+ /**
+ * 更新时间
+ */
+ @TableField("UPDATE_TIME")
+ private Date updateTime;
+
+
+ public Long getSubscribeId() {
+ return subscribeId;
+ }
+
+ public void setSubscribeId(Long subscribeId) {
+ this.subscribeId = subscribeId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ @Override
+ protected Serializable pkVal() {
+ return this.subscribeId;
+ }
+
+ @Override
+ public String toString() {
+ return "FaceSubscribe{" +
+ "subscribeId=" + subscribeId +
+ ", deviceCode=" + deviceCode +
+ ", updateTime=" + updateTime +
+ "}";
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
new file mode 100644
index 0000000..80d9eff
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/request/PersonInfo.java
@@ -0,0 +1,271 @@
+package com.casic.missiles.modular.system.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonInfo {
+
+ //@JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personID;
+
+ //@JSONField(name = "LastChange")
+ @SerializedName("LastChange")
+ private Long lastChange;
+
+ //@JSONField(name = "PersonCode")
+ @SerializedName("PersonCode")
+ private String personCode;
+
+ //@JSONField(name = "PersonName")
+ @SerializedName("PersonName")
+ private String personName;
+
+ //@JSONField(name = "Remarks")
+ @SerializedName("Remarks")
+ private String remarks;
+
+ //@JSONField(name = "TimeTemplateNum")
+ @SerializedName("TimeTemplateNum")
+ private Integer timeTemplateNum;
+
+ //@JSONField(name = "TimeTemplateList")
+ @SerializedName("TimeTemplateList")
+ private List timeTemplateList;
+
+ //@JSONField(name = "IdentificationNum")
+ @SerializedName("IdentificationNum")
+ private Integer identificationNum;
+
+ //@JSONField(name = "IdentificationList")
+ @SerializedName("IdentificationList")
+ private List identificationList;
+
+ //@JSONField(name = "ImageNum")
+ @SerializedName("ImageNum")
+ private Integer imageNum;
+
+ //@JSONField(name = "ImageList")
+ @SerializedName("ImageList")
+ private List imageList;
+
+ public Long getPersonID() {
+ return personID;
+ }
+
+ public void setPersonID(Long personID) {
+ this.personID = personID;
+ }
+
+ public Long getLastChange() {
+ return lastChange;
+ }
+
+ public void setLastChange(Long lastChange) {
+ this.lastChange = lastChange;
+ }
+
+ public String getPersonCode() {
+ return personCode;
+ }
+
+ public void setPersonCode(String personCode) {
+ this.personCode = personCode;
+ }
+
+ public String getPersonName() {
+ return personName;
+ }
+
+ public void setPersonName(String personName) {
+ this.personName = personName;
+ }
+
+ public String getRemarks() {
+ return remarks;
+ }
+
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ public Integer getTimeTemplateNum() {
+ return timeTemplateNum;
+ }
+
+ public void setTimeTemplateNum(Integer timeTemplateNum) {
+ this.timeTemplateNum = timeTemplateNum;
+ }
+
+ public List getTimeTemplateList() {
+ return timeTemplateList;
+ }
+
+ public void setTimeTemplateList(List timeTemplateList) {
+ this.timeTemplateList = timeTemplateList;
+ }
+
+ public Integer getIdentificationNum() {
+ return identificationNum;
+ }
+
+ public void setIdentificationNum(Integer identificationNum) {
+ this.identificationNum = identificationNum;
+ }
+
+ public List getIdentificationList() {
+ return identificationList;
+ }
+
+ public void setIdentificationList(List identificationList) {
+ this.identificationList = identificationList;
+ }
+
+ public Integer getImageNum() {
+ return imageNum;
+ }
+
+ public void setImageNum(Integer imageNum) {
+ this.imageNum = imageNum;
+ }
+
+ public List getImageList() {
+ return imageList;
+ }
+
+ public void setImageList(List imageList) {
+ this.imageList = imageList;
+ }
+
+ public class TimeTemplate{
+ @JSONField(name = "BeginTime")
+ private Long beginTime;
+ @JSONField(name = "EndTime")
+ private Long endTime;
+ @JSONField(name = "Index")
+ private Long index;
+
+ public TimeTemplate(Long beginTime, Long endTime, Long index) {
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ this.index = index;
+ }
+
+ public Long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(Long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getIndex() {
+ return index;
+ }
+
+ public void setIndex(Long index) {
+ this.index = index;
+ }
+ }
+
+ public TimeTemplate createTimeTemplate(Long beginTime, Long endTime, Long index){
+ return new TimeTemplate(beginTime, endTime, index);
+ }
+
+ public class IdentificationInfo {
+ @JSONField(name = "Type")
+ private Integer type;
+ @JSONField(name = "Number")
+ private String number;
+
+ public IdentificationInfo(Integer type, String number) {
+ this.type = type;
+ this.number = number;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+ }
+
+ public IdentificationInfo createIdentificationInfo(Integer type, String number){
+ return new IdentificationInfo(type,number);
+ }
+
+ public class ImageInfo{
+ @JSONField(name = "FaceID")
+ private Long faceID;
+ @JSONField(name = "Name")
+ private String name;
+ @JSONField(name = "Size")
+ private Long size;
+ @JSONField(name = "Data")
+ private String data;
+
+ public ImageInfo(Long faceID, String name, Long size, String data) {
+ this.faceID = faceID;
+ this.name = name;
+ this.size = size;
+ this.data = data;
+ }
+
+ public Long getFaceID() {
+ return faceID;
+ }
+
+ public void setFaceID(Long faceID) {
+ this.faceID = faceID;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+ }
+
+ public ImageInfo createImageInfo(Long faceID, String name, Long size, String data){
+ return new ImageInfo(faceID, name, size, data);
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
new file mode 100644
index 0000000..fe93b8a
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceBaseResponse.java
@@ -0,0 +1,90 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+public class FaceBaseResponse {
+ @JSONField(name = "ResponseURL")
+ @SerializedName("ResponseURL")
+ private String responseUrl;
+
+ @JSONField(name = "CreatedID")
+ @SerializedName("CreatedID")
+ private int createdId;
+
+ @JSONField(name = "ResponseCode")
+ @SerializedName("ResponseCode")
+ private int responseCode;
+
+ @JSONField(name = "ResponseString")
+ @SerializedName("ResponseString")
+ private String responseString;
+
+ @JSONField(name = "StatusCode")
+ @SerializedName("StatusCode")
+ private int statusCode;
+
+ @JSONField(name = "StatusString")
+ @SerializedName("StatusString")
+ private String statusString;
+
+ //@JSONField(name = "Data")
+ @SerializedName("Data")
+ private T data;
+
+ public String getResponseUrl() {
+ return responseUrl;
+ }
+
+ public void setResponseUrl(String responseUrl) {
+ this.responseUrl = responseUrl;
+ }
+
+ public int getCreatedId() {
+ return createdId;
+ }
+
+ public void setCreatedId(int createdId) {
+ this.createdId = createdId;
+ }
+
+ public int getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(int responseCode) {
+ this.responseCode = responseCode;
+ }
+
+ public String getResponseString() {
+ return responseString;
+ }
+
+ public void setResponseString(String responseString) {
+ this.responseString = responseString;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(int statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusString() {
+ return statusString;
+ }
+
+ public void setStatusString(String statusString) {
+ this.statusString = statusString;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
new file mode 100644
index 0000000..f128c92
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/FaceInfo.java
@@ -0,0 +1,128 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class FaceInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "CapSrc")
+ private Long capSrc;
+ @JSONField(name = "FeatureNum")
+ private Long featureNum;
+ @JSONField(name = "FeatureList")
+ private List featureList;
+ @JSONField(name = "FeatureVersion")
+ private String featureVersion;
+ @JSONField(name = "Feature")
+ private String feature;
+ @JSONField(name = "Temperature")
+ private Float temperature;
+ @JSONField(name = "MaskFlag")
+ private Long maskFlag;
+ @JSONField(name = "PanoImage")
+ private Object panoImage;
+ @JSONField(name = "FaceImage")
+ private Object faceImage;
+ @JSONField(name = "FaceArea")
+ private Object faceArea;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public Long getCapSrc() {
+ return capSrc;
+ }
+
+ public void setCapSrc(Long capSrc) {
+ this.capSrc = capSrc;
+ }
+
+ public Long getFeatureNum() {
+ return featureNum;
+ }
+
+ public void setFeatureNum(Long featureNum) {
+ this.featureNum = featureNum;
+ }
+
+ public List getFeatureList() {
+ return featureList;
+ }
+
+ public void setFeatureList(List featureList) {
+ this.featureList = featureList;
+ }
+
+ public String getFeatureVersion() {
+ return featureVersion;
+ }
+
+ public void setFeatureVersion(String featureVersion) {
+ this.featureVersion = featureVersion;
+ }
+
+ public String getFeature() {
+ return feature;
+ }
+
+ public void setFeature(String feature) {
+ this.feature = feature;
+ }
+
+ public Float getTemperature() {
+ return temperature;
+ }
+
+ public void setTemperature(Float temperature) {
+ this.temperature = temperature;
+ }
+
+ public Long getMaskFlag() {
+ return maskFlag;
+ }
+
+ public void setMaskFlag(Long maskFlag) {
+ this.maskFlag = maskFlag;
+ }
+
+ public Object getPanoImage() {
+ return panoImage;
+ }
+
+ public void setPanoImage(Object panoImage) {
+ this.panoImage = panoImage;
+ }
+
+ public Object getFaceImage() {
+ return faceImage;
+ }
+
+ public void setFaceImage(Object faceImage) {
+ this.faceImage = faceImage;
+ }
+
+ public Object getFaceArea() {
+ return faceArea;
+ }
+
+ public void setFaceArea(Object faceArea) {
+ this.faceArea = faceArea;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
new file mode 100644
index 0000000..ce6dd33
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/LibMatInfo.java
@@ -0,0 +1,69 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+public class LibMatInfo {
+ @JSONField(name = "ID")
+ private Long id;
+ @JSONField(name = "LibID")
+ private Long libId;
+ @JSONField(name = "LibType")
+ private Long libType;
+ @JSONField(name = "MatchStatus")
+ private Long matchStatus;
+ @JSONField(name = "MatchPersonID")
+ private Long matchPersonId;
+ @JSONField(name = "MatchFaceID")
+ private Long matchFaceId;
+
+ // MatchPersonInfo 暂时忽略不用
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getLibId() {
+ return libId;
+ }
+
+ public void setLibId(Long libId) {
+ this.libId = libId;
+ }
+
+ public Long getLibType() {
+ return libType;
+ }
+
+ public void setLibType(Long libType) {
+ this.libType = libType;
+ }
+
+ public Long getMatchStatus() {
+ return matchStatus;
+ }
+
+ public void setMatchStatus(Long matchStatus) {
+ this.matchStatus = matchStatus;
+ }
+
+ public Long getMatchPersonId() {
+ return matchPersonId;
+ }
+
+ public void setMatchPersonId(Long matchPersonId) {
+ this.matchPersonId = matchPersonId;
+ }
+
+ public Long getMatchFaceId() {
+ return matchFaceId;
+ }
+
+ public void setMatchFaceId(Long matchFaceId) {
+ this.matchFaceId = matchFaceId;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
new file mode 100644
index 0000000..186faed
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseData.java
@@ -0,0 +1,31 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonResponseData {
+ @JSONField(name = "Num")
+ @SerializedName("Num")
+ private int num;
+ @JSONField(name = "PersonList")
+ @SerializedName("PersonList")
+ private List personList;
+
+ public int getNum() {
+ return num;
+ }
+
+ public void setNum(int num) {
+ this.num = num;
+ }
+
+ public List getPersonList() {
+ return personList;
+ }
+
+ public void setPersonList(List personList) {
+ this.personList = personList;
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java
new file mode 100644
index 0000000..7ba3edc
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/PersonResponseInfo.java
@@ -0,0 +1,67 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PersonResponseInfo {
+ @JSONField(name = "PersonID")
+ @SerializedName("PersonID")
+ private Long personId;
+ @JSONField(name = "FaceNum")
+ @SerializedName("FaceNum")
+ private Long faceNum;
+ @JSONField(name = "FaceList")
+ @SerializedName("FaceList")
+ private List faceList;
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+
+ public Long getFaceNum() {
+ return faceNum;
+ }
+
+ public void setFaceNum(Long faceNum) {
+ this.faceNum = faceNum;
+ }
+
+ public List getFaceList() {
+ return faceList;
+ }
+
+ public void setFaceList(List faceList) {
+ this.faceList = faceList;
+ }
+
+ public class PersonResponseFace{
+ @JSONField(name = "FaceID")
+ @SerializedName("FaceID")
+ private Long faceId;
+ @JSONField(name = "ResultCode")
+ @SerializedName("ResultCode")
+ private Long resultCode;
+
+ public Long getFaceId() {
+ return faceId;
+ }
+
+ public void setFaceId(Long faceId) {
+ this.faceId = faceId;
+ }
+
+ public Long getResultCode() {
+ return resultCode;
+ }
+
+ public void setResultCode(Long resultCode) {
+ this.resultCode = resultCode;
+ }
+ }
+}
diff --git a/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/RecordNotification.java b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/RecordNotification.java
new file mode 100644
index 0000000..ca52d29
--- /dev/null
+++ b/casic-face-sync/src/main/java/com/casic/missiles/modular/system/response/RecordNotification.java
@@ -0,0 +1,138 @@
+package com.casic.missiles.modular.system.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.List;
+
+public class RecordNotification {
+ @JSONField(name = "Reference")
+ private String reference;
+ @JSONField(name = "Seq")
+ private int seq;
+ @JSONField(name = "DeviceCode")
+ private String deviceCode;
+ @JSONField(name = "Timestamp")
+ private Long timestamp;
+ @JSONField(name = "NotificationType")
+ private int notificationType;
+ @JSONField(name = "FaceInfoNum")
+ private int faceInfoNum;
+ @JSONField(name = "FaceInfoList")
+ private List