Commit 592071967f4ec49e36d351ab2377b951024f02b1
1 parent
ff74650a
Exists in
master
中控指纹机,考勤看板代码提交
Showing
19 changed files
with
555 additions
and
10 deletions
Show diff stats
cloud/dahua/src/main/java/com/example/dahua/service/imp/PermissFaceServiceImp.java
@@ -41,14 +41,7 @@ public class PermissFaceServiceImp implements PermissFaceService { | @@ -41,14 +41,7 @@ public class PermissFaceServiceImp implements PermissFaceService { | ||
41 | 41 | ||
42 | int schoolId = permissionFaceBean.getSchoolId(); | 42 | int schoolId = permissionFaceBean.getSchoolId(); |
43 | 43 | ||
44 | - //编辑设置 | ||
45 | PermissionBean permissionBean = permissionFaceBean.getPermissionBean(); | 44 | PermissionBean permissionBean = permissionFaceBean.getPermissionBean(); |
46 | - if(!StringUtils.isEmpty(permissionFaceBean.getChannel())){ | ||
47 | - permissionBean.setChannel(permissionFaceBean.getChannel()); | ||
48 | - } | ||
49 | - if(!StringUtils.isEmpty(permissionFaceBean.getCustomName())){ | ||
50 | - permissionBean.setChannel(permissionFaceBean.getCustomName()); | ||
51 | - } | ||
52 | 45 | ||
53 | int type = permissionFaceBean.getType(); | 46 | int type = permissionFaceBean.getType(); |
54 | if (null != permissionBean) | 47 | if (null != permissionBean) |
@@ -80,12 +73,22 @@ public class PermissFaceServiceImp implements PermissFaceService { | @@ -80,12 +73,22 @@ public class PermissFaceServiceImp implements PermissFaceService { | ||
80 | responseBean.setStatus(1); | 73 | responseBean.setStatus(1); |
81 | break; | 74 | break; |
82 | case 1://编辑 | 75 | case 1://编辑 |
83 | - if (null == permissionFaceDao.getPerFaceWithId(id)) { | 76 | + PermissionFaceBean faceBean = permissionFaceDao.getPerFaceWithId(id); |
77 | + if (null == faceBean) { | ||
84 | responseBean.setMessage("模板不存在"); | 78 | responseBean.setMessage("模板不存在"); |
85 | } else { | 79 | } else { |
86 | responseBean.setMessage("编辑权限模板成功"); | 80 | responseBean.setMessage("编辑权限模板成功"); |
81 | + permissionFaceBean.setChannel(faceBean.getChannel()); | ||
82 | + permissionFaceBean.setCustomName(faceBean.getCustomName()); | ||
87 | permissionFaceDao.updatePermissionFace(permissionFaceBean); | 83 | permissionFaceDao.updatePermissionFace(permissionFaceBean); |
88 | } | 84 | } |
85 | + //编辑时设置 | ||
86 | + if(!StringUtils.isEmpty(permissionFaceBean.getChannel())){ | ||
87 | + permissionBean.setChannel(permissionFaceBean.getChannel()); | ||
88 | + } | ||
89 | + if(!StringUtils.isEmpty(permissionFaceBean.getCustomName())){ | ||
90 | + permissionBean.setChannel(permissionFaceBean.getCustomName()); | ||
91 | + } | ||
89 | responseBean.setData(null); | 92 | responseBean.setData(null); |
90 | sendPermiss2Dev(permissionFaceBean); | 93 | sendPermiss2Dev(permissionFaceBean); |
91 | responseBean.setStatus(1); | 94 | responseBean.setStatus(1); |
cloud/dahua/src/main/resources/mapper/PermissionFaceMapper.xml
@@ -19,7 +19,7 @@ | @@ -19,7 +19,7 @@ | ||
19 | <result column="createTime" property="createTime"/> | 19 | <result column="createTime" property="createTime"/> |
20 | <result column="updateTime" property="updateTime"/> | 20 | <result column="updateTime" property="updateTime"/> |
21 | <result column="updateTime" property="updateTime"/> | 21 | <result column="updateTime" property="updateTime"/> |
22 | - <result column="nChannel" property="channel"/> | 22 | + <result column="channel" property="channel"/> |
23 | 23 | ||
24 | </resultMap> | 24 | </resultMap> |
25 | 25 |
cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java
@@ -2,11 +2,18 @@ package com.example.dahua.mapper; | @@ -2,11 +2,18 @@ package com.example.dahua.mapper; | ||
2 | 2 | ||
3 | import com.alibaba.fastjson.JSON; | 3 | import com.alibaba.fastjson.JSON; |
4 | import com.example.dahua.Tester; | 4 | import com.example.dahua.Tester; |
5 | +import com.example.dahua.async.MyScheduledTask; | ||
5 | import com.example.dahua.bean.CheckIn; | 6 | import com.example.dahua.bean.CheckIn; |
7 | +import com.example.dahua.bean.PermissionBean; | ||
8 | +import com.example.dahua.bean.PermissionFaceBean; | ||
6 | import com.example.dahua.bean.ShortMsg; | 9 | import com.example.dahua.bean.ShortMsg; |
10 | +import com.example.dahua.dao.PermissionFaceDao; | ||
7 | import com.example.dahua.dao.UserDao; | 11 | import com.example.dahua.dao.UserDao; |
12 | +import com.example.dahua.mqtt.MqttManager; | ||
13 | +import com.example.dahua.service.PermissFaceService; | ||
8 | import com.example.dahua.service.UserService; | 14 | import com.example.dahua.service.UserService; |
9 | import com.example.dahua.utils.DateUtils; | 15 | import com.example.dahua.utils.DateUtils; |
16 | +import com.example.dahua.utils.JsonUtils; | ||
10 | import com.example.dahua.xiananDao.SearchMapper; | 17 | import com.example.dahua.xiananDao.SearchMapper; |
11 | import org.junit.Test; | 18 | import org.junit.Test; |
12 | import org.springframework.beans.factory.annotation.Autowired; | 19 | import org.springframework.beans.factory.annotation.Autowired; |
@@ -31,6 +38,12 @@ public class SearchMapperTest extends Tester { | @@ -31,6 +38,12 @@ public class SearchMapperTest extends Tester { | ||
31 | @Autowired | 38 | @Autowired |
32 | private UserService userService; | 39 | private UserService userService; |
33 | 40 | ||
41 | + @Autowired | ||
42 | + private PermissionFaceDao permissionFaceDao; | ||
43 | + | ||
44 | + @Autowired | ||
45 | + private PermissFaceService permissFaceService; | ||
46 | + | ||
34 | @Test | 47 | @Test |
35 | public void test(){ | 48 | public void test(){ |
36 | //有效刷卡调考勤存储过程 | 49 | //有效刷卡调考勤存储过程 |
@@ -66,5 +79,45 @@ public class SearchMapperTest extends Tester { | @@ -66,5 +79,45 @@ public class SearchMapperTest extends Tester { | ||
66 | 79 | ||
67 | } | 80 | } |
68 | 81 | ||
82 | + @Test | ||
83 | + public void test4(){ | ||
84 | + PermissionFaceBean faceBean = permissionFaceDao.getPerFaceWithId(45); | ||
85 | + System.out.println(JsonUtils.nonDefaultMapper().toJson(faceBean)); | ||
86 | + faceBean.setType(1); | ||
87 | + | ||
88 | + String json = "{\"studentType\":\"1\",\"deviceIds\":[\"ytj01hzszdddddddd\"],\"weekDays\":[{\"weekTimes\":[{\"startTime\":\"10:00\",\"endTime\":\"12:05\"}],\"sex\":\"1\",\"weekDay\":\"3,4,5\"}]}"; | ||
89 | + PermissionBean permissionBean = JsonUtils.nonDefaultMapper().fromJson(json,PermissionBean.class); | ||
90 | + faceBean.setPermissionBean(permissionBean); | ||
91 | + faceBean.setPerrmissName("顺治测试学校"); | ||
92 | + faceBean.setChannel(""); | ||
93 | + faceBean.setCustomName(""); | ||
94 | + permissFaceService.addPermissionFace(faceBean); | ||
95 | + | ||
96 | + } | ||
97 | + | ||
98 | + | ||
99 | + private MqttManager mqttManager; | ||
100 | + | ||
101 | + @Autowired | ||
102 | + private MyScheduledTask myScheduledTask; | ||
103 | + | ||
104 | + @Test | ||
105 | + public void test5(){ | ||
106 | + if(null == mqttManager){ | ||
107 | + mqttManager = new MqttManager(); | ||
108 | + mqttManager.init(); | ||
109 | + } | ||
110 | + | ||
111 | + String eventTime = DateUtils.date2String(new Date(), DateUtils.format2); | ||
112 | + String deviceId =""; | ||
113 | + String cardNo =""; | ||
114 | + String content = "考勤成功!,设备:" + deviceId + "卡号:" + cardNo + "方向:进门" + "______" + eventTime; | ||
115 | + | ||
116 | + myScheduledTask.sendMQMess(content,deviceId); | ||
117 | + System.out.println("发送成功"); | ||
118 | + } | ||
119 | + | ||
120 | + | ||
121 | + | ||
69 | // boolean uploadImgAndUserInfo(String file, String schoolId, String studentCode, String clint_type, int userType, String devid); | 122 | // boolean uploadImgAndUserInfo(String file, String schoolId, String studentCode, String clint_type, int userType, String devid); |
70 | } | 123 | } |
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/AttendanceController.java
@@ -68,6 +68,11 @@ public class AttendanceController { | @@ -68,6 +68,11 @@ public class AttendanceController { | ||
68 | attendacenService.updateAttendance(clientId); | 68 | attendacenService.updateAttendance(clientId); |
69 | } | 69 | } |
70 | 70 | ||
71 | + /** | ||
72 | + * 关联的显示看板设备 | ||
73 | + * @param placeId | ||
74 | + * @return | ||
75 | + */ | ||
71 | @RequestMapping(value = "selectRoomAttendance", method = RequestMethod.GET) | 76 | @RequestMapping(value = "selectRoomAttendance", method = RequestMethod.GET) |
72 | List<String> selectRoomAttendance(@RequestParam("placeId") int placeId) { | 77 | List<String> selectRoomAttendance(@RequestParam("placeId") int placeId) { |
73 | return attendacenService.selectRoomAttendance(placeId); | 78 | return attendacenService.selectRoomAttendance(placeId); |
@@ -93,4 +98,15 @@ public class AttendanceController { | @@ -93,4 +98,15 @@ public class AttendanceController { | ||
93 | return DateUtils.date2String(date, DateUtils.format2); | 98 | return DateUtils.date2String(date, DateUtils.format2); |
94 | } | 99 | } |
95 | } | 100 | } |
101 | + | ||
102 | + /** | ||
103 | + * 根据考勤设备ID 获取关联看板设备ID | ||
104 | + * @param deviceId | ||
105 | + * @return | ||
106 | + */ | ||
107 | + @RequestMapping(value = "selectPlaceAttendance", method = RequestMethod.GET) | ||
108 | + String selectPlaceAttendance(@RequestParam("placeId") String deviceId) { | ||
109 | + return attendacenService.selectPlaceAttendance(deviceId); | ||
110 | + } | ||
111 | + | ||
96 | } | 112 | } |
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/UserController.java
@@ -63,4 +63,14 @@ public class UserController { | @@ -63,4 +63,14 @@ public class UserController { | ||
63 | SzVSchoolStudent selectByStudentId(@RequestParam("studentId") int studentId) { | 63 | SzVSchoolStudent selectByStudentId(@RequestParam("studentId") int studentId) { |
64 | return userService.selectByStudentId(studentId); | 64 | return userService.selectByStudentId(studentId); |
65 | } | 65 | } |
66 | + | ||
67 | + @RequestMapping(value = "getSchoolIdWidthCardNum", method = RequestMethod.GET) | ||
68 | + int getSchoolIdWidthCardNum(@RequestParam("num") String num) { | ||
69 | + return userService.getSchoolIdWidthCardNum(num); | ||
70 | + } | ||
71 | + | ||
72 | + @RequestMapping(value = "getClintIds", method = RequestMethod.GET) | ||
73 | + List<String> getClintIds(@RequestParam("schoolId") String schoolId) { | ||
74 | + return userService.getClintIds(schoolId); | ||
75 | + } | ||
66 | } | 76 | } |
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/AttendaceMapper.java
@@ -23,4 +23,6 @@ public interface AttendaceMapper { | @@ -23,4 +23,6 @@ public interface AttendaceMapper { | ||
23 | 23 | ||
24 | List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(int schoolId); | 24 | List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(int schoolId); |
25 | 25 | ||
26 | + String selectPlaceAttendance(String deviceId); | ||
27 | + | ||
26 | } | 28 | } |
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/UserMapper.java
@@ -24,4 +24,8 @@ public interface UserMapper { | @@ -24,4 +24,8 @@ public interface UserMapper { | ||
24 | StudentBean getStudent_NumWitdCode(@Param("studentcode") String studentcode); | 24 | StudentBean getStudent_NumWitdCode(@Param("studentcode") String studentcode); |
25 | 25 | ||
26 | 26 | ||
27 | + int getSchoolIdWidthCardNum(@Param("cardNum") String cardNum); | ||
28 | + | ||
29 | + List<String> getClintIds(@Param("schoolId") String schoolId); | ||
30 | + | ||
27 | } | 31 | } |
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/AttendacenService.java
@@ -17,9 +17,19 @@ public interface AttendacenService { | @@ -17,9 +17,19 @@ public interface AttendacenService { | ||
17 | 17 | ||
18 | int updateAttendance(String client_id); | 18 | int updateAttendance(String client_id); |
19 | 19 | ||
20 | + /** | ||
21 | + * 关联的显示看板设备 | ||
22 | + */ | ||
20 | List<String> selectRoomAttendance(int placeId); | 23 | List<String> selectRoomAttendance(int placeId); |
21 | 24 | ||
22 | List<Integer> selectCloudAttendance(); | 25 | List<Integer> selectCloudAttendance(); |
23 | 26 | ||
24 | List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(int schoolId); | 27 | List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(int schoolId); |
28 | + | ||
29 | + /** | ||
30 | + * 根据考勤设备ID 获取关联看板设备ID | ||
31 | + * @param deviceId | ||
32 | + * @return | ||
33 | + */ | ||
34 | + String selectPlaceAttendance(String deviceId); | ||
25 | } | 35 | } |
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/UserService.java
@@ -30,4 +30,8 @@ public interface UserService { | @@ -30,4 +30,8 @@ public interface UserService { | ||
30 | 30 | ||
31 | int insertTemperature(CwStutemperaturereocrd record); | 31 | int insertTemperature(CwStutemperaturereocrd record); |
32 | 32 | ||
33 | + int getSchoolIdWidthCardNum(String num); | ||
34 | + | ||
35 | + List<String> getClintIds(String schoolId); | ||
36 | + | ||
33 | } | 37 | } |
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/AttendacenServiceImp.java
@@ -35,6 +35,11 @@ public class AttendacenServiceImp implements AttendacenService { | @@ -35,6 +35,11 @@ public class AttendacenServiceImp implements AttendacenService { | ||
35 | return attendaceMapper.updateAttendance(client_id); | 35 | return attendaceMapper.updateAttendance(client_id); |
36 | } | 36 | } |
37 | 37 | ||
38 | + /** | ||
39 | + * 关联的显示看板设备 | ||
40 | + * @param placeId | ||
41 | + * @return | ||
42 | + */ | ||
38 | @Override | 43 | @Override |
39 | public List<String> selectRoomAttendance(int placeId) { | 44 | public List<String> selectRoomAttendance(int placeId) { |
40 | return attendaceMapper.selectRoomAttendance(placeId); | 45 | return attendaceMapper.selectRoomAttendance(placeId); |
@@ -49,4 +54,14 @@ public class AttendacenServiceImp implements AttendacenService { | @@ -49,4 +54,14 @@ public class AttendacenServiceImp implements AttendacenService { | ||
49 | public List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(int schoolId) { | 54 | public List<SZ_AttendanceDto> selectCloudAttendanceBySchoolId(int schoolId) { |
50 | return attendaceMapper.selectCloudAttendanceBySchoolId(schoolId); | 55 | return attendaceMapper.selectCloudAttendanceBySchoolId(schoolId); |
51 | } | 56 | } |
57 | + | ||
58 | + /** | ||
59 | + * 根据考勤设备ID 获取关联看板设备ID | ||
60 | + * @param deviceId | ||
61 | + * @return | ||
62 | + */ | ||
63 | + @Override | ||
64 | + public String selectPlaceAttendance(String deviceId) { | ||
65 | + return attendaceMapper.selectPlaceAttendance(deviceId); | ||
66 | + } | ||
52 | } | 67 | } |
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/UserServiceImpl.java
@@ -93,4 +93,14 @@ public class UserServiceImpl implements UserService { | @@ -93,4 +93,14 @@ public class UserServiceImpl implements UserService { | ||
93 | } | 93 | } |
94 | return 0; | 94 | return 0; |
95 | } | 95 | } |
96 | + | ||
97 | + @Override | ||
98 | + public int getSchoolIdWidthCardNum(String num) { | ||
99 | + return userMapper.getSchoolIdWidthCardNum(num); | ||
100 | + } | ||
101 | + | ||
102 | + @Override | ||
103 | + public List<String> getClintIds(String schoolId) { | ||
104 | + return userMapper.getClintIds(schoolId); | ||
105 | + } | ||
96 | } | 106 | } |
cloud/search_smartCampus/src/main/resources/mapper/AttendanceMapper.xml
@@ -39,7 +39,7 @@ | @@ -39,7 +39,7 @@ | ||
39 | 39 | ||
40 | 40 | ||
41 | <select id="selectRoomAttendance" parameterType="java.lang.Integer" resultType="java.lang.String"> | 41 | <select id="selectRoomAttendance" parameterType="java.lang.Integer" resultType="java.lang.String"> |
42 | - select KaoQinAttendance from XA_PlaceAttendance where PlaceId = #{placeId} | 42 | + select KaoQinAttendance from XA_PlaceAttendance where PlaceId = #{placeId} and (len(KanBanAttendance)>0 and KanBanAttendance is not null ) |
43 | </select> | 43 | </select> |
44 | 44 | ||
45 | <select id="selectCloudAttendance" resultType="java.lang.Integer"> | 45 | <select id="selectCloudAttendance" resultType="java.lang.Integer"> |
@@ -51,4 +51,8 @@ | @@ -51,4 +51,8 @@ | ||
51 | select * from SZ_Attendance where school_id = #{schoolId} and ( clint_type = 18 or clint_type = 22 or clint_id | 51 | select * from SZ_Attendance where school_id = #{schoolId} and ( clint_type = 18 or clint_type = 22 or clint_id |
52 | like '253%' ) | 52 | like '253%' ) |
53 | </select> | 53 | </select> |
54 | + | ||
55 | + <select id="selectPlaceAttendance" parameterType="java.lang.String" resultType="java.lang.String"> | ||
56 | + select Top(1) PlaceId from XA_PlaceAttendance where KaoQinAttendance = #{deviceId} | ||
57 | + </select> | ||
54 | </mapper> | 58 | </mapper> |
cloud/search_smartCampus/src/main/resources/mapper/UserMapper.xml
@@ -6,4 +6,11 @@ | @@ -6,4 +6,11 @@ | ||
6 | select student_num from SZ_V_School_Student where student_id = #{studentId} | 6 | select student_num from SZ_V_School_Student where student_id = #{studentId} |
7 | </select> | 7 | </select> |
8 | 8 | ||
9 | + <select id="getSchoolIdWidthCardNum" parameterType="java.lang.String" resultType="java.lang.Integer"> | ||
10 | + select Top(1) school_id from SZ_V_School_Student where student_num = #{cardNum} | ||
11 | + </select> | ||
12 | + | ||
13 | + <select id="getClintIds" parameterType="java.lang.String" resultType="java.lang.String"> | ||
14 | + select clint_id from SZ_Attendance where school_id = #{schoolId} and (clint_type = 8 or clint_type = 9 or clint_type = 10) | ||
15 | + </select> | ||
9 | </mapper> | 16 | </mapper> |
10 | \ No newline at end of file | 17 | \ No newline at end of file |
cloud/zkAttendance/pom.xml
@@ -41,6 +41,11 @@ | @@ -41,6 +41,11 @@ | ||
41 | <groupId>org.springframework.boot</groupId> | 41 | <groupId>org.springframework.boot</groupId> |
42 | <artifactId>spring-boot-starter-web</artifactId> | 42 | <artifactId>spring-boot-starter-web</artifactId> |
43 | </dependency> | 43 | </dependency> |
44 | + <dependency> | ||
45 | + <groupId>org.eclipse.paho</groupId> | ||
46 | + <artifactId>org.eclipse.paho.client.mqttv3</artifactId> | ||
47 | + <version>1.1.0</version> | ||
48 | + </dependency> | ||
44 | <!-- <dependency>--> | 49 | <!-- <dependency>--> |
45 | <!-- <groupId>org.apache.tomcat.embed</groupId>--> | 50 | <!-- <groupId>org.apache.tomcat.embed</groupId>--> |
46 | <!-- <artifactId>tomcat-embed-core</artifactId>--> | 51 | <!-- <artifactId>tomcat-embed-core</artifactId>--> |
cloud/zkAttendance/src/main/java/com/sincere/att/controller/AttPushController.java
@@ -7,6 +7,7 @@ import com.sincere.att.feign.ScFeign; | @@ -7,6 +7,7 @@ import com.sincere.att.feign.ScFeign; | ||
7 | import com.sincere.att.feign.XaFeign; | 7 | import com.sincere.att.feign.XaFeign; |
8 | import com.sincere.att.logs.LogName; | 8 | import com.sincere.att.logs.LogName; |
9 | import com.sincere.att.logs.LoggerUtils; | 9 | import com.sincere.att.logs.LoggerUtils; |
10 | +import com.sincere.att.mqtt.MqtUtils; | ||
10 | import com.sincere.att.vo.AttendanceInfoBean; | 11 | import com.sincere.att.vo.AttendanceInfoBean; |
11 | import com.sincere.att.vo.CheckOrderVo; | 12 | import com.sincere.att.vo.CheckOrderVo; |
12 | import com.sincere.att.vo.FingerOrderVo; | 13 | import com.sincere.att.vo.FingerOrderVo; |
@@ -410,6 +411,11 @@ public class AttPushController { | @@ -410,6 +411,11 @@ public class AttPushController { | ||
410 | JSONObject jsonObject = HttpClientUtils.httpPostJson(urlHXY, jsonResult); | 411 | JSONObject jsonObject = HttpClientUtils.httpPostJson(urlHXY, jsonResult); |
411 | //if ((int) jsonObject.get("status") == 1) { | 412 | //if ((int) jsonObject.get("status") == 1) { |
412 | if ( Integer.parseInt(jsonObject.get("data").toString()) == 0) { | 413 | if ( Integer.parseInt(jsonObject.get("data").toString()) == 0) { |
414 | + /** | ||
415 | + * 签到成功发送数据到看板 add by 2020-11-17 | ||
416 | + */ | ||
417 | + sendMQMessage(SN,cardNo); | ||
418 | + | ||
413 | Log_kaoInfo.info("出入寝签到成功:" + SN + " 卡号:" + cardNo); | 419 | Log_kaoInfo.info("出入寝签到成功:" + SN + " 卡号:" + cardNo); |
414 | } else { | 420 | } else { |
415 | Log_kaoInfo.info("出入寝签到失败:" + SN + " 卡号:" + cardNo + " result1:" + jsonObject.toJSONString()); | 421 | Log_kaoInfo.info("出入寝签到失败:" + SN + " 卡号:" + cardNo + " result1:" + jsonObject.toJSONString()); |
@@ -450,6 +456,33 @@ public class AttPushController { | @@ -450,6 +456,33 @@ public class AttPushController { | ||
450 | } | 456 | } |
451 | } | 457 | } |
452 | 458 | ||
459 | + public void sendMQMessage(String deviceId,String cardNum) { | ||
460 | + //获取寝室关联的场景id | ||
461 | + String placeId = scFeign.selectPlaceAttendance(deviceId); | ||
462 | + | ||
463 | + if (null != placeId) { | ||
464 | + //关联的显示看板设备 | ||
465 | + List<String> kanbanIds = scFeign.selectRoomAttendance(Integer.parseInt(placeId)); | ||
466 | + | ||
467 | + for (int i = 0; i < kanbanIds.size(); i++) { | ||
468 | + String kanbanId = kanbanIds.get(i); | ||
469 | + String data = "{\"cmd\":\"" + 34 + "\",\"clientId\":\"" + kanbanId + "\",\"data\":{\"cardNum\":\"" + cardNum+"}}"; | ||
470 | + MqtUtils.getInstance().sendMsg(kanbanId, data); | ||
471 | + } | ||
472 | + | ||
473 | + } else { | ||
474 | + String schoolId = scFeign.getSchoolIdWidthCardNum(cardNum); | ||
475 | + if(org.springframework.util.StringUtils.isEmpty(schoolId)||Integer.parseInt(schoolId) <=0)return; | ||
476 | + List<String> clintIds = scFeign.getClintIds(schoolId); | ||
477 | + for (int i = 0; i < clintIds.size(); i++) { | ||
478 | + String clintId = clintIds.get(i); | ||
479 | + String data = "{\"cmd\":\"" + 34 + "\",\"clientId\":\"" + clintId + "\",\"data\":{\"cardNum\":\"" + cardNum + "}}"; | ||
480 | + MqtUtils.getInstance().sendMsg(clintId, data); | ||
481 | + } | ||
482 | + } | ||
483 | + | ||
484 | + } | ||
485 | + | ||
453 | public static void main(String[] args) { | 486 | public static void main(String[] args) { |
454 | /*JSONObject object = new JSONObject(); | 487 | /*JSONObject object = new JSONObject(); |
455 | object.put("pageIndex",1); | 488 | object.put("pageIndex",1); |
cloud/zkAttendance/src/main/java/com/sincere/att/feign/ScFeign.java
@@ -33,4 +33,12 @@ public interface ScFeign { | @@ -33,4 +33,12 @@ public interface ScFeign { | ||
33 | String selectStudentNumByStudentId(@RequestParam("studentId") int studentId); | 33 | String selectStudentNumByStudentId(@RequestParam("studentId") int studentId); |
34 | 34 | ||
35 | 35 | ||
36 | + @RequestMapping(value = "attendance/selectPlaceAttendance", method = RequestMethod.GET) | ||
37 | + String selectPlaceAttendance(@RequestParam("deviceId") String deviceId); | ||
38 | + | ||
39 | + @RequestMapping(value = "/sm/user/getSchoolIdWidthCardNum", method = RequestMethod.GET) | ||
40 | + String getSchoolIdWidthCardNum(@RequestParam("num") String num); | ||
41 | + | ||
42 | + @RequestMapping(value = "/sm/user/getClintIds", method = RequestMethod.GET) | ||
43 | + List<String> getClintIds(@RequestParam("schoolId") String schoolId); | ||
36 | } | 44 | } |
cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqtUtils.java
0 → 100644
@@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
1 | +package com.sincere.att.mqtt; | ||
2 | + | ||
3 | +public class MqtUtils { | ||
4 | + | ||
5 | + private static MqtUtils mqtUtils; | ||
6 | + | ||
7 | + private MqttManager mqttManager = null; | ||
8 | + | ||
9 | + public static MqtUtils getInstance() { | ||
10 | + if (null == mqtUtils) { | ||
11 | + synchronized (MqtUtils.class) { | ||
12 | + if (null == mqtUtils) mqtUtils = new MqtUtils(); | ||
13 | + } | ||
14 | + } | ||
15 | + return mqtUtils; | ||
16 | + } | ||
17 | + | ||
18 | + public MqtUtils() { | ||
19 | + mqttManager = new MqttManager(); | ||
20 | + mqttManager.init(); | ||
21 | + } | ||
22 | + | ||
23 | + public void sendMsg(String deviceId, String content) { | ||
24 | + mqttManager.sendMq(deviceId, content); | ||
25 | + } | ||
26 | + | ||
27 | + | ||
28 | +} |
cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqttManager.java
0 → 100644
@@ -0,0 +1,116 @@ | @@ -0,0 +1,116 @@ | ||
1 | +package com.sincere.att.mqtt; | ||
2 | + | ||
3 | +import lombok.extern.slf4j.Slf4j; | ||
4 | +import org.eclipse.paho.client.mqttv3.*; | ||
5 | +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; | ||
6 | + | ||
7 | +import java.io.UnsupportedEncodingException; | ||
8 | +import java.security.InvalidKeyException; | ||
9 | +import java.security.NoSuchAlgorithmException; | ||
10 | + | ||
11 | +/** | ||
12 | + * mqtt 消息发送服务 | ||
13 | + */ | ||
14 | +@Slf4j | ||
15 | +public class MqttManager { | ||
16 | + | ||
17 | + private static String accessKey; | ||
18 | + | ||
19 | + private static String sign; | ||
20 | + | ||
21 | + public static MqttClient mqttClient; | ||
22 | + | ||
23 | + public static String groupId; | ||
24 | + | ||
25 | + public static String topic; | ||
26 | + | ||
27 | + private static int qosLevel; | ||
28 | + | ||
29 | + public void init() { | ||
30 | + final String brokerUrl = "tcp://post-cn-4590mq2hr03.mqtt.aliyuncs.com:1883"; | ||
31 | + groupId = "GID_HFJSIURFHAQO110"; | ||
32 | + topic = "Topic_Quene_Test"; | ||
33 | + qosLevel = 1; | ||
34 | + final Boolean cleanSession = false; | ||
35 | + String clientId = groupId + "@@@9ED96FB6D72C1698"; | ||
36 | + accessKey = "UimvLVp0Wj90P88u"; | ||
37 | + String secretKey = "TE4rZenITG27tiQqHx9qINjx71Nws7"; | ||
38 | + final MemoryPersistence memoryPersistence = new MemoryPersistence(); | ||
39 | + if (null == mqttClient) { | ||
40 | + try { | ||
41 | + mqttClient = new MqttClient(brokerUrl, clientId, memoryPersistence); | ||
42 | + } catch (MqttException e) { | ||
43 | + e.printStackTrace(); | ||
44 | + } | ||
45 | + MqttConnectOptions connOpts = new MqttConnectOptions(); | ||
46 | + //cal the sign as password,sign=BASE64(MAC.SHA1(groupId,secretKey)) | ||
47 | + try { | ||
48 | + sign = Tools.macSignature(clientId.split("@@@")[0], secretKey); | ||
49 | + } catch (InvalidKeyException e) { | ||
50 | + e.printStackTrace(); | ||
51 | + } catch (NoSuchAlgorithmException e) { | ||
52 | + e.printStackTrace(); | ||
53 | + } | ||
54 | + connOpts.setUserName(accessKey); | ||
55 | + connOpts.setPassword(sign.toCharArray()); | ||
56 | + connOpts.setCleanSession(cleanSession); | ||
57 | + connOpts.setKeepAliveInterval(90); | ||
58 | + connOpts.setAutomaticReconnect(true); | ||
59 | + mqttClient.setCallback(new MqttCallbackExtended() { | ||
60 | + @Override | ||
61 | + public void connectComplete(boolean reconnect, String serverURI) { | ||
62 | + log.info("connect success"); | ||
63 | + } | ||
64 | + | ||
65 | + @Override | ||
66 | + public void connectionLost(Throwable throwable) { | ||
67 | + log.info("connect lost:" + throwable.toString()); | ||
68 | + throwable.printStackTrace(); | ||
69 | + init();//初始化 | ||
70 | + } | ||
71 | + | ||
72 | + @Override | ||
73 | + public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { | ||
74 | + log.info("receive msg from topic " + s + " , body is " + new String(mqttMessage.getPayload())); | ||
75 | + } | ||
76 | + | ||
77 | + @Override | ||
78 | + public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { | ||
79 | + //this notice make sense when qos >0 | ||
80 | +// System.out.println("send msg succeed"); | ||
81 | + } | ||
82 | + }); | ||
83 | + try { | ||
84 | + mqttClient.connect(connOpts); | ||
85 | + } catch (MqttException e) { | ||
86 | + log.warn("mqtt:" + e.toString()); | ||
87 | + e.printStackTrace(); | ||
88 | + } | ||
89 | + } | ||
90 | + } | ||
91 | + | ||
92 | + public void sendMq(String deviceId, String content) { | ||
93 | + | ||
94 | + String recvClientId = groupId + "@@@" + deviceId; | ||
95 | + final String p2pSendTopic = topic + "/p2p/" + recvClientId; | ||
96 | + | ||
97 | + MqttMessage message = null; | ||
98 | + try { | ||
99 | + message = new MqttMessage(content.getBytes("GB2312")); | ||
100 | + } catch (UnsupportedEncodingException e) { | ||
101 | + e.printStackTrace(); | ||
102 | + } | ||
103 | + message.setQos(qosLevel); | ||
104 | + log.info("发送内容:" + p2pSendTopic + " msg:---------" + content); | ||
105 | + if (null != mqttClient) { | ||
106 | + try { | ||
107 | + mqttClient.publish(p2pSendTopic, message); | ||
108 | + } catch (MqttException e) { | ||
109 | + e.printStackTrace(); | ||
110 | + } | ||
111 | + } | ||
112 | + | ||
113 | + } | ||
114 | + | ||
115 | + | ||
116 | +} |
cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/Tools.java
0 → 100644
@@ -0,0 +1,217 @@ | @@ -0,0 +1,217 @@ | ||
1 | +package com.sincere.att.mqtt; | ||
2 | + | ||
3 | +import com.alibaba.fastjson.JSON; | ||
4 | +import com.alibaba.fastjson.JSONObject; | ||
5 | +import org.apache.commons.codec.binary.Base64; | ||
6 | +import org.apache.http.HttpEntity; | ||
7 | +import org.apache.http.HttpResponse; | ||
8 | +import org.apache.http.HttpStatus; | ||
9 | +import org.apache.http.NameValuePair; | ||
10 | +import org.apache.http.client.HttpClient; | ||
11 | +import org.apache.http.client.entity.UrlEncodedFormEntity; | ||
12 | +import org.apache.http.client.methods.HttpGet; | ||
13 | +import org.apache.http.client.methods.HttpPost; | ||
14 | +import org.apache.http.client.utils.URLEncodedUtils; | ||
15 | +import org.apache.http.config.Registry; | ||
16 | +import org.apache.http.config.RegistryBuilder; | ||
17 | +import org.apache.http.conn.socket.ConnectionSocketFactory; | ||
18 | +import org.apache.http.conn.socket.PlainConnectionSocketFactory; | ||
19 | +import org.apache.http.conn.ssl.NoopHostnameVerifier; | ||
20 | +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; | ||
21 | +import org.apache.http.impl.client.HttpClientBuilder; | ||
22 | +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; | ||
23 | +import org.apache.http.message.BasicNameValuePair; | ||
24 | +import org.apache.http.util.EntityUtils; | ||
25 | + | ||
26 | +import javax.crypto.Mac; | ||
27 | +import javax.crypto.spec.SecretKeySpec; | ||
28 | +import javax.net.ssl.SSLContext; | ||
29 | +import javax.net.ssl.TrustManager; | ||
30 | +import javax.net.ssl.X509TrustManager; | ||
31 | +import java.io.IOException; | ||
32 | +import java.nio.charset.Charset; | ||
33 | +import java.security.*; | ||
34 | +import java.security.cert.CertificateException; | ||
35 | +import java.security.cert.X509Certificate; | ||
36 | +import java.util.*; | ||
37 | + | ||
38 | +/** | ||
39 | + * Created by alvin on 17-3-29. | ||
40 | + */ | ||
41 | +public class Tools { | ||
42 | + public static Properties loadProperties() { | ||
43 | + Properties properties = new Properties(); | ||
44 | + try { | ||
45 | + properties.load(ClassLoader.getSystemResourceAsStream("test.properties")); | ||
46 | + } catch (IOException e) { | ||
47 | + } | ||
48 | + return properties; | ||
49 | + } | ||
50 | + | ||
51 | + /** | ||
52 | + * 计算签名,参数分别是参数对以及密钥 | ||
53 | + * | ||
54 | + * @param requestParams 参数对,即参与计算签名的参数 | ||
55 | + * @param secretKey 密钥 | ||
56 | + * @return 签名字符串 | ||
57 | + * @throws NoSuchAlgorithmException | ||
58 | + * @throws InvalidKeyException | ||
59 | + */ | ||
60 | + public static String doHttpSignature(Map<String, String> requestParams, String secretKey) throws NoSuchAlgorithmException, InvalidKeyException { | ||
61 | + List<String> paramList = new ArrayList<String>(); | ||
62 | + for (Map.Entry<String, String> entry : requestParams.entrySet()) { | ||
63 | + paramList.add(entry.getKey() + "=" + entry.getValue()); | ||
64 | + } | ||
65 | + Collections.sort(paramList); | ||
66 | + StringBuffer sb = new StringBuffer(); | ||
67 | + for (int i = 0; i < paramList.size(); i++) { | ||
68 | + if (i > 0) { | ||
69 | + sb.append('&'); | ||
70 | + } | ||
71 | + sb.append(paramList.get(i)); | ||
72 | + } | ||
73 | + return macSignature(sb.toString(), secretKey); | ||
74 | + } | ||
75 | + | ||
76 | + /** | ||
77 | + * @param text 要签名的文本 | ||
78 | + * @param secretKey 阿里云MQ secretKey | ||
79 | + * @return 加密后的字符串 | ||
80 | + * @throws InvalidKeyException | ||
81 | + * @throws NoSuchAlgorithmException | ||
82 | + */ | ||
83 | + public static String macSignature(String text, String secretKey) throws InvalidKeyException, NoSuchAlgorithmException { | ||
84 | + Charset charset = Charset.forName("UTF-8"); | ||
85 | + String algorithm = "HmacSHA1"; | ||
86 | + Mac mac = Mac.getInstance(algorithm); | ||
87 | + mac.init(new SecretKeySpec(secretKey.getBytes(charset), algorithm)); | ||
88 | + byte[] bytes = mac.doFinal(text.getBytes(charset)); | ||
89 | + return new String(Base64.encodeBase64(bytes), charset); | ||
90 | + } | ||
91 | + | ||
92 | + /** | ||
93 | + * 创建HTTPS 客户端 | ||
94 | + * | ||
95 | + * @return 单例模式的客户端 | ||
96 | + * @throws KeyStoreException | ||
97 | + * @throws UnrecoverableKeyException | ||
98 | + * @throws NoSuchAlgorithmException | ||
99 | + * @throws KeyManagementException | ||
100 | + */ | ||
101 | + private static HttpClient httpClient = null; | ||
102 | + | ||
103 | + public static HttpClient getHttpsClient() throws KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException { | ||
104 | + if (httpClient != null) { | ||
105 | + return httpClient; | ||
106 | + } | ||
107 | + X509TrustManager xtm = new X509TrustManager() { | ||
108 | + @Override | ||
109 | + public void checkClientTrusted(X509Certificate[] arg0, String arg1) | ||
110 | + throws CertificateException { | ||
111 | + } | ||
112 | + | ||
113 | + @Override | ||
114 | + public void checkServerTrusted(X509Certificate[] arg0, String arg1) | ||
115 | + throws CertificateException { | ||
116 | + } | ||
117 | + | ||
118 | + @Override | ||
119 | + public X509Certificate[] getAcceptedIssuers() { | ||
120 | + return new X509Certificate[]{}; | ||
121 | + } | ||
122 | + }; | ||
123 | + SSLContext context = SSLContext.getInstance("TLS"); | ||
124 | + context.init(null, new TrustManager[]{xtm}, null); | ||
125 | + SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(context, NoopHostnameVerifier.INSTANCE); | ||
126 | + Registry<ConnectionSocketFactory> sfr = RegistryBuilder.<ConnectionSocketFactory>create() | ||
127 | + .register("http", PlainConnectionSocketFactory.INSTANCE) | ||
128 | + .register("https", scsf).build(); | ||
129 | + PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager(sfr); | ||
130 | + httpClient = HttpClientBuilder.create().setConnectionManager(pcm).build(); | ||
131 | + return httpClient; | ||
132 | + } | ||
133 | + | ||
134 | + public static HttpClient createHttpsClient() throws KeyManagementException, NoSuchAlgorithmException { | ||
135 | + X509TrustManager xtm = new X509TrustManager() { | ||
136 | + @Override | ||
137 | + public void checkClientTrusted(X509Certificate[] arg0, String arg1) | ||
138 | + throws CertificateException { | ||
139 | + } | ||
140 | + | ||
141 | + @Override | ||
142 | + public void checkServerTrusted(X509Certificate[] arg0, String arg1) | ||
143 | + throws CertificateException { | ||
144 | + } | ||
145 | + | ||
146 | + @Override | ||
147 | + public X509Certificate[] getAcceptedIssuers() { | ||
148 | + return new X509Certificate[]{}; | ||
149 | + } | ||
150 | + }; | ||
151 | + SSLContext context = SSLContext.getInstance("TLS"); | ||
152 | + context.init(null, new TrustManager[]{xtm}, null); | ||
153 | + SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(context, NoopHostnameVerifier.INSTANCE); | ||
154 | + Registry<ConnectionSocketFactory> sfr = RegistryBuilder.<ConnectionSocketFactory>create() | ||
155 | + .register("http", PlainConnectionSocketFactory.INSTANCE) | ||
156 | + .register("https", scsf).build(); | ||
157 | + PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager(sfr); | ||
158 | + return HttpClientBuilder.create().setConnectionManager(pcm).build(); | ||
159 | + } | ||
160 | + | ||
161 | + /** | ||
162 | + * 发起Https Get请求,并得到返回的JSON响应 | ||
163 | + * | ||
164 | + * @param url 接口Url | ||
165 | + * @param params 参数u对 | ||
166 | + * @return | ||
167 | + * @throws IOException | ||
168 | + * @throws KeyStoreException | ||
169 | + * @throws UnrecoverableKeyException | ||
170 | + * @throws NoSuchAlgorithmException | ||
171 | + * @throws KeyManagementException | ||
172 | + */ | ||
173 | + public static JSONObject httpsGet(String url, Map<String, String> params) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException { | ||
174 | + HttpClient client = Tools.getHttpsClient(); | ||
175 | + JSONObject jsonResult = null; | ||
176 | + //发送get请求 | ||
177 | + List<NameValuePair> urlParameters = new ArrayList<NameValuePair>(); | ||
178 | + for (Map.Entry<String, String> entry : params.entrySet()) { | ||
179 | + urlParameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); | ||
180 | + } | ||
181 | + String paramUrl = URLEncodedUtils.format(urlParameters, Charset.forName("UTF-8")); | ||
182 | + HttpGet request = new HttpGet(url + "?" + paramUrl); | ||
183 | + HttpResponse response = client.execute(request); | ||
184 | + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { | ||
185 | + String strResult = EntityUtils.toString(response.getEntity()); | ||
186 | + jsonResult = JSON.parseObject(strResult); | ||
187 | + } | ||
188 | + return jsonResult; | ||
189 | + } | ||
190 | + | ||
191 | + /** | ||
192 | + * 工具方法,发送一个http post请求,并尝试将响应转换为JSON | ||
193 | + * | ||
194 | + * @param url 请求的方法名url | ||
195 | + * @param params 参数表 | ||
196 | + * @return 如果请求成功则返回JSON, 否则抛异常或者返回空 | ||
197 | + * @throws IOException | ||
198 | + */ | ||
199 | + public static JSONObject httpsPost(String url, Map<String, String> params) throws IOException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException { | ||
200 | + JSONObject jsonResult = null; | ||
201 | + //发送get请求 | ||
202 | + HttpClient client = getHttpsClient(); | ||
203 | + HttpPost request = new HttpPost(url); | ||
204 | + List<NameValuePair> urlParameters = new ArrayList<NameValuePair>(); | ||
205 | + for (Map.Entry<String, String> entry : params.entrySet()) { | ||
206 | + urlParameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); | ||
207 | + } | ||
208 | + HttpEntity postParams = new UrlEncodedFormEntity(urlParameters); | ||
209 | + request.setEntity(postParams); | ||
210 | + HttpResponse response = client.execute(request); | ||
211 | + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { | ||
212 | + String strResult = EntityUtils.toString(response.getEntity()); | ||
213 | + jsonResult = JSON.parseObject(strResult); | ||
214 | + } | ||
215 | + return jsonResult; | ||
216 | + } | ||
217 | +} |