Commit 1232df0d5bff5de02f046faf2074c7dc7dedf677
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
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 | +} | ... | ... |