Commit 1232df0d5bff5de02f046faf2074c7dc7dedf677

Authored by 徐泉
1 parent b8a3cdaf
Exists in master

智能校卫一阶段优化代码提交

Showing 20 changed files with 2165 additions and 17 deletions   Show diff stats
cloud/haikangface/src/main/java/com/sincere/haikangface/bean/Result.java 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +package com.sincere.haikangface.bean;
  2 +
  3 +/**
  4 + * 统一API响应结果封装
  5 + */
  6 +public class Result<T> {
  7 + private int code;
  8 + private String message;
  9 + private T data;
  10 +
  11 + public Result<T> setCode(ResultCode resultCode) {
  12 + this.code = resultCode.code();
  13 + return this;
  14 + }
  15 +
  16 + public int getCode() {
  17 + return code;
  18 + }
  19 +
  20 + public String getMessage() {
  21 + return message;
  22 + }
  23 +
  24 + public Result<T> setMessage(String message) {
  25 + this.message = message;
  26 + return this;
  27 + }
  28 +
  29 + public T getData() {
  30 + return data;
  31 + }
  32 +
  33 + Result<T> setData(T data) {
  34 + this.data = data;
  35 + return this;
  36 + }
  37 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultCode.java 0 → 100644
... ... @@ -0,0 +1,28 @@
  1 +package com.sincere.haikangface.bean;
  2 +
  3 +/**
  4 + * 响应码枚举,参考HTTP状态码的语义
  5 + */
  6 +public enum ResultCode {
  7 +
  8 + // 成功
  9 + SUCCESS(200),
  10 + // 失败
  11 + FAIL(400),
  12 + // 未认证(签名错误)
  13 + UNAUTHORIZED(401),
  14 + // 接口不存在
  15 + NOT_FOUND(404),
  16 + // 服务器内部错误
  17 + INTERNAL_SERVER_ERROR(500);
  18 +
  19 + private final int code;
  20 +
  21 + ResultCode(int code){
  22 + this.code = code;
  23 + }
  24 +
  25 + public int code() {
  26 + return code;
  27 + }
  28 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultGenerator.java 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +package com.sincere.haikangface.bean;
  2 +
  3 +/**
  4 + * 响应结果生成工具
  5 + */
  6 +public class ResultGenerator {
  7 + private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
  8 +
  9 + private ResultGenerator() {}
  10 +
  11 + public static Result<String> genSuccessResult() {
  12 + return new Result<String>()
  13 + .setCode(ResultCode.SUCCESS)
  14 + .setMessage(DEFAULT_SUCCESS_MESSAGE);
  15 + }
  16 +
  17 + public static <T> Result<T> genSuccessResult(T data) {
  18 + return new Result<T>()
  19 + .setCode(ResultCode.SUCCESS)
  20 + .setMessage(DEFAULT_SUCCESS_MESSAGE)
  21 + .setData(data);
  22 + }
  23 + public static Result genFailResult(String message) {
  24 + return new Result()
  25 + .setCode(ResultCode.FAIL)
  26 + .setMessage(message);
  27 + }
  28 +
  29 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/AuthRecordDto.java 0 → 100644
... ... @@ -0,0 +1,86 @@
  1 +package com.sincere.haikangface.bean.face;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * 权限记录实体
  10 + * @author xuquan
  11 + * @date 2020/12/16 09:10
  12 + */
  13 +@ApiModel
  14 +public class AuthRecordDto {
  15 +
  16 + @ApiModelProperty("权限表ID")
  17 + private Integer id ;
  18 + @ApiModelProperty("1 学生类型 2 学生组")
  19 + private Integer type ;
  20 + @ApiModelProperty("学校ID")
  21 + private Integer schoolId ;
  22 + @ApiModelProperty("设备号,逗号隔开")
  23 + private List<String> snList;
  24 + @ApiModelProperty("学生类型,1通校2住校")
  25 + private Integer studentType ;
  26 + @ApiModelProperty("权限周计划列表")
  27 + private List<WeekDay> weekDays ;
  28 + @ApiModelProperty("权限类型1微耕权限2人脸机权限")
  29 + private Integer authType;
  30 +
  31 + public Integer getId() {
  32 + return id;
  33 + }
  34 +
  35 + public void setId(Integer id) {
  36 + this.id = id;
  37 + }
  38 +
  39 + public Integer getType() {
  40 + return type;
  41 + }
  42 +
  43 + public void setType(Integer type) {
  44 + this.type = type;
  45 + }
  46 +
  47 + public Integer getSchoolId() {
  48 + return schoolId;
  49 + }
  50 +
  51 + public void setSchoolId(Integer schoolId) {
  52 + this.schoolId = schoolId;
  53 + }
  54 +
  55 + public List<String> getSnList() {
  56 + return snList;
  57 + }
  58 +
  59 + public void setSnList(List<String> snList) {
  60 + this.snList = snList;
  61 + }
  62 +
  63 + public Integer getStudentType() {
  64 + return studentType;
  65 + }
  66 +
  67 + public void setStudentType(Integer studentType) {
  68 + this.studentType = studentType;
  69 + }
  70 +
  71 + public List<WeekDay> getWeekDays() {
  72 + return weekDays;
  73 + }
  74 +
  75 + public void setWeekDays(List<WeekDay> weekDays) {
  76 + this.weekDays = weekDays;
  77 + }
  78 +
  79 + public Integer getAuthType() {
  80 + return authType;
  81 + }
  82 +
  83 + public void setAuthType(Integer authType) {
  84 + this.authType = authType;
  85 + }
  86 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/DeviceAuthRecord.java 0 → 100644
... ... @@ -0,0 +1,140 @@
  1 +package com.sincere.haikangface.bean.face;
  2 +
  3 +import java.util.Date;
  4 +
  5 +/**
  6 + * 下发权限时段实体类
  7 + * @author xuquan
  8 + * @date 2020/12/17 12:40
  9 + */
  10 +public class DeviceAuthRecord {
  11 +
  12 + private int id;
  13 + //时段
  14 + private String shiduan ;
  15 + //学生组 就是powerGroupId 学生类型就是 studentType
  16 + private int studentType ;
  17 + //性别
  18 + private String sex ;
  19 + //学校ID
  20 + private int schoolId ;
  21 + //开始时间
  22 + private Date startTime ;
  23 + //结束时间
  24 + private Date endTime ;
  25 + //设备ID
  26 + private String sno ;
  27 + //周计划json
  28 + private String weekDays;
  29 + //状态
  30 + private int state;
  31 + //下发状态
  32 + private int grantState;
  33 + //权限类型
  34 + private int authType;
  35 + //计划类型
  36 + private int aType;
  37 +
  38 + public int getId() {
  39 + return id;
  40 + }
  41 + public void setId(int id) {
  42 + this.id = id;
  43 + }
  44 +
  45 + public String getShiduan() {
  46 + return shiduan;
  47 + }
  48 +
  49 + public void setShiduan(String shiduan) {
  50 + this.shiduan = shiduan;
  51 + }
  52 +
  53 + public int getAuthType() {
  54 + return authType;
  55 + }
  56 +
  57 + public void setAuthType(int authType) {
  58 + this.authType = authType;
  59 + }
  60 +
  61 + public String getSno() {
  62 + return sno;
  63 + }
  64 +
  65 + public void setSno(String sno) {
  66 + this.sno = sno;
  67 + }
  68 +
  69 + public int getStudentType() {
  70 + return studentType;
  71 + }
  72 +
  73 + public void setStudentType(int studentType) {
  74 + this.studentType = studentType;
  75 + }
  76 +
  77 + public String getSex() {
  78 + return sex;
  79 + }
  80 +
  81 + public void setSex(String sex) {
  82 + this.sex = sex;
  83 + }
  84 +
  85 + public int getSchoolId() {
  86 + return schoolId;
  87 + }
  88 +
  89 + public void setSchoolId(int schoolId) {
  90 + this.schoolId = schoolId;
  91 + }
  92 +
  93 + public Date getStartTime() {
  94 + return startTime;
  95 + }
  96 +
  97 + public void setStartTime(Date startTime) {
  98 + this.startTime = startTime;
  99 + }
  100 +
  101 + public Date getEndTime() {
  102 + return endTime;
  103 + }
  104 +
  105 + public void setEndTime(Date endTime) {
  106 + this.endTime = endTime;
  107 + }
  108 +
  109 + public String getWeekDays() {
  110 + return weekDays;
  111 + }
  112 +
  113 + public void setWeekDays(String weekDays) {
  114 + this.weekDays = weekDays;
  115 + }
  116 +
  117 + public int getState() {
  118 + return state;
  119 + }
  120 +
  121 + public void setState(int state) {
  122 + this.state = state;
  123 + }
  124 +
  125 + public int getGrantState() {
  126 + return grantState;
  127 + }
  128 +
  129 + public void setGrantState(int grantState) {
  130 + this.grantState = grantState;
  131 + }
  132 +
  133 + public int getaType() {
  134 + return aType;
  135 + }
  136 +
  137 + public void setaType(int aType) {
  138 + this.aType = aType;
  139 + }
  140 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/sendFaceResult.java 0 → 100644
... ... @@ -0,0 +1,4 @@
  1 +package com.sincere.haikangface.bean.face;
  2 +
  3 +public class sendFaceResult {
  4 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java 0 → 100644
... ... @@ -0,0 +1,136 @@
  1 +package com.sincere.haikangface.control;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.fasterxml.jackson.databind.JavaType;
  5 +import com.sincere.haikangface.async.SendUserAsync;
  6 +import com.sincere.haikangface.bean.Result;
  7 +import com.sincere.haikangface.bean.ResultGenerator;
  8 +import com.sincere.haikangface.bean.face.AuthRecordDto;
  9 +import com.sincere.haikangface.bean.face.DeviceAuthRecord;
  10 +import com.sincere.haikangface.bean.face.PermissionBean;
  11 +import com.sincere.haikangface.bean.face.WeekDay;
  12 +import com.sincere.haikangface.dao.UserDao;
  13 +import com.sincere.haikangface.enums.EnumSzBusinessType;
  14 +import com.sincere.haikangface.service.UserOperateService;
  15 +import com.sincere.haikangface.utils.FileUtils;
  16 +import com.sincere.haikangface.utils.JsonUtils;
  17 +import io.swagger.annotations.ApiOperation;
  18 +import lombok.extern.slf4j.Slf4j;
  19 +import org.springframework.beans.factory.annotation.Autowired;
  20 +import org.springframework.http.MediaType;
  21 +import org.springframework.util.StringUtils;
  22 +import org.springframework.web.bind.annotation.*;
  23 +
  24 +import java.util.ArrayList;
  25 +import java.util.Arrays;
  26 +import java.util.List;
  27 +import java.util.Map;
  28 +
  29 +/**
  30 + * 用户信息、人脸、卡信息、权限下发控制类
  31 + * @author xuquan
  32 + * @date 2020/12/01 15:16
  33 + */
  34 +@Slf4j
  35 +@RestController
  36 +@RequestMapping(value = "/operate/*", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  37 +public class UserOperateController {
  38 +
  39 + @Autowired
  40 + UserDao userDao;
  41 + @Autowired
  42 + SendUserAsync sendUserAsync;
  43 + @Autowired
  44 + UserOperateService userOperateService;
  45 +
  46 + @RequestMapping(value = "createHKAuth", method = RequestMethod.POST)
  47 + @ApiOperation("人脸机创建权限2.0")
  48 + public Result sendPermiss(@RequestBody AuthRecordDto authRecordDto) {
  49 + log.info("permissionBean:{}", JSON.toJSONString(authRecordDto));
  50 + if(userOperateService.createHKAuth(authRecordDto)){
  51 + return ResultGenerator.genSuccessResult();
  52 + }else{
  53 + return ResultGenerator.genFailResult("权限创建失败");
  54 + }
  55 + }
  56 +
  57 + private static JsonUtils objectMapper = JsonUtils.nonEmptyMapper();
  58 + @RequestMapping(value = "sendHKAuth", method = RequestMethod.POST)
  59 + @ApiOperation("下发权限给设备2.0")
  60 + public Result sendHKPermiss(@RequestParam("authId") Integer authId) {
  61 + DeviceAuthRecord record = userDao.getAuthRecord(authId);
  62 + if(record ==null){
  63 + log.info("未查询到对应权限ID: {}, 权限计划。",authId);
  64 + return ResultGenerator.genFailResult("未查询到对应权限");
  65 + }
  66 + Integer studentType = record.getStudentType();
  67 + //周计划
  68 + String weekDaysJson = record.getWeekDays();
  69 + JavaType javaType = objectMapper.contructCollectionType(ArrayList.class, WeekDay.class);
  70 + ArrayList<WeekDay> weekDayList = objectMapper.fromJson(weekDaysJson,javaType);
  71 + //设备ID
  72 + String[] deviceArr = record.getSno().split(",");
  73 + List<String> devices= new ArrayList<>(Arrays.asList(deviceArr));
  74 + PermissionBean permissionBean = new PermissionBean();
  75 + permissionBean.setWeekDays(weekDayList);
  76 + permissionBean.setDeviceIds(devices);
  77 + permissionBean.setSchoolId(String.valueOf(record.getSchoolId()));
  78 + permissionBean.setUserType(String.valueOf(EnumSzBusinessType.EnumUserType.STUDENT.code));
  79 + FileUtils.getInstance().writeLogs("传入权限模板:" + JSON.toJSONString(permissionBean), "设置权限内容.txt");
  80 + if (!StringUtils.isEmpty(permissionBean.getDeviceIds())) {
  81 + if(sendUserAsync.sendHKAuth(permissionBean,record.getId(),studentType)){
  82 + return ResultGenerator.genSuccessResult();
  83 + }else{
  84 + return ResultGenerator.genFailResult("下发权限失败");
  85 + }
  86 + }
  87 + return ResultGenerator.genSuccessResult();
  88 + }
  89 +
  90 + @ApiOperation("删除单卡权限2.0")
  91 + @RequestMapping(value = "deleteCardAuth",method = RequestMethod.GET)
  92 + public Result deleteCardAuth(Integer authId){
  93 + userOperateService.deleteAuthRecord(authId);
  94 + return ResultGenerator.genSuccessResult();
  95 + }
  96 +
  97 + @ApiOperation("获取权限详情权限2.0")
  98 + @RequestMapping(value = "getCardAuth",method = RequestMethod.GET)
  99 + public Result<DeviceAuthRecord> getCardAuth(Integer authId){
  100 + return ResultGenerator.genSuccessResult(userOperateService.getAuthRecord(authId));
  101 + }
  102 +
  103 + @ApiOperation("重新下发人脸2.0")
  104 + @RequestMapping(value = "againSendFace",method = RequestMethod.GET)
  105 + public Result againSendFace(String userId,String deviceId,Integer userType){
  106 + return userOperateService.againSendFace(userId,deviceId,userType);
  107 + }
  108 +
  109 + @ApiOperation(value = "照片下发2.0")
  110 + @RequestMapping(value = "sendFace", method = RequestMethod.GET)
  111 + public Result sendFace(@RequestParam("schoolId") String schoolId, @RequestParam("type") int type,@RequestParam("deviceIds") String deviceIds) {
  112 + return userOperateService.sendFace(schoolId,type,deviceIds);
  113 + }
  114 +
  115 + // /**
  116 +// * 下发卡权限至指定设备(含批量)
  117 +// * @param permissionBean
  118 +// * @return
  119 +// */
  120 +// @RequestMapping(value = "sendUserPermission", method = RequestMethod.POST)
  121 +// @ApiOperation("下发权限给设备")
  122 +// public boolean sendUserPermission(@RequestBody PermissionBean permissionBean) {
  123 +// log.error("permissionBean:{}", JSON.toJSONString(permissionBean));
  124 +// FileUtils.getInstance().writeLogs("传入权限模板:" + JSON.toJSONString(permissionBean), "设置权限内容.txt");
  125 +//
  126 +// return userOperateService.sendUserPermission(permissionBean);
  127 +// }
  128 +//
  129 +//
  130 +// @RequestMapping(value = "sendUserFace", method = RequestMethod.POST)
  131 +// @ApiOperation("下发人脸给设备")
  132 +// public boolean sendUserFace(@RequestParam("filePath") String filePath, @RequestParam("userId") String userId,@RequestParam("userType") Integer userType,
  133 +// @RequestParam("schoolId") String schoolId, @RequestParam("deviceId") String deviceId) {
  134 +// return userOperateService.sendUserFace(filePath,schoolId, userId,userType,deviceId);
  135 +// }
  136 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumDeviceType.java 0 → 100644
... ... @@ -0,0 +1,36 @@
  1 +package com.sincere.haikangface.enums;
  2 +
  3 +/**
  4 + * 设备类型枚举
  5 + *
  6 + * @author xuquan
  7 + * @date 2020/11/11 16:06
  8 + */
  9 +
  10 +public enum EnumDeviceType {
  11 +
  12 + SCHOOL_CARD(1, "校牌"),
  13 + CLASS_CARD(2, "班牌"),
  14 + CLOUD_WINDOW(4, "云视窗"),
  15 + ZJ_CONTROL(6, "闸机控制器"),
  16 + LOAN_PERIOD(7, "话机"),
  17 + HK_FACE(18, "海康人脸设备"),
  18 + FACE(19, "人脸设备"),
  19 + DH_FACE(22, "大华人脸设备"),
  20 + HK_ZW(23, "海康指纹机"),
  21 + ZK_ZW(24, "中控指纹机"),
  22 + BG_FACE_WG(25, "博观人脸带温感"),
  23 + BG_FACE_CG(26, "博观人脸常规"),
  24 + LQ_QS(27, "乐清寝室看板"),
  25 + HK_FACE_YTJ(28, "海康人脸权限一体机"),
  26 + DH_FACE_YTJ(29, "大华人脸权限一体机");
  27 +
  28 + public final int deviceType;
  29 + public final String deviceName;
  30 +
  31 + EnumDeviceType(int deviceType, String deviceName) {
  32 + this.deviceType = deviceType;
  33 + this.deviceName = deviceName;
  34 + }
  35 +
  36 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendCardErrorType.java 0 → 100644
... ... @@ -0,0 +1,51 @@
  1 +package com.sincere.haikangface.enums;
  2 +
  3 +import org.apache.commons.lang.StringUtils;
  4 +
  5 +/**
  6 + *下发卡常见异常码、异常描述枚举
  7 + * @author xuquan
  8 + * @date 2020/11/11 15:19
  9 + */
  10 +
  11 +public enum EnumSendCardErrorType {
  12 +
  13 + CHECK_DATA_ERR_21("21", "对返回数据的校验出错"),
  14 + EXIST_USER_146("146", "用户已存在"),
  15 + NOT_ONLINE_USER_147("147", "用户不存在"),
  16 + UNKNOWN_1091("1091" , "未知错误"),
  17 + UNKNOWN_1147("1147" , "未知错误"),
  18 + UNKNOWN_1162("1162", "未知错误");
  19 +
  20 + public final String code;
  21 + public final String message;
  22 +
  23 + public String getCode() {
  24 + return code;
  25 + }
  26 +
  27 + public String getMessage() {
  28 + return message;
  29 + }
  30 +
  31 + EnumSendCardErrorType(String code, String message) {
  32 + this.code = code;
  33 + this.message = message;
  34 + }
  35 +
  36 + /**
  37 + * 根据key获得具体的值
  38 + */
  39 + public static EnumSendCardErrorType getByCode(String code){
  40 + if(StringUtils.isBlank(code)){
  41 + return null;
  42 + }
  43 + for(EnumSendCardErrorType enums: EnumSendCardErrorType.values()){
  44 + if(enums.getCode().equals(code)){
  45 + return enums;
  46 + }
  47 + }
  48 + return null;
  49 + }
  50 +
  51 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceErrorType.java 0 → 100644
... ... @@ -0,0 +1,50 @@
  1 +package com.sincere.haikangface.enums;
  2 +
  3 +import org.apache.commons.lang.StringUtils;
  4 +
  5 +/**
  6 + * 下发人脸常见异常码、异常描述枚举
  7 + * @author xuquan
  8 + * @date 2020/11/11 15:23
  9 + */
  10 +public enum EnumSendFaceErrorType {
  11 +
  12 + CHECK_DATA_ERR_21("21", "对返回数据的校验出错"),
  13 + EXCEED_SIZE_1028("1028", "图片大小超限"),
  14 + NOT_EXIST_USER_1029("1029", "用户ID不存在"),
  15 + EXTRACT_ERROR_1030("1030", "照片特征值提取失败"),
  16 + EXIST_IMG_1031("1031", "照片已存在"),
  17 + UPPER_LIMIT_1032("1032", "照片数量超过上限");
  18 +
  19 + public final String code;
  20 + public final String message;
  21 +
  22 + public String getCode() {
  23 + return code;
  24 + }
  25 +
  26 + public String getMessage() {
  27 + return message;
  28 + }
  29 +
  30 + EnumSendFaceErrorType(String code, String message) {
  31 + this.code = code;
  32 + this.message = message;
  33 + }
  34 +
  35 + /**
  36 + * 根据key获得具体的值
  37 + */
  38 + public static EnumSendFaceErrorType getByCode(String code){
  39 + if(StringUtils.isBlank(code)){
  40 + return null;
  41 + }
  42 + for(EnumSendFaceErrorType enums: EnumSendFaceErrorType.values()){
  43 + if(enums.getCode().equals(code)){
  44 + return enums;
  45 + }
  46 + }
  47 + return null;
  48 + }
  49 +
  50 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceType.java 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +package com.sincere.haikangface.enums;
  2 +
  3 +/**
  4 + * 下发人脸枚举配置中心
  5 + *
  6 + * @Author: xuquan
  7 + * @Date: 2020/11/1 14:59
  8 + */
  9 +public enum EnumSendFaceType {
  10 +
  11 + NOT_EXIST_DEVICE(1, "设备不存在"),
  12 + NOT_ONLINE_DEVICE(2, "设备不在线"),
  13 + FACE_AND_CARD_FAIL(3, "人脸信息、卡信息下发失败"),
  14 + FACE_FAIL_CARD_SUCCESS(4, "人脸信息下发失败,卡信息下发成功"),
  15 + FACE_SUCCESS_CARD_FAIl(5, "人脸信息下发成功,卡信息下发失败"),
  16 + TIME_INTERVAL_ERROR(6, "刷卡时段验证错误");
  17 +
  18 + public final int code;
  19 + public final String message;
  20 +
  21 + EnumSendFaceType(int code, String message) {
  22 + this.code = code;
  23 + this.message = message;
  24 + }
  25 +
  26 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSzBusinessType.java 0 → 100644
... ... @@ -0,0 +1,125 @@
  1 +package com.sincere.haikangface.enums;
  2 +
  3 +/**
  4 + * 顺治科技智能校卫业务枚举配置中心
  5 + *
  6 + * @author xuquan
  7 + * @date 2020/11/11 14:43
  8 + */
  9 +
  10 +public interface EnumSzBusinessType {
  11 +
  12 + /**
  13 + * 用户类型
  14 + */
  15 + public enum EnumUserType {
  16 +
  17 + TEACHER(1, "teacher","老师"),
  18 + STUDENT(2, "student","学生");
  19 +// PARENT(3, "parent","家长");
  20 +
  21 + public final int code;
  22 + public final String enName;
  23 + public final String cnName;
  24 +
  25 + EnumUserType(int code, String enName,String cnName) {
  26 + this.code = code;
  27 + this.enName = enName;
  28 + this.cnName = cnName;
  29 + }
  30 + }
  31 +
  32 + /**
  33 + * 学生出入类型
  34 + */
  35 + public enum EnumStudentType {
  36 +
  37 + GO_OUT(1, "通校"),
  38 + LIVING(2, "住校"),
  39 + ALL(3, "全部");
  40 +
  41 + public final int code;
  42 + public final String name;
  43 +
  44 + EnumStudentType(int code, String name) {
  45 + this.code = code;
  46 + this.name = name;
  47 + }
  48 + }
  49 +
  50 + /**
  51 + * 设备出入类型
  52 + */
  53 + public enum EnumDeviceInAndOut {
  54 +
  55 + INT(1, "进校"),
  56 + OUT(0, "出校");
  57 +
  58 + public final int code;
  59 + public final String name;
  60 +
  61 + EnumDeviceInAndOut(int code, String name) {
  62 + this.code = code;
  63 + this.name = name;
  64 + }
  65 + }
  66 +
  67 +
  68 + /**
  69 + * 设备操作错误码 参考:NET_EM_FAILCODE
  70 + */
  71 + public enum EnumOperateErrorType {
  72 +
  73 + ZERO(0, "没有错误"),
  74 + ONE(1, "未知错误"),
  75 + TEO(2, "参数错误"),
  76 + THREE(3, "无效密码"),
  77 + FOUR(4, "无效指纹数据"),
  78 + FIVE(5, "无效人脸数据"),
  79 + SIX(6, "无效卡数据"),
  80 + SEVEN(7, "无效人数据"),
  81 + ERR_21(21, "对返回数据校验出错");
  82 +
  83 +
  84 + public final int code;
  85 + public final String name;
  86 +
  87 + public int getCode() {
  88 + return code;
  89 + }
  90 +
  91 + public String getMessage() {
  92 + return name;
  93 + }
  94 +
  95 + EnumOperateErrorType(int code, String name) {
  96 + this.code = code;
  97 + this.name = name;
  98 + }
  99 +
  100 + public static EnumSzBusinessType.EnumOperateErrorType getByCode(int code){
  101 + for(EnumSzBusinessType.EnumOperateErrorType enums: EnumSzBusinessType.EnumOperateErrorType.values()){
  102 + if(enums.getCode()==code){
  103 + return enums;
  104 + }
  105 + }
  106 + return null;
  107 + }
  108 + }
  109 +
  110 + public enum EnumHkOperateType {
  111 +
  112 + ADD(1,"下发"),
  113 + EDIT(2,"修改"),
  114 + DELETE(3, "删除");
  115 +
  116 + public final int code;
  117 + public final String name;
  118 +
  119 + EnumHkOperateType(int code, String name) {
  120 + this.code = code;
  121 + this.name = name;
  122 + }
  123 + }
  124 +
  125 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/filter/AllowOriginFilter.java 0 → 100644
... ... @@ -0,0 +1,33 @@
  1 +package com.sincere.haikangface.filter;
  2 +
  3 +import org.springframework.stereotype.Component;
  4 +
  5 +import javax.servlet.*;
  6 +import javax.servlet.annotation.WebFilter;
  7 +import javax.servlet.http.HttpServletResponse;
  8 +import java.io.IOException;
  9 +
  10 +/**
  11 + * 用于解决跨域问题
  12 + */
  13 +@Component
  14 +@WebFilter(urlPatterns = "/*", filterName = "authFilter")
  15 +public class AllowOriginFilter implements Filter {
  16 +
  17 + @Override
  18 + public void init(FilterConfig filterConfig) throws ServletException {
  19 + }
  20 +
  21 + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
  22 + HttpServletResponse response = (HttpServletResponse) res;
  23 + response.setHeader("Access-Control-Allow-Origin", "*");
  24 + response.setHeader("Access-Control-Allow-Methods", "*");
  25 + response.setHeader("Access-Control-Allow-Credentials", "true");
  26 + response.setHeader("Access-Control-Allow-Headers","*");
  27 + chain.doFilter(req, res);
  28 + }
  29 +
  30 + @Override
  31 + public void destroy() {
  32 + }
  33 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java 0 → 100644
... ... @@ -0,0 +1,50 @@
  1 +package com.sincere.haikangface.service;
  2 +
  3 +import com.sincere.haikangface.bean.Result;
  4 +import com.sincere.haikangface.bean.face.AuthRecordDto;
  5 +import com.sincere.haikangface.bean.face.DeviceAuthRecord;
  6 +import com.sincere.haikangface.bean.face.PermissionBean;
  7 +import org.apache.ibatis.annotations.Param;
  8 +
  9 +/**
  10 + * @author xuquan
  11 + * @date 2020/12/10 17:25
  12 + */
  13 +
  14 +public interface UserOperateService {
  15 +
  16 +// /**
  17 +// * 下发卡权限至指定设备(含批量)a/
  18 +// * @param permissionBean
  19 +// * @return
  20 +// */
  21 +// boolean sendUserPermission(PermissionBean permissionBean);
  22 +//
  23 +// boolean sendUserFace(String filePath, String schoolId,String userId,int userType, String deviceId);
  24 +
  25 + /**
  26 + * 创建权限
  27 + * @param recordDto
  28 + * @return
  29 + */
  30 + boolean createHKAuth(AuthRecordDto recordDto);
  31 +
  32 + /**
  33 + * 权限ID删除权限下发记录
  34 + * @param authId
  35 + * @return
  36 + */
  37 + void deleteAuthRecord(Integer authId);
  38 +
  39 + /**
  40 + * 获取权限
  41 + * @param authId
  42 + * @return
  43 + */
  44 + DeviceAuthRecord getAuthRecord(Integer authId);
  45 +
  46 + Result againSendFace(String userId,String deviceId,Integer userType);
  47 +
  48 + Result sendFace(String schoolId,Integer type,String deviceIds);
  49 +
  50 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java 0 → 100644
... ... @@ -0,0 +1,515 @@
  1 +package com.sincere.haikangface.service.impl;
  2 +
  3 +
  4 +import com.alibaba.fastjson.JSONArray;
  5 +import com.alibaba.fastjson.JSONObject;
  6 +import com.sincere.haikangface.CMSServer;
  7 +import com.sincere.haikangface.async.SendUserAsync;
  8 +import com.sincere.haikangface.bean.BaiduFaceRecorder;
  9 +import com.sincere.haikangface.bean.SendRecordBean;
  10 +import com.sincere.haikangface.bean.StudentBean;
  11 +import com.sincere.haikangface.bean.TeacherBean;
  12 +import com.sincere.haikangface.dao.UserDao;
  13 +import com.sincere.haikangface.enums.EnumSzBusinessType;
  14 +import com.sincere.haikangface.mqtt.MqtUtils;
  15 +import com.sincere.haikangface.utils.*;
  16 +import com.sincere.haikangface.xiananDao.SendRecordDao;
  17 +import lombok.extern.slf4j.Slf4j;
  18 +import org.apache.commons.lang3.StringUtils;
  19 +import org.springframework.beans.factory.annotation.Autowired;
  20 +import org.springframework.beans.factory.annotation.Value;
  21 +import org.springframework.stereotype.Service;
  22 +
  23 +import java.io.File;
  24 +import java.text.SimpleDateFormat;
  25 +import java.util.*;
  26 +
  27 +/**
  28 + * 业务基础类
  29 + * @author xuquan
  30 + * @date 2020/12/23 10:16
  31 + */
  32 +@Slf4j
  33 +@Service
  34 +public class BaseService {
  35 +
  36 + @Autowired
  37 + private SendRecordDao sendRecordDao;
  38 + @Autowired
  39 + private UserDao userDao;
  40 + @Autowired
  41 + CMSServer cmsServer;
  42 + @Autowired
  43 + SendUserAsync sendUserAsync;
  44 +
  45 + @Value("${ipCloud}")
  46 + private String ipCloud;
  47 +
  48 + public boolean sendImg2Device(String filePath, String card, String name, String deviceId, String userType) {
  49 + try {
  50 + if (new File(filePath.trim()).exists()) {
  51 + String targetPath = FileUtils.picPathComp + new File(filePath).getName();
  52 + try {
  53 + CompressPic.CompressPic(filePath, targetPath);
  54 + } catch (Exception e) {
  55 + e.printStackTrace();
  56 + }
  57 + StudentBean studentBean = userDao.getStudentWithCard(card);
  58 + Integer schoolId = studentBean ==null ?null:studentBean.getSchool_id();
  59 +
  60 + return sendImg(filePath, targetPath, deviceId, card, name, userType,schoolId);
  61 + } else {
  62 + sendFail(Long.parseLong(getCard(card), 16) + "", filePath, deviceId,"文件不存在", userType);
  63 + System.out.println("文件不存在:" + filePath);
  64 + }
  65 + } catch (Exception e) {
  66 + e.printStackTrace();
  67 + }
  68 + return true;
  69 + }
  70 +
  71 + /**
  72 + * 下发人脸给设备
  73 + * @param filePath 人脸文件路径
  74 + * @param targetPath
  75 + * @param deviceId
  76 + * @param card
  77 + * @param name
  78 + * @param userType
  79 + * @return
  80 + */
  81 + public boolean sendImg(String filePath, String targetPath, String deviceId, String card, String name, String userType,Integer schoolId) {
  82 + String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
  83 + Calendar calendar = Calendar.getInstance();
  84 + calendar.add(Calendar.YEAR, 10);
  85 + String endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
  86 + //下发标识:详情见枚举 EnumHkOperateType
  87 + int validTimeEnabled = EnumSzBusinessType.EnumHkOperateType.ADD.code;
  88 + try {
  89 + FileUtils.getInstance().writeLogs("startTime:" + startTime + "---endTime:" + endTime + "---card:" + card, "下发参数");
  90 + if (cmsServer.getIsDeviceOnline(deviceId)) {
  91 + String cardNo = Long.parseLong(getCard(card),16)+"";
  92 + //下发海康设备
  93 + sendUserAsync.sendStuToHaiKang(filePath,targetPath, cardNo, startTime, endTime, validTimeEnabled, name, deviceId, userType,schoolId);
  94 + }else {
  95 + sendUserAsync.uploadImgs(targetPath, card, name, deviceId, startTime, endTime, validTimeEnabled, userType);
  96 + }
  97 + return true;
  98 + } catch (Exception e) {
  99 + log.error("下发人脸照失败,错误信息:"+ e.getMessage());
  100 + return false;
  101 + }
  102 + }
  103 +
  104 + /**
  105 + * 发送失败人脸
  106 + * @param deviceId
  107 + * @param userType
  108 + */
  109 + public void sendFace(String deviceId, int userType) {
  110 + List<SendRecordBean> sendRecordBeans = sendRecordDao.getSendFailWithDevId(deviceId);
  111 + if (null != sendRecordBeans) {
  112 + for (int i = 0; i < sendRecordBeans.size(); i++) {
  113 + SendRecordBean sendRecordBean = sendRecordBeans.get(i);
  114 + String typeName = "";
  115 + if (userType == 0) {
  116 + typeName = sendRecordBean.getUserType() == 1 ? "Teacher" : "Student";
  117 + } else {
  118 + typeName = userType == 1 ? "Teacher" : "Student";
  119 + }
  120 + String studentCode = "";
  121 + if (sendRecordBean.getUserType() == 1) {
  122 + studentCode = userDao.getTeaNumWithCard(sendRecordBean.getNum());
  123 + } else if (sendRecordBean.getUserType() == 2) {
  124 + studentCode = userDao.getStudentCode(sendRecordBean.getNum());
  125 + }
  126 + String imgPath = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + sendRecordBean.getSchoolId() + "\\" + typeName + "\\" + studentCode + ".png";
  127 + File imgFile = new File(imgPath);
  128 + if (imgFile.exists()) {
  129 + String targetPath = FileUtils.picPathComp + imgFile.getName();
  130 + try {
  131 + CompressPic.CompressPic(imgFile.getAbsolutePath(), targetPath);
  132 + } catch (Exception e) {
  133 + e.printStackTrace();
  134 + }
  135 + String cardNum = sendRecordBean.getNum();
  136 + String userName = sendRecordBean.getName();
  137 + Integer schoolId = sendRecordBean.getSchoolId();
  138 + userType = sendRecordBean.getUserType();
  139 + sendImg(imgPath, targetPath,deviceId,cardNum ,userName,String.valueOf(userType),schoolId);
  140 + } else {
  141 + log.error("文件不存在");
  142 + }
  143 + }
  144 +
  145 + }
  146 +
  147 + }
  148 +
  149 + /**
  150 + * 保存成功下发记录
  151 + */
  152 + public synchronized void sendSuccessRecord(String card, String faceUrl, String deviceId,String userType) {
  153 + long lon = Long.parseLong(card);
  154 + String resultCard = getCard(String.format("%08x", lon)).toUpperCase();
  155 + StudentBean studentBean = null;
  156 + switch (userType) {
  157 + case "1"://老师
  158 + studentBean = userDao.getTeacherWithCard(resultCard);
  159 + break;
  160 + case "2"://学生
  161 + studentBean = userDao.getStudentWithCard(resultCard);
  162 + break;
  163 + case "3"://家长
  164 + break;
  165 + }
  166 + if (null != studentBean) {
  167 + //用户ID
  168 + String userId = studentBean.getUser_id();
  169 + //用户名称
  170 + String userName = studentBean.getName();
  171 + //所属学校
  172 + int schoolId = studentBean.getSchool_id();
  173 + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
  174 + String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + "");
  175 + List<SendRecordBean> sendRecordBeans = sendRecordDao.getRecordIsExit(deviceId,resultCard,userId);
  176 + SendRecordBean sendRecordBean =null;
  177 + if(sendRecordBeans.size()>0){
  178 + sendRecordBean = sendRecordBeans.get(0);
  179 + }
  180 + if (null == sendRecordBean) {
  181 + sendRecordDao.saveFaceRecord(userId, deviceId, resultCard, userName, time, schoolName,
  182 + faceUrl, schoolId,null,null, Integer.parseInt(userType),18,1);
  183 + } else {
  184 + sendRecordDao.updateFaceSuccessRecord(deviceId,resultCard,time,faceUrl,userName,userId);
  185 + }
  186 + FileUtils.getInstance().writeLogs(studentBean.toString() + "\r\n" + resultCard, "下发成功记录");
  187 + } else {
  188 + log.error("用户不存在: 对应卡号{} ," + resultCard);
  189 + }
  190 + }
  191 +
  192 +
  193 + /**
  194 + * 保存下发失败记录
  195 + * @param card
  196 + * @param faceUrl
  197 + * @param deviceId
  198 + * @param content
  199 + * @param userType
  200 + */
  201 + public synchronized void sendFailRecord(String card, String faceUrl, String deviceId,String content,String userType) {
  202 + long lon = Long.parseLong(card);
  203 + String resultCard = getCard(String.format("%08x", lon)).toUpperCase();
  204 + StudentBean studentBean = null;
  205 + switch (userType) {
  206 + case "1"://老师
  207 + studentBean = userDao.getTeacherWithCard(resultCard);
  208 + break;
  209 + case "2"://学生
  210 + studentBean = userDao.getStudentWithCard(resultCard);
  211 + break;
  212 + case "3"://家长
  213 + break;
  214 + }
  215 + if (null != studentBean) {
  216 + //用户ID
  217 + String userId = studentBean.getUser_id();
  218 + //用户名称
  219 + String userName = studentBean.getName();
  220 + //所属学校
  221 + int schoolId = studentBean.getSchool_id();
  222 + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
  223 + String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + "");
  224 + List<SendRecordBean> sendRecordBeans = sendRecordDao.getRecordIsExit(deviceId,resultCard,userId);
  225 + SendRecordBean sendRecordBean =null;
  226 + if(sendRecordBeans.size()>0){
  227 + sendRecordBean = sendRecordBeans.get(0);
  228 + }
  229 + if (null == sendRecordBean) {
  230 + sendRecordDao.saveFaceRecord(userId, deviceId, resultCard, userName, time, schoolName,
  231 + faceUrl, schoolId, content,9, Integer.parseInt(userType),18,2);
  232 + }else {
  233 + sendRecordDao.updateFaceFailRecord(deviceId,faceUrl,resultCard,time,content,userId);
  234 + }
  235 + } else {
  236 + log.error("用户不存在: 对应卡号{} ," + resultCard);
  237 + }
  238 + }
  239 +
  240 + public synchronized void sendSuccess(String card,String faceUrl,String deviceId,String userType) {
  241 +// BigInteger bigInteger = new BigInteger(card);
  242 + long lon = Long.parseLong(card);
  243 + String resultCard = getCard(String.format("%08x", lon)).toUpperCase();
  244 + StudentBean studentBean = null;
  245 + String customerId = "";
  246 + switch (userType) {
  247 + case "1"://老师
  248 + studentBean = userDao.getTeacherWithCard(resultCard);
  249 + customerId = studentBean.getTeacher_id();
  250 + break;
  251 + case "2"://学生
  252 + studentBean = userDao.getStudentWithCard(resultCard);
  253 + customerId = studentBean.getStudent_id();
  254 + break;
  255 + case "3"://家长
  256 +
  257 + break;
  258 + }
  259 + if (null != studentBean) {
  260 + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
  261 + String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + "");
  262 + List<SendRecordBean> sendRecordBeans = sendRecordDao.getSuccessIsExitStu(deviceId, resultCard);
  263 + SendRecordBean sendRecordBean = null;
  264 + //处理重复添加的数据
  265 + if (null != sendRecordBeans && sendRecordBeans.size() > 1) {
  266 + for (int i = 0; i < sendRecordBeans.size(); i++) {
  267 + sendRecordDao.deleteFaceSuccess(sendRecordBeans.get(i).getNum(), sendRecordBeans.get(i).getDeviceID());
  268 + }
  269 + } else if (null != sendRecordBeans && sendRecordBeans.size() == 1) {
  270 + sendRecordBean = sendRecordBeans.get(0);
  271 + }
  272 + if (null == sendRecordBean) {
  273 + //添加成功日志
  274 + sendRecordDao.addFaceSuccess(customerId, deviceId, resultCard, studentBean.getName(), time, schoolName,
  275 + faceUrl, studentBean.getSchool_id(), Integer.parseInt(userType), 18);
  276 + } else {
  277 + sendRecordDao.updateFaceSuccess(deviceId, resultCard, time, faceUrl, studentBean.getName(), customerId);
  278 + }
  279 + FileUtils.getInstance().writeLogs(studentBean.toString() + "\r\n" + resultCard, "下发成功记录");
  280 + //删除下发失败表中的数据
  281 + sendRecordDao.deleteFaceFail(resultCard, deviceId);
  282 + } else {
  283 + log.error("用户不存在: 卡号 {}," + resultCard);
  284 + }
  285 + }
  286 +
  287 + /**
  288 + * 下发人脸失败
  289 + *
  290 + * @param card
  291 + * @param faceUrl
  292 + * @param deviceId
  293 + */
  294 + public synchronized void sendFail(String card, String faceUrl, String deviceId,String content, String userType) {
  295 +// BigInteger bigInteger = new BigInteger(card);
  296 + long lon = Long.parseLong(card);
  297 + String resultCard = getCard(String.format("%08x", lon)).toUpperCase();
  298 + StudentBean studentBean = null;
  299 + String customerId = "";
  300 + switch (userType) {
  301 + case "1"://老师
  302 + studentBean = userDao.getTeacherWithCard(resultCard);
  303 + customerId = studentBean.getTeacher_id();
  304 + break;
  305 + case "2"://学生
  306 + studentBean = userDao.getStudentWithCard(resultCard);
  307 + customerId = studentBean.getStudent_id();
  308 + break;
  309 + case "3"://家长
  310 + break;
  311 + }
  312 + if (null != studentBean) {
  313 + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
  314 + String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + "");
  315 + List<SendRecordBean> sendRecordBeans = sendRecordDao.getFailIsExit(deviceId, resultCard);
  316 +
  317 + SendRecordBean sendRecordBean = null;
  318 + //处理重复添加的数据
  319 + if (null != sendRecordBeans && sendRecordBeans.size() > 1) {
  320 + for (int i = 0; i < sendRecordBeans.size(); i++) {
  321 + sendRecordDao.deleteFaceFail(sendRecordBeans.get(i).getNum(), sendRecordBeans.get(i).getDeviceID());
  322 + }
  323 + } else if (null != sendRecordBeans && sendRecordBeans.size() == 1) {
  324 + sendRecordBean = sendRecordBeans.get(0);
  325 + }
  326 + if (null == sendRecordBean) {
  327 + sendRecordDao.addFaceFail(customerId, deviceId, resultCard, studentBean.getName(), time, schoolName,
  328 + faceUrl, studentBean.getSchool_id(), content, 9, Integer.parseInt(userType), 18);
  329 + } else {
  330 + sendRecordDao.updateFaceFail(deviceId, resultCard, time, content);
  331 + }
  332 + } else {
  333 + log.error("用户不存在: 卡号 {}," + resultCard);
  334 + }
  335 + }
  336 +
  337 + /**
  338 + * 校验卡号
  339 + * @param card
  340 + * @return
  341 + */
  342 + public String getCard(String card) {
  343 + if (card.length() == 8) {
  344 + int length = card.length();
  345 + String result = card.substring(length - 2, length) + card.substring(length - 4, length - 2) + card.substring(length - 6, length - 4)
  346 + + card.substring(length - 8, length - 6);
  347 + return result;
  348 + } else {
  349 + log.warn("卡号位数不对:" + card);
  350 + return "";
  351 + }
  352 + }
  353 +
  354 + /**
  355 + * 下发时长统计下发截止时间
  356 + * 每条数据执行0.06分钟
  357 + * @param size 文件数
  358 + * @param clientNum 设备数
  359 + * @return
  360 + */
  361 + public String getTime(int size,int clientNum,int timeLength){
  362 + Date date = new Date();
  363 + if(clientNum ==0){
  364 + return DateUtils.date2String(date,DateUtils.format3);
  365 + }
  366 + Date afterDate = DateUtils.getDateByTime(timeLength,date);
  367 + String dateStr = DateUtils.date2String(afterDate,DateUtils.format3);
  368 + return dateStr;
  369 + }
  370 +
  371 + //存储抓拍人脸用户信息
  372 + private static Map<String, Long> userMap = new HashMap<>();
  373 +
  374 + /**
  375 + * 人脸发送看板信息
  376 + * @param file
  377 + * @param deviceId
  378 + */
  379 + public void sendUserInfoToKB(File file,String deviceId){
  380 + //获取学校ID
  381 + String schoolId = userDao.getSchoolIdWithDevId(deviceId);
  382 + //请求人脸识别
  383 + JSONObject jsonObject = HttpUtil.sendToKB(file,schoolId);
  384 + if(jsonObject ==null){
  385 + log.error("人脸识别失败,返回数据为空");
  386 + return;
  387 + }
  388 + String face = jsonObject.getString("data");
  389 + if (face.startsWith("face") || face.startsWith("pic")){
  390 + log.error("人脸识别失败");
  391 + return;
  392 + }
  393 + JSONObject data = jsonObject.getJSONObject("data");
  394 + String errorMsg = data.getString("error_msg");
  395 + //识别成功
  396 + if (errorMsg.equals("SUCCESS")) {
  397 + JSONObject result = data.getJSONObject("result");
  398 + //用户信息
  399 + JSONArray userList = result.getJSONArray("user_list");
  400 + if (userList != null && userList.size() > 0) {
  401 + for (int i = 0; i < userList.size(); i++) {
  402 + JSONObject user = userList.getJSONObject(i);
  403 + //用户ID
  404 + String userId = user.getString("user_id");
  405 + //比对成功分数值
  406 + String score = user.getString("score");
  407 + double sc = Double.valueOf(score.split("\\.")[0]);
  408 + if (sc >= 60) {
  409 + TeacherBean teacherBean = userDao.getTeacherWithUserId1(userId);
  410 + if (null != teacherBean) {
  411 + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
  412 + teacherBean.setTime(time);
  413 + if (StringUtils.isBlank(teacherBean.getTeacer_num())){
  414 + teacherBean.setTeacer_num(userId);
  415 + }
  416 + //保存百度人脸识别记录
  417 + saveBaiDuFaceRecorder(teacherBean,file,sc,userId);
  418 + //同一用户抓拍时间在60秒内,则部不发送看板
  419 + if (userMap.containsKey(userId) && userMap.get(userId)!=null) {
  420 + long value = userMap.get(userId);
  421 + if ((System.currentTimeMillis() - value) / 1000 > 60) {
  422 + userMap.put(userId,System.currentTimeMillis());
  423 + send2DeviceIds(schoolId, teacherBean);
  424 + log.info("发送成功.....");
  425 + }
  426 + } else {
  427 + userMap.put(userId, System.currentTimeMillis());
  428 + send2DeviceIds(schoolId, teacherBean);
  429 + log.info("发送成功.....");
  430 + }
  431 + } else {
  432 + log.info("用户身份信息不存在");
  433 + sendNoPersonImg(file,schoolId);
  434 + }
  435 + } else {
  436 + log.info("用户身份信息不存在" + score);
  437 + sendNoPersonImg(file,schoolId);
  438 + }
  439 + }
  440 + }
  441 + } else {
  442 + log.error("百度人脸识别失败, 返回信息:{}" + jsonObject.toJSONString());
  443 + }
  444 + }
  445 +
  446 + /**
  447 + * 发送平台用户信息至看板设备
  448 + * @param schoolId
  449 + * @param teacherBean
  450 + */
  451 + private void send2DeviceIds(String schoolId, TeacherBean teacherBean) {
  452 + List<String> deviceIds = userDao.getKBDevices(schoolId);
  453 + if (deviceIds != null) {
  454 + for (int i = 0; i < deviceIds.size(); i++) {
  455 + String deviceId = deviceIds.get(i);
  456 + if (!StringUtils.isEmpty(deviceId)) {
  457 + String content = "{\"cmd\":\"" + 1 + "\",\"clientId\":\"\",\"data\": " + teacherBean.toString() + "}";
  458 + MqtUtils.getInstance().sendMsg(deviceId, content);
  459 + }
  460 + }
  461 + }
  462 + }
  463 +
  464 + /**
  465 + * 发送陌生人信息至设备看板
  466 + * @param faceFile
  467 + * @param schoolId
  468 + */
  469 + private void sendNoPersonImg(File faceFile, String schoolId) {
  470 + List<String> deviceIds = userDao.getKBDevices(schoolId);
  471 + String imgName = faceFile.getName();
  472 + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  473 + if (imgName.contains(date)) {
  474 + String imgId = imgName.substring(0, imgName.indexOf(date));
  475 + String api = "/kms/services/rest/dataInfoService/downloadFile?id=" + imgId;
  476 + String imgUrl = ipCloud+":8081"+ api;
  477 + FileUtils.getInstance().writeLogs("文件名:" + imgUrl, FileUtils.fileNoPerson);
  478 + for (int i = 0; i < deviceIds.size(); i++) {
  479 + String deviceId = deviceIds.get(i);
  480 + if (!org.springframework.util.StringUtils.isEmpty(deviceId)){
  481 + String content = "{\"cmd\":\"" + 2 + "\",\"clientId\":\"\",\"data\": \"" + imgUrl + "\"}";
  482 + MqtUtils.getInstance().sendMsg(deviceId, content);
  483 + }
  484 + }
  485 + }
  486 + try {
  487 + Thread.sleep(2000);
  488 + } catch (InterruptedException e) {
  489 + e.printStackTrace();
  490 + }
  491 + }
  492 +
  493 + private void saveBaiDuFaceRecorder(TeacherBean teacherBean,File faceFile,double score,String userId){
  494 + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  495 + BaiduFaceRecorder baiduFaceRecorder = new BaiduFaceRecorder();
  496 + baiduFaceRecorder.setUserId(userId);
  497 + baiduFaceRecorder.setName(teacherBean.getName());
  498 + baiduFaceRecorder.setScore(score + "");
  499 + baiduFaceRecorder.setTime(teacherBean.getTime());
  500 + baiduFaceRecorder.setUserImgUrl(teacherBean.getFace());
  501 + String uploadImgUrl = "";
  502 + if(faceFile.getAbsolutePath().contains(date)){
  503 + //抓拍照片ID
  504 + String imgId = faceFile.getName().substring(0,faceFile.getName().indexOf(date));
  505 + String api = "/kms/services/rest/dataInfoService/downloadFile?id=" +imgId;
  506 + uploadImgUrl = ipCloud+ api;
  507 + }else {
  508 + uploadImgUrl = faceFile.getAbsolutePath();
  509 + }
  510 + baiduFaceRecorder.setUploadImgUrl(uploadImgUrl);
  511 +
  512 + //插入百度人脸记录表
  513 + userDao.insertBaiduFaceRecorder(baiduFaceRecorder);
  514 + }
  515 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java 0 → 100644
... ... @@ -0,0 +1,497 @@
  1 +package com.sincere.haikangface.service.impl;
  2 +import com.sincere.haikangface.CMSServer;
  3 +import com.sincere.haikangface.async.SendUserAsync;
  4 +import com.sincere.haikangface.bean.*;
  5 +import com.sincere.haikangface.bean.face.*;
  6 +import com.sincere.haikangface.dao.DeviceDao;
  7 +import com.sincere.haikangface.dao.UserDao;
  8 +import com.sincere.haikangface.service.UserOperateService;
  9 +import com.sincere.haikangface.utils.*;
  10 +import com.sincere.haikangface.xiananDao.SendRecordDao;
  11 +import lombok.extern.slf4j.Slf4j;
  12 +import org.apache.commons.lang3.StringUtils;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.stereotype.Service;
  15 +import java.io.File;
  16 +import java.util.*;
  17 +
  18 +/**
  19 + * TODO
  20 + *
  21 + * @author Administrator
  22 + * @date 2020/12/10 21:26
  23 + */
  24 +@Slf4j
  25 +@Service
  26 +public class UserOperateServiceImpl implements UserOperateService {
  27 +
  28 + @Autowired
  29 + CMSServer cmsServer;
  30 + @Autowired
  31 + DeviceDao deviceDao;
  32 + @Autowired
  33 + SendRecordDao sendRecordDao;
  34 + @Autowired
  35 + UserDao userDao;
  36 + @Autowired
  37 + BaseService baseService;
  38 + @Autowired
  39 + SendUserAsync sendUserAsync;
  40 +
  41 + private static JsonUtils objectMapper = JsonUtils.nonEmptyMapper();
  42 +
  43 + @Override
  44 + public boolean createHKAuth(AuthRecordDto recordDto) {
  45 + try {
  46 + String sexStr = recordDto.getWeekDays().get(0).getSex();
  47 + //1学生类型,当为组时为群组iD
  48 + int studentType = recordDto.getStudentType();
  49 + //学校ID
  50 + int schoolId = recordDto.getSchoolId();
  51 + //设备ID
  52 + List<String> deviceIds = recordDto.getSnList();
  53 + //1 学生类型 2 学生组
  54 + int type = recordDto.getType();
  55 + //权限类型
  56 + int authType = recordDto.getAuthType();
  57 + //权限周计划
  58 + List<WeekDay> weekDay = recordDto.getWeekDays();
  59 + String weekDayJson = objectMapper.toJson(weekDay);
  60 + String deviceStr = "";
  61 + for (String sn : deviceIds) {
  62 + deviceStr += sn + ",";
  63 + }
  64 + Date start = DateUtils.string2Date("2020-01-01", DateUtils.format1);
  65 + Date end = DateUtils.string2Date("2030-01-01", DateUtils.format1);
  66 + deviceStr = deviceStr.substring(0, deviceStr.length() - 1);
  67 + //保存权限计划
  68 + saveDeviceAuth(schoolId, deviceStr, studentType, start, end, weekDayJson, sexStr, type, authType);
  69 + return true;
  70 + } catch (Exception e) {
  71 + e.printStackTrace();
  72 + log.error("创建权限失败");
  73 + }
  74 + return false;
  75 + }
  76 +
  77 + private void saveDeviceAuth(int schoolId, String sn, int studentType, Date start, Date end, String json, String sexStr, int type, int authType) {
  78 + //设置权限信息
  79 + DeviceAuthRecord record = new DeviceAuthRecord();
  80 + //学校ID
  81 + record.setSchoolId(schoolId);
  82 + //开始时间
  83 + record.setStartTime(start);
  84 + //结束时间
  85 + record.setEndTime(end);
  86 + //设备ID
  87 + record.setSno(sn);
  88 + //学生类型1通校2住校
  89 + record.setStudentType(studentType);
  90 + //性别
  91 + record.setSex(sexStr);
  92 + //时段
  93 + record.setShiduan(null);
  94 + //计划状态1正常2停用
  95 + record.setState(1);
  96 + //计划下发状态1下发成功2下发失败3待下发
  97 + record.setGrantState(3);
  98 + //计划详情
  99 + record.setWeekDays(json);
  100 + //权限类型1微耕2人脸机
  101 + record.setAuthType(authType);
  102 + //计划类型1学生类别2学生组
  103 + record.setaType(type);
  104 + //插入权限记录表AC_DeviceAuthRecord
  105 + userDao.insertAuthRecord(record);
  106 + }
  107 +
  108 + @Override
  109 + public void deleteAuthRecord(Integer authId) {
  110 + userDao.deleteAuthRecord(authId.intValue());
  111 + }
  112 +
  113 + @Override
  114 + public DeviceAuthRecord getAuthRecord(Integer authId) {
  115 + return userDao.getAuthRecord(authId.intValue());
  116 + }
  117 +
  118 + @Override
  119 + public Result againSendFace(String userId, String deviceId,Integer userType) {
  120 + StudentBean studentBean = null;
  121 + String cardNum ="";
  122 + String photo ="";
  123 + String studentCode = "";
  124 + if(userType.intValue() ==1 ){
  125 + studentBean = userDao.getTeacherByUserId(userId);
  126 + cardNum = studentBean.getTeacher_num();
  127 + photo = studentBean.getFace();
  128 + studentCode = studentBean.getNum();
  129 + }else{
  130 + studentBean = userDao.getStudentCByUserId(userId);
  131 + cardNum = studentBean.getStudent_num();
  132 + photo = studentBean.getPhoto();
  133 + studentCode = studentBean.getStudentCode();
  134 + }
  135 + if (studentBean == null) {
  136 + log.error("下发人脸失败,userId: {},未查询到用户信息", userId);
  137 + return ResultGenerator.genSuccessResult("未查询到用户信息");
  138 + }
  139 + Integer schoolId = studentBean.getSchool_id();
  140 + String userName = studentBean.getName();
  141 + //2.重新下发
  142 + String typeName = userType.intValue() ==1 ? "Teacher" : "Student";
  143 + String path = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName;
  144 + //以学籍号为名的文件名
  145 + String fileName = photo.split(typeName+"/")[1];
  146 + //100服务器上人脸照绝对路径
  147 + String filePath = path+ "\\" + fileName;
  148 + //校验100服务上是否存在此人脸
  149 + File file = new File(filePath.trim());
  150 + if (!file.exists()) {
  151 + log.error("文件不存在:" + filePath);
  152 + String card = Long.parseLong(baseService.getCard(cardNum), 16)+"";
  153 + baseService.sendFailRecord(card, filePath, deviceId, "文件不存在", String.valueOf(userType));
  154 + return ResultGenerator.genFailResult("文件不存在");
  155 + }
  156 + //设备类型
  157 + Integer clintType = userDao.getClintTypeByDeviceId(deviceId);
  158 + if(clintType.intValue()== 18 || clintType.intValue()== 28){
  159 + //1.先删除人脸
  160 + if (cmsServer.getIsDeviceOnline(deviceId)) {
  161 + String cardNo = Long.parseLong(baseService.getCard(cardNum),16) + "";
  162 + cmsServer.deleteCard(deviceId, cardNo,schoolId);
  163 + }else{
  164 + //不在线,去253服务器上删除
  165 + HttpUtil.deleteCard(deviceId, cardNum);
  166 + }
  167 + String targetPath = FileUtils.picPathComp + file.getName();
  168 + try {
  169 + CompressPic.CompressPic(file.getAbsolutePath(), targetPath);
  170 + } catch (Exception e) {
  171 + log.error("图片压缩失败");
  172 + }
  173 + boolean isOk = baseService.sendImg(photo, targetPath, deviceId, cardNum, userName, String.valueOf(userType), schoolId);
  174 + if (isOk) {
  175 + return ResultGenerator.genSuccessResult();
  176 + } else {
  177 + return ResultGenerator.genFailResult("重新下发失败");
  178 + }
  179 + }
  180 + //下大华人脸
  181 + if(clintType.intValue()== 22 || clintType.intValue()== 29){
  182 + HttpUtil.uploadDHImgForOne(filePath,schoolId,studentCode,clintType,deviceId);
  183 + return ResultGenerator.genSuccessResult();
  184 + }
  185 + return ResultGenerator.genSuccessResult();
  186 + }
  187 +
  188 + @Override
  189 + public Result sendFace(String schoolId,Integer type,String deviceIds) {
  190 + try {
  191 + String filePathStudent = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\Student";
  192 + String filePathParent = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\Parent";
  193 + String filePathTeacher = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\Teacher";
  194 + File filePaths = null;
  195 + int userType = 0;
  196 + if (type == 0) {//主卡下发
  197 + filePaths = new File(filePathStudent);
  198 + userType = 2;
  199 + } else if (type == 1) {//副卡下发
  200 + filePaths = new File(filePathParent);
  201 + userType = 2;
  202 + } else if (type == 2) {//教师卡下发
  203 + filePaths = new File(filePathTeacher);
  204 + userType = 1;
  205 + }
  206 + File[] filesStudent = filePaths.listFiles();
  207 + if (filesStudent == null) {
  208 + log.warn("目录:{},没有找到人脸图片,",filePaths.getAbsolutePath());
  209 + return ResultGenerator.genFailResult("没有找到人脸图片");
  210 + }
  211 + if(StringUtils.isBlank(deviceIds)){
  212 + log.warn("未选择下发设备");
  213 + return ResultGenerator.genFailResult("未选择下发设备");
  214 + }
  215 + String[] deviceArr = deviceIds.split(",");
  216 + List<String> idLists= new ArrayList<>(Arrays.asList(deviceArr));
  217 + //设备类型
  218 + Integer clintType = userDao.getClintTypeByDeviceId(idLists.get(0));
  219 + if(clintType.intValue()== 22 || clintType.intValue()== 29){
  220 + sendUserAsync.uploadDHImg(schoolId,userType,deviceIds);
  221 + }
  222 + if(clintType.intValue()== 18 || clintType.intValue()== 28){
  223 + sendUserAsync.uploadHkImg(schoolId,userType,deviceIds);
  224 + }
  225 + int fileSize = filesStudent.length;
  226 + int clintNum = deviceArr.length;
  227 + //下发所用时长
  228 + int timeLength = new Double(clintNum * fileSize * 0.06).intValue();
  229 + //下发截止时间
  230 + String dateStr = baseService.getTime(fileSize,clintNum,timeLength);
  231 + Map map = new HashMap();
  232 + map.put("timeLength",timeLength);
  233 + map.put("afterDate",dateStr);
  234 + map.put("fileSize",fileSize);
  235 + return ResultGenerator.genSuccessResult(objectMapper.toJson(map));
  236 + } catch (Exception e) {
  237 + log.error("下发失败,错误信息",e);
  238 + return ResultGenerator.genFailResult("下发失败");
  239 + }
  240 + }
  241 +}
  242 +
  243 +// p }ublic boolean sendPermiss2(PermissionBean permissionBean, int i) {
  244 +// return sendImg(filePath, targetPath, deviceId, card, name, userType); String userType = permissionBean.getUserType();
  245 +// String schoolId = permissionBean.getSchoolId();
  246 +// //设备ID,多设备户英文逗号,隔开
  247 +// List<String> deviceIds = permissionBean.getDeviceIds();
  248 +// //用户iD,批量用户英文逗号,隔开
  249 +// String userIds = permissionBean.getUserIds();
  250 +// String[] userIdsStr = userIds.split(",");
  251 +//
  252 +// List<String> cardNumList = new ArrayList<>();
  253 +// if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.TEACHER.code) {
  254 +// List<String> cardList = getUserCard(userIds,EnumSzBusinessType.EnumUserType.TEACHER.code);
  255 +// cardNumList.addAll(cardList);
  256 +// }
  257 +// if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.STUDENT.code) {
  258 +// for (String userId : userIdsStr) {
  259 +// String cardNum = userDao.getStudentCardWithUserId(schoolId,userId);
  260 +// cardNumList.add(cardNum);
  261 +// }
  262 +// }
  263 +// //权限周计划
  264 +// List<WeekDay> weekDays = permissionBean.getWeekDays();
  265 +// //存储周计划时段
  266 +// Map<Integer, List<WeekTime>> map = new HashMap<>();
  267 +// for (WeekDay weekDay : weekDays) {
  268 +// //整理周和时间段
  269 +// initWeedayAndTimes(weekDay, map);
  270 +// senPsermiss(permissionBean, map, deviceIds, cardNumList, i);
  271 +// }
  272 +// log.error("map{}", JSON.toJSONString(map));
  273 +// return true;
  274 +// }
  275 +
  276 +//
  277 +// // @Override
  278 +//// public boolean sendUserPermission(PermissionBean permissionBean) {
  279 +//// //设备ID,多设备户英文逗号,隔开
  280 +//// List<String> deviceIds = permissionBean.getDeviceIds();
  281 +//// if ((CollectionUtils.isEmpty(deviceIds))) {
  282 +//// log.error("下发权限,设备ID为空");
  283 +//// return false;
  284 +//// }
  285 +//// //用户类型
  286 +//// String userType = permissionBean.getUserType();
  287 +//// //学校ID
  288 +//// String schoolId = permissionBean.getSchoolId();
  289 +////
  290 +//// //用户iD,批量用户英文逗号,隔开
  291 +//// String userIds = permissionBean.getUserIds();
  292 +//// String[] userIdsStr = userIds.split(",");
  293 +////
  294 +//// List<String> cardNumList = new ArrayList<>();
  295 +//// if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.TEACHER.code) {
  296 +//// List<String> cardList = getTeacherUserNum(userIds,EnumSzBusinessType.EnumUserType.TEACHER.code);
  297 +//// cardNumList.addAll(cardList);
  298 +//// }
  299 +//// if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.STUDENT.code) {
  300 +//// for (String userId : userIdsStr) {
  301 +//// String cardNum = userDao.getStudentCardWithUserId(schoolId,userId);
  302 +//// if(StringUtils.isNotBlank(cardNum)){
  303 +//// cardNumList.add(cardNum);
  304 +//// }
  305 +//// }
  306 +//// }
  307 +//// for(String deviceId : deviceIds){
  308 +//// //权限周计划
  309 +//// List<WeekDay> weekDays = permissionBean.getWeekDays();
  310 +//// //存储周计划时段
  311 +//// Map<Integer, List<WeekTime>> map = new HashMap<>();
  312 +//// for (WeekDay weekDay : weekDays) {
  313 +//// //整理周和时间段
  314 +//// initWeedayAndTimes(weekDay, map);
  315 +//// //下发权限
  316 +//// cmsServer.(permissionBean, map, cardNumList,deviceId);
  317 +//// }
  318 +//// log.info("map{}", JSON.toJSONString(map));
  319 +//// }
  320 +//// return true;
  321 +//// }
  322 +////
  323 +//// /**
  324 +//// * 整理时间
  325 +//// * @param weekDay
  326 +//// * @param map
  327 +//// */
  328 +//// private void initWeedayAndTimes(WeekDay weekDay, Map<Integer, List<WeekTime>> map) {
  329 +////
  330 +//// String weekDayStr = weekDay.getWeekDay();
  331 +//// String[] weekDays = weekDayStr.split(",");
  332 +////
  333 +//// List<WeekTime> weekTimes = weekDay.getWeekTimes();
  334 +////
  335 +//// for (int i = 0; i < weekDays.length; i++) {
  336 +//// int weekDayIndex = Integer.parseInt(weekDays[i]);
  337 +//// if (map.containsKey(weekDayIndex)) {//周已经有时间段
  338 +//// List<WeekTime> weekTimeList = map.get(weekDayIndex);
  339 +//// for (WeekTime wee : weekTimes) {
  340 +//// weekTimeList.add(wee);
  341 +//// }
  342 +//// map.put(weekDayIndex, weekTimeList);
  343 +//// } else {
  344 +//// List<WeekTime> weekTimes1 = new ArrayList<>();
  345 +//// weekTimes1.addAll(weekTimes);
  346 +//// map.put(weekDayIndex, weekTimes1);
  347 +//// }
  348 +//// }
  349 +////
  350 +//// }
  351 +////
  352 +//// /**
  353 +//// *
  354 +//// * @param userIds
  355 +//// * @param userType
  356 +//// * @return
  357 +//// */
  358 +//// private List<String> getTeacherUserNum(String userIds, int userType) {
  359 +//// List<String> cards = new ArrayList<>();
  360 +//// try {
  361 +//// String[] userIdsStr = userIds.split(",");
  362 +//// for (String userId : userIdsStr) {
  363 +//// TeacherBean teacherBean = null;
  364 +//// if (userType == EnumSzBusinessType.EnumUserType.TEACHER.code) {//教师
  365 +//// teacherBean = userDao.getTeacherWithUserId(userId);
  366 +//// if (null != teacherBean) {
  367 +//// String card = teacherBean.getTeacer_num();
  368 +//// if (!StringUtils.isEmpty(card)) {
  369 +//// cards.add(card);
  370 +//// }
  371 +//// } else {
  372 +//// log.error("教师用户不存在");
  373 +//// }
  374 +//// }
  375 +//// }
  376 +////
  377 +//// } catch (Exception e) {
  378 +//// e.printStackTrace();
  379 +//// }
  380 +//// return cards;
  381 +//// }
  382 +////
  383 +//// /**
  384 +//// * 把卡号和权限下发到对应的设备
  385 +//// *
  386 +//// * @param permissionBean
  387 +//// * @param map
  388 +//// * @param cardNumList
  389 +//// * @return
  390 +//// */
  391 +//// private boolean sendPermission(PermissionBean permissionBean, Map<Integer, List<WeekTime>> map,List<String> cardNumList,String deviceId) {
  392 +//// String userType = permissionBean.getUserType();
  393 +//// if (null == cardNumList || cardNumList.size() == 0) {
  394 +//// log.error("卡号为空");
  395 +//// return false;
  396 +//// }
  397 +//// //设备在线
  398 +//// boolean onLine = cmsServer.getIsDeviceOnline(deviceId);
  399 +//// if (onLine) {
  400 +//// for (String cardNum : cardNumList) {
  401 +//// //卡号取反
  402 +//// String newCardNum = getCardNo(cardNum);
  403 +//// if (StringUtils.isBlank(newCardNum)) {
  404 +//// continue;
  405 +//// }
  406 +//// //获取十进制卡
  407 +//// newCardNum = String.valueOf(NumConvertUtil.hex16To10(newCardNum));
  408 +//// //设置卡权限计划模板
  409 +//// if(cmsServer.SetCardWeekPlan(deviceId, HKXmlUtils.getInstance().SetCardTemplate())){
  410 +//// log.info("设置卡权限计划模板成功,成功卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType);
  411 +//// }else{
  412 +//// log.error("设置卡权限计划模板失败,失败卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType);
  413 +//// }
  414 +//// //设置卡权限周计划
  415 +//// if(cmsServer.SetCardWeekPlan(deviceId, HKXmlUtils.getInstance().SetCardWeekPlan())){
  416 +//// log.info("设置卡权限周计划成功,成功卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType);
  417 +//// }else{
  418 +//// log.error("设置卡权限周计划失败,失败卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType);
  419 +//// }
  420 +//// for (Map.Entry<Integer, List<WeekTime>> weeKdayMap : map.entrySet()) {
  421 +//// int week = weeKdayMap.getKey();
  422 +//// List<WeekTime> weekTimes = weeKdayMap.getValue();
  423 +////
  424 +//// StringBuffer stringBuffer = new StringBuffer();
  425 +//// for (WeekTime weekTime : weekTimes) {
  426 +//// //周计化时间段
  427 +//// String weekPlanTimes = HKXmlUtils.getInstance().SetCardWeekPlanTimes(weekTime.getStartTime(), weekTime.getEndTime());
  428 +//// stringBuffer.append(weekPlanTimes);
  429 +//// }
  430 +//// //卡权限周计划时间段
  431 +//// String weekPlanTime = HKXmlUtils.getInstance().SetCardWeekPlanTime(stringBuffer.toString(), "" + week);
  432 +//// FileUtils.getInstance().writeLogs(weekPlanTime, "设置卡权限周计划时间.txt");
  433 +//// //设置卡权限
  434 +//// String serCardRightCfg = HKXmlUtils.getInstance().SetCardRightCfg(newCardNum);
  435 +//// //设置卡权限周计划
  436 +//// if(cmsServer.SetCardWeekPlan(deviceId, weekPlanTime)){
  437 +//// log.info("设置卡权限计划模板成功,成功卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType);
  438 +//// }else{
  439 +//// log.error("设置卡权限计划模板失败,失败卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType);
  440 +//// }
  441 +//// if(cmsServer.SetCardWeekPlan(deviceId, serCardRightCfg)){
  442 +//// log.info("设置卡权限周计划成功,成功卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType);
  443 +//// }else{
  444 +//// log.error("设置卡权限周计划失败,失败卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType);
  445 +//// }
  446 +//// }
  447 +//// }
  448 +//// } else {
  449 +//// //设备不在线
  450 +//// log.warn("设备: {},不在线.前往253服务器下发", deviceId);
  451 +//// HttpUtil.sendPermission2HK(permissionBean);
  452 +//// }
  453 +//// return true;
  454 +//// }
  455 +////
  456 +////
  457 +//// /**
  458 +//// * 卡号两两取反
  459 +//// *
  460 +//// * @param cardDex
  461 +//// * @return
  462 +//// */
  463 +//// public static String getCardNo(String cardDex) {
  464 +//// String cardR = "";
  465 +//// int length = cardDex.length();
  466 +//// if (length != 8) {
  467 +//// log.error("卡号格式不正确: 位数有误" + cardDex);
  468 +//// return cardDex;
  469 +//// }
  470 +//// while (length > 0) {
  471 +//// length -= 2;
  472 +//// cardR += cardDex.substring(length, length + 2);
  473 +//// }
  474 +//// return cardR;
  475 +//// }
  476 +////
  477 +//// @Override
  478 +//// public boolean sendUserFace(String filePath, String schoolId,String userId, int userType, String deviceId) {
  479 +//// File file = new File(filePath);
  480 +//// if(file ==null){
  481 +//// log.error("用户人脸不存在");
  482 +//// sendRecoderUtils.sendFail(sendRecordDao, Long.parseLong(getCard(card), 16) + "", filePath, deviceId, userDao, "文件不存在", userType);
  483 +//// return false;
  484 +//// }
  485 +//// String cardNum = userDao.getStudentCardWithUserId(schoolId,userId);
  486 +//// String fileName = file.getName();
  487 +//// //文件相对路径
  488 +//// String targetPath = FileUtils.picPathComp + fileName;
  489 +//// try {
  490 +//// CompressPic.CompressPic(filePath, targetPath);
  491 +//// } catch (Exception e) {
  492 +//// log.error("人脸图片压缩失败.",e.getMessage());
  493 +//// return false;
  494 +//// }
  495 +//// return sendImg(filePath, targetPath, deviceId, card, name, userType);
  496 +//// }
  497 +//}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java
... ... @@ -4,6 +4,7 @@ import com.sincere.haikangface.bean.BaiduFaceRecorder;
4 4 import com.sincere.haikangface.bean.FaceWaterRecoder;
5 5 import com.sincere.haikangface.dao.DeviceDao;
6 6 import com.sincere.haikangface.dao.UserDao;
  7 +import lombok.extern.slf4j.Slf4j;
7 8 import org.springframework.stereotype.Component;
8 9 import org.springframework.util.StringUtils;
9 10  
... ... @@ -13,6 +14,7 @@ import java.util.Date;
13 14 /**
14 15 * 报警事件处理
15 16 */
  17 +@Slf4j
16 18 public class AlarmUtils {
17 19  
18 20 private static AlarmUtils alarmUtils;
... ... @@ -23,6 +25,8 @@ public class AlarmUtils {
23 25  
24 26 private AlarmCallBack alarmCallBack;
25 27  
  28 + private static JsonUtils objectMapper = JsonUtils.nonEmptyMapper();
  29 +
26 30 // public static AlarmUtils getInstance(DeviceDao deviceDao) {
27 31 // if (alarmUtils == null) {
28 32 // synchronized (AlarmUtils.class) {
... ... @@ -46,9 +50,8 @@ public class AlarmUtils {
46 50 }
47 51  
48 52 public void deleAlarm(String strXML) {
49   -// System.out.println("人脸抓拍机:" + strXML);
50   - if (strXML.contains("FACESNAPREPORT")) {//人脸抓拍机器
51   -
  53 + //人脸抓拍机器
  54 + if (strXML.contains("FACESNAPREPORT")) {
52 55 // System.out.println("人脸抓拍机:" + strXML);
53 56 BaiduFaceRecorder baiduFaceRecorder = new BaiduFaceRecorder();
54 57 baiduFaceRecorder.setUploadImgUrl(strXML);
... ... @@ -57,13 +60,10 @@ public class AlarmUtils {
57 60 String deviceId = strXML.substring(strXML.indexOf("DeviceID"),strXML.lastIndexOf("DeviceID")).trim();
58 61 deviceId = deviceId.replace("DeviceID>","");
59 62 deviceId = deviceId.replace("</","");
60   -
61 63 userDao.insertBaiduFaceRecorder(baiduFaceRecorder);
62 64 // if (null != alarmCallBack)
63 65 // alarmCallBack.callBack(minorType, deviceID, cardNo, time, picDataUrlId, currTemperature);
64   -
65 66 } else {//人脸识别
66   -
67 67 //主类型
68 68 String majirType = strXML.substring(strXML.indexOf("MajorType"), strXML.lastIndexOf("MajorType")).trim();
69 69 majirType = majirType.replace("MajorType>", "");
... ... @@ -104,9 +104,6 @@ public class AlarmUtils {
104 104 currTemperature = currTemperature.replace("currTemperature>", "");
105 105 currTemperature = currTemperature.replace("</", "");
106 106 }
107   -
108   -
109   -//System.out.println("alarmCallBack:"+alarmCallBack);
110 107 switch (majirType) {
111 108 case "0x1"://报警
112 109 baojing(minorType, deviceID, time);
... ... @@ -136,19 +133,21 @@ public class AlarmUtils {
136 133 */
137 134 private void shijian(String minorType, String deviceID, String cardNo, String time, String picDataUrl, String currTemperature) {
138 135 String content = "";
139   -// System.out.println("=-=============================minorType:" + minorType);
140 136 switch (minorType) {
141 137 case "0x01"://合法卡认证通过
142 138 content = "合法卡认证通过";
143 139 break;
144 140 case "0x07"://无效时段
145 141 content = "无效时段";
  142 + log.info("卡号:{}, {}",cardNo,content);
146 143 break;
147 144 case "0x8"://卡号过期
148 145 content = "卡号过期";
  146 + log.info("卡号:{}, {}",cardNo,content);
149 147 break;
150 148 case "0x9"://无此卡号
151 149 content = "无此卡号";
  150 + log.info("卡号:{}, {}",cardNo,content);
152 151 break;
153 152 case "0x4b"://人脸认证通过
154 153 if (!StringUtils.isEmpty(picDataUrl) && picDataUrl.split("id=").length > 1) {
... ... @@ -161,12 +160,15 @@ public class AlarmUtils {
161 160 break;
162 161 case "0x4c"://人脸认证失败
163 162 content = "人脸认证失败";
  163 + log.info("卡号:{}, {}",cardNo,content);
164 164 break;
165 165 case "0x50"://人脸不存在
166 166 content = "人脸不存在";
  167 + log.info("卡号:{}, {}",cardNo,content);
167 168 break;
168 169 case "0x68"://真人检测失败
169 170 content = "真人检测失败";
  171 + log.info("卡号:{}, {}",cardNo,content);
170 172 break;
171 173 case "0x69"://人证比对通过
172 174 if (!StringUtils.isEmpty(picDataUrl) && picDataUrl.split("id=").length > 1) {
... ... @@ -190,9 +192,7 @@ public class AlarmUtils {
190 192 }
191 193 break;
192 194 }
193   -
194 195 saveWater(content, minorType, deviceID, cardNo, time, "0x05");
195   -
196 196 }
197 197  
198 198 /**
... ... @@ -301,13 +301,13 @@ public class AlarmUtils {
301 301 private void baojing(String minorType, String deviceID, String time) {
302 302 switch (minorType) {
303 303 case "0x413"://人脸图像画质低
304   -
  304 + log.info("人脸图像画质低");
305 305 break;
306 306 case "0x40d"://SD卡存储满报警
307   -
  307 + log.info("SD卡存储已满");
308 308 break;
309 309 case "0x40b"://离线事件满90%报警
310   -
  310 + log.info("设备离线率达90%");
311 311 break;
312 312 }
313 313 }
... ... @@ -332,8 +332,7 @@ public class AlarmUtils {
332 332 faceWaterRecoder.setTime(time);
333 333 faceWaterRecoder.setCardNo(cardNo);
334 334 faceWaterRecoder.setSystime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
335   -// System.out.println("deviceDao:" + deviceDao);
336   -// System.out.println("faceWaterRecoder:" + faceWaterRecoder);
  335 + log.info("保存流水记录,流水信息: {}",objectMapper.toJson(faceWaterRecoder));
337 336 deviceDao.saveFaceWaterRecoder(faceWaterRecoder.getDeviceId(), faceWaterRecoder.getDeviceType() + "", faceWaterRecoder.getMinorType(),
338 337 faceWaterRecoder.getContent(), faceWaterRecoder.getMajorType(), faceWaterRecoder.getTime(), faceWaterRecoder.getCardNo(), faceWaterRecoder.getSystime());
339 338 }
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java 0 → 100644
... ... @@ -0,0 +1,124 @@
  1 +package com.sincere.haikangface.utils;
  2 +
  3 +import java.text.ParseException;
  4 +import java.text.SimpleDateFormat;
  5 +import java.util.Calendar;
  6 +import java.util.Date;
  7 +
  8 +/**
  9 + * @author chen
  10 + * @version 1.0
  11 + * @date 2019/10/14 0014 14:16
  12 + */
  13 +public class DateUtils {
  14 +
  15 + public static String format = "yyyy";
  16 +
  17 + public static String format1 = "yyyy-MM-dd";
  18 +
  19 + public static String format2 = "yyyy-MM-dd HH:mm:ss";
  20 +
  21 + public static String format3 = "yyyy年MM月dd日 HH:mm:ss" ;
  22 +
  23 + public static String format4 = "yyyy-MM-dd HH:mm";
  24 +
  25 + public static long getDate(){
  26 + return System.currentTimeMillis();
  27 + }
  28 +
  29 + public static String date2String(Date date, String format) {
  30 + SimpleDateFormat sdf = new SimpleDateFormat(format);
  31 + return sdf.format(date);
  32 + }
  33 +
  34 + public static Date string2Date(String date, String format) {
  35 + try{
  36 + SimpleDateFormat sdf = new SimpleDateFormat(format);
  37 + return sdf.parse(date);
  38 + }catch (Exception e){
  39 +
  40 + }
  41 + return new Date();
  42 + }
  43 +
  44 + public static Date getToday(){
  45 + return new Date();
  46 + }
  47 +
  48 + public static String getToday(String format) throws ParseException {
  49 + SimpleDateFormat sdf = new SimpleDateFormat(format);
  50 + return sdf.format(new Date());
  51 + }
  52 +
  53 + public static int getDateDifference(Date date1, Date date2, String timeType) {
  54 + int between = (int) (date1.getTime() - date2.getTime());
  55 + int difference = 0;
  56 + switch (timeType) {
  57 + case "day":
  58 + difference = between / (24 * 60 * 60 * 1000);
  59 + break;
  60 + case "hour":
  61 + difference = between / (60 * 60 * 1000);
  62 + break;
  63 + case "min":
  64 + difference = between / (60 * 1000);
  65 + break;
  66 + case "s":
  67 + difference = between / 1000;
  68 + }
  69 + return difference;
  70 + }
  71 +
  72 + private static byte[] lock = new byte[0];
  73 + // 位数,默认是8位
  74 + private final static long strNum = 100000000;
  75 +
  76 + /**
  77 + * 创建以时间为唯一UUID
  78 + * @return
  79 + */
  80 + public static String createTimeId() {
  81 + long r = 0;
  82 + synchronized (lock) {
  83 + r = (long) ((Math.random() + 1) * strNum);
  84 + }
  85 + return System.currentTimeMillis() + String.valueOf(r).substring(1);
  86 + }
  87 +
  88 + /**
  89 + * 拼接时间
  90 + * @param time
  91 + * @return
  92 + */
  93 + public static Date spliceTime(String time){
  94 + SimpleDateFormat df = new SimpleDateFormat(format4);
  95 + SimpleDateFormat ds = new SimpleDateFormat(format1+" ");
  96 + try {
  97 + Date date = df.parse(ds.format(new Date()) + time);
  98 + return date;
  99 + } catch (ParseException e) {
  100 + e.printStackTrace();
  101 + }
  102 + return null;
  103 + }
  104 +
  105 + /**
  106 + * 获取N分钟后时间
  107 + * @param length
  108 + * @param date
  109 + * @return
  110 + */
  111 + public static Date getDateByTime(int length, Date date){
  112 + Calendar cal = Calendar.getInstance();
  113 + cal.setTime(date);//设置起时间
  114 + cal.add(Calendar.MINUTE,length);//把日期往后增加
  115 + return cal.getTime();
  116 + }
  117 +
  118 +
  119 + public static void main(String[] args) {
  120 + System.out.println(getDateByTime(3,new Date()));
  121 + System.out.println(date2String(new Date(),format3));
  122 + }
  123 +
  124 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/utils/JsonUtils.java 0 → 100644
... ... @@ -0,0 +1,148 @@
  1 +package com.sincere.haikangface.utils;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonInclude.Include;
  4 +import com.fasterxml.jackson.core.type.TypeReference;
  5 +import com.fasterxml.jackson.databind.DeserializationFeature;
  6 +import com.fasterxml.jackson.databind.JavaType;
  7 +import com.fasterxml.jackson.databind.ObjectMapper;
  8 +import org.apache.commons.lang3.StringUtils;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +
  12 +import java.io.IOException;
  13 +import java.util.Collection;
  14 +import java.util.Map;
  15 +
  16 +/**
  17 + * 类JsonMapper.java的实现描述:简单封装Jackson,实现JSON String<->Java Object的Mapper.
  18 + *
  19 + * <p> 封装不同的输出风格, 使用不同的builder函数创建实例. </p>
  20 + *
  21 + * @author xuquan
  22 + */
  23 +public class JsonUtils {
  24 +
  25 + private static final Logger LOG = LoggerFactory.getLogger(JsonUtils.class);
  26 +
  27 + private ObjectMapper mapper;
  28 +
  29 + public JsonUtils(){
  30 + this(null);
  31 + }
  32 +
  33 + public JsonUtils(Include include) {
  34 + mapper = new ObjectMapper();
  35 + // 设置输出时包含属性的风格
  36 + if (include != null) {
  37 + mapper.setSerializationInclusion(include);
  38 + }
  39 + // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
  40 + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
  41 + }
  42 +
  43 + /**
  44 + * 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper,建议在外部接口中使用.
  45 + */
  46 + public static JsonUtils nonEmptyMapper() {
  47 + return new JsonUtils(Include.NON_EMPTY);
  48 + }
  49 +
  50 + /**
  51 + * 创建只输出初始值被改变的属性到Json字符串的Mapper, 最节约的存储方式,建议在内部接口中使用。
  52 + */
  53 + public static JsonUtils nonDefaultMapper() {
  54 + return new JsonUtils(Include.NON_DEFAULT);
  55 + }
  56 +
  57 + /**
  58 + * Object可以是POJO,也可以是Collection或数组。
  59 + * 如果对象为Null, 返回"null".
  60 + * 如果集合为空集合, 返回"[]".
  61 + */
  62 + public String toJson(Object object) {
  63 +
  64 + try {
  65 + return mapper.writeValueAsString(object);
  66 + } catch (IOException e) {
  67 + LOG.warn(String.format("序列化成 JSON 字符串发生错误:%s", object), e);
  68 + return null;
  69 + }
  70 + }
  71 +
  72 + /**
  73 + * 反序列化POJO或简单Collection如List<String>.
  74 + *
  75 + * 如果JSON字符串为Null或"null"字符串, 返回Null.
  76 + * 如果JSON字符串为"[]", 返回空集合.
  77 + *
  78 + * 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String, JavaType)
  79 + *
  80 + * @see #fromJson(String, JavaType)
  81 + */
  82 + public <T> T fromJson(String jsonString, Class<T> clazz) {
  83 + if (StringUtils.isEmpty(jsonString)) {
  84 + return null;
  85 + }
  86 +
  87 + try {
  88 + return mapper.readValue(jsonString, clazz);
  89 + } catch (IOException e) {
  90 + LOG.error(String.format("解析 JSON 字符串发生错误:%s", jsonString), e);
  91 + return null;
  92 + }
  93 + }
  94 +
  95 + /**
  96 + * 反序列化泛型对象
  97 + * @param <T>
  98 + * @param jsonString
  99 + * @param typeReference
  100 + * @return
  101 + */
  102 + public <T> T fromJson(String jsonString, TypeReference<T> typeReference) {
  103 + if (StringUtils.isEmpty(jsonString)) {
  104 + return null;
  105 + }
  106 +
  107 + try {
  108 + return mapper.readValue(jsonString, typeReference);
  109 + } catch (IOException e) {
  110 + LOG.error(String.format("解析 JSON 字符串发生错误:%s", jsonString), e);
  111 + return null;
  112 + }
  113 + }
  114 +
  115 + /**
  116 + * 反序列化复杂Collection如List<Bean>, 先使用createCollectionType()或contructMapType()构造类型, 然后调用本函数.
  117 + *
  118 + * @see #(Class, Class...)
  119 + */
  120 + public <T> T fromJson(String jsonString, JavaType javaType) {
  121 + if (StringUtils.isEmpty(jsonString)) {
  122 + return null;
  123 + }
  124 +
  125 + try {
  126 + return mapper.readValue(jsonString, javaType);
  127 + } catch (IOException e) {
  128 + LOG.error(String.format("解析 JSON 字符串发生错误:%s", jsonString), e);
  129 + return null;
  130 + }
  131 + }
  132 +
  133 + /**
  134 + * 构造Collection类型.
  135 + */
  136 + public JavaType contructCollectionType(Class<? extends Collection> collectionClass, Class<?> elementClass) {
  137 + return mapper.getTypeFactory().constructCollectionType(collectionClass, elementClass);
  138 + }
  139 +
  140 + /**
  141 + * 构造Map类型.
  142 + */
  143 + public JavaType contructMapType(Class<? extends Map> mapClass, Class<?> keyClass, Class<?> valueClass) {
  144 + return mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass);
  145 + }
  146 +
  147 +
  148 +}
... ...
cloud/haikangface/src/main/java/com/sincere/haikangface/utils/NumConvertUtil.java 0 → 100644
... ... @@ -0,0 +1,34 @@
  1 +package com.sincere.haikangface.utils;
  2 +
  3 +import java.math.BigInteger;
  4 +
  5 +/**
  6 + * @author xuquan
  7 + * @date 2020/12/10 16:54
  8 + */
  9 +
  10 +public class NumConvertUtil {
  11 + /**
  12 + * 十六进制转十进制
  13 + * @param str
  14 + * @return
  15 + */
  16 + public static int hex16To10(String str){
  17 + BigInteger bigInteger = new BigInteger(str,16);
  18 + return bigInteger.intValue();
  19 + }
  20 +
  21 + /**
  22 + * 十进制转十六进制
  23 + * @param value
  24 + * @return
  25 + */
  26 + public static String hex10To16(int value){
  27 + String str = String.format("%08X",value);
  28 + return str;
  29 + }
  30 +
  31 + public static void main(String[] args) {
  32 + System.out.println(hex16To10("AF104568"));
  33 + }
  34 +}
... ...