From 1232df0d5bff5de02f046faf2074c7dc7dedf677 Mon Sep 17 00:00:00 2001 From: XuQuan <1099815072@qq.com> Date: Tue, 5 Jan 2021 08:18:53 +0800 Subject: [PATCH] 智能校卫一阶段优化代码提交 --- cloud/haikangface/src/main/java/com/sincere/haikangface/bean/Result.java | 37 +++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultCode.java | 28 ++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultGenerator.java | 29 +++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/AuthRecordDto.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/DeviceAuthRecord.java | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/sendFaceResult.java | 4 ++++ cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumDeviceType.java | 36 ++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendCardErrorType.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceErrorType.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceType.java | 26 ++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSzBusinessType.java | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/filter/AllowOriginFilter.java | 33 +++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java | 515 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java | 497 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java | 33 ++++++++++++++++----------------- cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/utils/JsonUtils.java | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/utils/NumConvertUtil.java | 34 ++++++++++++++++++++++++++++++++++ 20 files changed, 2165 insertions(+), 17 deletions(-) create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/bean/Result.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultCode.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultGenerator.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/AuthRecordDto.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/DeviceAuthRecord.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/sendFaceResult.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumDeviceType.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendCardErrorType.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceErrorType.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceType.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSzBusinessType.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/filter/AllowOriginFilter.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/utils/JsonUtils.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/utils/NumConvertUtil.java diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/Result.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/Result.java new file mode 100644 index 0000000..7b35028 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/Result.java @@ -0,0 +1,37 @@ +package com.sincere.haikangface.bean; + +/** + * 统一API响应结果封装 + */ +public class Result { + private int code; + private String message; + private T data; + + public Result setCode(ResultCode resultCode) { + this.code = resultCode.code(); + return this; + } + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } + + public Result setMessage(String message) { + this.message = message; + return this; + } + + public T getData() { + return data; + } + + Result setData(T data) { + this.data = data; + return this; + } +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultCode.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultCode.java new file mode 100644 index 0000000..8f88baf --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultCode.java @@ -0,0 +1,28 @@ +package com.sincere.haikangface.bean; + +/** + * 响应码枚举,参考HTTP状态码的语义 + */ +public enum ResultCode { + + // 成功 + SUCCESS(200), + // 失败 + FAIL(400), + // 未认证(签名错误) + UNAUTHORIZED(401), + // 接口不存在 + NOT_FOUND(404), + // 服务器内部错误 + INTERNAL_SERVER_ERROR(500); + + private final int code; + + ResultCode(int code){ + this.code = code; + } + + public int code() { + return code; + } +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultGenerator.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultGenerator.java new file mode 100644 index 0000000..29051dc --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/ResultGenerator.java @@ -0,0 +1,29 @@ +package com.sincere.haikangface.bean; + +/** + * 响应结果生成工具 + */ +public class ResultGenerator { + private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS"; + + private ResultGenerator() {} + + public static Result genSuccessResult() { + return new Result() + .setCode(ResultCode.SUCCESS) + .setMessage(DEFAULT_SUCCESS_MESSAGE); + } + + public static Result genSuccessResult(T data) { + return new Result() + .setCode(ResultCode.SUCCESS) + .setMessage(DEFAULT_SUCCESS_MESSAGE) + .setData(data); + } + public static Result genFailResult(String message) { + return new Result() + .setCode(ResultCode.FAIL) + .setMessage(message); + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/AuthRecordDto.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/AuthRecordDto.java new file mode 100644 index 0000000..768f2f5 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/AuthRecordDto.java @@ -0,0 +1,86 @@ +package com.sincere.haikangface.bean.face; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +/** + * 权限记录实体 + * @author xuquan + * @date 2020/12/16 09:10 + */ +@ApiModel +public class AuthRecordDto { + + @ApiModelProperty("权限表ID") + private Integer id ; + @ApiModelProperty("1 学生类型 2 学生组") + private Integer type ; + @ApiModelProperty("学校ID") + private Integer schoolId ; + @ApiModelProperty("设备号,逗号隔开") + private List snList; + @ApiModelProperty("学生类型,1通校2住校") + private Integer studentType ; + @ApiModelProperty("权限周计划列表") + private List weekDays ; + @ApiModelProperty("权限类型1微耕权限2人脸机权限") + private Integer authType; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getSchoolId() { + return schoolId; + } + + public void setSchoolId(Integer schoolId) { + this.schoolId = schoolId; + } + + public List getSnList() { + return snList; + } + + public void setSnList(List snList) { + this.snList = snList; + } + + public Integer getStudentType() { + return studentType; + } + + public void setStudentType(Integer studentType) { + this.studentType = studentType; + } + + public List getWeekDays() { + return weekDays; + } + + public void setWeekDays(List weekDays) { + this.weekDays = weekDays; + } + + public Integer getAuthType() { + return authType; + } + + public void setAuthType(Integer authType) { + this.authType = authType; + } +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/DeviceAuthRecord.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/DeviceAuthRecord.java new file mode 100644 index 0000000..4630812 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/DeviceAuthRecord.java @@ -0,0 +1,140 @@ +package com.sincere.haikangface.bean.face; + +import java.util.Date; + +/** + * 下发权限时段实体类 + * @author xuquan + * @date 2020/12/17 12:40 + */ +public class DeviceAuthRecord { + + private int id; + //时段 + private String shiduan ; + //学生组 就是powerGroupId 学生类型就是 studentType + private int studentType ; + //性别 + private String sex ; + //学校ID + private int schoolId ; + //开始时间 + private Date startTime ; + //结束时间 + private Date endTime ; + //设备ID + private String sno ; + //周计划json + private String weekDays; + //状态 + private int state; + //下发状态 + private int grantState; + //权限类型 + private int authType; + //计划类型 + private int aType; + + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + + public String getShiduan() { + return shiduan; + } + + public void setShiduan(String shiduan) { + this.shiduan = shiduan; + } + + public int getAuthType() { + return authType; + } + + public void setAuthType(int authType) { + this.authType = authType; + } + + public String getSno() { + return sno; + } + + public void setSno(String sno) { + this.sno = sno; + } + + public int getStudentType() { + return studentType; + } + + public void setStudentType(int studentType) { + this.studentType = studentType; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public int getSchoolId() { + return schoolId; + } + + public void setSchoolId(int schoolId) { + this.schoolId = schoolId; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getWeekDays() { + return weekDays; + } + + public void setWeekDays(String weekDays) { + this.weekDays = weekDays; + } + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } + + public int getGrantState() { + return grantState; + } + + public void setGrantState(int grantState) { + this.grantState = grantState; + } + + public int getaType() { + return aType; + } + + public void setaType(int aType) { + this.aType = aType; + } +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/sendFaceResult.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/sendFaceResult.java new file mode 100644 index 0000000..341e9a2 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/face/sendFaceResult.java @@ -0,0 +1,4 @@ +package com.sincere.haikangface.bean.face; + +public class sendFaceResult { +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java new file mode 100644 index 0000000..4d514ca --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java @@ -0,0 +1,136 @@ +package com.sincere.haikangface.control; + +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.databind.JavaType; +import com.sincere.haikangface.async.SendUserAsync; +import com.sincere.haikangface.bean.Result; +import com.sincere.haikangface.bean.ResultGenerator; +import com.sincere.haikangface.bean.face.AuthRecordDto; +import com.sincere.haikangface.bean.face.DeviceAuthRecord; +import com.sincere.haikangface.bean.face.PermissionBean; +import com.sincere.haikangface.bean.face.WeekDay; +import com.sincere.haikangface.dao.UserDao; +import com.sincere.haikangface.enums.EnumSzBusinessType; +import com.sincere.haikangface.service.UserOperateService; +import com.sincere.haikangface.utils.FileUtils; +import com.sincere.haikangface.utils.JsonUtils; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 用户信息、人脸、卡信息、权限下发控制类 + * @author xuquan + * @date 2020/12/01 15:16 + */ +@Slf4j +@RestController +@RequestMapping(value = "/operate/*", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) +public class UserOperateController { + + @Autowired + UserDao userDao; + @Autowired + SendUserAsync sendUserAsync; + @Autowired + UserOperateService userOperateService; + + @RequestMapping(value = "createHKAuth", method = RequestMethod.POST) + @ApiOperation("人脸机创建权限2.0") + public Result sendPermiss(@RequestBody AuthRecordDto authRecordDto) { + log.info("permissionBean:{}", JSON.toJSONString(authRecordDto)); + if(userOperateService.createHKAuth(authRecordDto)){ + return ResultGenerator.genSuccessResult(); + }else{ + return ResultGenerator.genFailResult("权限创建失败"); + } + } + + private static JsonUtils objectMapper = JsonUtils.nonEmptyMapper(); + @RequestMapping(value = "sendHKAuth", method = RequestMethod.POST) + @ApiOperation("下发权限给设备2.0") + public Result sendHKPermiss(@RequestParam("authId") Integer authId) { + DeviceAuthRecord record = userDao.getAuthRecord(authId); + if(record ==null){ + log.info("未查询到对应权限ID: {}, 权限计划。",authId); + return ResultGenerator.genFailResult("未查询到对应权限"); + } + Integer studentType = record.getStudentType(); + //周计划 + String weekDaysJson = record.getWeekDays(); + JavaType javaType = objectMapper.contructCollectionType(ArrayList.class, WeekDay.class); + ArrayList weekDayList = objectMapper.fromJson(weekDaysJson,javaType); + //设备ID + String[] deviceArr = record.getSno().split(","); + List devices= new ArrayList<>(Arrays.asList(deviceArr)); + PermissionBean permissionBean = new PermissionBean(); + permissionBean.setWeekDays(weekDayList); + permissionBean.setDeviceIds(devices); + permissionBean.setSchoolId(String.valueOf(record.getSchoolId())); + permissionBean.setUserType(String.valueOf(EnumSzBusinessType.EnumUserType.STUDENT.code)); + FileUtils.getInstance().writeLogs("传入权限模板:" + JSON.toJSONString(permissionBean), "设置权限内容.txt"); + if (!StringUtils.isEmpty(permissionBean.getDeviceIds())) { + if(sendUserAsync.sendHKAuth(permissionBean,record.getId(),studentType)){ + return ResultGenerator.genSuccessResult(); + }else{ + return ResultGenerator.genFailResult("下发权限失败"); + } + } + return ResultGenerator.genSuccessResult(); + } + + @ApiOperation("删除单卡权限2.0") + @RequestMapping(value = "deleteCardAuth",method = RequestMethod.GET) + public Result deleteCardAuth(Integer authId){ + userOperateService.deleteAuthRecord(authId); + return ResultGenerator.genSuccessResult(); + } + + @ApiOperation("获取权限详情权限2.0") + @RequestMapping(value = "getCardAuth",method = RequestMethod.GET) + public Result getCardAuth(Integer authId){ + return ResultGenerator.genSuccessResult(userOperateService.getAuthRecord(authId)); + } + + @ApiOperation("重新下发人脸2.0") + @RequestMapping(value = "againSendFace",method = RequestMethod.GET) + public Result againSendFace(String userId,String deviceId,Integer userType){ + return userOperateService.againSendFace(userId,deviceId,userType); + } + + @ApiOperation(value = "照片下发2.0") + @RequestMapping(value = "sendFace", method = RequestMethod.GET) + public Result sendFace(@RequestParam("schoolId") String schoolId, @RequestParam("type") int type,@RequestParam("deviceIds") String deviceIds) { + return userOperateService.sendFace(schoolId,type,deviceIds); + } + + // /** +// * 下发卡权限至指定设备(含批量) +// * @param permissionBean +// * @return +// */ +// @RequestMapping(value = "sendUserPermission", method = RequestMethod.POST) +// @ApiOperation("下发权限给设备") +// public boolean sendUserPermission(@RequestBody PermissionBean permissionBean) { +// log.error("permissionBean:{}", JSON.toJSONString(permissionBean)); +// FileUtils.getInstance().writeLogs("传入权限模板:" + JSON.toJSONString(permissionBean), "设置权限内容.txt"); +// +// return userOperateService.sendUserPermission(permissionBean); +// } +// +// +// @RequestMapping(value = "sendUserFace", method = RequestMethod.POST) +// @ApiOperation("下发人脸给设备") +// public boolean sendUserFace(@RequestParam("filePath") String filePath, @RequestParam("userId") String userId,@RequestParam("userType") Integer userType, +// @RequestParam("schoolId") String schoolId, @RequestParam("deviceId") String deviceId) { +// return userOperateService.sendUserFace(filePath,schoolId, userId,userType,deviceId); +// } +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumDeviceType.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumDeviceType.java new file mode 100644 index 0000000..88856f8 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumDeviceType.java @@ -0,0 +1,36 @@ +package com.sincere.haikangface.enums; + +/** + * 设备类型枚举 + * + * @author xuquan + * @date 2020/11/11 16:06 + */ + +public enum EnumDeviceType { + + SCHOOL_CARD(1, "校牌"), + CLASS_CARD(2, "班牌"), + CLOUD_WINDOW(4, "云视窗"), + ZJ_CONTROL(6, "闸机控制器"), + LOAN_PERIOD(7, "话机"), + HK_FACE(18, "海康人脸设备"), + FACE(19, "人脸设备"), + DH_FACE(22, "大华人脸设备"), + HK_ZW(23, "海康指纹机"), + ZK_ZW(24, "中控指纹机"), + BG_FACE_WG(25, "博观人脸带温感"), + BG_FACE_CG(26, "博观人脸常规"), + LQ_QS(27, "乐清寝室看板"), + HK_FACE_YTJ(28, "海康人脸权限一体机"), + DH_FACE_YTJ(29, "大华人脸权限一体机"); + + public final int deviceType; + public final String deviceName; + + EnumDeviceType(int deviceType, String deviceName) { + this.deviceType = deviceType; + this.deviceName = deviceName; + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendCardErrorType.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendCardErrorType.java new file mode 100644 index 0000000..662d6d7 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendCardErrorType.java @@ -0,0 +1,51 @@ +package com.sincere.haikangface.enums; + +import org.apache.commons.lang.StringUtils; + +/** + *下发卡常见异常码、异常描述枚举 + * @author xuquan + * @date 2020/11/11 15:19 + */ + +public enum EnumSendCardErrorType { + + CHECK_DATA_ERR_21("21", "对返回数据的校验出错"), + EXIST_USER_146("146", "用户已存在"), + NOT_ONLINE_USER_147("147", "用户不存在"), + UNKNOWN_1091("1091" , "未知错误"), + UNKNOWN_1147("1147" , "未知错误"), + UNKNOWN_1162("1162", "未知错误"); + + public final String code; + public final String message; + + public String getCode() { + return code; + } + + public String getMessage() { + return message; + } + + EnumSendCardErrorType(String code, String message) { + this.code = code; + this.message = message; + } + + /** + * 根据key获得具体的值 + */ + public static EnumSendCardErrorType getByCode(String code){ + if(StringUtils.isBlank(code)){ + return null; + } + for(EnumSendCardErrorType enums: EnumSendCardErrorType.values()){ + if(enums.getCode().equals(code)){ + return enums; + } + } + return null; + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceErrorType.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceErrorType.java new file mode 100644 index 0000000..9972874 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceErrorType.java @@ -0,0 +1,50 @@ +package com.sincere.haikangface.enums; + +import org.apache.commons.lang.StringUtils; + +/** + * 下发人脸常见异常码、异常描述枚举 + * @author xuquan + * @date 2020/11/11 15:23 + */ +public enum EnumSendFaceErrorType { + + CHECK_DATA_ERR_21("21", "对返回数据的校验出错"), + EXCEED_SIZE_1028("1028", "图片大小超限"), + NOT_EXIST_USER_1029("1029", "用户ID不存在"), + EXTRACT_ERROR_1030("1030", "照片特征值提取失败"), + EXIST_IMG_1031("1031", "照片已存在"), + UPPER_LIMIT_1032("1032", "照片数量超过上限"); + + public final String code; + public final String message; + + public String getCode() { + return code; + } + + public String getMessage() { + return message; + } + + EnumSendFaceErrorType(String code, String message) { + this.code = code; + this.message = message; + } + + /** + * 根据key获得具体的值 + */ + public static EnumSendFaceErrorType getByCode(String code){ + if(StringUtils.isBlank(code)){ + return null; + } + for(EnumSendFaceErrorType enums: EnumSendFaceErrorType.values()){ + if(enums.getCode().equals(code)){ + return enums; + } + } + return null; + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceType.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceType.java new file mode 100644 index 0000000..fcc5b2e --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSendFaceType.java @@ -0,0 +1,26 @@ +package com.sincere.haikangface.enums; + +/** + * 下发人脸枚举配置中心 + * + * @Author: xuquan + * @Date: 2020/11/1 14:59 + */ +public enum EnumSendFaceType { + + NOT_EXIST_DEVICE(1, "设备不存在"), + NOT_ONLINE_DEVICE(2, "设备不在线"), + FACE_AND_CARD_FAIL(3, "人脸信息、卡信息下发失败"), + FACE_FAIL_CARD_SUCCESS(4, "人脸信息下发失败,卡信息下发成功"), + FACE_SUCCESS_CARD_FAIl(5, "人脸信息下发成功,卡信息下发失败"), + TIME_INTERVAL_ERROR(6, "刷卡时段验证错误"); + + public final int code; + public final String message; + + EnumSendFaceType(int code, String message) { + this.code = code; + this.message = message; + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSzBusinessType.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSzBusinessType.java new file mode 100644 index 0000000..55b5e35 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/enums/EnumSzBusinessType.java @@ -0,0 +1,125 @@ +package com.sincere.haikangface.enums; + +/** + * 顺治科技智能校卫业务枚举配置中心 + * + * @author xuquan + * @date 2020/11/11 14:43 + */ + +public interface EnumSzBusinessType { + + /** + * 用户类型 + */ + public enum EnumUserType { + + TEACHER(1, "teacher","老师"), + STUDENT(2, "student","学生"); +// PARENT(3, "parent","家长"); + + public final int code; + public final String enName; + public final String cnName; + + EnumUserType(int code, String enName,String cnName) { + this.code = code; + this.enName = enName; + this.cnName = cnName; + } + } + + /** + * 学生出入类型 + */ + public enum EnumStudentType { + + GO_OUT(1, "通校"), + LIVING(2, "住校"), + ALL(3, "全部"); + + public final int code; + public final String name; + + EnumStudentType(int code, String name) { + this.code = code; + this.name = name; + } + } + + /** + * 设备出入类型 + */ + public enum EnumDeviceInAndOut { + + INT(1, "进校"), + OUT(0, "出校"); + + public final int code; + public final String name; + + EnumDeviceInAndOut(int code, String name) { + this.code = code; + this.name = name; + } + } + + + /** + * 设备操作错误码 参考:NET_EM_FAILCODE + */ + public enum EnumOperateErrorType { + + ZERO(0, "没有错误"), + ONE(1, "未知错误"), + TEO(2, "参数错误"), + THREE(3, "无效密码"), + FOUR(4, "无效指纹数据"), + FIVE(5, "无效人脸数据"), + SIX(6, "无效卡数据"), + SEVEN(7, "无效人数据"), + ERR_21(21, "对返回数据校验出错"); + + + public final int code; + public final String name; + + public int getCode() { + return code; + } + + public String getMessage() { + return name; + } + + EnumOperateErrorType(int code, String name) { + this.code = code; + this.name = name; + } + + public static EnumSzBusinessType.EnumOperateErrorType getByCode(int code){ + for(EnumSzBusinessType.EnumOperateErrorType enums: EnumSzBusinessType.EnumOperateErrorType.values()){ + if(enums.getCode()==code){ + return enums; + } + } + return null; + } + } + + public enum EnumHkOperateType { + + ADD(1,"下发"), + EDIT(2,"修改"), + DELETE(3, "删除"); + + public final int code; + public final String name; + + EnumHkOperateType(int code, String name) { + this.code = code; + this.name = name; + } + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/filter/AllowOriginFilter.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/filter/AllowOriginFilter.java new file mode 100644 index 0000000..2445103 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/filter/AllowOriginFilter.java @@ -0,0 +1,33 @@ +package com.sincere.haikangface.filter; + +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 用于解决跨域问题 + */ +@Component +@WebFilter(urlPatterns = "/*", filterName = "authFilter") +public class AllowOriginFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "*"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers","*"); + chain.doFilter(req, res); + } + + @Override + public void destroy() { + } +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java new file mode 100644 index 0000000..99362c5 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java @@ -0,0 +1,50 @@ +package com.sincere.haikangface.service; + +import com.sincere.haikangface.bean.Result; +import com.sincere.haikangface.bean.face.AuthRecordDto; +import com.sincere.haikangface.bean.face.DeviceAuthRecord; +import com.sincere.haikangface.bean.face.PermissionBean; +import org.apache.ibatis.annotations.Param; + +/** + * @author xuquan + * @date 2020/12/10 17:25 + */ + +public interface UserOperateService { + +// /** +// * 下发卡权限至指定设备(含批量)a/ +// * @param permissionBean +// * @return +// */ +// boolean sendUserPermission(PermissionBean permissionBean); +// +// boolean sendUserFace(String filePath, String schoolId,String userId,int userType, String deviceId); + + /** + * 创建权限 + * @param recordDto + * @return + */ + boolean createHKAuth(AuthRecordDto recordDto); + + /** + * 权限ID删除权限下发记录 + * @param authId + * @return + */ + void deleteAuthRecord(Integer authId); + + /** + * 获取权限 + * @param authId + * @return + */ + DeviceAuthRecord getAuthRecord(Integer authId); + + Result againSendFace(String userId,String deviceId,Integer userType); + + Result sendFace(String schoolId,Integer type,String deviceIds); + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java new file mode 100644 index 0000000..759463f --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java @@ -0,0 +1,515 @@ +package com.sincere.haikangface.service.impl; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.sincere.haikangface.CMSServer; +import com.sincere.haikangface.async.SendUserAsync; +import com.sincere.haikangface.bean.BaiduFaceRecorder; +import com.sincere.haikangface.bean.SendRecordBean; +import com.sincere.haikangface.bean.StudentBean; +import com.sincere.haikangface.bean.TeacherBean; +import com.sincere.haikangface.dao.UserDao; +import com.sincere.haikangface.enums.EnumSzBusinessType; +import com.sincere.haikangface.mqtt.MqtUtils; +import com.sincere.haikangface.utils.*; +import com.sincere.haikangface.xiananDao.SendRecordDao; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 业务基础类 + * @author xuquan + * @date 2020/12/23 10:16 + */ +@Slf4j +@Service +public class BaseService { + + @Autowired + private SendRecordDao sendRecordDao; + @Autowired + private UserDao userDao; + @Autowired + CMSServer cmsServer; + @Autowired + SendUserAsync sendUserAsync; + + @Value("${ipCloud}") + private String ipCloud; + + public boolean sendImg2Device(String filePath, String card, String name, String deviceId, String userType) { + try { + if (new File(filePath.trim()).exists()) { + String targetPath = FileUtils.picPathComp + new File(filePath).getName(); + try { + CompressPic.CompressPic(filePath, targetPath); + } catch (Exception e) { + e.printStackTrace(); + } + StudentBean studentBean = userDao.getStudentWithCard(card); + Integer schoolId = studentBean ==null ?null:studentBean.getSchool_id(); + + return sendImg(filePath, targetPath, deviceId, card, name, userType,schoolId); + } else { + sendFail(Long.parseLong(getCard(card), 16) + "", filePath, deviceId,"文件不存在", userType); + System.out.println("文件不存在:" + filePath); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + /** + * 下发人脸给设备 + * @param filePath 人脸文件路径 + * @param targetPath + * @param deviceId + * @param card + * @param name + * @param userType + * @return + */ + public boolean sendImg(String filePath, String targetPath, String deviceId, String card, String name, String userType,Integer schoolId) { + String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.YEAR, 10); + String endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()); + //下发标识:详情见枚举 EnumHkOperateType + int validTimeEnabled = EnumSzBusinessType.EnumHkOperateType.ADD.code; + try { + FileUtils.getInstance().writeLogs("startTime:" + startTime + "---endTime:" + endTime + "---card:" + card, "下发参数"); + if (cmsServer.getIsDeviceOnline(deviceId)) { + String cardNo = Long.parseLong(getCard(card),16)+""; + //下发海康设备 + sendUserAsync.sendStuToHaiKang(filePath,targetPath, cardNo, startTime, endTime, validTimeEnabled, name, deviceId, userType,schoolId); + }else { + sendUserAsync.uploadImgs(targetPath, card, name, deviceId, startTime, endTime, validTimeEnabled, userType); + } + return true; + } catch (Exception e) { + log.error("下发人脸照失败,错误信息:"+ e.getMessage()); + return false; + } + } + + /** + * 发送失败人脸 + * @param deviceId + * @param userType + */ + public void sendFace(String deviceId, int userType) { + List sendRecordBeans = sendRecordDao.getSendFailWithDevId(deviceId); + if (null != sendRecordBeans) { + for (int i = 0; i < sendRecordBeans.size(); i++) { + SendRecordBean sendRecordBean = sendRecordBeans.get(i); + String typeName = ""; + if (userType == 0) { + typeName = sendRecordBean.getUserType() == 1 ? "Teacher" : "Student"; + } else { + typeName = userType == 1 ? "Teacher" : "Student"; + } + String studentCode = ""; + if (sendRecordBean.getUserType() == 1) { + studentCode = userDao.getTeaNumWithCard(sendRecordBean.getNum()); + } else if (sendRecordBean.getUserType() == 2) { + studentCode = userDao.getStudentCode(sendRecordBean.getNum()); + } + String imgPath = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + sendRecordBean.getSchoolId() + "\\" + typeName + "\\" + studentCode + ".png"; + File imgFile = new File(imgPath); + if (imgFile.exists()) { + String targetPath = FileUtils.picPathComp + imgFile.getName(); + try { + CompressPic.CompressPic(imgFile.getAbsolutePath(), targetPath); + } catch (Exception e) { + e.printStackTrace(); + } + String cardNum = sendRecordBean.getNum(); + String userName = sendRecordBean.getName(); + Integer schoolId = sendRecordBean.getSchoolId(); + userType = sendRecordBean.getUserType(); + sendImg(imgPath, targetPath,deviceId,cardNum ,userName,String.valueOf(userType),schoolId); + } else { + log.error("文件不存在"); + } + } + + } + + } + + /** + * 保存成功下发记录 + */ + public synchronized void sendSuccessRecord(String card, String faceUrl, String deviceId,String userType) { + long lon = Long.parseLong(card); + String resultCard = getCard(String.format("%08x", lon)).toUpperCase(); + StudentBean studentBean = null; + switch (userType) { + case "1"://老师 + studentBean = userDao.getTeacherWithCard(resultCard); + break; + case "2"://学生 + studentBean = userDao.getStudentWithCard(resultCard); + break; + case "3"://家长 + break; + } + if (null != studentBean) { + //用户ID + String userId = studentBean.getUser_id(); + //用户名称 + String userName = studentBean.getName(); + //所属学校 + int schoolId = studentBean.getSchool_id(); + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + ""); + List sendRecordBeans = sendRecordDao.getRecordIsExit(deviceId,resultCard,userId); + SendRecordBean sendRecordBean =null; + if(sendRecordBeans.size()>0){ + sendRecordBean = sendRecordBeans.get(0); + } + if (null == sendRecordBean) { + sendRecordDao.saveFaceRecord(userId, deviceId, resultCard, userName, time, schoolName, + faceUrl, schoolId,null,null, Integer.parseInt(userType),18,1); + } else { + sendRecordDao.updateFaceSuccessRecord(deviceId,resultCard,time,faceUrl,userName,userId); + } + FileUtils.getInstance().writeLogs(studentBean.toString() + "\r\n" + resultCard, "下发成功记录"); + } else { + log.error("用户不存在: 对应卡号{} ," + resultCard); + } + } + + + /** + * 保存下发失败记录 + * @param card + * @param faceUrl + * @param deviceId + * @param content + * @param userType + */ + public synchronized void sendFailRecord(String card, String faceUrl, String deviceId,String content,String userType) { + long lon = Long.parseLong(card); + String resultCard = getCard(String.format("%08x", lon)).toUpperCase(); + StudentBean studentBean = null; + switch (userType) { + case "1"://老师 + studentBean = userDao.getTeacherWithCard(resultCard); + break; + case "2"://学生 + studentBean = userDao.getStudentWithCard(resultCard); + break; + case "3"://家长 + break; + } + if (null != studentBean) { + //用户ID + String userId = studentBean.getUser_id(); + //用户名称 + String userName = studentBean.getName(); + //所属学校 + int schoolId = studentBean.getSchool_id(); + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + ""); + List sendRecordBeans = sendRecordDao.getRecordIsExit(deviceId,resultCard,userId); + SendRecordBean sendRecordBean =null; + if(sendRecordBeans.size()>0){ + sendRecordBean = sendRecordBeans.get(0); + } + if (null == sendRecordBean) { + sendRecordDao.saveFaceRecord(userId, deviceId, resultCard, userName, time, schoolName, + faceUrl, schoolId, content,9, Integer.parseInt(userType),18,2); + }else { + sendRecordDao.updateFaceFailRecord(deviceId,faceUrl,resultCard,time,content,userId); + } + } else { + log.error("用户不存在: 对应卡号{} ," + resultCard); + } + } + + public synchronized void sendSuccess(String card,String faceUrl,String deviceId,String userType) { +// BigInteger bigInteger = new BigInteger(card); + long lon = Long.parseLong(card); + String resultCard = getCard(String.format("%08x", lon)).toUpperCase(); + StudentBean studentBean = null; + String customerId = ""; + switch (userType) { + case "1"://老师 + studentBean = userDao.getTeacherWithCard(resultCard); + customerId = studentBean.getTeacher_id(); + break; + case "2"://学生 + studentBean = userDao.getStudentWithCard(resultCard); + customerId = studentBean.getStudent_id(); + break; + case "3"://家长 + + break; + } + if (null != studentBean) { + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + ""); + List sendRecordBeans = sendRecordDao.getSuccessIsExitStu(deviceId, resultCard); + SendRecordBean sendRecordBean = null; + //处理重复添加的数据 + if (null != sendRecordBeans && sendRecordBeans.size() > 1) { + for (int i = 0; i < sendRecordBeans.size(); i++) { + sendRecordDao.deleteFaceSuccess(sendRecordBeans.get(i).getNum(), sendRecordBeans.get(i).getDeviceID()); + } + } else if (null != sendRecordBeans && sendRecordBeans.size() == 1) { + sendRecordBean = sendRecordBeans.get(0); + } + if (null == sendRecordBean) { + //添加成功日志 + sendRecordDao.addFaceSuccess(customerId, deviceId, resultCard, studentBean.getName(), time, schoolName, + faceUrl, studentBean.getSchool_id(), Integer.parseInt(userType), 18); + } else { + sendRecordDao.updateFaceSuccess(deviceId, resultCard, time, faceUrl, studentBean.getName(), customerId); + } + FileUtils.getInstance().writeLogs(studentBean.toString() + "\r\n" + resultCard, "下发成功记录"); + //删除下发失败表中的数据 + sendRecordDao.deleteFaceFail(resultCard, deviceId); + } else { + log.error("用户不存在: 卡号 {}," + resultCard); + } + } + + /** + * 下发人脸失败 + * + * @param card + * @param faceUrl + * @param deviceId + */ + public synchronized void sendFail(String card, String faceUrl, String deviceId,String content, String userType) { +// BigInteger bigInteger = new BigInteger(card); + long lon = Long.parseLong(card); + String resultCard = getCard(String.format("%08x", lon)).toUpperCase(); + StudentBean studentBean = null; + String customerId = ""; + switch (userType) { + case "1"://老师 + studentBean = userDao.getTeacherWithCard(resultCard); + customerId = studentBean.getTeacher_id(); + break; + case "2"://学生 + studentBean = userDao.getStudentWithCard(resultCard); + customerId = studentBean.getStudent_id(); + break; + case "3"://家长 + break; + } + if (null != studentBean) { + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + ""); + List sendRecordBeans = sendRecordDao.getFailIsExit(deviceId, resultCard); + + SendRecordBean sendRecordBean = null; + //处理重复添加的数据 + if (null != sendRecordBeans && sendRecordBeans.size() > 1) { + for (int i = 0; i < sendRecordBeans.size(); i++) { + sendRecordDao.deleteFaceFail(sendRecordBeans.get(i).getNum(), sendRecordBeans.get(i).getDeviceID()); + } + } else if (null != sendRecordBeans && sendRecordBeans.size() == 1) { + sendRecordBean = sendRecordBeans.get(0); + } + if (null == sendRecordBean) { + sendRecordDao.addFaceFail(customerId, deviceId, resultCard, studentBean.getName(), time, schoolName, + faceUrl, studentBean.getSchool_id(), content, 9, Integer.parseInt(userType), 18); + } else { + sendRecordDao.updateFaceFail(deviceId, resultCard, time, content); + } + } else { + log.error("用户不存在: 卡号 {}," + resultCard); + } + } + + /** + * 校验卡号 + * @param card + * @return + */ + public String getCard(String card) { + if (card.length() == 8) { + int length = card.length(); + String result = card.substring(length - 2, length) + card.substring(length - 4, length - 2) + card.substring(length - 6, length - 4) + + card.substring(length - 8, length - 6); + return result; + } else { + log.warn("卡号位数不对:" + card); + return ""; + } + } + + /** + * 下发时长统计下发截止时间 + * 每条数据执行0.06分钟 + * @param size 文件数 + * @param clientNum 设备数 + * @return + */ + public String getTime(int size,int clientNum,int timeLength){ + Date date = new Date(); + if(clientNum ==0){ + return DateUtils.date2String(date,DateUtils.format3); + } + Date afterDate = DateUtils.getDateByTime(timeLength,date); + String dateStr = DateUtils.date2String(afterDate,DateUtils.format3); + return dateStr; + } + + //存储抓拍人脸用户信息 + private static Map userMap = new HashMap<>(); + + /** + * 人脸发送看板信息 + * @param file + * @param deviceId + */ + public void sendUserInfoToKB(File file,String deviceId){ + //获取学校ID + String schoolId = userDao.getSchoolIdWithDevId(deviceId); + //请求人脸识别 + JSONObject jsonObject = HttpUtil.sendToKB(file,schoolId); + if(jsonObject ==null){ + log.error("人脸识别失败,返回数据为空"); + return; + } + String face = jsonObject.getString("data"); + if (face.startsWith("face") || face.startsWith("pic")){ + log.error("人脸识别失败"); + return; + } + JSONObject data = jsonObject.getJSONObject("data"); + String errorMsg = data.getString("error_msg"); + //识别成功 + if (errorMsg.equals("SUCCESS")) { + JSONObject result = data.getJSONObject("result"); + //用户信息 + JSONArray userList = result.getJSONArray("user_list"); + if (userList != null && userList.size() > 0) { + for (int i = 0; i < userList.size(); i++) { + JSONObject user = userList.getJSONObject(i); + //用户ID + String userId = user.getString("user_id"); + //比对成功分数值 + String score = user.getString("score"); + double sc = Double.valueOf(score.split("\\.")[0]); + if (sc >= 60) { + TeacherBean teacherBean = userDao.getTeacherWithUserId1(userId); + if (null != teacherBean) { + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + teacherBean.setTime(time); + if (StringUtils.isBlank(teacherBean.getTeacer_num())){ + teacherBean.setTeacer_num(userId); + } + //保存百度人脸识别记录 + saveBaiDuFaceRecorder(teacherBean,file,sc,userId); + //同一用户抓拍时间在60秒内,则部不发送看板 + if (userMap.containsKey(userId) && userMap.get(userId)!=null) { + long value = userMap.get(userId); + if ((System.currentTimeMillis() - value) / 1000 > 60) { + userMap.put(userId,System.currentTimeMillis()); + send2DeviceIds(schoolId, teacherBean); + log.info("发送成功....."); + } + } else { + userMap.put(userId, System.currentTimeMillis()); + send2DeviceIds(schoolId, teacherBean); + log.info("发送成功....."); + } + } else { + log.info("用户身份信息不存在"); + sendNoPersonImg(file,schoolId); + } + } else { + log.info("用户身份信息不存在" + score); + sendNoPersonImg(file,schoolId); + } + } + } + } else { + log.error("百度人脸识别失败, 返回信息:{}" + jsonObject.toJSONString()); + } + } + + /** + * 发送平台用户信息至看板设备 + * @param schoolId + * @param teacherBean + */ + private void send2DeviceIds(String schoolId, TeacherBean teacherBean) { + List deviceIds = userDao.getKBDevices(schoolId); + if (deviceIds != null) { + for (int i = 0; i < deviceIds.size(); i++) { + String deviceId = deviceIds.get(i); + if (!StringUtils.isEmpty(deviceId)) { + String content = "{\"cmd\":\"" + 1 + "\",\"clientId\":\"\",\"data\": " + teacherBean.toString() + "}"; + MqtUtils.getInstance().sendMsg(deviceId, content); + } + } + } + } + + /** + * 发送陌生人信息至设备看板 + * @param faceFile + * @param schoolId + */ + private void sendNoPersonImg(File faceFile, String schoolId) { + List deviceIds = userDao.getKBDevices(schoolId); + String imgName = faceFile.getName(); + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + if (imgName.contains(date)) { + String imgId = imgName.substring(0, imgName.indexOf(date)); + String api = "/kms/services/rest/dataInfoService/downloadFile?id=" + imgId; + String imgUrl = ipCloud+":8081"+ api; + FileUtils.getInstance().writeLogs("文件名:" + imgUrl, FileUtils.fileNoPerson); + for (int i = 0; i < deviceIds.size(); i++) { + String deviceId = deviceIds.get(i); + if (!org.springframework.util.StringUtils.isEmpty(deviceId)){ + String content = "{\"cmd\":\"" + 2 + "\",\"clientId\":\"\",\"data\": \"" + imgUrl + "\"}"; + MqtUtils.getInstance().sendMsg(deviceId, content); + } + } + } + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private void saveBaiDuFaceRecorder(TeacherBean teacherBean,File faceFile,double score,String userId){ + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + BaiduFaceRecorder baiduFaceRecorder = new BaiduFaceRecorder(); + baiduFaceRecorder.setUserId(userId); + baiduFaceRecorder.setName(teacherBean.getName()); + baiduFaceRecorder.setScore(score + ""); + baiduFaceRecorder.setTime(teacherBean.getTime()); + baiduFaceRecorder.setUserImgUrl(teacherBean.getFace()); + String uploadImgUrl = ""; + if(faceFile.getAbsolutePath().contains(date)){ + //抓拍照片ID + String imgId = faceFile.getName().substring(0,faceFile.getName().indexOf(date)); + String api = "/kms/services/rest/dataInfoService/downloadFile?id=" +imgId; + uploadImgUrl = ipCloud+ api; + }else { + uploadImgUrl = faceFile.getAbsolutePath(); + } + baiduFaceRecorder.setUploadImgUrl(uploadImgUrl); + + //插入百度人脸记录表 + userDao.insertBaiduFaceRecorder(baiduFaceRecorder); + } +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java new file mode 100644 index 0000000..516cd9a --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java @@ -0,0 +1,497 @@ +package com.sincere.haikangface.service.impl; +import com.sincere.haikangface.CMSServer; +import com.sincere.haikangface.async.SendUserAsync; +import com.sincere.haikangface.bean.*; +import com.sincere.haikangface.bean.face.*; +import com.sincere.haikangface.dao.DeviceDao; +import com.sincere.haikangface.dao.UserDao; +import com.sincere.haikangface.service.UserOperateService; +import com.sincere.haikangface.utils.*; +import com.sincere.haikangface.xiananDao.SendRecordDao; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.io.File; +import java.util.*; + +/** + * TODO + * + * @author Administrator + * @date 2020/12/10 21:26 + */ +@Slf4j +@Service +public class UserOperateServiceImpl implements UserOperateService { + + @Autowired + CMSServer cmsServer; + @Autowired + DeviceDao deviceDao; + @Autowired + SendRecordDao sendRecordDao; + @Autowired + UserDao userDao; + @Autowired + BaseService baseService; + @Autowired + SendUserAsync sendUserAsync; + + private static JsonUtils objectMapper = JsonUtils.nonEmptyMapper(); + + @Override + public boolean createHKAuth(AuthRecordDto recordDto) { + try { + String sexStr = recordDto.getWeekDays().get(0).getSex(); + //1学生类型,当为组时为群组iD + int studentType = recordDto.getStudentType(); + //学校ID + int schoolId = recordDto.getSchoolId(); + //设备ID + List deviceIds = recordDto.getSnList(); + //1 学生类型 2 学生组 + int type = recordDto.getType(); + //权限类型 + int authType = recordDto.getAuthType(); + //权限周计划 + List weekDay = recordDto.getWeekDays(); + String weekDayJson = objectMapper.toJson(weekDay); + String deviceStr = ""; + for (String sn : deviceIds) { + deviceStr += sn + ","; + } + Date start = DateUtils.string2Date("2020-01-01", DateUtils.format1); + Date end = DateUtils.string2Date("2030-01-01", DateUtils.format1); + deviceStr = deviceStr.substring(0, deviceStr.length() - 1); + //保存权限计划 + saveDeviceAuth(schoolId, deviceStr, studentType, start, end, weekDayJson, sexStr, type, authType); + return true; + } catch (Exception e) { + e.printStackTrace(); + log.error("创建权限失败"); + } + return false; + } + + private void saveDeviceAuth(int schoolId, String sn, int studentType, Date start, Date end, String json, String sexStr, int type, int authType) { + //设置权限信息 + DeviceAuthRecord record = new DeviceAuthRecord(); + //学校ID + record.setSchoolId(schoolId); + //开始时间 + record.setStartTime(start); + //结束时间 + record.setEndTime(end); + //设备ID + record.setSno(sn); + //学生类型1通校2住校 + record.setStudentType(studentType); + //性别 + record.setSex(sexStr); + //时段 + record.setShiduan(null); + //计划状态1正常2停用 + record.setState(1); + //计划下发状态1下发成功2下发失败3待下发 + record.setGrantState(3); + //计划详情 + record.setWeekDays(json); + //权限类型1微耕2人脸机 + record.setAuthType(authType); + //计划类型1学生类别2学生组 + record.setaType(type); + //插入权限记录表AC_DeviceAuthRecord + userDao.insertAuthRecord(record); + } + + @Override + public void deleteAuthRecord(Integer authId) { + userDao.deleteAuthRecord(authId.intValue()); + } + + @Override + public DeviceAuthRecord getAuthRecord(Integer authId) { + return userDao.getAuthRecord(authId.intValue()); + } + + @Override + public Result againSendFace(String userId, String deviceId,Integer userType) { + StudentBean studentBean = null; + String cardNum =""; + String photo =""; + String studentCode = ""; + if(userType.intValue() ==1 ){ + studentBean = userDao.getTeacherByUserId(userId); + cardNum = studentBean.getTeacher_num(); + photo = studentBean.getFace(); + studentCode = studentBean.getNum(); + }else{ + studentBean = userDao.getStudentCByUserId(userId); + cardNum = studentBean.getStudent_num(); + photo = studentBean.getPhoto(); + studentCode = studentBean.getStudentCode(); + } + if (studentBean == null) { + log.error("下发人脸失败,userId: {},未查询到用户信息", userId); + return ResultGenerator.genSuccessResult("未查询到用户信息"); + } + Integer schoolId = studentBean.getSchool_id(); + String userName = studentBean.getName(); + //2.重新下发 + String typeName = userType.intValue() ==1 ? "Teacher" : "Student"; + String path = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; + //以学籍号为名的文件名 + String fileName = photo.split(typeName+"/")[1]; + //100服务器上人脸照绝对路径 + String filePath = path+ "\\" + fileName; + //校验100服务上是否存在此人脸 + File file = new File(filePath.trim()); + if (!file.exists()) { + log.error("文件不存在:" + filePath); + String card = Long.parseLong(baseService.getCard(cardNum), 16)+""; + baseService.sendFailRecord(card, filePath, deviceId, "文件不存在", String.valueOf(userType)); + return ResultGenerator.genFailResult("文件不存在"); + } + //设备类型 + Integer clintType = userDao.getClintTypeByDeviceId(deviceId); + if(clintType.intValue()== 18 || clintType.intValue()== 28){ + //1.先删除人脸 + if (cmsServer.getIsDeviceOnline(deviceId)) { + String cardNo = Long.parseLong(baseService.getCard(cardNum),16) + ""; + cmsServer.deleteCard(deviceId, cardNo,schoolId); + }else{ + //不在线,去253服务器上删除 + HttpUtil.deleteCard(deviceId, cardNum); + } + String targetPath = FileUtils.picPathComp + file.getName(); + try { + CompressPic.CompressPic(file.getAbsolutePath(), targetPath); + } catch (Exception e) { + log.error("图片压缩失败"); + } + boolean isOk = baseService.sendImg(photo, targetPath, deviceId, cardNum, userName, String.valueOf(userType), schoolId); + if (isOk) { + return ResultGenerator.genSuccessResult(); + } else { + return ResultGenerator.genFailResult("重新下发失败"); + } + } + //下大华人脸 + if(clintType.intValue()== 22 || clintType.intValue()== 29){ + HttpUtil.uploadDHImgForOne(filePath,schoolId,studentCode,clintType,deviceId); + return ResultGenerator.genSuccessResult(); + } + return ResultGenerator.genSuccessResult(); + } + + @Override + public Result sendFace(String schoolId,Integer type,String deviceIds) { + try { + String filePathStudent = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\Student"; + String filePathParent = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\Parent"; + String filePathTeacher = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\Teacher"; + File filePaths = null; + int userType = 0; + if (type == 0) {//主卡下发 + filePaths = new File(filePathStudent); + userType = 2; + } else if (type == 1) {//副卡下发 + filePaths = new File(filePathParent); + userType = 2; + } else if (type == 2) {//教师卡下发 + filePaths = new File(filePathTeacher); + userType = 1; + } + File[] filesStudent = filePaths.listFiles(); + if (filesStudent == null) { + log.warn("目录:{},没有找到人脸图片,",filePaths.getAbsolutePath()); + return ResultGenerator.genFailResult("没有找到人脸图片"); + } + if(StringUtils.isBlank(deviceIds)){ + log.warn("未选择下发设备"); + return ResultGenerator.genFailResult("未选择下发设备"); + } + String[] deviceArr = deviceIds.split(","); + List idLists= new ArrayList<>(Arrays.asList(deviceArr)); + //设备类型 + Integer clintType = userDao.getClintTypeByDeviceId(idLists.get(0)); + if(clintType.intValue()== 22 || clintType.intValue()== 29){ + sendUserAsync.uploadDHImg(schoolId,userType,deviceIds); + } + if(clintType.intValue()== 18 || clintType.intValue()== 28){ + sendUserAsync.uploadHkImg(schoolId,userType,deviceIds); + } + int fileSize = filesStudent.length; + int clintNum = deviceArr.length; + //下发所用时长 + int timeLength = new Double(clintNum * fileSize * 0.06).intValue(); + //下发截止时间 + String dateStr = baseService.getTime(fileSize,clintNum,timeLength); + Map map = new HashMap(); + map.put("timeLength",timeLength); + map.put("afterDate",dateStr); + map.put("fileSize",fileSize); + return ResultGenerator.genSuccessResult(objectMapper.toJson(map)); + } catch (Exception e) { + log.error("下发失败,错误信息",e); + return ResultGenerator.genFailResult("下发失败"); + } + } +} + +// p }ublic boolean sendPermiss2(PermissionBean permissionBean, int i) { +// return sendImg(filePath, targetPath, deviceId, card, name, userType); String userType = permissionBean.getUserType(); +// String schoolId = permissionBean.getSchoolId(); +// //设备ID,多设备户英文逗号,隔开 +// List deviceIds = permissionBean.getDeviceIds(); +// //用户iD,批量用户英文逗号,隔开 +// String userIds = permissionBean.getUserIds(); +// String[] userIdsStr = userIds.split(","); +// +// List cardNumList = new ArrayList<>(); +// if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.TEACHER.code) { +// List cardList = getUserCard(userIds,EnumSzBusinessType.EnumUserType.TEACHER.code); +// cardNumList.addAll(cardList); +// } +// if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.STUDENT.code) { +// for (String userId : userIdsStr) { +// String cardNum = userDao.getStudentCardWithUserId(schoolId,userId); +// cardNumList.add(cardNum); +// } +// } +// //权限周计划 +// List weekDays = permissionBean.getWeekDays(); +// //存储周计划时段 +// Map> map = new HashMap<>(); +// for (WeekDay weekDay : weekDays) { +// //整理周和时间段 +// initWeedayAndTimes(weekDay, map); +// senPsermiss(permissionBean, map, deviceIds, cardNumList, i); +// } +// log.error("map{}", JSON.toJSONString(map)); +// return true; +// } + +// +// // @Override +//// public boolean sendUserPermission(PermissionBean permissionBean) { +//// //设备ID,多设备户英文逗号,隔开 +//// List deviceIds = permissionBean.getDeviceIds(); +//// if ((CollectionUtils.isEmpty(deviceIds))) { +//// log.error("下发权限,设备ID为空"); +//// return false; +//// } +//// //用户类型 +//// String userType = permissionBean.getUserType(); +//// //学校ID +//// String schoolId = permissionBean.getSchoolId(); +//// +//// //用户iD,批量用户英文逗号,隔开 +//// String userIds = permissionBean.getUserIds(); +//// String[] userIdsStr = userIds.split(","); +//// +//// List cardNumList = new ArrayList<>(); +//// if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.TEACHER.code) { +//// List cardList = getTeacherUserNum(userIds,EnumSzBusinessType.EnumUserType.TEACHER.code); +//// cardNumList.addAll(cardList); +//// } +//// if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.STUDENT.code) { +//// for (String userId : userIdsStr) { +//// String cardNum = userDao.getStudentCardWithUserId(schoolId,userId); +//// if(StringUtils.isNotBlank(cardNum)){ +//// cardNumList.add(cardNum); +//// } +//// } +//// } +//// for(String deviceId : deviceIds){ +//// //权限周计划 +//// List weekDays = permissionBean.getWeekDays(); +//// //存储周计划时段 +//// Map> map = new HashMap<>(); +//// for (WeekDay weekDay : weekDays) { +//// //整理周和时间段 +//// initWeedayAndTimes(weekDay, map); +//// //下发权限 +//// cmsServer.(permissionBean, map, cardNumList,deviceId); +//// } +//// log.info("map{}", JSON.toJSONString(map)); +//// } +//// return true; +//// } +//// +//// /** +//// * 整理时间 +//// * @param weekDay +//// * @param map +//// */ +//// private void initWeedayAndTimes(WeekDay weekDay, Map> map) { +//// +//// String weekDayStr = weekDay.getWeekDay(); +//// String[] weekDays = weekDayStr.split(","); +//// +//// List weekTimes = weekDay.getWeekTimes(); +//// +//// for (int i = 0; i < weekDays.length; i++) { +//// int weekDayIndex = Integer.parseInt(weekDays[i]); +//// if (map.containsKey(weekDayIndex)) {//周已经有时间段 +//// List weekTimeList = map.get(weekDayIndex); +//// for (WeekTime wee : weekTimes) { +//// weekTimeList.add(wee); +//// } +//// map.put(weekDayIndex, weekTimeList); +//// } else { +//// List weekTimes1 = new ArrayList<>(); +//// weekTimes1.addAll(weekTimes); +//// map.put(weekDayIndex, weekTimes1); +//// } +//// } +//// +//// } +//// +//// /** +//// * +//// * @param userIds +//// * @param userType +//// * @return +//// */ +//// private List getTeacherUserNum(String userIds, int userType) { +//// List cards = new ArrayList<>(); +//// try { +//// String[] userIdsStr = userIds.split(","); +//// for (String userId : userIdsStr) { +//// TeacherBean teacherBean = null; +//// if (userType == EnumSzBusinessType.EnumUserType.TEACHER.code) {//教师 +//// teacherBean = userDao.getTeacherWithUserId(userId); +//// if (null != teacherBean) { +//// String card = teacherBean.getTeacer_num(); +//// if (!StringUtils.isEmpty(card)) { +//// cards.add(card); +//// } +//// } else { +//// log.error("教师用户不存在"); +//// } +//// } +//// } +//// +//// } catch (Exception e) { +//// e.printStackTrace(); +//// } +//// return cards; +//// } +//// +//// /** +//// * 把卡号和权限下发到对应的设备 +//// * +//// * @param permissionBean +//// * @param map +//// * @param cardNumList +//// * @return +//// */ +//// private boolean sendPermission(PermissionBean permissionBean, Map> map,List cardNumList,String deviceId) { +//// String userType = permissionBean.getUserType(); +//// if (null == cardNumList || cardNumList.size() == 0) { +//// log.error("卡号为空"); +//// return false; +//// } +//// //设备在线 +//// boolean onLine = cmsServer.getIsDeviceOnline(deviceId); +//// if (onLine) { +//// for (String cardNum : cardNumList) { +//// //卡号取反 +//// String newCardNum = getCardNo(cardNum); +//// if (StringUtils.isBlank(newCardNum)) { +//// continue; +//// } +//// //获取十进制卡 +//// newCardNum = String.valueOf(NumConvertUtil.hex16To10(newCardNum)); +//// //设置卡权限计划模板 +//// if(cmsServer.SetCardWeekPlan(deviceId, HKXmlUtils.getInstance().SetCardTemplate())){ +//// log.info("设置卡权限计划模板成功,成功卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType); +//// }else{ +//// log.error("设置卡权限计划模板失败,失败卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType); +//// } +//// //设置卡权限周计划 +//// if(cmsServer.SetCardWeekPlan(deviceId, HKXmlUtils.getInstance().SetCardWeekPlan())){ +//// log.info("设置卡权限周计划成功,成功卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType); +//// }else{ +//// log.error("设置卡权限周计划失败,失败卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType); +//// } +//// for (Map.Entry> weeKdayMap : map.entrySet()) { +//// int week = weeKdayMap.getKey(); +//// List weekTimes = weeKdayMap.getValue(); +//// +//// StringBuffer stringBuffer = new StringBuffer(); +//// for (WeekTime weekTime : weekTimes) { +//// //周计化时间段 +//// String weekPlanTimes = HKXmlUtils.getInstance().SetCardWeekPlanTimes(weekTime.getStartTime(), weekTime.getEndTime()); +//// stringBuffer.append(weekPlanTimes); +//// } +//// //卡权限周计划时间段 +//// String weekPlanTime = HKXmlUtils.getInstance().SetCardWeekPlanTime(stringBuffer.toString(), "" + week); +//// FileUtils.getInstance().writeLogs(weekPlanTime, "设置卡权限周计划时间.txt"); +//// //设置卡权限 +//// String serCardRightCfg = HKXmlUtils.getInstance().SetCardRightCfg(newCardNum); +//// //设置卡权限周计划 +//// if(cmsServer.SetCardWeekPlan(deviceId, weekPlanTime)){ +//// log.info("设置卡权限计划模板成功,成功卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType); +//// }else{ +//// log.error("设置卡权限计划模板失败,失败卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType); +//// } +//// if(cmsServer.SetCardWeekPlan(deviceId, serCardRightCfg)){ +//// log.info("设置卡权限周计划成功,成功卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType); +//// }else{ +//// log.error("设置卡权限周计划失败,失败卡号: {},设备ID: {},用户类型:{}",cardNum,deviceId,userType); +//// } +//// } +//// } +//// } else { +//// //设备不在线 +//// log.warn("设备: {},不在线.前往253服务器下发", deviceId); +//// HttpUtil.sendPermission2HK(permissionBean); +//// } +//// return true; +//// } +//// +//// +//// /** +//// * 卡号两两取反 +//// * +//// * @param cardDex +//// * @return +//// */ +//// public static String getCardNo(String cardDex) { +//// String cardR = ""; +//// int length = cardDex.length(); +//// if (length != 8) { +//// log.error("卡号格式不正确: 位数有误" + cardDex); +//// return cardDex; +//// } +//// while (length > 0) { +//// length -= 2; +//// cardR += cardDex.substring(length, length + 2); +//// } +//// return cardR; +//// } +//// +//// @Override +//// public boolean sendUserFace(String filePath, String schoolId,String userId, int userType, String deviceId) { +//// File file = new File(filePath); +//// if(file ==null){ +//// log.error("用户人脸不存在"); +//// sendRecoderUtils.sendFail(sendRecordDao, Long.parseLong(getCard(card), 16) + "", filePath, deviceId, userDao, "文件不存在", userType); +//// return false; +//// } +//// String cardNum = userDao.getStudentCardWithUserId(schoolId,userId); +//// String fileName = file.getName(); +//// //文件相对路径 +//// String targetPath = FileUtils.picPathComp + fileName; +//// try { +//// CompressPic.CompressPic(filePath, targetPath); +//// } catch (Exception e) { +//// log.error("人脸图片压缩失败.",e.getMessage()); +//// return false; +//// } +//// return sendImg(filePath, targetPath, deviceId, card, name, userType); +//// } +//} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java index 2fc1847..d2cc1d7 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java @@ -4,6 +4,7 @@ import com.sincere.haikangface.bean.BaiduFaceRecorder; import com.sincere.haikangface.bean.FaceWaterRecoder; import com.sincere.haikangface.dao.DeviceDao; import com.sincere.haikangface.dao.UserDao; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -13,6 +14,7 @@ import java.util.Date; /** * 报警事件处理 */ +@Slf4j public class AlarmUtils { private static AlarmUtils alarmUtils; @@ -23,6 +25,8 @@ public class AlarmUtils { private AlarmCallBack alarmCallBack; + private static JsonUtils objectMapper = JsonUtils.nonEmptyMapper(); + // public static AlarmUtils getInstance(DeviceDao deviceDao) { // if (alarmUtils == null) { // synchronized (AlarmUtils.class) { @@ -46,9 +50,8 @@ public class AlarmUtils { } public void deleAlarm(String strXML) { -// System.out.println("人脸抓拍机:" + strXML); - if (strXML.contains("FACESNAPREPORT")) {//人脸抓拍机器 - + //人脸抓拍机器 + if (strXML.contains("FACESNAPREPORT")) { // System.out.println("人脸抓拍机:" + strXML); BaiduFaceRecorder baiduFaceRecorder = new BaiduFaceRecorder(); baiduFaceRecorder.setUploadImgUrl(strXML); @@ -57,13 +60,10 @@ public class AlarmUtils { String deviceId = strXML.substring(strXML.indexOf("DeviceID"),strXML.lastIndexOf("DeviceID")).trim(); deviceId = deviceId.replace("DeviceID>",""); deviceId = deviceId.replace("", ""); @@ -104,9 +104,6 @@ public class AlarmUtils { currTemperature = currTemperature.replace("currTemperature>", ""); currTemperature = currTemperature.replace(" 1) { @@ -161,12 +160,15 @@ public class AlarmUtils { break; case "0x4c"://人脸认证失败 content = "人脸认证失败"; + log.info("卡号:{}, {}",cardNo,content); break; case "0x50"://人脸不存在 content = "人脸不存在"; + log.info("卡号:{}, {}",cardNo,content); break; case "0x68"://真人检测失败 content = "真人检测失败"; + log.info("卡号:{}, {}",cardNo,content); break; case "0x69"://人证比对通过 if (!StringUtils.isEmpty(picDataUrl) && picDataUrl.split("id=").length > 1) { @@ -190,9 +192,7 @@ public class AlarmUtils { } break; } - saveWater(content, minorType, deviceID, cardNo, time, "0x05"); - } /** @@ -301,13 +301,13 @@ public class AlarmUtils { private void baojing(String minorType, String deviceID, String time) { switch (minorType) { case "0x413"://人脸图像画质低 - + log.info("人脸图像画质低"); break; case "0x40d"://SD卡存储满报警 - + log.info("SD卡存储已满"); break; case "0x40b"://离线事件满90%报警 - + log.info("设备离线率达90%"); break; } } @@ -332,8 +332,7 @@ public class AlarmUtils { faceWaterRecoder.setTime(time); faceWaterRecoder.setCardNo(cardNo); faceWaterRecoder.setSystime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); -// System.out.println("deviceDao:" + deviceDao); -// System.out.println("faceWaterRecoder:" + faceWaterRecoder); + log.info("保存流水记录,流水信息: {}",objectMapper.toJson(faceWaterRecoder)); deviceDao.saveFaceWaterRecoder(faceWaterRecoder.getDeviceId(), faceWaterRecoder.getDeviceType() + "", faceWaterRecoder.getMinorType(), faceWaterRecoder.getContent(), faceWaterRecoder.getMajorType(), faceWaterRecoder.getTime(), faceWaterRecoder.getCardNo(), faceWaterRecoder.getSystime()); } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java new file mode 100644 index 0000000..bfe5480 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java @@ -0,0 +1,124 @@ +package com.sincere.haikangface.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @author chen + * @version 1.0 + * @date 2019/10/14 0014 14:16 + */ +public class DateUtils { + + public static String format = "yyyy"; + + public static String format1 = "yyyy-MM-dd"; + + public static String format2 = "yyyy-MM-dd HH:mm:ss"; + + public static String format3 = "yyyy年MM月dd日 HH:mm:ss" ; + + public static String format4 = "yyyy-MM-dd HH:mm"; + + public static long getDate(){ + return System.currentTimeMillis(); + } + + public static String date2String(Date date, String format) { + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.format(date); + } + + public static Date string2Date(String date, String format) { + try{ + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.parse(date); + }catch (Exception e){ + + } + return new Date(); + } + + public static Date getToday(){ + return new Date(); + } + + public static String getToday(String format) throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.format(new Date()); + } + + public static int getDateDifference(Date date1, Date date2, String timeType) { + int between = (int) (date1.getTime() - date2.getTime()); + int difference = 0; + switch (timeType) { + case "day": + difference = between / (24 * 60 * 60 * 1000); + break; + case "hour": + difference = between / (60 * 60 * 1000); + break; + case "min": + difference = between / (60 * 1000); + break; + case "s": + difference = between / 1000; + } + return difference; + } + + private static byte[] lock = new byte[0]; + // 位数,默认是8位 + private final static long strNum = 100000000; + + /** + * 创建以时间为唯一UUID + * @return + */ + public static String createTimeId() { + long r = 0; + synchronized (lock) { + r = (long) ((Math.random() + 1) * strNum); + } + return System.currentTimeMillis() + String.valueOf(r).substring(1); + } + + /** + * 拼接时间 + * @param time + * @return + */ + public static Date spliceTime(String time){ + SimpleDateFormat df = new SimpleDateFormat(format4); + SimpleDateFormat ds = new SimpleDateFormat(format1+" "); + try { + Date date = df.parse(ds.format(new Date()) + time); + return date; + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 获取N分钟后时间 + * @param length + * @param date + * @return + */ + public static Date getDateByTime(int length, Date date){ + Calendar cal = Calendar.getInstance(); + cal.setTime(date);//设置起时间 + cal.add(Calendar.MINUTE,length);//把日期往后增加 + return cal.getTime(); + } + + + public static void main(String[] args) { + System.out.println(getDateByTime(3,new Date())); + System.out.println(date2String(new Date(),format3)); + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/JsonUtils.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/JsonUtils.java new file mode 100644 index 0000000..2c57907 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/JsonUtils.java @@ -0,0 +1,148 @@ +package com.sincere.haikangface.utils; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Collection; +import java.util.Map; + +/** + * 类JsonMapper.java的实现描述:简单封装Jackson,实现JSON String<->Java Object的Mapper. + * + *

封装不同的输出风格, 使用不同的builder函数创建实例.

+ * + * @author xuquan + */ +public class JsonUtils { + + private static final Logger LOG = LoggerFactory.getLogger(JsonUtils.class); + + private ObjectMapper mapper; + + public JsonUtils(){ + this(null); + } + + public JsonUtils(Include include) { + mapper = new ObjectMapper(); + // 设置输出时包含属性的风格 + if (include != null) { + mapper.setSerializationInclusion(include); + } + // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性 + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + } + + /** + * 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper,建议在外部接口中使用. + */ + public static JsonUtils nonEmptyMapper() { + return new JsonUtils(Include.NON_EMPTY); + } + + /** + * 创建只输出初始值被改变的属性到Json字符串的Mapper, 最节约的存储方式,建议在内部接口中使用。 + */ + public static JsonUtils nonDefaultMapper() { + return new JsonUtils(Include.NON_DEFAULT); + } + + /** + * Object可以是POJO,也可以是Collection或数组。 + * 如果对象为Null, 返回"null". + * 如果集合为空集合, 返回"[]". + */ + public String toJson(Object object) { + + try { + return mapper.writeValueAsString(object); + } catch (IOException e) { + LOG.warn(String.format("序列化成 JSON 字符串发生错误:%s", object), e); + return null; + } + } + + /** + * 反序列化POJO或简单Collection如List. + * + * 如果JSON字符串为Null或"null"字符串, 返回Null. + * 如果JSON字符串为"[]", 返回空集合. + * + * 如需反序列化复杂Collection如List, 请使用fromJson(String, JavaType) + * + * @see #fromJson(String, JavaType) + */ + public T fromJson(String jsonString, Class clazz) { + if (StringUtils.isEmpty(jsonString)) { + return null; + } + + try { + return mapper.readValue(jsonString, clazz); + } catch (IOException e) { + LOG.error(String.format("解析 JSON 字符串发生错误:%s", jsonString), e); + return null; + } + } + + /** + * 反序列化泛型对象 + * @param + * @param jsonString + * @param typeReference + * @return + */ + public T fromJson(String jsonString, TypeReference typeReference) { + if (StringUtils.isEmpty(jsonString)) { + return null; + } + + try { + return mapper.readValue(jsonString, typeReference); + } catch (IOException e) { + LOG.error(String.format("解析 JSON 字符串发生错误:%s", jsonString), e); + return null; + } + } + + /** + * 反序列化复杂Collection如List, 先使用createCollectionType()或contructMapType()构造类型, 然后调用本函数. + * + * @see #(Class, Class...) + */ + public T fromJson(String jsonString, JavaType javaType) { + if (StringUtils.isEmpty(jsonString)) { + return null; + } + + try { + return mapper.readValue(jsonString, javaType); + } catch (IOException e) { + LOG.error(String.format("解析 JSON 字符串发生错误:%s", jsonString), e); + return null; + } + } + + /** + * 构造Collection类型. + */ + public JavaType contructCollectionType(Class collectionClass, Class elementClass) { + return mapper.getTypeFactory().constructCollectionType(collectionClass, elementClass); + } + + /** + * 构造Map类型. + */ + public JavaType contructMapType(Class mapClass, Class keyClass, Class valueClass) { + return mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass); + } + + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/NumConvertUtil.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/NumConvertUtil.java new file mode 100644 index 0000000..942241e --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/NumConvertUtil.java @@ -0,0 +1,34 @@ +package com.sincere.haikangface.utils; + +import java.math.BigInteger; + +/** + * @author xuquan + * @date 2020/12/10 16:54 + */ + +public class NumConvertUtil { + /** + * 十六进制转十进制 + * @param str + * @return + */ + public static int hex16To10(String str){ + BigInteger bigInteger = new BigInteger(str,16); + return bigInteger.intValue(); + } + + /** + * 十进制转十六进制 + * @param value + * @return + */ + public static String hex10To16(int value){ + String str = String.format("%08X",value); + return str; + } + + public static void main(String[] args) { + System.out.println(hex16To10("AF104568")); + } +} -- libgit2 0.21.0