From f6c2934ebcb6a58efdd2f3a213647c6ba4350c1c Mon Sep 17 00:00:00 2001 From: xuquan <1099815072@qq.com> Date: Thu, 24 Feb 2022 17:55:11 +0800 Subject: [PATCH] 大华设备对接艺校考勤 --- cloud/dahua/src/main/java/com/example/dahua/MyTask.java | 3 +++ cloud/dahua/src/main/java/com/example/dahua/async/SendUserInfoTask2.java | 303 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------- cloud/dahua/src/main/java/com/example/dahua/bean/UserInfoBean.java | 10 ++++++++++ cloud/dahua/src/main/java/com/example/dahua/dao/UserDao.java | 2 ++ cloud/dahua/src/main/java/com/example/dahua/enums/EnumSendFaceType.java | 3 ++- cloud/dahua/src/main/java/com/example/dahua/module/GateModule2.java | 2 +- cloud/dahua/src/main/resources/mapper/usermapper.xml | 12 +++++++++++- cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java | 11 ++++------- cloud/haikangface/src/main/java/com/sincere/haikangface/dao/UserDao.java | 7 +++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java | 2 ++ cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java | 17 +++++++++++++++-- cloud/haikangface/src/main/resources/mapper/usermapper.xml | 25 +++++++++++++++++++++++++ cloud/haikangface/src/test/java/com/sincere/haikangface/HaikangfaceApplicationTests.java | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 14 files changed, 456 insertions(+), 170 deletions(-) diff --git a/cloud/dahua/src/main/java/com/example/dahua/MyTask.java b/cloud/dahua/src/main/java/com/example/dahua/MyTask.java index 3a1e890..cde8d75 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/MyTask.java +++ b/cloud/dahua/src/main/java/com/example/dahua/MyTask.java @@ -220,6 +220,9 @@ public class MyTask implements ApplicationRunner { String deviceId = ""; try { deviceId = new String(buffer1, "GBK").trim(); + log.info("设备GBK心跳:" + deviceId); + deviceId = new String(buffer1, "UTF-8").trim(); + log.info("设备UTF-8心跳:" + deviceId); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } diff --git a/cloud/dahua/src/main/java/com/example/dahua/async/SendUserInfoTask2.java b/cloud/dahua/src/main/java/com/example/dahua/async/SendUserInfoTask2.java index 34824cd..dc2d288 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/async/SendUserInfoTask2.java +++ b/cloud/dahua/src/main/java/com/example/dahua/async/SendUserInfoTask2.java @@ -25,6 +25,7 @@ import org.springframework.util.StringUtils; import java.io.File; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -183,10 +184,11 @@ public class SendUserInfoTask2 { String studentId = userInfoBean.getStudent_id(); //学生卡号 String studentNum = userInfoBean.getStudent_num(); + //班级ID + String classId = userInfoBean.getClass_id(); + Integer studentType = userInfoBean.getStudent_type(); //学生姓名 String userName = userInfoBean.getName(); - //设备类型:默认为大华人脸机 - int deviceType = EnumDeviceType.DH_FACE.deviceType; int userType2 = Integer.parseInt(userType); //下发记录 @@ -209,12 +211,21 @@ public class SendUserInfoTask2 { String endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()); String channel=""; if(userType2 ==2){ - //根据学生ID\学校ID获取学生类型 - String studentType = userDao.getStudentType(schoolId,studentId); - //通道号 -// String channel = analysisPermission(Integer.parseInt(schoolId),studentType); - channel = analysisAuthChannel(Integer.parseInt(schoolId),Integer.parseInt(studentType),deviceId); + //通道号:先根据学生类型获取,若不存在在根据群组id获取 + channel = getAuthChannelByStudentType(Integer.parseInt(schoolId),studentType,deviceId); + if(StringUtils.isEmpty(channel)){ + log.error("学生类型【{}】无对应权限通道。",studentType); + channel = getAuthChannelByClassId(Integer.parseInt(schoolId),Integer.parseInt(classId),deviceId); + } + if(StringUtils.isEmpty(channel)){ + //设备不在线 + sendRecordBean.setFailType(EnumSendFaceType.AUTH_NOT_SET.code); + sendRecordBean.setFailContent(EnumSendFaceType.AUTH_NOT_SET.message); + baseService.sendFailRecord(sendRecordBean,channel); + return; + } } + /** * 下发升级二代接口,动态库libs下win64,更新为官方最新版sdk add by xuquan 2020-11-23 * 注:用户下发逻辑: @@ -234,167 +245,127 @@ public class SendUserInfoTask2 { //登录设备 NetSDKLib.LLong loginHandleLong = MyTask.lLongSendMap.get(attendanceBean.getClint_id()); log.info("设备ID: {},设备登录句柄: {}",attendanceBean.getClint_id(),loginHandleLong); - //若设备不在线时,且人脸下发失败表中存在记录,则执行修改下发失败状态为:设备不在线 if (loginHandleLong == null) { - log.info("设备不在线, 设备ID: {} ",attendanceBean.getClint_id() ); - FileUtils.getInstance().writeLogs("设备不在线:" + attendanceBean.getClint_id(), FileUtils.devices); //设备不在线 sendRecordBean.setFailType(EnumSendFaceType.NOT_ONLINE_DEVICE.code); sendRecordBean.setFailContent(EnumSendFaceType.NOT_ONLINE_DEVICE.message); - //判断该学校设备ID对应失败记录是否存在:Face_SendFail - deviceId = sendRecordDao.getFailIsExit(deviceId, attendanceBean.getSchool_id()); - if (!StringUtils.isEmpty(deviceId)) { - sendRecordBean.setFailType(EnumSendFaceType.FACE_AND_CARD_FAIL.code); - sendRecordBean.setFailContent(EnumSendFaceType.NOT_ONLINE_DEVICE.message); - baseService.sendFailRecord(sendRecordBean,channel); - } + baseService.sendFailRecord(sendRecordBean,channel); + log.info("设备不在线, 设备ID: {} ",attendanceBean.getClint_id() ); + return; + } + + log.info("=================开始执行下发人脸及卡号任务================="); + //卡号取反 + String cardNum =""; + if(attendanceBean.getClint_id().startsWith("ytj")&&Integer.parseInt(attendanceBean.getSchool_id())!=126 + &&Integer.parseInt(attendanceBean.getSchool_id())!=393) { + cardNum = studentNum; } else { - log.info("=================开始执行下发人脸及卡号任务================="); - //卡号取反 - String cardNum =""; - if(attendanceBean.getClint_id().startsWith("ytj")&&Integer.parseInt(attendanceBean.getSchool_id())!=126 - &&Integer.parseInt(attendanceBean.getSchool_id())!=393) { - cardNum = studentNum; - } else { - cardNum = cardNo(studentNum); - } - if(attendanceBean.getClint_id().startsWith("ytj")){ - deviceType= EnumDeviceType.DH_FACE_YTJ.deviceType; - sendRecordBean.setDeviceType(deviceType); - } - try{ - /** - * recordNo 不为空存在下发记录集编号,直接修改执行人脸信息(二代升级接口,此处不需要修改用户信息) - */ - if (!StringUtils.isEmpty(recordNo)) { - //修改用户信息 - bUserFlags = GateModule2.addUser(userId,userName,userType2,"123456",channel,startTime,endTime,loginHandleLong); - //修改卡 - bCardFlags = GateModule2.modifyCard(userId,cardNum,loginHandleLong); - //修改人脸 - bFaceFalgs = GateModule2.modifyFace(userId,facePath,loginHandleLong); - if(bFaceFalgs != 0 || bCardFlags !=0){ - //未知错误、对返回数据校验出错,执行删除用户,重新下发 - if(bFaceFalgs == EnumSzBusinessType.EnumOperateErrorType.ONE.code || bFaceFalgs == EnumSzBusinessType.EnumOperateErrorType.ERR_21.code|| - bCardFlags == EnumSzBusinessType.EnumOperateErrorType.ONE.code || bCardFlags == EnumSzBusinessType.EnumOperateErrorType.ERR_21.code){ - if(GateModule2.deleteUser(userId,loginHandleLong) == 0){ - bUserFlags = GateModule2.addUser(userId,userName,userType2,"123456",channel,startTime,endTime,loginHandleLong); - //新增卡 - bCardFlags = GateModule2.addCard(userId,cardNum,loginHandleLong); - //新增人脸 - bFaceFalgs = GateModule2.addFace(userId,facePath,loginHandleLong); - } + cardNum = cardNo(studentNum); + } + //设备类型:默认为大华人脸机 + int deviceType = EnumDeviceType.DH_FACE.deviceType; + if(attendanceBean.getClint_id().startsWith("ytj")){ + deviceType= EnumDeviceType.DH_FACE_YTJ.deviceType; + sendRecordBean.setDeviceType(deviceType); + } + try{ + /** + * recordNo 不为空存在下发记录集编号,直接修改执行人脸信息(二代升级接口,此处不需要修改用户信息) + */ + if (!StringUtils.isEmpty(recordNo)) { + //修改用户信息 + bUserFlags = GateModule2.addUser(userId,userName,userType2,"123456",channel,startTime,endTime,loginHandleLong); + //修改卡 + bCardFlags = GateModule2.modifyCard(userId,cardNum,loginHandleLong); + //修改人脸 + bFaceFalgs = GateModule2.modifyFace(userId,facePath,loginHandleLong); + if(bFaceFalgs != 0 || bCardFlags !=0){ + //未知错误、对返回数据校验出错,执行删除用户,重新下发 + if(bFaceFalgs == EnumSzBusinessType.EnumOperateErrorType.ONE.code || bFaceFalgs == EnumSzBusinessType.EnumOperateErrorType.ERR_21.code|| + bCardFlags == EnumSzBusinessType.EnumOperateErrorType.ONE.code || bCardFlags == EnumSzBusinessType.EnumOperateErrorType.ERR_21.code){ + if(GateModule2.deleteUser(userId,loginHandleLong) == 0){ + bUserFlags = GateModule2.addUser(userId,userName,userType2,"123456",channel,startTime,endTime,loginHandleLong); + //新增卡 + bCardFlags = GateModule2.addCard(userId,cardNum,loginHandleLong); + //新增人脸 + bFaceFalgs = GateModule2.addFace(userId,facePath,loginHandleLong); } } - } else { - //新增用户信息 - bUserFlags = GateModule2.addUser(userId,userName,userType2,"123456",channel,startTime,endTime,loginHandleLong); - //新增卡 - bCardFlags = GateModule2.addCard(userId,cardNum,loginHandleLong); - //新增人脸 - bFaceFalgs = GateModule2.addFace(userId,facePath,loginHandleLong); - - //新增用户、卡、人脸信息都成功,则新增记录集信息,默认为1 - if (bCardFlags == 0 && bFaceFalgs ==0 && bUserFlags ==0) { - userDao.saveRecordNo(userId,1, userName, attendanceBean.getClint_id()); - } } - } catch (RuntimeException e) { - log.error("下发异常:异常错误信息msg: {}",e); - continue; - } - /** - * 人脸和卡都下发成功 - */ - if (bUserFlags ==0 && bCardFlags ==0 && bFaceFalgs==0) { - FileUtils.getInstance().writeLogs("下发人脸和卡号成功:" + cardNum + " " + attendanceBean.getClint_id(), FileUtils.sendUserSucTxt); - log.info("下发人脸和卡号成功, sendRecordBean: "+ JSON.toJSONString(sendRecordBean)); - //保存成功记录 - baseService.sendSuccessRecord(sendRecordBean,channel); - } - /** - * 人脸和卡都下发失败 - */ - if (bUserFlags !=0 && bFaceFalgs != 0 && bCardFlags !=0) { - FileUtils.getInstance().writeLogs("下发用户人脸和卡号失败: 卡号:" + cardNum + "用户ID: " + userId + " loginHandleLong: " + loginHandleLong, FileUtils.sendUserErrTxt); - log.info("下发用户人脸和卡号失败, sendRecordBean: "+ JSON.toJSONString(sendRecordBean)); - //失败信息 - String failContent = analysisErrorMsg(bUserFlags,bFaceFalgs,bCardFlags); - sendRecordBean.setFailType(EnumSendFaceType.FACE_AND_CARD_FAIL.code); - sendRecordBean.setFailContent(failContent); - baseService.sendFailRecord(sendRecordBean,channel); - } - /** - * 下发卡号成功,下发人脸失败, - */ - if (bUserFlags ==0 && bCardFlags !=0 && bFaceFalgs !=0) { - FileUtils.getInstance().writeLogs("下发卡号成功,下发人脸失败:" + cardNum + " " + attendanceBean.getClint_id(), FileUtils.sendUserErrTxt); - log.info("下发卡号成功,下发人脸失败, sendRecordBean: " + JSON.toJSONString(sendRecordBean)); - //失败信息 - String failContent = analysisErrorMsg(bUserFlags,bFaceFalgs,bCardFlags); - sendRecordBean.setFailType(EnumSendFaceType.FACE_FAIL_CARD_SUCCESS.code); - sendRecordBean.setFailContent(failContent); - baseService.sendFailRecord(sendRecordBean,channel); - } - /** - * 下发卡号失败,下发人脸成功, - */ - if (bUserFlags ==0 && bCardFlags == 0 && bFaceFalgs !=0) { - FileUtils.getInstance().writeLogs("卡信息已存在,下发人脸成功:" + cardNum + " " + attendanceBean.getClint_id(), FileUtils.sendUserSucTxt); - //失败信息 - String failContent = analysisErrorMsg(bUserFlags,bFaceFalgs,bCardFlags); - sendRecordBean.setFailType(EnumSendFaceType.FACE_SUCCESS_CARD_FAIl.code); - sendRecordBean.setFailContent(failContent); - baseService.sendFailRecord(sendRecordBean,channel); + } else { + //新增用户信息 + bUserFlags = GateModule2.addUser(userId,userName,userType2,"123456",channel,startTime,endTime,loginHandleLong); + //新增卡 + bCardFlags = GateModule2.addCard(userId,cardNum,loginHandleLong); + //新增人脸 + bFaceFalgs = GateModule2.addFace(userId,facePath,loginHandleLong); + + //新增用户、卡、人脸信息都成功,则新增记录集信息,默认为1 + if (bCardFlags == 0 && bFaceFalgs ==0 && bUserFlags ==0) { + userDao.saveRecordNo(userId,1, userName, attendanceBean.getClint_id()); + } } + } catch (RuntimeException e) { + log.error("下发异常:异常错误信息msg: {}",e); + continue; } - } - - - } - - private static JsonUtils objectMapper = JsonUtils.nonEmptyMapper(); - - /** - * 解析权限模板、获取下发通道号 - * @param schoolId - * @param studentType - * @return - */ - private String analysisPermission(int schoolId, String studentType){ - if(StringUtils.isEmpty(studentType)){ - return ""; - } - List permissionFaceBeans = permissFaceService.getPermissionList(schoolId); - String channel =""; - if(permissionFaceBeans.size()>0){ - for(PermissionFaceBean permissionFaceBean : permissionFaceBeans){ - String json = permissionFaceBean.getPermissionJson(); - PermissionBean permissionBean = objectMapper.fromJson(json,PermissionBean.class); - //学生考勤类型 1:通校生,2:住校生,3:全部 - String studentTypeStr = permissionBean.getStudentType(); - if(studentTypeStr.indexOf(studentType)!=-1){ - channel= permissionFaceBean.getChannel(); - } + /** + * 人脸和卡都下发成功 + */ + if (bUserFlags ==0 && bCardFlags ==0 && bFaceFalgs==0) { + FileUtils.getInstance().writeLogs("下发人脸和卡号成功:" + cardNum + " " + attendanceBean.getClint_id(), FileUtils.sendUserSucTxt); + log.info("下发人脸和卡号成功, sendRecordBean: "+ JSON.toJSONString(sendRecordBean)); + //保存成功记录 + baseService.sendSuccessRecord(sendRecordBean,channel); + } + /** + * 人脸和卡都下发失败 + */ + if (bUserFlags !=0 && bFaceFalgs != 0 && bCardFlags !=0) { + FileUtils.getInstance().writeLogs("下发用户人脸和卡号失败: 卡号:" + cardNum + "用户ID: " + userId + " loginHandleLong: " + loginHandleLong, FileUtils.sendUserErrTxt); + log.info("下发用户人脸和卡号失败, sendRecordBean: "+ JSON.toJSONString(sendRecordBean)); + //失败信息 + String failContent = analysisErrorMsg(bUserFlags,bFaceFalgs,bCardFlags); + sendRecordBean.setFailType(EnumSendFaceType.FACE_AND_CARD_FAIL.code); + sendRecordBean.setFailContent(failContent); + baseService.sendFailRecord(sendRecordBean,channel); + } + /** + * 下发卡号成功,下发人脸失败, + */ + if (bUserFlags ==0 && bCardFlags !=0 && bFaceFalgs !=0) { + FileUtils.getInstance().writeLogs("下发卡号成功,下发人脸失败:" + cardNum + " " + attendanceBean.getClint_id(), FileUtils.sendUserErrTxt); + log.info("下发卡号成功,下发人脸失败, sendRecordBean: " + JSON.toJSONString(sendRecordBean)); + //失败信息 + String failContent = analysisErrorMsg(bUserFlags,bFaceFalgs,bCardFlags); + sendRecordBean.setFailType(EnumSendFaceType.FACE_FAIL_CARD_SUCCESS.code); + sendRecordBean.setFailContent(failContent); + baseService.sendFailRecord(sendRecordBean,channel); } - if(StringUtils.isEmpty(channel)){ - log.warn("未获取到学校权限通道号!"); - return ""; + /** + * 下发卡号失败,下发人脸成功, + */ + if (bUserFlags ==0 && bCardFlags == 0 && bFaceFalgs !=0) { + FileUtils.getInstance().writeLogs("卡信息已存在,下发人脸成功:" + cardNum + " " + attendanceBean.getClint_id(), FileUtils.sendUserSucTxt); + //失败信息 + String failContent = analysisErrorMsg(bUserFlags,bFaceFalgs,bCardFlags); + sendRecordBean.setFailType(EnumSendFaceType.FACE_SUCCESS_CARD_FAIl.code); + sendRecordBean.setFailContent(failContent); + baseService.sendFailRecord(sendRecordBean,channel); } - return channel; } - return channel; } /** - * 获取学生时段类型2.0 + * 根据学生类型获取学生时段类型 * @param schoolId * @param studentType * @param deviceId * @return */ - private String analysisAuthChannel(Integer schoolId,Integer studentType,String deviceId){ + private String getAuthChannelByStudentType(Integer schoolId,Integer studentType,String deviceId){ if(StringUtils.isEmpty(studentType) || StringUtils.isEmpty(schoolId)){ return ""; } @@ -407,16 +378,46 @@ public class SendUserInfoTask2 { //学生考勤类型 1:通校生,2:住校生,3:全部 Integer sType = authRecord.getStudentType(); log.info("学生类型:{},设备ID:{}",sType,deviceId); - if(deviceIds.indexOf(deviceId)!=-1 && (studentType.intValue() == sType.intValue() || sType.intValue() == 3)){ + if(deviceIds.indexOf(deviceId)!=-1 && studentType.intValue() == sType.intValue()){ channel= authRecord.getShiduan(); log.info("通道号:"+channel); + return channel; } } - if(StringUtils.isEmpty(channel)){ - log.warn("未获取到学校权限通道号!"); - return ""; + } + return channel; + } + + /** + * 根据班级id获取学生时段 + * @param schoolId + * @param classId + * @param deviceId + * @return + */ + private String getAuthChannelByClassId(Integer schoolId,Integer classId,String deviceId){ + if(StringUtils.isEmpty(classId) || StringUtils.isEmpty(schoolId)) { + return ""; + } + List groups = userDao.getGroupByClassId(classId); + String channel =""; + if(groups.size()>0){ + List result = new ArrayList<>(); + groups.stream().distinct().forEach(s -> { + List authRecords = userDao.getAuthRecord(schoolId,s); + result.addAll(authRecords); + }); + if(result.size()>0){ + for(DeviceAuthRecord s : result){ + String deviceIds = s.getSno(); + channel= s.getShiduan(); + log.info("学生类型:{},设备ID:{}",deviceId); + if(deviceIds.indexOf(deviceId)!=-1 ){ + log.info("通道号:"+channel); + return channel; + } + } } - return channel; } return channel; } diff --git a/cloud/dahua/src/main/java/com/example/dahua/bean/UserInfoBean.java b/cloud/dahua/src/main/java/com/example/dahua/bean/UserInfoBean.java index 36f9a65..0076188 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/bean/UserInfoBean.java +++ b/cloud/dahua/src/main/java/com/example/dahua/bean/UserInfoBean.java @@ -26,6 +26,8 @@ public class UserInfoBean implements Serializable { private String parentMobile; + private Integer student_type; + public String getClass_id() { return class_id; } @@ -114,6 +116,14 @@ public class UserInfoBean implements Serializable { this.parentMobile = parentMobile; } + public Integer getStudent_type() { + return student_type; + } + + public void setStudent_type(Integer student_type) { + this.student_type = student_type; + } + @Override public String toString() { return "UserInfoBean{" + diff --git a/cloud/dahua/src/main/java/com/example/dahua/dao/UserDao.java b/cloud/dahua/src/main/java/com/example/dahua/dao/UserDao.java index ce21ad7..bb98e2c 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/dao/UserDao.java +++ b/cloud/dahua/src/main/java/com/example/dahua/dao/UserDao.java @@ -279,4 +279,6 @@ public interface UserDao { List queryStudentIdList(@Param("schoolId") Integer schoolId,@Param("roomId")Integer roomId); List getStudentByClassId(@Param("schoolId") int schoolId,@Param("classIds") List classIds); + + List getGroupByClassId(@Param("classId") Integer classId); } diff --git a/cloud/dahua/src/main/java/com/example/dahua/enums/EnumSendFaceType.java b/cloud/dahua/src/main/java/com/example/dahua/enums/EnumSendFaceType.java index 8073c57..a23bf14 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/enums/EnumSendFaceType.java +++ b/cloud/dahua/src/main/java/com/example/dahua/enums/EnumSendFaceType.java @@ -13,7 +13,8 @@ public enum EnumSendFaceType { FACE_AND_CARD_FAIL(3, "人脸信息、卡信息下发失败"), FACE_FAIL_CARD_SUCCESS(4, "人脸信息下发失败,卡信息下发成功"), FACE_SUCCESS_CARD_FAIl(5, "人脸信息下发成功,卡信息下发失败"), - TIME_INTERVAL_ERROR(6, "刷卡时段验证错误"); + TIME_INTERVAL_ERROR(6, "刷卡时段验证错误"), + AUTH_NOT_SET(7, "权限时段未设置"); public final int code; public final String message; diff --git a/cloud/dahua/src/main/java/com/example/dahua/module/GateModule2.java b/cloud/dahua/src/main/java/com/example/dahua/module/GateModule2.java index 3284c16..8f44e00 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/module/GateModule2.java +++ b/cloud/dahua/src/main/java/com/example/dahua/module/GateModule2.java @@ -120,7 +120,7 @@ public class GateModule2 { users[i].nTimeSectionNo[0] = 255; // 表示第一个门全天有效 users[i].nTimeSectionNo[1] = 255; // 表示第二个门全天有效 }else { - //此学校不存在权限设置默认为全天有效 + //此学校不存在权限,为老师类型 设置默认为全天有效 if(StringUtils.isEmpty(channel)){ users[i].nTimeSectionNo[0] = 255; // 表示第一个门全天有效 users[i].nTimeSectionNo[1] = 255; // 表示第二个门全天有效 diff --git a/cloud/dahua/src/main/resources/mapper/usermapper.xml b/cloud/dahua/src/main/resources/mapper/usermapper.xml index e349fbb..ee8ba84 100644 --- a/cloud/dahua/src/main/resources/mapper/usermapper.xml +++ b/cloud/dahua/src/main/resources/mapper/usermapper.xml @@ -32,7 +32,7 @@ @@ -60,4 +60,14 @@ and student_num != '' and photo !='' + + \ No newline at end of file diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java index 9f933c8..e544c37 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java @@ -146,12 +146,9 @@ public class UserOperateController { return userOperateService.deleteFaceBySchoolId(schoolId,deviceIds); } - - public static void main(String[] args) { - String photo = "http://campus.myjxt.com//f0i5l7e5/0/alluser/20171008/aa26754eb6f24fceb8881d50ee37cdf3.jpg"; - //以学籍号为名的文件名 - String fileName = photo.substring(photo.lastIndexOf("/") + 1,photo.length()); - System.out.println(fileName); - System.out.println(fileName.split(".")[0]); + @ApiOperation(value = "删除指定学校下无效人脸") + @RequestMapping(value = "checkFaceSend", method = RequestMethod.GET) + public void checkFaceSend(){ + userOperateService.checkFaceSend(); } } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/dao/UserDao.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/dao/UserDao.java index 8598166..3632aea 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/dao/UserDao.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/dao/UserDao.java @@ -2,6 +2,7 @@ package com.sincere.haikangface.dao; import com.sincere.haikangface.bean.*; import com.sincere.haikangface.bean.face.DeviceAuthRecord; +import com.sincere.haikangface.bean.test.SaveStudentBak; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -287,4 +288,10 @@ public interface UserDao { StudentBean getTeacherWithCard(@Param("teacher_num") String teacher_num,@Param("schoolId") Integer schoolId); void insertCard(UpdateCardBean bean); + + void insertStudent(SaveStudentBak studentBak); + + void updateStudent(@Param("id") Integer id); + + List selectStudentList(); } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java index f048a3e..cf3b72f 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java @@ -138,4 +138,6 @@ public interface UserOperateService { * @return */ Result deleteFaceBySchoolId(Integer schoolId,String deviceIds); + + void checkFaceSend(); } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java index 165ef78..d204b22 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java @@ -6,6 +6,7 @@ import com.sincere.haikangface.CMSServer; import com.sincere.haikangface.async.SendUserAsync; import com.sincere.haikangface.bean.*; import com.sincere.haikangface.bean.face.*; +import com.sincere.haikangface.bean.test.SaveStudentBak; import com.sincere.haikangface.dao.DeviceDao; import com.sincere.haikangface.dao.UserDao; import com.sincere.haikangface.enums.EnumSzBusinessType; @@ -71,13 +72,9 @@ public class UserOperateServiceImpl implements UserOperateService { String weekDayJson = objectMapper.toJson(weekDay); //设备类型 Integer deviceType = userDao.getClintTypeByDeviceId(deviceIds.get(0)); - String deviceStr = ""; - for (String sn : deviceIds) { - deviceStr += sn + ","; - } Date start = DateUtils.string2Date("2020-01-01", DateUtils.format1); Date end = DateUtils.string2Date("2030-01-01", DateUtils.format1); - deviceStr = deviceStr.substring(0, deviceStr.length() - 1); + String deviceStr = deviceIds.stream().collect(Collectors.joining(",")); //保存权限计划 saveDeviceAuth(schoolId, deviceStr, studentType, start, end, weekDayJson, sexStr, type, authType,deviceType); return true; @@ -167,7 +164,8 @@ public class UserOperateServiceImpl implements UserOperateService { dhBean.setWeekDays(weekDayList); dhBean.setDeviceIds(devices); dhBean.setChannel(record.getShiduan()); - dhBean.setCustomName(EnumSzBusinessType.EnumStudentType.getByCode(studentType).code+""); + EnumSzBusinessType.EnumStudentType enumStudentType = EnumSzBusinessType.EnumStudentType.getByCode(studentType); + dhBean.setCustomName(enumStudentType ==null?record.getStudentType()+"": enumStudentType.name); dhBean.setStudentType(String.valueOf(studentType)); log.info("下发大华权限计划详情:{}", JSON.toJSONString(dhBean)); //发送大华设备 @@ -1036,4 +1034,92 @@ public class UserOperateServiceImpl implements UserOperateService { } return ResultGenerator.genSuccessResult(); } + + @Override + public void checkFaceSend() { + List saveStudentBaks = userDao.selectStudentList(); + if(!CollectionUtils.isEmpty(saveStudentBaks)) { + saveStudentBaks.stream().forEach(saveStudentBak -> { + try{ + String cardNum = saveStudentBak.getCardNum(); + Integer schoolId = saveStudentBak.getSchoolId(); + String deviceId = saveStudentBak.getClientId(); + StudentBean studentBean = userDao.getStudentWithCard(cardNum, schoolId); + if (studentBean == null) { + return; + } + String photo = studentBean.getPhoto(); + if (StringUtils.isBlank(photo)) { + return; + } + int userType = studentBean.getUserType(); + String userName = studentBean.getName(); + String studentCode = studentBean.getStudentCode(); + String typeName = "Student"; + //以学籍号为名的文件名 + String fileName = photo.substring(photo.lastIndexOf("/") + 1, photo.length()); + //100服务器人脸照绝对路径 + String path_1 = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; + String path_2 = "E:\\wwwhtdocs\\SmartCampus\\face17e5\\School" + schoolId + "\\" + typeName; + String path_3 = "E:\\wwwhtdocs\\SmartCampus\\f0i5l7e5\\"; + String filePath = ""; + if (photo.indexOf("f0i5l7e5") != -1) { + String afterStr = photo.split("f0i5l7e5/")[1].replace("/", "\\"); + filePath = path_3 + afterStr; + } + if (photo.indexOf("face17e5") != -1) { + filePath = path_2 + "\\" + fileName; + } + if (photo.indexOf("face17e50") != -1) { + filePath = path_1 + "\\" + fileName; + } + if (filePath.indexOf("?v=") != -1) { + filePath = filePath.split("\\?")[0]; + } + //校验100服务文件存储地址上是否存在此人脸 + File file = new File(filePath.trim());//图片 + if (!file.exists()) { + log.error("文件不存在:" + filePath); + baseService.sendFailRecord(cardNum, filePath, deviceId, "文件不存在", String.valueOf(userType), schoolId); + return; + } + String targetPath = FileUtils.picPathComp + file.getName(); + if (file.exists()) { + try { + CompressPic.CompressPic(file.getAbsolutePath(), targetPath); + } catch (Exception e) { + log.error("压缩图片失败:", e); + } + } + //设备类型 + Integer clintType = userDao.getClintTypeByDeviceId(deviceId); + if (clintType.intValue() == 18 || clintType.intValue() == 28) { +// //1.先删除人脸 +// if (cmsServer.getIsDeviceOnline(deviceId)) { +// String cardNo = Long.parseLong(baseService.getCard(cardNum), 16) + ""; +// cmsServer.deleteFace(deviceId, cardNo, schoolId); +// } else { +// //不在线,去253服务器上删除 +// HttpUtil.deleteCard(deviceId, cardNum); +// } + //2.重新下发 + boolean isOk = baseService.sendImg(file.getAbsolutePath(), targetPath, deviceId, cardNum, userName, String.valueOf(userType), schoolId); + if (isOk) { + return; + } else { + } + } + //下大华人脸 + if (clintType.intValue() == 22 || clintType.intValue() == 29) { + //下发单个人脸至大华设备 + HttpUtil.uploadDHImgForOne(filePath, schoolId, studentCode, clintType, deviceId); + return; + } + }catch (Exception e){ + log.error("下发出错"); + return; + } + }); + } + } } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java index bfe5480..7a759ec 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/DateUtils.java @@ -41,6 +41,16 @@ public class DateUtils { return new Date(); } + public static String string2Date2(String date, String format) { + try{ + SimpleDateFormat sdf = new SimpleDateFormat(format); + return String.valueOf(sdf.parse(date).getTime()); + }catch (Exception e){ + + } + return String.valueOf(new Date().getTime()); + } + public static Date getToday(){ return new Date(); } @@ -117,8 +127,11 @@ public class DateUtils { public static void main(String[] args) { - System.out.println(getDateByTime(3,new Date())); - System.out.println(date2String(new Date(),format3)); +// System.out.println(getDateByTime(3,new Date())); +// System.out.println(date2String(new Date(),format3)); + + System.out.println(string2Date2("2022-02-23 04:00:00","yyyy-MM-dd HH:mm:ss")); + System.out.println(string2Date2("2022-02-23 20:00:00","yyyy-MM-dd HH:mm:ss")); } } diff --git a/cloud/haikangface/src/main/resources/mapper/usermapper.xml b/cloud/haikangface/src/main/resources/mapper/usermapper.xml index 65a253b..d6b5b58 100644 --- a/cloud/haikangface/src/main/resources/mapper/usermapper.xml +++ b/cloud/haikangface/src/main/resources/mapper/usermapper.xml @@ -163,4 +163,29 @@ + + + + + + + + + + + + + + insert into sz_student_bak values (#{name},#{userId},#{cardNum},#{clientId},#{className},#{status},#{schoolId}) + + + + + + update sz_student_bak set status = 1 where id = #{id} + diff --git a/cloud/haikangface/src/test/java/com/sincere/haikangface/HaikangfaceApplicationTests.java b/cloud/haikangface/src/test/java/com/sincere/haikangface/HaikangfaceApplicationTests.java index e1a41b1..7946a26 100644 --- a/cloud/haikangface/src/test/java/com/sincere/haikangface/HaikangfaceApplicationTests.java +++ b/cloud/haikangface/src/test/java/com/sincere/haikangface/HaikangfaceApplicationTests.java @@ -1,5 +1,6 @@ package com.sincere.haikangface; +import com.alibaba.fastjson.JSONObject; import com.drew.imaging.jpeg.JpegMetadataReader; import com.drew.imaging.jpeg.JpegProcessingException; import com.drew.metadata.Directory; @@ -9,6 +10,7 @@ import com.drew.metadata.exif.ExifDirectory; import com.sincere.haikangface.admindao.ZuoyeAdminDao; import com.sincere.haikangface.bean.*; import com.sincere.haikangface.bean.homework.QuestionBean; +import com.sincere.haikangface.bean.test.SaveStudentBak; import com.sincere.haikangface.bean.xiaoan.AttendanceRecordsSS; import com.sincere.haikangface.bean.xiaoan.CreditCardRecordsSS; import com.sincere.haikangface.dao.DeviceDao; @@ -16,7 +18,9 @@ import com.sincere.haikangface.dao.UserDao; import com.sincere.haikangface.dao.ZuoYeDao; import com.sincere.haikangface.service.impl.BaseService; import com.sincere.haikangface.utils.ApiUtil; +import com.sincere.haikangface.utils.DateUtils; import com.sincere.haikangface.xiananDao.SendRecordDao; +import org.apache.commons.lang3.RandomStringUtils; import org.bouncycastle.asn1.cms.MetaData; import org.hibernate.validator.constraints.LuhnCheck; import org.junit.Test; @@ -74,10 +78,37 @@ public class HaikangfaceApplicationTests { //艺术 // String deviceIds = "567176463869,567176463898,567176463903,567176463892"; Integer schoolId = 1066; -// baseService.clearStudent(schoolId,deviceIds); + baseService.clearStudent(schoolId,deviceIds); baseService.clearStudent2(schoolId); } + @Test + public void checkFaceSend() { + String deviceIds = "694642005671,694642215671,687425355671,687425325671,338652895671,687425135671,ytj694642375671,338652415671,687425265671,ytj687425345671,338652515671,694642555671,ytj694642105671,338653105671,ytj687425415671,ytj687425155671,740456495671,694642135671,ytj687425395671,687425225671"; + //下发设备集合 + List deviceList= new ArrayList<>(Arrays.asList(deviceIds.split(","))); + List studentBeans = userDao.getStudentBySchoolId(865); + studentBeans.stream().distinct().forEach(studentBean -> { + String name = studentBean.getName(); + String userId = studentBean.getUser_id(); + String cardNum = studentBean.getStudent_num(); + String className = studentBean.getClass_name(); + for(String s : deviceList){ + List sendRecordBeans = sendRecordDao.getRecordIsExit(s,cardNum,userId); + if(CollectionUtils.isEmpty(sendRecordBeans)){ + SaveStudentBak saveStudentBak = new SaveStudentBak(); + saveStudentBak.setCardNum(cardNum); + saveStudentBak.setClientId(s); + saveStudentBak.setUserId(userId); + saveStudentBak.setName(name); + saveStudentBak.setClassName(className); + saveStudentBak.setStatus(2); + userDao.insertStudent(saveStudentBak); + } + } + }); + } + public String splicingZero(String str, int totalLenght) { int strLenght = str.length(); String strReturn = str; @@ -137,4 +168,102 @@ public class HaikangfaceApplicationTests { } } } + + @Test + public void test() { + List students = userDao.getStudentBySchoolId(12); + int i = 0; + for(StudentBean studentBean : students){ + String time = DateUtils.date2String(new Date(),"yyyyMMddHHmm"); + String randomString = RandomStringUtils.randomNumeric(4); + String studentCode = "YX"+time+randomString+".png"; + String photo = studentBean.getPhoto(); + System.out.println("源文件:" + photo); + //以学籍号为名的文件名 + String fileName = photo.substring(photo.lastIndexOf("/") + 1,photo.length()); + //100服务器人脸照绝对路径 + //100服务器人脸照绝对路径 + String path_1 = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School12\\Student"; + String path_2 = "E:\\wwwhtdocs\\SmartCampus\\face17e5\\School12\\Student"; + String path_3 = "E:\\wwwhtdocs\\SmartCampus\\f0i5l7e5\\"; + String filePath =""; + String filePath2 =""; + if(photo.indexOf("f0i5l7e5")!=-1){ + String afterStr = photo.split("f0i5l7e5/")[1].replace("/","\\"); + filePath = path_3 + afterStr; + filePath2 = path_3 + studentCode; + } + if(photo.indexOf("face17e5")!=-1){ + filePath = path_2 + "\\" + fileName; + filePath2 = path_2 + "\\" + studentCode; + } + if(photo.indexOf("face17e50")!=-1){ + filePath = path_1 + "\\" + fileName; + filePath2 = path_1 + "\\" + studentCode; + } + if(filePath.indexOf("?v=")!=-1){ + filePath = filePath.split("\\?")[0]; + } + File file = new File(filePath.trim());//图片 + if (file.exists()) { + //原始文件路径 + String srcPath = file.getAbsolutePath(); + System.out.println("文件名:" + fileName + ", 学籍号:" + fileName.split("\\.")[0]); + //复制文件 + copy(srcPath,filePath2); + String savePath = "http://campus.myjxt.com//" + filePath2; + studentBean.setPhoto(savePath); + userDao.updateUser(studentBean.getUser_id(), savePath); + file.delete(); + i++; + } + if(i==1){ + System.out.println(filePath); + return; + } + } + } + + public static void copy(String srcPathStr, String desPathStr) { + //获取源文件的名称 + try { + FileInputStream fis = new FileInputStream(srcPathStr);//创建输入流对象 + FileOutputStream fos = new FileOutputStream(desPathStr); //创建输出流对象 + byte datas[] = new byte[1024*8];//创建搬运工具 + int len = 0;//创建长度 + while((len = fis.read(datas))!=-1)//循环读取数据 + { + fos.write(datas,0,len); + } + fis.close();//释放资源 + fis.close();//释放资源 + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + + @Test + public void send2() { + try { + String api = "http://yixiao.198.hmkj.com.cn/index.php/Attend/send"; + RestTemplate restTemplate = new RestTemplate(); + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add("name", "测试"); + map.add("xuehao", "1122"); + map.add("time", "2022-02-10 09:09:00"); + map.add("state", 1); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity> param = new HttpEntity<>(map, headers); + ResponseEntity response = restTemplate.postForEntity(api, param, String.class); + String body = response.getBody(); + System.out.println(body); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("考勤失败"); + } + } } -- libgit2 0.21.0