From ad296f75cc57c68080616ec44e28db75436c6ea9 Mon Sep 17 00:00:00 2001 From: XuQuan <1099815072@qq.com> Date: Sun, 25 Apr 2021 15:07:38 +0800 Subject: [PATCH] 智能校卫:海康、大华人脸机代码提交 --- cloud/dahua/src/main/java/com/example/dahua/DahuaApplication.java | 1 - cloud/dahua/src/main/java/com/example/dahua/MyTask.java | 46 ++++++++++++++++++++++++++++------------------ cloud/dahua/src/main/java/com/example/dahua/async/MyScheduledTask.java | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask100.java | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask2.java | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/dahua/src/main/java/com/example/dahua/async/SendUserInfoTask2.java | 16 ++++++++-------- cloud/dahua/src/main/java/com/example/dahua/bean/StudentBean.java | 10 ++++++++++ cloud/dahua/src/main/java/com/example/dahua/bean/UserInfoBean.java | 20 ++++++++++++++++++++ cloud/dahua/src/main/java/com/example/dahua/control/UserControl.java | 55 +++++++++++++++++++++++++++++++++++++++++++------------ cloud/dahua/src/main/java/com/example/dahua/control/UserOperateController.java | 28 +++++++++++++++++++++------- cloud/dahua/src/main/java/com/example/dahua/dao/UserDao.java | 17 +++++++++++------ cloud/dahua/src/main/java/com/example/dahua/filter/AllowOriginFilter.java | 66 +++++++++++++++++++++++++++++++++--------------------------------- cloud/dahua/src/main/java/com/example/dahua/service/AttendanceService.java | 3 +-- cloud/dahua/src/main/java/com/example/dahua/service/DeleteBatchTest.java | 8 +++++++- cloud/dahua/src/main/java/com/example/dahua/service/UserOperateService.java | 5 ++--- cloud/dahua/src/main/java/com/example/dahua/service/imp/AttendanceImp.java | 8 +++----- cloud/dahua/src/main/java/com/example/dahua/service/imp/BaseService.java | 10 +++++----- cloud/dahua/src/main/java/com/example/dahua/service/imp/DeleteBatchTestImpl.java | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/dahua/src/main/java/com/example/dahua/service/imp/UserOperateServiceImpl.java | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------- cloud/dahua/src/main/java/com/example/dahua/utils/BaiduUtils.java | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------- cloud/dahua/src/main/java/com/example/dahua/utils/DateFormatUtil.java | 28 ++++++++++++++++++++++++---- cloud/dahua/src/main/java/com/example/dahua/xiananDao/SearchMapper.java | 6 ++++++ cloud/dahua/src/main/java/com/example/dahua/xiananDao/SendRecordDao.java | 37 ++++++++++++++++++++++++------------- cloud/dahua/src/main/resources/logback-spring.xml | 2 +- cloud/dahua/src/main/resources/mapper/usermapper.xml | 8 +++++++- cloud/dahua/src/main/resources/xiaoanmapper/SearchMapper.xml | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- cloud/haikangface/src/main/java/com/sincere/haikangface/CMSServer.java | 331 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------- cloud/haikangface/src/main/java/com/sincere/haikangface/HaikangfaceApplication.java | 4 +--- cloud/haikangface/src/main/java/com/sincere/haikangface/async/AsyncTask.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/async/DeleteTask.java | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendFaceBatchTask253.java | 2 +- cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendUserAsync.java | 33 ++++++++------------------------- cloud/haikangface/src/main/java/com/sincere/haikangface/bean/AttendanceBean.java | 10 ++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/bean/StudentBean.java | 10 ++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/bean/UpdateCardBean.java | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/control/FileControl.java | 38 ++++++++++++++++++++++---------------- cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserControl.java | 179 ++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------- cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserOperateController.java | 39 ++++++++++++++++++++++++++------------- cloud/haikangface/src/main/java/com/sincere/haikangface/dao/UserDao.java | 30 +++++++++++++++++++----------- cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqtUtils.java | 1 - cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqttManager.java | 23 ----------------------- cloud/haikangface/src/main/java/com/sincere/haikangface/service/UserOperateService.java | 37 ++++++++++++++++++++++++------------- cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java | 467 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/UserOperateServiceImpl.java | 544 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java | 53 ++++++++++++++++++++++++++++++++++++++--------------- cloud/haikangface/src/main/java/com/sincere/haikangface/utils/HttpUtil.java | 34 +++++++++++++++++++++++++++------- cloud/haikangface/src/main/java/com/sincere/haikangface/utils/SpringContextHolder.java | 23 +++++++++++++++++++++++ cloud/haikangface/src/main/java/com/sincere/haikangface/xiananDao/SendRecordDao.java | 34 +++++++++++++++++++++++++++------- cloud/haikangface/src/main/resources/application.yaml | 12 ++++++------ cloud/haikangface/src/main/resources/logback-spring.xml | 9 ++++++++- cloud/haikangface/src/main/resources/mapper/usermapper.xml | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++------------ cloud/haikangface/src/test/java/com/sincere/haikangface/HaikangfaceApplicationTests.java | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/mypulsar/pom.xml | 20 +++++++++++++++----- cloud/mypulsar/src/main/java/com/example/mypulsar/MyRunnerableInt.java | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------- cloud/mypulsar/src/main/java/com/example/mypulsar/bean/IotDevice.java | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/mypulsar/src/main/java/com/example/mypulsar/bean/TuYaReceiverBean.java | 21 +++++++++++++-------- cloud/mypulsar/src/main/java/com/example/mypulsar/bean/Wl_Attendace.java | 12 ++++++++++++ cloud/mypulsar/src/main/java/com/example/mypulsar/control/UserControl.java | 8 ++++++++ cloud/mypulsar/src/main/java/com/example/mypulsar/dao/DeviceDao.java | 25 ++++++++++++++++++------- cloud/mypulsar/src/main/java/com/example/mypulsar/enums/EnumEventType.java | 41 +++++++++++++++++++++++++++++++++++++++++ cloud/mypulsar/src/main/java/com/example/mypulsar/message/MessageVO.java | 16 +++++++++++++++- cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumer.java | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumerCallback.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttProperties.java | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/mypulsar/src/main/java/com/example/mypulsar/task/SchduledTasks.java | 203 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------- cloud/mypulsar/src/main/java/com/example/mypulsar/utils/ControlUtils.java | 2 +- cloud/mypulsar/src/main/java/com/example/mypulsar/utils/HttpUtil.java | 11 ++++++++--- cloud/mypulsar/src/main/java/com/example/mypulsar/utils/JsonUtils.java | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/mypulsar/src/main/resources/application.yaml | 41 ----------------------------------------- cloud/mypulsar/src/main/resources/application.yml | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/mypulsar/src/main/resources/iotmapper/iotmapper.xml | 16 +++++++--------- cloud/mypulsar/src/test/java/com/example/mypulsar/MypulsarApplicationTests.java | 30 +++++++++++++++++++++++++++++- 73 files changed, 3388 insertions(+), 1314 deletions(-) create mode 100644 cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask100.java create mode 100644 cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask2.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/async/AsyncTask.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/async/DeleteTask.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/bean/UpdateCardBean.java create mode 100644 cloud/haikangface/src/main/java/com/sincere/haikangface/utils/SpringContextHolder.java create mode 100644 cloud/mypulsar/src/main/java/com/example/mypulsar/bean/IotDevice.java create mode 100644 cloud/mypulsar/src/main/java/com/example/mypulsar/enums/EnumEventType.java create mode 100644 cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumer.java create mode 100644 cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumerCallback.java create mode 100644 cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttProperties.java create mode 100644 cloud/mypulsar/src/main/java/com/example/mypulsar/utils/JsonUtils.java delete mode 100644 cloud/mypulsar/src/main/resources/application.yaml create mode 100644 cloud/mypulsar/src/main/resources/application.yml diff --git a/cloud/dahua/src/main/java/com/example/dahua/DahuaApplication.java b/cloud/dahua/src/main/java/com/example/dahua/DahuaApplication.java index da75e5d..87340b6 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/DahuaApplication.java +++ b/cloud/dahua/src/main/java/com/example/dahua/DahuaApplication.java @@ -58,7 +58,6 @@ public class DahuaApplication { } } });*/ - } @EnableAsync 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 3c0b69e..b24a189 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/MyTask.java +++ b/cloud/dahua/src/main/java/com/example/dahua/MyTask.java @@ -37,6 +37,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; @Component @Slf4j @@ -72,7 +73,6 @@ public class MyTask implements ApplicationRunner { //设备断线 public static boolean isFirstAutoRegister = false; - public static String inTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); @Override public void run(ApplicationArguments args) throws Exception { @@ -143,7 +143,9 @@ public class MyTask implements ApplicationRunner { String deviceId = getDeviceId(pchDVRIP, nDVRPort); log.info("DisConnect Device: {}, IP: {}, Port: {}",deviceId,pchDVRIP,nDVRPort); if (!StringUtils.isEmpty(deviceId)) { - myTaskUtil.attendanceService.updateConnectStateWithDevid(0,inTime,deviceId); + String inTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + //保存设备 + saveAttendanceService(deviceId,pchDVRIP,nDVRPort,0); GateModule.stopRealLoadPic(attachLongMap.get(deviceId)); //移除在线 removeDevice(deviceId); @@ -169,7 +171,9 @@ public class MyTask implements ApplicationRunner { String deviceId = getDeviceId(pchDVRIP, nDVRPort); log.info("ReConnect Device: {},IP: {},Port: {}", deviceId,pchDVRIP, nDVRPort); if (!StringUtils.isEmpty(deviceId)) { - myTaskUtil.attendanceService.updateConnectStateWithDevid(1,inTime,deviceId); + String inTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + //保存设备 + saveAttendanceService(deviceId,pchDVRIP,nDVRPort,1); DeviceInfoBean deviceInfoBean = new DeviceInfoBean(); deviceInfoBean.setDevcieId(deviceId); deviceInfoBean.setDeviceIp(pchDVRIP); @@ -226,7 +230,7 @@ public class MyTask implements ApplicationRunner { log.info("Register Device Info Device address: {},port: {},DeviceID: {}", pIp, wPort, deviceId); log.info("EM_LISTEN_TYPE:设备注册携带序列号"); //保存设备 - saveAttendanceService(deviceId,pIp,wPort); + saveAttendanceService(deviceId,pIp,wPort,1); CDevInfo dev = new CDevInfo(); System.arraycopy(pIp.getBytes(),0,dev.address,0,pIp.getBytes().length); dev.port=wPort; @@ -391,7 +395,18 @@ public class MyTask implements ApplicationRunner { if (!path.exists()) { path.mkdir(); } - + //设备ID + CDevInfo data = new CDevInfo(); + ToolKits.GetPointerData(dwUser, data); + String szSn = new String(data.szSN).trim(); +// if(dwAlarmType == NetSDKLib.EVENT_IVS_FACERECOGNITION){ +//// ToolKits.GetPointerData(pAlarmInfo, msg); +//// //卡号 +//// String card = new String(msg.szCardNo).trim(); +//// //开门用户 +//// String userId = new String(msg.szUID).trim(); +//// log.info("你来了。。。。"); +// } ///< 门禁事件 if (dwAlarmType == NetSDKLib.EVENT_IVS_ACCESS_CTL) { NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO msg = new NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO(); @@ -403,11 +418,9 @@ public class MyTask implements ApplicationRunner { String userId = new String(msg.szUserID).trim(); //开门错误码 int messageCode = msg.nErrorCode; - //设备ID - CDevInfo data = new CDevInfo(); - ToolKits.GetPointerData(dwUser, data); - String szSn = new String(data.szSN).trim(); log.info("设备ID: {}, 开门用户ID: {}, 开门卡号: {}",szSn,userId,card); + //处理心跳 + saveAttendanceService(szSn,"",0,1); try { if (!StringUtils.isEmpty(card)) { // 保存图片,获取图片缓存 @@ -428,7 +441,6 @@ public class MyTask implements ApplicationRunner { outOrIn= StringUtils.isEmpty(attendanceBean.getOutOrIn())?0:Integer.parseInt(attendanceBean.getOutOrIn()); } } - /** * 卡号取反(大写) * 注:若设备为一体机、且非"126上虞城东小学、393上虞实验中学"学校,卡则取反 @@ -569,14 +581,14 @@ public class MyTask implements ApplicationRunner { * @param ip * @param port */ - private static void saveAttendanceService(String deviceId, String ip, int port){ + public static void saveAttendanceService(String deviceId, String ip, int port,int status){ + String inTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); String clintType = String.valueOf(EnumDeviceType.DH_FACE.deviceType); if(deviceId.startsWith("ytj")){ clintType = String.valueOf(EnumDeviceType.DH_FACE_YTJ.deviceType); } - //联网成功 - String status = "1"; - myTaskUtil.attendanceService.insert(deviceId, clintType, ip,String.valueOf(port), inTime, "-1",status); + + myTaskUtil.attendanceService.insert(deviceId,clintType, ip,String.valueOf(port), inTime, "-1",1,status); } /** @@ -710,7 +722,7 @@ public class MyTask implements ApplicationRunner { log.info("设备ID集: "+ JsonUtils.nonDefaultMapper().toJson(kanbanIds)); for (String kanbanId : kanbanIds) { String data = "{\"cmd\":\"" + 34 + "\",\"clientId\":\"" + kanbanId + "\",\"data\":{\"cardNum\":\"" + cardNum + "\",\"inOrOut\":\"" + inOrOut + "\"}}"; - log.info("====== 开始推送看板======, kanbanId = {}, cardNum = {},content ={}",kanbanId,cardNum,data); +// log.info("====== 开始推送看板======, kanbanId = {}, cardNum = {},content ={}",kanbanId,cardNum,data); mqttManager.sendMqQD(kanbanId, data); } } else { @@ -729,7 +741,7 @@ public class MyTask implements ApplicationRunner { for (int i = 0; i < clintIds.size(); i++) { String clintId = clintIds.get(i); String data = "{\"cmd\":\"" + 34 + "\",\"clientId\":\"" + clintId + "\",\"data\":{\"cardNum\":\"" + cardNum + "\",\"inOrOut\":\"" + inOrOut + "\"}}"; - log.info("====== 开始推送看板======, deviceId = {}, cardNum = {},content ={}",clintId,cardNum,data); +// log.info("====== 开始推送看板======, deviceId = {}, cardNum = {},content ={}",clintId,cardNum,data); mqttManager.sendMqQD(clintId, data); } } @@ -743,11 +755,9 @@ public class MyTask implements ApplicationRunner { public static boolean openDoor(NetSDKLib.LLong lLong) { open.nChannelID = 0; - open.write(); boolean openSuccess = LoginModule.netsdk.CLIENT_ControlDeviceEx(lLong, NetSDKLib.CtrlType.CTRLTYPE_CTRL_ACCESS_OPEN, open.getPointer(), null, 5000); open.read(); - if (!openSuccess) { log.warn("open Door error: 0x: "+ Long.toHexString(LoginModule.netsdk.CLIENT_GetLastError())); return false; diff --git a/cloud/dahua/src/main/java/com/example/dahua/async/MyScheduledTask.java b/cloud/dahua/src/main/java/com/example/dahua/async/MyScheduledTask.java index 16538f0..c458cb0 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/async/MyScheduledTask.java +++ b/cloud/dahua/src/main/java/com/example/dahua/async/MyScheduledTask.java @@ -8,10 +8,15 @@ import com.example.dahua.bean.WGBean; import com.example.dahua.dao.UserDao; import com.example.dahua.lib.Utils; import com.example.dahua.mqtt.MqttManager; +import com.example.dahua.service.UserOperateService; import com.example.dahua.utils.DateFormatUtil; import com.example.dahua.utils.DateUtils; import com.example.dahua.utils.FileUtils; +import com.example.dahua.xiananDao.SearchMapper; import com.example.dahua.xiananDao.SendRecordDao; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.json.JSONException; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; @@ -33,7 +38,11 @@ import java.io.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; +@Slf4j @Component public class MyScheduledTask { @@ -89,7 +98,7 @@ public class MyScheduledTask { /** * 订阅任务 20秒执行一次 */ - @Scheduled(fixedDelay= 5000) + @Scheduled(fixedDelay= 10000) protected synchronized void reloadPic2(){ //登录 if (myTasks.isHasNewDevice) { @@ -100,6 +109,83 @@ public class MyScheduledTask { } } + @Autowired + private UserOperateService userOperateService; + @Autowired + private SearchMapper searchMapper; +// /** +// * 订阅任务 20秒执行一次 +// */ +// @Scheduled(cron = "0 51 18 * * ?") +// protected synchronized void task(){ +// log.info("开始执行----- 晚上到寝"); +// //男 +// Integer schoolId=27; +// Integer roomId =12226; +// Integer type = 7; +// Integer outof = 1; +// String clintId="253169192"; +// String timeIds = "2021-01-08,2021-01-11,2021-01-12,2021-01-13,2021-01-14,2021-01-15,2021-01-18,2021-01-19,2021-01-20,2021-01-21,2021-01-22"; +// String[] deviceArr = timeIds.split(","); +// List deviceList= new ArrayList<>(Arrays.asList(deviceArr)); +// //启用多线程执行 +// CountDownLatch begin = new CountDownLatch(1); +// CountDownLatch end = new CountDownLatch(deviceList.size()); +// ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-sendFace-runner-%d").build(); +// ExecutorService exe = new ThreadPoolExecutor(4,8,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue(),namedThreadFactory); +// for(String s : deviceList){ +// String intime = s + " 20:26:14"; +// String startTime= s + " 00:00:00"; +// String endTime = s+" 23:59:59"; +// exe.execute(new SendFaceBatchTask100(userDao,sendRecordDao,searchMapper,schoolId,roomId,type,outof,intime,clintId,startTime,endTime,begin,end)); +// } +// begin.countDown(); +// try { +// end.await(); +// }catch (Exception e){ +// log.error("失败"+e); +// } +// exe.shutdown(); +// log.info("统计100服务器总共有"+deviceList.size()+"个设备,处理完毕"); +// } +// +// // @Scheduled(cron = "0 50 15 * * ?") +// @Scheduled(cron = "0 09 21 * * ?") +// protected synchronized void task2(){ +// log.info("开始执行----- 晚上到寝"); +// //男 +// Integer schoolId=27; +// Integer roomId =12226; +// Integer type = 4; +// Integer outof = 1; +// String clintId="253169212"; +// String timeIds = "2021-01-08,2021-01-11,2021-01-12,2021-01-13,2021-01-14,2021-01-15,2021-01-18,2021-01-19,2021-01-20,2021-01-21,2021-01-22"; +// String[] deviceArr = timeIds.split(","); +// List deviceList= new ArrayList<>(Arrays.asList(deviceArr)); +// //启用多线程执行 +// CountDownLatch begin = new CountDownLatch(1); +// CountDownLatch end = new CountDownLatch(deviceList.size()); +// ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-sendFace-runner-%d").build(); +// ExecutorService exe = new ThreadPoolExecutor(8,16,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue(),namedThreadFactory); +// for(String s : deviceList){ +//// String intime = s + " 06:03:39"; +//// String startTime= s + " 00:00:00"; +//// String endTime = s+" 23:59:59"; +// String intime = s + " 17:14:39"; +// String startTime= s + " 00:00:00"; +// String endTime = s+" 23:59:59"; +// exe.execute(new SendFaceBatchTask2(userDao,sendRecordDao,searchMapper,schoolId,roomId,type,outof,intime,clintId,startTime,endTime,begin,end)); +// } +// begin.countDown(); +// try { +// end.await(); +// }catch (Exception e){ +// log.error("失败"+e); +// } +// exe.shutdown(); +// log.info("统计100服务器总共有"+deviceList.size()+"个设备,处理完毕"); +// } + /** * 定期删除人脸抓拍图片 */ @@ -197,12 +283,10 @@ public class MyScheduledTask { isSendMQ = true; String fileName = simpleDateFormat.format(new Date()); String filePath = "D:\\wg_log\\info\\kaoInfo\\" + fileName + ".log"; -// String filePath = "C:\\Users\\Administrator\\Desktop\\2020-04-30 08.log"; if (!readLineMap.containsKey(fileName)) readLineNum = -1;//更新文件后从头开始 File file = new File(filePath); try { if (!file.exists()) { -// System.out.println("文件不存在:" + filePath); return; } FileInputStream fileInputStream = new FileInputStream(file); @@ -213,16 +297,12 @@ public class MyScheduledTask { int indexLineNum = 0;//当前文件的行 while ((content = bufferedReader.readLine()) != null) { indexLineNum++; -// System.out.println("indexLineNum:"+indexLineNum+" ----------readLineNum:"+readLineNum); if (indexLineNum >= readLineNum) { readLineNum++; sendMQMess(content); } - } - readLineMap.put(fileName, readLineNum); - fileInputStream.close(); bufferedReader.close(); @@ -254,32 +334,36 @@ public class MyScheduledTask { String qiandaoDevId = content.substring(content.indexOf("设备") + 3, content.indexOf("设备") + 12); + String schoolId = userDao.getSchoolIdWidthCardNum(cardNum); + if(StringUtils.isEmpty(schoolId)){ + log.info("此卡号未对应所属学校,考勤卡号:{}",cardNum); + return; + } //获取寝室关联的场景id String placeId = userDao.getPlaceIdWithKaoqinDevid(qiandaoDevId); - - if (null != placeId) { - //关联的显示看板设备 - List kanbanIds = userDao.getKanBanIdWithPlaceId(placeId); - - for (int i = 0; i < kanbanIds.size(); i++) { - String kanbanId = kanbanIds.get(i); - String data = "{\"cmd\":\"" + 34 + "\",\"clientId\":\"" + kanbanId + "\",\"data\":{\"cardNum\":\"" + cardNum + "\",\"inOrOut\":\"" + inOrOut + "\"}}"; - mqttManager.sendMqQD(kanbanId, data); + //关联的显示看板设备 + List kanbanIds = new ArrayList<>(); + if(!StringUtils.isEmpty(placeId)) { + log.info("关联场景ID: {},考勤设备ID:{}",placeId,qiandaoDevId); + kanbanIds = userDao.getKanBanIdWithPlaceId(placeId); + }else{ + List kBIds = userDao.getClintIds(schoolId); + if(CollectionUtils.isNotEmpty(kBIds)){ + for(String kbId : kBIds){ + String roomId = userDao.getPlaceIdWithKanBanDevid(kbId); + if(StringUtils.isEmpty(roomId)){ + kanbanIds.add(kbId); + } + } } - - } else { - - String schoolId = userDao.getSchoolIdWidthCardNum(cardNum); - if(StringUtils.isEmpty(schoolId)||Integer.parseInt(schoolId) <=0)return; - List clintIds = userDao.getClintIds(schoolId); - for (int i = 0; i < clintIds.size(); i++) { - String clintId = clintIds.get(i); + } + if(CollectionUtils.isNotEmpty(kanbanIds)){ + for (int i = 0; i < kanbanIds.size(); i++) { + String clintId = kanbanIds.get(i); String data = "{\"cmd\":\"" + 34 + "\",\"clientId\":\"" + clintId + "\",\"data\":{\"cardNum\":\"" + cardNum + "\",\"inOrOut\":\"" + inOrOut + "\"}}"; mqttManager.sendMqQD(clintId, data); + log.info("发送微耕考勤消息:学校ID: {},设备ID: {},关联看板room: {},",schoolId,clintId,placeId); } } - } - - } diff --git a/cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask100.java b/cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask100.java new file mode 100644 index 0000000..59ce1b1 --- /dev/null +++ b/cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask100.java @@ -0,0 +1,106 @@ +package com.example.dahua.async; + +import com.example.dahua.bean.UserInfoBean; +import com.example.dahua.dao.UserDao; +import com.example.dahua.utils.DateFormatUtil; +import com.example.dahua.xiananDao.SearchMapper; +import com.example.dahua.xiananDao.SendRecordDao; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CountDownLatch; + +/** + * 多线程执行卡下发 + * @author xuquan + * @date 2021/01/12 15:56 + */ +@Slf4j +public class SendFaceBatchTask100 implements Runnable { + + + CountDownLatch begin; + CountDownLatch end; + UserDao userDao; + SendRecordDao sendRecordDao; + SearchMapper searchMapper; + Integer schoolId; + Integer roomId; + Integer type; + Integer outof; + String intime; + String clintId; + String startTime; + String endTime; + + public SendFaceBatchTask100(UserDao userDao,SendRecordDao sendRecordDao,SearchMapper searchMapper,Integer schoolId,Integer roomId, + Integer type,Integer outof,String intime,String clintId,String startTime,String endTime,CountDownLatch begin, CountDownLatch end){ + this.begin=begin; + this.end=end; + this.userDao=userDao; + this.sendRecordDao=sendRecordDao; + this.searchMapper=searchMapper; + this.schoolId=schoolId; + this.roomId=roomId; + this.type= type; + this.outof=outof; + this.intime=intime; + this.clintId=clintId; + this.startTime=startTime; + this.endTime=endTime; + } + + @Override + public void run() { + try { + begin.await(); + int num= (int)Math.random()*20+30; + List studentIds = userDao.queryStudentIdList(schoolId,roomId); + if(!CollectionUtils.isEmpty(studentIds)){ + System.out.println("总数:"+studentIds.size()); + int i =0; + for(String studentId : studentIds){ + if(i==num){ + return; + } + UserInfoBean userInfoBean = userDao.getStudentWithid(studentId); + if(userInfoBean!=null){ + String cardNum = userInfoBean.getStudent_num(); + String userId = userInfoBean.getUser_id(); + String com = userInfoBean.getStudent_id(); + String classId = userInfoBean.getClass_id(); + String className = userInfoBean.getClass_name(); + String name= userInfoBean.getName(); + String mobile= userInfoBean.getParentMobile(); + String sex = String.valueOf(userInfoBean.getSex()); + String cid= UUID.randomUUID().toString().toUpperCase(); + int count = sendRecordDao.getKaoQin(schoolId,cardNum,type,outof,startTime,endTime); + System.out.println("count: "+count); + if(count ==0){ + intime = DateFormatUtil.getDateAdd(intime); + searchMapper.insert(userId,String.valueOf(schoolId),com,cardNum,type,outof,intime,cid,classId,clintId,name,mobile,className,sex,intime); + i++; + } + } + } + } + }catch (Exception e){ + log.error("异常,信息:",e); + }finally { + end.countDown(); + } + } + + public static void main(String[] args) { + for(int i=1;i<20;i++){ + int num= (int)(Math.random()*20)+30; + System.out.println(num); + } + } + +} diff --git a/cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask2.java b/cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask2.java new file mode 100644 index 0000000..d4e12a2 --- /dev/null +++ b/cloud/dahua/src/main/java/com/example/dahua/async/SendFaceBatchTask2.java @@ -0,0 +1,102 @@ +package com.example.dahua.async; + +import com.example.dahua.bean.StudentBean; +import com.example.dahua.bean.UserInfoBean; +import com.example.dahua.dao.UserDao; +import com.example.dahua.utils.DateFormatUtil; +import com.example.dahua.xiananDao.SearchMapper; +import com.example.dahua.xiananDao.SendRecordDao; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CountDownLatch; + +/** + * 多线程执行卡下发 + * @author xuquan + * @date 2021/01/12 15:56 + */ +@Slf4j +public class SendFaceBatchTask2 implements Runnable { + + + CountDownLatch begin; + CountDownLatch end; + UserDao userDao; + SendRecordDao sendRecordDao; + SearchMapper searchMapper; + Integer schoolId; + Integer roomId; + Integer type; + Integer outof; + String intime; + String clintId; + String startTime; + String endTime; + + public SendFaceBatchTask2(UserDao userDao, SendRecordDao sendRecordDao, SearchMapper searchMapper, Integer schoolId, Integer roomId, + Integer type, Integer outof, String intime, String clintId, String startTime, String endTime, CountDownLatch begin, CountDownLatch end){ + this.begin=begin; + this.end=end; + this.userDao=userDao; + this.sendRecordDao=sendRecordDao; + this.searchMapper=searchMapper; + this.schoolId=schoolId; + this.roomId=roomId; + this.type= type; + this.outof=outof; + this.intime=intime; + this.clintId=clintId; + this.startTime=startTime; + this.endTime=endTime; + } + + @Override + public void run() { + try { + begin.await(); + int num= (int)(Math.random()*50)+150; + List studentIds = userDao.getStudentList(schoolId,1,null); + if(!CollectionUtils.isEmpty(studentIds)){ + System.out.println("总数:"+studentIds.size()); + for(int i=0;i<=studentIds.size();i++){ + if(i==num){ + return; + } + String cardNum = studentIds.get(i).getStudent_num(); + String userId = studentIds.get(i).getUser_id(); + String com = studentIds.get(i).getStudent_id(); + String classId = studentIds.get(i).getClass_id(); + String className = studentIds.get(i).getClass_name(); + String name= studentIds.get(i).getName(); + String mobile= studentIds.get(i).getParentMobile(); + String sex = String.valueOf(studentIds.get(i).getSex()); + String cid= UUID.randomUUID().toString().toUpperCase(); + int count = sendRecordDao.getKaoQin(schoolId,cardNum,type,outof,startTime,endTime);; + System.out.println("count: "+count); + System.out.println("cardNum "+cardNum); + if(count ==0){ + intime = DateFormatUtil.getDateAdd(intime); + searchMapper.insert(userId,String.valueOf(schoolId),com,cardNum,type,outof,intime,cid,classId,clintId,name,mobile,className,sex,intime); + i++; + } + } + } + }catch (Exception e){ + log.error("异常,信息:",e); + }finally { + end.countDown(); + } + } + + public static void main(String[] args) { + for(int i=1;i<20;i++){ + int num= (int)(Math.random()*50)+150; +// int num= (int)(Math.random()*20)+30; + System.out.println(num); + } + } + +} 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 351a2e5..34824cd 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 @@ -247,7 +247,7 @@ public class SendUserInfoTask2 { if (!StringUtils.isEmpty(deviceId)) { sendRecordBean.setFailType(EnumSendFaceType.FACE_AND_CARD_FAIL.code); sendRecordBean.setFailContent(EnumSendFaceType.NOT_ONLINE_DEVICE.message); - baseService.sendFailRecord(sendRecordBean); + baseService.sendFailRecord(sendRecordBean,channel); } } else { log.info("=================开始执行下发人脸及卡号任务================="); @@ -311,7 +311,7 @@ public class SendUserInfoTask2 { FileUtils.getInstance().writeLogs("下发人脸和卡号成功:" + cardNum + " " + attendanceBean.getClint_id(), FileUtils.sendUserSucTxt); log.info("下发人脸和卡号成功, sendRecordBean: "+ JSON.toJSONString(sendRecordBean)); //保存成功记录 - baseService.sendSuccessRecord(sendRecordBean); + baseService.sendSuccessRecord(sendRecordBean,channel); } /** * 人脸和卡都下发失败 @@ -323,7 +323,7 @@ public class SendUserInfoTask2 { String failContent = analysisErrorMsg(bUserFlags,bFaceFalgs,bCardFlags); sendRecordBean.setFailType(EnumSendFaceType.FACE_AND_CARD_FAIL.code); sendRecordBean.setFailContent(failContent); - baseService.sendFailRecord(sendRecordBean); + baseService.sendFailRecord(sendRecordBean,channel); } /** * 下发卡号成功,下发人脸失败, @@ -335,7 +335,7 @@ public class SendUserInfoTask2 { String failContent = analysisErrorMsg(bUserFlags,bFaceFalgs,bCardFlags); sendRecordBean.setFailType(EnumSendFaceType.FACE_FAIL_CARD_SUCCESS.code); sendRecordBean.setFailContent(failContent); - baseService.sendFailRecord(sendRecordBean); + baseService.sendFailRecord(sendRecordBean,channel); } /** * 下发卡号失败,下发人脸成功, @@ -346,7 +346,7 @@ public class SendUserInfoTask2 { String failContent = analysisErrorMsg(bUserFlags,bFaceFalgs,bCardFlags); sendRecordBean.setFailType(EnumSendFaceType.FACE_SUCCESS_CARD_FAIl.code); sendRecordBean.setFailContent(failContent); - baseService.sendFailRecord(sendRecordBean); + baseService.sendFailRecord(sendRecordBean,channel); } } } @@ -575,10 +575,10 @@ public class SendUserInfoTask2 { String typeName =""; if(userType ==1){ typeName= "Teacher"; - studentBean = userDao.getTeacherWithCard(recordBean.getNum()); + studentBean = userDao.getTeacherWithCard(recordBean.getNum(),schoolId); }else{ typeName= "Student"; - studentBean= userDao.getStudentWithCard(recordBean.getNum()); + studentBean= userDao.getStudentWithCard(recordBean.getNum(),schoolId); } if(studentBean==null){ continue; @@ -629,7 +629,7 @@ public class SendUserInfoTask2 { log.error("设备不在线"); return false; } - StudentBean studentBean = userDao.getStudentWithCard(cardNum); + StudentBean studentBean = userDao.getStudentWithCard(cardNum,schoolId); if(studentBean == null){ log.error("此卡号:{},未查询到相应学生信息。",cardNum); return false; diff --git a/cloud/dahua/src/main/java/com/example/dahua/bean/StudentBean.java b/cloud/dahua/src/main/java/com/example/dahua/bean/StudentBean.java index f243bf1..4882bab 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/bean/StudentBean.java +++ b/cloud/dahua/src/main/java/com/example/dahua/bean/StudentBean.java @@ -61,6 +61,16 @@ public class StudentBean implements Serializable { private String num; + private String ParentMobile; + + public String getParentMobile() { + return ParentMobile; + } + + public void setParentMobile(String parentMobile) { + ParentMobile = parentMobile; + } + public String getNum() { return num; } 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 e7ad18a..36f9a65 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 @@ -22,6 +22,10 @@ public class UserInfoBean implements Serializable { private String class_id; + private String sex; + + private String parentMobile; + public String getClass_id() { return class_id; } @@ -94,6 +98,22 @@ public class UserInfoBean implements Serializable { this.student_id = student_id; } + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getParentMobile() { + return parentMobile; + } + + public void setParentMobile(String parentMobile) { + this.parentMobile = parentMobile; + } + @Override public String toString() { return "UserInfoBean{" + diff --git a/cloud/dahua/src/main/java/com/example/dahua/control/UserControl.java b/cloud/dahua/src/main/java/com/example/dahua/control/UserControl.java index 88d7f23..07c2323 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/control/UserControl.java +++ b/cloud/dahua/src/main/java/com/example/dahua/control/UserControl.java @@ -9,8 +9,8 @@ import com.example.dahua.dao.UserDao; import com.example.dahua.enums.EnumSzBusinessType; import com.example.dahua.lib.CompressPic; import com.example.dahua.lib.FilePath; -import com.example.dahua.service.DeleteBatchTest; import com.example.dahua.service.UserService; +import com.example.dahua.service.imp.BaseService; import com.example.dahua.utils.*; import com.example.dahua.xiananDao.SendRecordDao; import io.swagger.annotations.Api; @@ -54,6 +54,9 @@ public class UserControl { @Autowired UserDao userDao; + @Autowired + BaseService baseService; + /** * 权限下发至设备 @@ -280,17 +283,15 @@ public class UserControl { boolean check = BaiduUtils.getBaiduUtils().checkImg(httpurl); //获取文件名 - File file1 = new File(httpurl); - File target = new File("./huoti/"); - //压缩后的文件 - httpurl = target.getAbsolutePath() + "/"+ file1.getName(); +// File file1 = new File(httpurl); +// File target = new File("./huoti/"); +// //压缩后的文件 +// httpurl = target.getAbsolutePath() + "/"+ file1.getName(); + System.out.println("人脸图片路径:"+httpurl); if (check) { File file = new File(httpurl); - String userCode = file.getName().split("\\.")[0]; - - String schoolId = "864"; - + String schoolId = ""; if (httpurl.contains("Student") && !httpurl.startsWith("http")) { schoolId = httpurl.substring(httpurl.indexOf("School") + 6, httpurl.indexOf("\\Student")); } else if (httpurl.contains("Teacher") && !httpurl.startsWith("http")) { @@ -303,11 +304,43 @@ public class UserControl { FileUtils.getInstance().writeLogs("人脸添加成功:" + userId, "人脸添加成功.txt"); } } - return check; + } + @RequestMapping(value = "delBaiDuFace", method = RequestMethod.GET) + @ApiOperation("在线活体检测") + public void delBaiDuFace(@RequestParam("schoolId") String schoolId,@RequestParam("userId") String userId) { + BaiduUtils.getBaiduUtils().delFace(schoolId,userId); } + @RequestMapping(value = "updateBaiDuFace", method = RequestMethod.GET) + @ApiOperation("在线活体检测") + public boolean updateBaiDuFace(@RequestParam("url") String httpurl) { + boolean check = BaiduUtils.getBaiduUtils().checkImg(httpurl); + //获取文件名 +// File file1 = new File(httpurl); +// File target = new File("./huoti/"); +// //压缩后的文件 +// httpurl = target.getAbsolutePath() + "/"+ file1.getName(); + System.out.println("人脸图片路径:"+httpurl); + if (check) { + File file = new File(httpurl); + String userCode = file.getName().split("\\.")[0]; + String schoolId = ""; + if (httpurl.contains("Student") && !httpurl.startsWith("http")) { + schoolId = httpurl.substring(httpurl.indexOf("School") + 6, httpurl.indexOf("\\Student")); + } else if (httpurl.contains("Teacher") && !httpurl.startsWith("http")) { + schoolId = httpurl.substring(httpurl.indexOf("School") + 6, httpurl.indexOf("\\Teacher")); + } + System.out.println("choolId:" + schoolId + "userCode:" + userCode); + if (!StringUtils.isEmpty(schoolId) && !StringUtils.isEmpty(userCode)) { + String userId = userService.getUserId(userCode, schoolId); + BaiduUtils.getBaiduUtils().updateFace(new File(httpurl), schoolId, userId, userId); + FileUtils.getInstance().writeLogs("人脸添加成功:" + userId, "人脸添加成功.txt"); + } + } + return check; + } @RequestMapping(value = "jpg2png", method = RequestMethod.GET) @ApiOperation("jpg图片转png") @@ -336,9 +369,7 @@ public class UserControl { } } - return true; - } @RequestMapping(value = "imgsSend", method = RequestMethod.GET) diff --git a/cloud/dahua/src/main/java/com/example/dahua/control/UserOperateController.java b/cloud/dahua/src/main/java/com/example/dahua/control/UserOperateController.java index 5d41759..2be2017 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/control/UserOperateController.java +++ b/cloud/dahua/src/main/java/com/example/dahua/control/UserOperateController.java @@ -1,16 +1,25 @@ package com.example.dahua.control; import com.example.dahua.async.SendUserInfoTask2; -import com.example.dahua.bean.SendFaceDto; +import com.example.dahua.bean.StudentBean; import com.example.dahua.dao.UserDao; import com.example.dahua.service.UserOperateService; +import com.example.dahua.service.imp.BaseService; +import com.example.dahua.utils.HttpUtil; import com.example.dahua.utils.HttpUtils; +import io.micrometer.core.instrument.util.StringUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; /** * 用户信息、人脸、卡信息、权限下发控制类 @@ -32,16 +41,22 @@ public class UserOperateController { @Autowired UserOperateService userOperateService; + @Autowired + BaseService baseService; + @RequestMapping(value = "clearAllFace", method = RequestMethod.POST) @ApiOperation(value = "21服务器清空指定学校,指定设备下所有人脸2.0") - public boolean clearAllFace(@RequestParam("schoolId") Integer schoolId, @RequestParam("deviceId") String deviceId) { + public boolean clearAllFace(@RequestParam("schoolId") Integer schoolId, @RequestParam(value = "deviceId",required = false) String deviceId) { return sendUserInfoTask.clearAllFace(schoolId,deviceId); } - @RequestMapping(value = "sendUserFaces", method = RequestMethod.POST) + @RequestMapping(value = "sendUserFaces", method = RequestMethod.GET) @ApiOperation(value = "100服务器下发学校下所有人脸给指定设备2.0") - public void sendUserFaces(@RequestBody SendFaceDto sendFaceDto) { - userOperateService.sendUserFaces(sendFaceDto); + public void sendUserFaces(@RequestParam("schoolId") Integer schoolId,@RequestParam("userType") Integer userType, + @RequestParam(value = "studentType",required = false) Integer studentType, + @RequestParam(value = "sex",required = false) String sex, + @RequestParam(value = "deviceIds",required = false) String deviceIds) { + userOperateService.sendUserFaces(schoolId,userType,deviceIds,studentType,sex); } @RequestMapping(value = "deleteFailFace100", method = RequestMethod.POST) @@ -68,5 +83,4 @@ public class UserOperateController { public boolean deleteFaceByCard(Integer schoolId,String cardNum,String deviceId) { return sendUserInfoTask.deleteFaceByCard(schoolId,cardNum,deviceId); } - } 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 1ec61ee..4f7f1cf 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 @@ -89,7 +89,7 @@ public interface UserDao { @Select(" select studentcode from SZ_V_School_Student where student_id = #{customerid}") String getStudentCode(@Param("customerid") String customerid); - @Select(" select * from SZ_V_School_Student where student_id = #{student_id}") + @Select(" select top 1* from SZ_V_School_Student where student_id = #{student_id}") UserInfoBean getStudentWithid(@Param("student_id") String student_id); @Select(" select * from SZ_V_School_Student where student_num = #{student_num} and name = #{name}") @@ -136,6 +136,9 @@ public interface UserDao { @Select("select Top(1) PlaceId from XA_PlaceAttendance where KaoQinAttendance = #{qiandaoDevId}") String getPlaceIdWithKaoqinDevid(@Param("qiandaoDevId") String qiandaoDevId); + @Select("select Top(1) PlaceId from XA_PlaceAttendance where KanBanAttendance = #{kanBanDevId}") + String getPlaceIdWithKanBanDevid(@Param("kanBanDevId") String kanBanDevId); + @Select("select KanBanAttendance from XA_PlaceAttendance where PlaceId = #{PlaceId} and (len(KanBanAttendance)>0 and KanBanAttendance is not null )") List getKanBanIdWithPlaceId(@Param("PlaceId") String placeId); @@ -251,12 +254,11 @@ public interface UserDao { /*************************************** 仅供测试,下发失败使用接口 end ************************************/ + @Select("select Top(1)* from SZ_V_School_Student where student_num = #{card} and school_id = #{schoolId}") + StudentBean getStudentWithCard(@Param("card") String card,@Param("schoolId") Integer schoolId); - @Select("select Top(1)* from SZ_V_School_Teacher where teacher_num = #{teacher_num}") - StudentBean getTeacherWithCard(@Param("teacher_num") String teacher_num); - - @Select("select Top(1)* from SZ_V_School_Student where student_num = #{card}") - StudentBean getStudentWithCard(@Param("card") String card); + @Select("select Top(1)* from SZ_V_School_Teacher where teacher_num = #{teacher_num} and school_id = #{schoolId}") + StudentBean getTeacherWithCard(@Param("teacher_num") String teacher_num,@Param("schoolId") Integer schoolId); List getStudentList(@Param("schoolId") Integer schoolId,@Param("studentType")Integer studentType,@Param("sex") List sex); @@ -266,4 +268,7 @@ public interface UserDao { List queryClintList(@Param("schoolId") Integer schoolId,@Param("deviceId")String deviceId); + List queryStudentIdList(@Param("schoolId") Integer schoolId,@Param("roomId")Integer roomId); + + } diff --git a/cloud/dahua/src/main/java/com/example/dahua/filter/AllowOriginFilter.java b/cloud/dahua/src/main/java/com/example/dahua/filter/AllowOriginFilter.java index 53682f3..e6ff7ea 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/filter/AllowOriginFilter.java +++ b/cloud/dahua/src/main/java/com/example/dahua/filter/AllowOriginFilter.java @@ -1,33 +1,33 @@ -package com.example.dahua.filter; - -import org.springframework.stereotype.Component; - -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * 用于解决跨域问题 - */ -@Component -@WebFilter(urlPatterns = "/*", filterName = "authFilter") -public class AllowOriginFilter implements Filter { - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - - public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { - HttpServletResponse response = (HttpServletResponse) res; - response.setHeader("Access-Control-Allow-Origin", "*"); - response.setHeader("Access-Control-Allow-Methods", "*"); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Allow-Headers","*"); - chain.doFilter(req, res); - } - - @Override - public void destroy() { - } -} +//package com.example.dahua.filter; +// +//import org.springframework.stereotype.Component; +// +//import javax.servlet.*; +//import javax.servlet.annotation.WebFilter; +//import javax.servlet.http.HttpServletResponse; +//import java.io.IOException; +// +/////** +//// * 用于解决跨域问题 +//// */ +////@Component +////@WebFilter(urlPatterns = "/*", filterName = "authFilter") +////public class AllowOriginFilter implements Filter { +//// +//// @Override +//// public void init(FilterConfig filterConfig) throws ServletException { +//// } +//// +//// public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { +//// HttpServletResponse response = (HttpServletResponse) res; +//// response.setHeader("Access-Control-Allow-Origin", "*"); +//// response.setHeader("Access-Control-Allow-Methods", "*"); +//// response.setHeader("Access-Control-Allow-Credentials", "true"); +//// response.setHeader("Access-Control-Allow-Headers","*"); +//// chain.doFilter(req, res); +//// } +//// +//// @Override +//// public void destroy() { +//// } +////} diff --git a/cloud/dahua/src/main/java/com/example/dahua/service/AttendanceService.java b/cloud/dahua/src/main/java/com/example/dahua/service/AttendanceService.java index 26c6e45..e8ee6ba 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/service/AttendanceService.java +++ b/cloud/dahua/src/main/java/com/example/dahua/service/AttendanceService.java @@ -9,8 +9,7 @@ public interface AttendanceService { * * @return */ - public int insert(String clint_id, String clint_type, String ip, String port, String intime, String school_id, - String state); + public int insert(String clint_id, String clint_type, String ip, String port, String intime, String school_id,int state,int status); /** * 更新联网状态 diff --git a/cloud/dahua/src/main/java/com/example/dahua/service/DeleteBatchTest.java b/cloud/dahua/src/main/java/com/example/dahua/service/DeleteBatchTest.java index 708742f..81209e3 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/service/DeleteBatchTest.java +++ b/cloud/dahua/src/main/java/com/example/dahua/service/DeleteBatchTest.java @@ -12,7 +12,13 @@ public interface DeleteBatchTest { void test(String schoolId); void test2(String schoolId); void test3(String schoolId); - void test4(Integer schoolId,Integer studentType,String sex); + void test5(String cardNum,String intime,String sysTime,String clintId); + + void test6(Integer schoolId,Integer roomId,Integer type,Integer outof,String intime,String clintId,String startTime,String endTime); + + void test7(Integer schoolId,Integer roomId,Integer type,Integer outof,String intime,String clintId,String startTime,String endTime); + + void test8(Integer schoolId,Integer roomId,Integer type,Integer outof,String startTime,String endTime,int size); } diff --git a/cloud/dahua/src/main/java/com/example/dahua/service/UserOperateService.java b/cloud/dahua/src/main/java/com/example/dahua/service/UserOperateService.java index 70ac1ec..7138786 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/service/UserOperateService.java +++ b/cloud/dahua/src/main/java/com/example/dahua/service/UserOperateService.java @@ -1,6 +1,5 @@ package com.example.dahua.service; -import com.example.dahua.bean.SendFaceDto; /** * 下发用户信息、人脸、卡、权限接口 @@ -11,8 +10,8 @@ public interface UserOperateService { /** * 照片下发 - * @param sendFaceDto */ - void sendUserFaces(SendFaceDto sendFaceDto); + void sendUserFaces(Integer schoolId,Integer userType,String deviceIds,Integer studentType,String sex); + void test6(Integer schoolId,Integer roomId,Integer type,Integer outof,String intime,String clintId,String startTime,String endTime); } diff --git a/cloud/dahua/src/main/java/com/example/dahua/service/imp/AttendanceImp.java b/cloud/dahua/src/main/java/com/example/dahua/service/imp/AttendanceImp.java index 58347f8..92d390d 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/service/imp/AttendanceImp.java +++ b/cloud/dahua/src/main/java/com/example/dahua/service/imp/AttendanceImp.java @@ -16,15 +16,15 @@ public class AttendanceImp implements AttendanceService { JdbcTemplate jdbcTemplate; @Override - public int insert(String clint_id, String clint_type, String ip, String port, String intime, String school_id, String state) { + public int insert(String clint_id, String clint_type, String ip, String port, String intime, String school_id, int state,int status) { try { String selectSql = String.format("select * from SZ_Attendance where clint_id =\'%s\'", clint_id); List attendanceBeans = jdbcTemplate.query(selectSql, new Object[]{}, new BeanPropertyRowMapper(AttendanceBean.class)); if (attendanceBeans.size() == 0) {//设备不存在 - String insertSql = String.format("insert into SZ_Attendance(clint_id, clint_type, ip, port, intime, school_id, state,isConnection) values ('%s','%s','%s','%s','%s','%s','%s','%s')", clint_id, clint_type, ip, port, intime, school_id, state, 1); + String insertSql = String.format("insert into SZ_Attendance(clint_id, clint_type, ip, port, intime, school_id, state,isConnection) values ('%s','%s','%s','%s','%s','%s','%s','%s')", clint_id, clint_type, ip, port, intime, school_id, state,status); return jdbcTemplate.update(insertSql); } else {//设备 已经存在,更新在线状态 - updateConnectStateWithDevid(1,intime, clint_id); + updateConnectStateWithDevid(status,intime, clint_id); } } catch (Exception e) { e.printStackTrace(); @@ -45,7 +45,6 @@ public class AttendanceImp implements AttendanceService { try { String updateSql = String.format(" update SZ_Attendance set isConnection = %d where ip = '%s' and port = '%s' ", isConnection, ip, port); index = jdbcTemplate.update(updateSql); -// System.out.println("updateIndex:"+index+" isConnection:"+isConnection+"updateSql:"+updateSql); } catch (Exception e) { e.printStackTrace(); } @@ -59,7 +58,6 @@ public class AttendanceImp implements AttendanceService { try { String updateSql = String.format(" update SZ_Attendance set isConnection = %d,inTime='%s' where clint_id = '%s' ", isConnection,inTime,clint_id); index = jdbcTemplate.update(updateSql); -// System.out.println("updateIndex:"+index+" isConnection:"+isConnection+"updateSql:"+updateSql); } catch (Exception e) { e.printStackTrace(); } diff --git a/cloud/dahua/src/main/java/com/example/dahua/service/imp/BaseService.java b/cloud/dahua/src/main/java/com/example/dahua/service/imp/BaseService.java index e2c3d02..2ad2764 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/service/imp/BaseService.java +++ b/cloud/dahua/src/main/java/com/example/dahua/service/imp/BaseService.java @@ -67,7 +67,7 @@ public class BaseService { /** * 保存成功下发记录 */ - public synchronized void sendSuccessRecord(SendRecordBean recordBean) { + public synchronized void sendSuccessRecord(SendRecordBean recordBean,String channel) { try{ String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); Integer schoolId = recordBean.getSchoolId(); @@ -86,9 +86,9 @@ public class BaseService { } if (null == sendRecordBean) { sendRecordDao.saveFaceRecord(userId, deviceId, resultCard, userName, time, schoolName, - faceUrl, schoolId,null,null, userType,deviceType,1); + faceUrl, schoolId,null,null, userType,deviceType,1,channel); } else { - sendRecordDao.updateFaceSuccessRecord(deviceId, resultCard, time, faceUrl, userName, userId); + sendRecordDao.updateFaceSuccessRecord(deviceId, resultCard, time, faceUrl, userName, userId,channel); } }catch (Exception e){ log.error("保存成功记录失败。"); @@ -100,7 +100,7 @@ public class BaseService { /** * 保存下发失败记录 */ - public synchronized void sendFailRecord(SendRecordBean recordBean) { + public synchronized void sendFailRecord(SendRecordBean recordBean,String channel) { try{ String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); Integer schoolId = recordBean.getSchoolId(); @@ -121,7 +121,7 @@ public class BaseService { } if (null == sendRecordBean) { sendRecordDao.saveFaceRecord(userId, deviceId, resultCard, userName, time, schoolName, - faceUrl, schoolId,failContent,failType, userType,deviceType,2); + faceUrl, schoolId,failContent,failType, userType,deviceType,2,channel); }else { sendRecordDao.updateFaceFailRecord(deviceId,faceUrl,resultCard,time,failContent,userId); } diff --git a/cloud/dahua/src/main/java/com/example/dahua/service/imp/DeleteBatchTestImpl.java b/cloud/dahua/src/main/java/com/example/dahua/service/imp/DeleteBatchTestImpl.java index 568edec..e31a13e 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/service/imp/DeleteBatchTestImpl.java +++ b/cloud/dahua/src/main/java/com/example/dahua/service/imp/DeleteBatchTestImpl.java @@ -5,12 +5,16 @@ import com.example.dahua.bean.StudentBean; import com.example.dahua.bean.UserInfoBean; import com.example.dahua.dao.UserDao; import com.example.dahua.service.DeleteBatchTest; +import com.example.dahua.utils.DateFormatUtil; +import com.example.dahua.xiananDao.SearchMapper; import com.example.dahua.xiananDao.SendRecordDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.security.Provider; import java.util.*; import java.util.stream.Collectors; @@ -30,6 +34,8 @@ public class DeleteBatchTestImpl implements DeleteBatchTest { private SendRecordDao sendRecordDao; @Autowired private BaseService baseService; + @Autowired + private SearchMapper searchMapper; @Override @@ -125,4 +131,101 @@ public class DeleteBatchTestImpl implements DeleteBatchTest { } } + @Override + public void test5(String cardNum,String intime,String sysTime,String clintId) { + StudentBean studentBean = userDao.getStudentWithCard(cardNum,null); + String userId = studentBean.getUser_id(); + String com = studentBean.getStudent_id(); + String classId = studentBean.getClass_id(); + String className = studentBean.getClass_name(); + String name= studentBean.getName(); + String mobile= studentBean.getParentMobile(); + String sex = String.valueOf(studentBean.getSex()); + String cid= UUID.randomUUID().toString().toUpperCase(); +// searchMapper.insert(userId,"27",com,cardNum,intime,cid,classId,clintId,name,mobile,className,sex,sysTime); + } + + + @Override + public void test6(Integer schoolId,Integer roomId,Integer type,Integer outof,String intime,String clintId,String startTime,String endTime) { + List studentIds = userDao.queryStudentIdList(schoolId,roomId); + if(!CollectionUtils.isEmpty(studentIds)){ + System.out.println("总数:"+studentIds.size()); + int i =0; + for(String studentId : studentIds){ + UserInfoBean userInfoBean = userDao.getStudentWithid(studentId); + if(userInfoBean!=null){ + if(i== 1168){ + return; + } + String cardNum = userInfoBean.getStudent_num(); + String userId = userInfoBean.getUser_id(); + String com = userInfoBean.getStudent_id(); + String classId = userInfoBean.getClass_id(); + String className = userInfoBean.getClass_name(); + String name= userInfoBean.getName(); + String mobile= userInfoBean.getParentMobile(); + String sex = String.valueOf(userInfoBean.getSex()); + String cid= UUID.randomUUID().toString().toUpperCase(); + int count = sendRecordDao.getSSKaoQin(schoolId,cardNum,type,outof,startTime,endTime); + System.out.println("count: "+count); + System.out.println(cardNum); + if(count ==0){ + intime = DateFormatUtil.getDateAdd(intime); + searchMapper.insertSS(userId,String.valueOf(schoolId),com,cardNum,type,outof,intime,cid,classId,clintId,name,mobile,className,sex,intime); + System.out.println(i); + i++; + } + } + } + } + } + + @Override + public void test7(Integer schoolId,Integer roomId,Integer type,Integer outof,String intime,String clintId,String startTime,String endTime) { + List studentIds = userDao.getStudentList(schoolId,1,null); + int num= (int)Math.random()*40+160; + if(!CollectionUtils.isEmpty(studentIds)){ + System.out.println("总数:"+studentIds.size()); + for(int i=0;i<=studentIds.size();i++){ + if(i==num){ + return; + } + String cardNum = studentIds.get(i).getStudent_num(); + String userId = studentIds.get(i).getUser_id(); + String com = studentIds.get(i).getStudent_id(); + String classId = studentIds.get(i).getClass_id(); + String className = studentIds.get(i).getClass_name(); + String name= studentIds.get(i).getName(); + String mobile= studentIds.get(i).getParentMobile(); + String sex = String.valueOf(studentIds.get(i).getSex()); + String cid= UUID.randomUUID().toString().toUpperCase(); + int count = sendRecordDao.getKaoQin(schoolId,cardNum,type,outof,startTime,endTime); + System.out.println("count: "+count); + System.out.println(cardNum); + if(count ==0){ + intime = DateFormatUtil.getDateAdd(intime); + searchMapper.insert(userId,String.valueOf(schoolId),com,cardNum,type,outof,intime,cid,classId,clintId,name,mobile,className,sex,intime); + System.out.println(i); + } + } + } + } + + @Override + public void test8(Integer schoolId,Integer roomId,Integer type,Integer outof,String startTime,String endTime,int size) { + List studentIds = userDao.queryStudentIdList(schoolId,roomId); + if(!CollectionUtils.isEmpty(studentIds)){ + for(int i=0;i<=studentIds.size();i++){ + UserInfoBean userInfoBean = userDao.getStudentWithid(studentIds.get(i)); + System.out.println(i); + if(userInfoBean!=null){ + String cardNum = userInfoBean.getStudent_num(); + System.out.println(i); + sendRecordDao.deleteSS(schoolId,cardNum,type,outof,startTime,endTime); + } + } + } + } + } diff --git a/cloud/dahua/src/main/java/com/example/dahua/service/imp/UserOperateServiceImpl.java b/cloud/dahua/src/main/java/com/example/dahua/service/imp/UserOperateServiceImpl.java index cd8186a..f530b1a 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/service/imp/UserOperateServiceImpl.java +++ b/cloud/dahua/src/main/java/com/example/dahua/service/imp/UserOperateServiceImpl.java @@ -1,21 +1,26 @@ package com.example.dahua.service.imp; -import com.example.dahua.bean.SendFaceDto; import com.example.dahua.bean.StudentBean; +import com.example.dahua.bean.UserInfoBean; import com.example.dahua.dao.UserDao; import com.example.dahua.lib.CompressPic; import com.example.dahua.lib.FilePath; import com.example.dahua.service.UserOperateService; +import com.example.dahua.utils.DateFormatUtil; import com.example.dahua.utils.HttpUtils; +import com.example.dahua.xiananDao.SearchMapper; +import com.example.dahua.xiananDao.SendRecordDao; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.UUID; /** * 下发用户信息、人脸、卡、权限接口实现类 @@ -30,52 +35,55 @@ public class UserOperateServiceImpl implements UserOperateService { private UserDao userDao; @Autowired private BaseService baseService; + @Autowired + private SendRecordDao sendRecordDao; + @Autowired + private SearchMapper searchMapper; @Override - public void sendUserFaces(SendFaceDto sendFaceDto) { - Integer schoolId = sendFaceDto.getSchoolId(); - Integer studentType = sendFaceDto.getStudentType(); - Integer type = sendFaceDto.getType(); - String sex = sendFaceDto.getSex(); + public void sendUserFaces(Integer schoolId,Integer userType,String deviceIds,Integer studentType,String sex) { //下发设备集合 - String[] deviceArr = sendFaceDto.getsNos().split(","); + String[] deviceArr = deviceIds.split(","); List deviceList= new ArrayList<>(Arrays.asList(deviceArr)); if(deviceList.size()<1){ log.error("未选择下发设备"); return; } - Integer userType=null; //根据类型获取下发用户信息、文件名目录 String typeName=""; List studentBeanList = null; - if(type.intValue() == 0 || type.intValue()==1){ - userType = 2; + if(userType.intValue()==2){ typeName= "Student"; studentBeanList = baseService.getStudentList(schoolId,studentType,sex); }else{ - userType = 1; typeName= "Teacher"; studentBeanList = baseService.getTeacherList(schoolId); } + log.info("下发用户总数:"+studentBeanList.size()); for(StudentBean studentBean : studentBeanList){ try{ - //100服务器文件目录绝对路径 - String path = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; String photo= userType.intValue()==1?studentBean.getFace():studentBean.getPhoto(); + //以学籍号为名的文件名 + String fileName = photo.split(typeName +"/")[1]; //学籍号 String studentCode=userType.intValue()==1?studentBean.getNum():studentBean.getStudentcode(); if (StringUtils.isEmpty(photo) || StringUtils.isEmpty(studentCode)){ continue; } String filePath=""; + //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\\"; if(photo.indexOf("f0i5l7e5")!=-1){ String afterStr = photo.split("f0i5l7e5/")[1].replace("/","\\"); - filePath="E:\\wwwhtdocs\\SmartCampus\\f0i5l7e5\\" + afterStr; - } else{ - //以学籍号为名的文件名 - String fileName = photo.split(typeName +"/")[1]; - //100服务器上人脸照绝对路径 - filePath = path+ "\\" + fileName; + filePath= path_3 + afterStr; + } + if(photo.indexOf("face17e5")!=-1){ + filePath = path_2 + "\\" + fileName; + } + if(photo.indexOf("face17e50")!=-1){ + filePath = path_1 + "\\" + fileName; } log.info("学籍号:{},人脸路径:{}, ",studentCode,filePath); //100服务人脸照图片路径 @@ -112,4 +120,33 @@ public class UserOperateServiceImpl implements UserOperateService { // System.out.println(photo.split("f0i5l7e5/")[0]); } + @Override + public void test6(Integer schoolId, Integer roomId, Integer type, Integer outof, String intime, String clintId, String startTime, String endTime) { + List studentIds = userDao.queryStudentIdList(schoolId,roomId); + if(!CollectionUtils.isEmpty(studentIds)){ + System.out.println("总数:"+studentIds.size()); + int i =0; + for(String studentId : studentIds){ + UserInfoBean userInfoBean = userDao.getStudentWithid(studentId); + if(userInfoBean!=null){ + String cardNum = userInfoBean.getStudent_num(); + String userId = userInfoBean.getUser_id(); + String com = userInfoBean.getStudent_id(); + String classId = userInfoBean.getClass_id(); + String className = userInfoBean.getClass_name(); + String name= userInfoBean.getName(); + String mobile= userInfoBean.getParentMobile(); + String sex = String.valueOf(userInfoBean.getSex()); + String cid= UUID.randomUUID().toString().toUpperCase(); + int count = sendRecordDao.getSSKaoQin(schoolId,cardNum,type,outof,startTime,endTime); + System.out.println("count: "+count); + if(count ==0){ + intime = DateFormatUtil.getDateAdd(intime); + searchMapper.insertSS(userId,String.valueOf(schoolId),com,cardNum,type,outof,intime,cid,classId,clintId,name,mobile,className,sex,intime); + i++; + } + } + } + } + } } diff --git a/cloud/dahua/src/main/java/com/example/dahua/utils/BaiduUtils.java b/cloud/dahua/src/main/java/com/example/dahua/utils/BaiduUtils.java index d183f66..f7fdf01 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/utils/BaiduUtils.java +++ b/cloud/dahua/src/main/java/com/example/dahua/utils/BaiduUtils.java @@ -49,8 +49,6 @@ public class BaiduUtils { } map.put("image", httpurl); map.put("image_type", image_type); -// map.put("face_field",""); -// map.put("option","GATE"); list.add(map); String param = GsonUtils.toJson(list); // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 @@ -252,17 +250,6 @@ public class BaiduUtils { com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result); String error_msg = jsonObject.getString("error_msg"); if (error_msg.equals("SUCCESS")) { - -// com.alibaba.fastjson.JSONObject faceResult = jsonObject.getJSONObject("result"); - -// FacerecordBean facerecordBean = new FacerecordBean(); -// -// facerecordBean.setFace_token(faceResult.getString("face_token")); -// facerecordBean.setGroup_id(group_id); -// facerecordBean.setIntime(simpleDateFormat.format(new Date())); -// facerecordBean.setUser_id(user_id); -// -// facerecordService.addFacerecord(facerecordBean); return "注册成功"; } else { log.info("注册人脸失败,文件大小,size: "+ img.length()); @@ -275,6 +262,64 @@ public class BaiduUtils { return ""; } + //注册人脸 + public String updateFace(File img, String group_id, String user_id, String userInfo) { + + String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/update"; + try { + Map map = new HashMap<>(); + map.put("image", Base64Util.encode(InputStream2ByteArray(img.getAbsolutePath()))); + map.put("group_id", group_id); + map.put("user_id", user_id); + map.put("user_info", userInfo); + map.put("image_type", "BASE64"); + map.put("quality_control", "NORMAL"); + String param = GsonUtils.toJson(map); + + // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 + + String result = HttpUtil.post(url, getAuth(), "application/json", param); + System.out.println(result); + com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result); + String error_msg = jsonObject.getString("error_msg"); + if (error_msg.equals("SUCCESS")) { + return "更新成功"; + } else { + log.info("更新失败,文件大小,size: "+ img.length()); + return error_msg; + } + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + //注册人脸 + public String delFace(String group_id, String user_id) { + String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/face/delete"; + try { + Map map = new HashMap<>(); + map.put("group_id", group_id); + map.put("user_id", user_id); + String param = GsonUtils.toJson(map); + + // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 + String result = HttpUtil.post(url, getAuth(), "application/json", param); + System.out.println(result); + com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result); + String error_msg = jsonObject.getString("error_msg"); + if (error_msg.equals("SUCCESS")) { + return "注册成功"; + } else { + log.info("注册人脸失败"); + return error_msg; + } + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + private byte[] InputStream2ByteArray(String filePath) throws IOException { InputStream in = new FileInputStream(filePath); diff --git a/cloud/dahua/src/main/java/com/example/dahua/utils/DateFormatUtil.java b/cloud/dahua/src/main/java/com/example/dahua/utils/DateFormatUtil.java index 8777b65..20b249b 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/utils/DateFormatUtil.java +++ b/cloud/dahua/src/main/java/com/example/dahua/utils/DateFormatUtil.java @@ -43,16 +43,36 @@ public class DateFormatUtil { } /** + * 日期叠加计算,以月为单位:整数 + * @param date 起始时间 + * @return + */ + public static String getDateAdd(String date) { + Date date1 = stringFormatDate(date,"yyyy-MM-dd hh:mm:ss"); + Calendar cal = Calendar.getInstance(); + cal.setTime(date1);//设置起时间 + cal.add(Calendar.SECOND, 2); + String strDate = dateFormatString(cal.getTime(),"yyyy-MM-dd hh:mm:ss"); + return strDate; + } + + public static void main(String[] args) { + System.out.println(getDateAdd("2021-01-25 19:54:03")); + } + + /** * 日期叠加计算,以天为单位:整数 * @param length 叠加长度 * @param date 起始时间 * @return */ - public static Date getDateByTime(int length, Date date){ + public static String getDateByTime(String date){ + Date date1 = stringFormatDate(date,"yyyy-MM-dd hh:mm:ss"); Calendar cal = Calendar.getInstance(); - cal.setTime(date);//设置起时间 - cal.add(Calendar.DATE,length);//把日期往后增加 - return cal.getTime(); + cal.setTime(date1);//设置起时间 + cal.add(Calendar.DATE,1);//把日期往后增加 + String strDate = dateFormatString(cal.getTime(),"yyyy-MM-dd hh:mm:ss"); + return strDate; } /** diff --git a/cloud/dahua/src/main/java/com/example/dahua/xiananDao/SearchMapper.java b/cloud/dahua/src/main/java/com/example/dahua/xiananDao/SearchMapper.java index 6ae88d1..9f262ae 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/xiananDao/SearchMapper.java +++ b/cloud/dahua/src/main/java/com/example/dahua/xiananDao/SearchMapper.java @@ -10,4 +10,10 @@ public interface SearchMapper { */ void checkIn(CheckIn checkIn); + void insert(String user_id,String school_id,String customerId,String card_num,Integer card_type,Integer outof,String intime,String cid,String class_id,String attendance_id, + String name,String mobile,String class_name,String sex,String systime); + + void insertSS(String user_id,String school_id,String customerId,String card_num,Integer card_type,Integer outof,String intime,String cid,String class_id,String attendance_id, + String name,String mobile,String class_name,String sex,String systime); + } diff --git a/cloud/dahua/src/main/java/com/example/dahua/xiananDao/SendRecordDao.java b/cloud/dahua/src/main/java/com/example/dahua/xiananDao/SendRecordDao.java index c31ca5e..750cc42 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/xiananDao/SendRecordDao.java +++ b/cloud/dahua/src/main/java/com/example/dahua/xiananDao/SendRecordDao.java @@ -1,13 +1,13 @@ package com.example.dahua.xiananDao; -import com.example.dahua.bean.AttendanceRecords; -import com.example.dahua.bean.SendRecordBean; -import com.example.dahua.bean.StudentBean; -import com.example.dahua.bean.WGBean; -import org.apache.ibatis.annotations.*; -import org.springframework.stereotype.Repository; + import com.example.dahua.bean.AttendanceRecords; + import com.example.dahua.bean.SendRecordBean; + import com.example.dahua.bean.StudentBean; + import com.example.dahua.bean.WGBean; + import org.apache.ibatis.annotations.*; + import org.springframework.stereotype.Repository; -import java.util.List; + import java.util.List; /** * 人脸照片下发结果记录 @@ -106,19 +106,30 @@ public interface SendRecordDao { @Select("select * from Face_SendRecord where schoolId = #{schoolId} and deviceID = #{deviceID} and Num = #{Num} and userId = #{userId}") List getRecordIsExit(@Param("schoolId") Integer schoolId,@Param("deviceID") String deviceId, @Param("Num") String card,@Param("userId") String userId); - @Insert("insert into Face_SendRecord values(#{deviceID},#{userId},#{num},#{name},#{time},#{schoolName},#{imgPath},#{schoolId},#{failContent},#{failType},#{userType},#{deviceType},#{status})") - void saveFaceRecord(@Param("userId") String userId, @Param("deviceID") String deviceID, @Param("num") String num, @Param("name") String name, - @Param("time") String time, @Param("schoolName") String schoolName, @Param("imgPath") String imgPath, @Param("schoolId") Integer schoolId, @Param("failContent") String failContent, - @Param("failType") Integer failType, @Param("userType") Integer userType, @Param("deviceType") Integer deviceType,Integer status); + @Insert("insert into Face_SendRecord values(#{deviceID},#{userId},#{num},#{name},#{time},#{schoolName},#{imgPath},#{schoolId},#{failContent},#{failType},#{userType},#{deviceType},#{status},#{channel})") + void saveFaceRecord(@Param("userId") String userId, @Param("deviceID") String deviceID, @Param("num") String num, @Param("name") String name, @Param("time") String time, @Param("schoolName") String schoolName, + @Param("imgPath") String imgPath, @Param("schoolId") Integer schoolId, @Param("failContent") String failContent, @Param("failType") Integer failType, @Param("userType") Integer userType, + @Param("deviceType") Integer deviceType,@Param("status") Integer status,@Param("channel") String channel); @Update("update Face_SendRecord set time = #{time},failContent = #{content},imgPath= #{faceUrl},status = 2 where deviceID = #{deviceID} and Num =#{Num} and userId = #{userId}") void updateFaceFailRecord(@Param("deviceID") String deviceId, @Param("faceUrl") String faceUrl,@Param("Num") String card, @Param("time") String time, @Param("content") String content,@Param("userId") String userId); - @Update("update Face_SendRecord set time = #{time},imgPath= #{faceUrl},Name = #{Name},status = 1, failType=null, failContent = null where deviceID = #{deviceID} and Num = #{Num}") - void updateFaceSuccessRecord(@Param("deviceID") String deviceId, @Param("Num") String card, @Param("time") String time, @Param("faceUrl") String faceUrl, @Param("Name") String name, @Param("userId") String userId); + @Update("update Face_SendRecord set time = #{time},imgPath= #{faceUrl},Name = #{Name},status = 1,channel=#{channel},failType=null, failContent = null where deviceID = #{deviceID} and Num = #{Num}") + void updateFaceSuccessRecord(@Param("deviceID") String deviceId, @Param("Num") String card, @Param("time") String time, @Param("faceUrl") String faceUrl, @Param("Name") String name, @Param("userId") String userId,@Param("channel") String channel); @Select("select * from Face_SendRecord where schoolId = #{schoolId} and status =2") List getFailRecord(@Param("schoolId") Integer schoolId); + @Select("select count(*) from SZ_AttendanceRecordsSS202101 where school_id = #{schoolId} and card_num = #{cardNum} and card_type = #{cardType} and outof=#{outof} and intime > #{startTime} and intime < #{endTime} ") + int getSSKaoQin(@Param("schoolId") Integer schoolId,@Param("cardNum") String cardNum,@Param("cardType") Integer cardType,@Param("outof") Integer outof,@Param("startTime") String startTime,@Param("endTime") String endTime); + + @Select("select count(*) from SZ_AttendanceRecords202101 where school_id = #{schoolId} and card_num = #{cardNum} and card_type = #{cardType} and outof=#{outof} and intime > #{startTime} and intime < #{endTime} ") + int getKaoQin(@Param("schoolId") Integer schoolId,@Param("cardNum") String cardNum,@Param("cardType") Integer cardType,@Param("outof") Integer outof,@Param("startTime") String startTime,@Param("endTime") String endTime); + + @Delete("DELETE from SZ_AttendanceRecords202101 where school_id = #{schoolId} and card_Num = #{cardNum} and card_type = #{cardType} and outof=#{outof} and intime > #{startTime} and intime < #{endTime}") + void delete(@Param("schoolId") Integer schoolId,@Param("cardNum") String cardNum,@Param("cardType") Integer cardType,@Param("outof") Integer outof,@Param("startTime") String startTime,@Param("endTime") String endTime); + + @Delete("DELETE from SZ_AttendanceRecordsSS202101 where school_id = #{schoolId} and card_Num = #{cardNum} and card_type = #{cardType} and outof=#{outof} and intime > #{startTime} and intime < #{endTime}") + void deleteSS(@Param("schoolId") Integer schoolId,@Param("cardNum") String cardNum,@Param("cardType") Integer cardType,@Param("outof") Integer outof,@Param("startTime") String startTime,@Param("endTime") String endTime); } diff --git a/cloud/dahua/src/main/resources/logback-spring.xml b/cloud/dahua/src/main/resources/logback-spring.xml index 58f34e3..fdeee89 100644 --- a/cloud/dahua/src/main/resources/logback-spring.xml +++ b/cloud/dahua/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - + diff --git a/cloud/dahua/src/main/resources/mapper/usermapper.xml b/cloud/dahua/src/main/resources/mapper/usermapper.xml index 06cd53c..f7c3646 100644 --- a/cloud/dahua/src/main/resources/mapper/usermapper.xml +++ b/cloud/dahua/src/main/resources/mapper/usermapper.xml @@ -20,7 +20,7 @@ #{item} - and (student_num is not null or student_num != '') and (photo is not null or photo !='') + and (student_num is not null or student_num != '') and (photo is not null or photo !='') order by newid() + + \ No newline at end of file diff --git a/cloud/dahua/src/main/resources/xiaoanmapper/SearchMapper.xml b/cloud/dahua/src/main/resources/xiaoanmapper/SearchMapper.xml index cb4418f..7aa2eb8 100644 --- a/cloud/dahua/src/main/resources/xiaoanmapper/SearchMapper.xml +++ b/cloud/dahua/src/main/resources/xiaoanmapper/SearchMapper.xml @@ -15,4 +15,62 @@ )} + + INSERT INTO SZ_AttendanceRecords202101 ( + [user_id], + [school_id], + [customerId], + [usertype], + [card_num], + [card_type], + [outof], + [intime], + [cid], + [func_no], + [head_image], + [class_id], + [expression], + [attendance_id], + [name], + [mobile], + [class_name], + [sex], + [student_type], + [systime] + ) + VALUES + ( + #{user_id},#{school_id},#{customerId},2,#{card_num},#{card_type},#{outof}, #{intime}, #{cid},8,null,#{class_id},null,#{attendance_id},#{name},#{mobile}, #{class_name}, #{sex}, 2, #{systime} + ) + + + + INSERT INTO SZ_AttendanceRecordsSS202101 ( + [user_id], + [school_id], + [customerId], + [usertype], + [card_num], + [card_type], + [outof], + [intime], + [cid], + [func_no], + [head_image], + [class_id], + [expression], + [attendance_id], + [name], + [mobile], + [class_name], + [sex], + [student_type], + [systime] + ) + VALUES + ( + #{user_id},#{school_id},#{customerId},2,#{card_num},#{card_type},#{outof}, #{intime}, #{cid},8,null,#{class_id},null,#{attendance_id},#{name},#{mobile}, #{class_name}, #{sex}, 2, #{systime} + ) + + \ No newline at end of file diff --git a/cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java b/cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java index d42b8f9..494fabb 100644 --- a/cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java +++ b/cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.example.dahua.MyTask; import com.example.dahua.Tester; import com.example.dahua.async.MyScheduledTask; +import com.example.dahua.async.SendFaceBatchTask2; import com.example.dahua.bean.*; import com.example.dahua.dao.PermissionFaceDao; import com.example.dahua.dao.UserDao; @@ -17,11 +18,17 @@ import com.example.dahua.utils.DateUtils; import com.example.dahua.utils.HttpUtil; import com.example.dahua.utils.JsonUtils; import com.example.dahua.xiananDao.SearchMapper; +import com.example.dahua.xiananDao.SendRecordDao; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; +import java.util.List; +import java.util.concurrent.*; /** * TODO @@ -144,10 +151,120 @@ public class SearchMapperTest extends Tester { // deleteBatchTest.test2(schoolId); String schoolId = "1485"; deleteBatchTest.test3(schoolId); + } @Test public void test9() { - deleteBatchTest.test4(27,2,"1"); + String cardNum="8733277A"; + String intime= "2021-01-28 20:47:14"; + String systime="2021-01-28 20:47:23"; + String clientId ="253169469"; + deleteBatchTest.test5(cardNum,intime,systime,clientId); + } + + @Test + public void test10() { + //男 + Integer roomId =11748; +// String roomId ="12226"; + Integer type = 12; + Integer outof = 0; + String intime = "2021-01-24 20:26:14"; + String clintId="253169240"; + String startTime= "2021-01-24 00:00:00"; + String endTime ="2021-01-24 23:59:59"; + deleteBatchTest.test6(27,roomId,type,outof,intime,clintId,startTime,endTime); + } + + @Test + public void test11() { + //男11748 + Integer roomId =11748; +// String roomId ="12226"; + Integer type = 7; + Integer outof = 1; + String intime = "2021-01-08 06:03:39"; + String clintId="253169240"; + String startTime= "2021-01-08 00:00:00"; + String endTime ="2021-01-08 23:59:59"; + deleteBatchTest.test6(27,roomId,type,outof,intime,clintId,startTime,endTime); + } + + @Test + public void test12() { + //男 + Integer roomId =11748; +// String roomId ="12226"; +// Integer type = 7; +// Integer outof = 1; + Integer type = 12; + Integer outof = 0; + String startTime= "2021-01-24 00:00:00"; + String endTime ="2021-01-09 23:59:59"; + deleteBatchTest.test8(27,roomId,type,outof,startTime,endTime,47); + } + + @Test + public void test13() { + //男11748 + Integer roomId =12226; +// String roomId ="12226"; + Integer type =1; + Integer outof = 0; + String intime = "2021-01-21 06:03:39"; + String clintId="253185199"; + String startTime= "2021-01-21 00:00:00"; + String endTime ="2021-01-21 23:59:59"; + deleteBatchTest.test7(27,roomId,type,outof,intime,clintId,startTime,endTime); + } + + @Test + public void test14() { + //男11748 + Integer roomId =12226; +// String roomId ="12226"; + Integer type =4; + Integer outof = 1; + String intime = "2021-01-20 17:14:39"; + String clintId="253185199"; + String startTime= "2021-01-20 00:00:00"; + String endTime ="2021-01-20 23:59:59"; + deleteBatchTest.test7(27,roomId,type,outof,intime,clintId,startTime,endTime); + } + + @Autowired + private SendRecordDao sendRecordDao; + + @Test + public void test15() { + //男 + Integer schoolId=27; + Integer roomId =12226; + Integer type = 4; + Integer outof = 0; + String clintId="253169212"; + String timeIds = "2021-01-08,2021-01-11,2021-01-12,2021-01-13,2021-01-14,2021-01-15,2021-01-18,2021-01-19,2021-01-20,2021-01-21,2021-01-22"; + String[] deviceArr = timeIds.split(","); + List deviceList= new ArrayList<>(Arrays.asList(deviceArr)); + //启用多线程执行 + CountDownLatch begin = new CountDownLatch(1); + CountDownLatch end = new CountDownLatch(deviceList.size()); + ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-sendFace-runner-%d").build(); + ExecutorService exe = new ThreadPoolExecutor(8,16,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue(),namedThreadFactory); + for(String s : deviceList){ + String intime = s + " 06:03:39"; + String startTime= s + " 00:00:00"; + String endTime = s+" 23:59:59"; + exe.execute(new SendFaceBatchTask2(userDao,sendRecordDao,searchMapper,schoolId,roomId,type,outof,intime,clintId,startTime,endTime,begin,end)); + } + begin.countDown(); + try { + end.await(); + }catch (Exception e){ + e.printStackTrace(); + } + exe.shutdown(); + System.out.println("统计100服务器总共有"+deviceList.size()+"个设备,处理完毕"); } } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/CMSServer.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/CMSServer.java index 2fe69dd..8ba82b8 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/CMSServer.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/CMSServer.java @@ -1,25 +1,29 @@ package com.sincere.haikangface; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.sincere.haikangface.bean.AttendanceBean; +import com.sincere.haikangface.bean.BaiduFaceRecorder; import com.sincere.haikangface.bean.StudentBean; +import com.sincere.haikangface.bean.TeacherBean; import com.sincere.haikangface.bean.xiaoan.Face_Recoder; import com.sincere.haikangface.dao.DeviceDao; import com.sincere.haikangface.dao.UserDao; import com.sincere.haikangface.haikanglibs.HCEHomeAlarm; import com.sincere.haikangface.haikanglibs.HCEHomeCMS; import com.sincere.haikangface.haikanglibs.HCEHomeSS; +import com.sincere.haikangface.mqtt.MqtUtils; import com.sincere.haikangface.service.impl.BaseService; import com.sincere.haikangface.utils.AlarmUtils; -import com.sincere.haikangface.utils.FileUtils; +import com.sincere.haikangface.utils.HttpUtil; +import com.sincere.haikangface.utils.SpringContextHolder; import com.sincere.haikangface.xiananDao.SendRecordDao; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import lombok.extern.slf4j.Slf4j; import org.apache.http.util.TextUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; @@ -50,9 +54,6 @@ public class CMSServer implements ApplicationRunner { @Autowired SendRecordDao sendRecordDao; - @Autowired - BaseService baseService; - public static HCEHomeCMS hCEhomeCMS = HCEHomeCMS.INSTANCE; //注册回调函数实现 static FRegisterCallBack fRegisterCallBack; @@ -61,8 +62,6 @@ public class CMSServer implements ApplicationRunner { // 存储设备登录句柄 static Map map = new HashMap<>(); - public static String inTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - //114.55.30.100 //120.26.116.253 // private String ip_cloud = "114.55.30.100"; @@ -246,23 +245,7 @@ public class CMSServer implements ApplicationRunner { log.error("注册设备,设置设备ID异常,错误信息:{}",e); } pInBuffer.dwSize = pInBuffer.size(); - AttendanceBean attendanceBean = new AttendanceBean(); - attendanceBean.setClint_id(deviceId); - - if (deviceId.startsWith("ytj")) - attendanceBean.setClint_type("28"); - else - attendanceBean.setClint_type("18"); - attendanceBean.setIntime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - attendanceBean.setIsConnection(1); - attendanceBean.setSchool_id("-1"); - attendanceBean.setState(1); - if (deviceDao.selectDevice(deviceId) != null) { - deviceDao.updateDeviceStatu(1,inTime,deviceId); - } else { - deviceDao.addDevide(attendanceBean.getClint_id(), attendanceBean.getClint_type(), attendanceBean.getIntime(), - attendanceBean.getSchool_id(), attendanceBean.getState() + "", attendanceBean.getIsConnection() + ""); - } + saveAttendance(deviceId); /*这里加判断即可,可以通过byDeviceID、sDeviceSerial、sDevName 进行判断 if(strDevRegInfo.dwDevType == 1) { pInBuffer.dwAlarmServerType = 3; @@ -295,7 +278,7 @@ public class CMSServer implements ApplicationRunner { public boolean invoke(NativeLong iHandle, int enumType, Pointer pOutBuffer, int dwOutLen, Pointer pInBuffer, int dwInLen, Pointer pUser) { - System.out.println("信息回调函数上报:------"); + log.info("信息回调函数上报:------"); if (1 == enumType) { HCEHomeSS.NET_EHOME_SS_TOMCAT_MSG pTomcatMsg = new HCEHomeSS.NET_EHOME_SS_TOMCAT_MSG(); String szDevUri = new String(pTomcatMsg.szDevUri).trim(); @@ -316,19 +299,17 @@ public class CMSServer implements ApplicationRunner { public class PSS_Storage_Callback implements HCEHomeSS.EHomeSSStorageCallBack { public boolean invoke(NativeLong iHandle, String pFileName, Pointer pFileBuf, int dwFileLen, Pointer pFilePath, Pointer pUser) { String strPath = "C://EhomePicServer/"; - FileUtils.getInstance().writeLogs("文件名:" + pFileName, FileUtils.fileName); + //若此目录不存在,则创建之 + File myPath = new File(strPath); + if (!myPath.exists()) { + myPath.mkdirs(); + } String isQJFileName = pFileName;//用来判断是否是枪机 pFileName = pFileName.replace("_", ""); if (pFileName.contains("T"))pFileName=pFileName.split("T")[0]+".jpg"; - FileUtils.getInstance().writeLogs("文件名pFileName:" + pFileName, FileUtils.fileName); String strFilePath = strPath + pFileName; //保存抓拍到的人脸图片,比对通过后的图片资源 - //若此目录不存在,则创建之 - File myPath = new File(strPath); - if (!myPath.exists()) { - myPath.mkdir(); - log.info("人脸抓拍文件,文件夹路径为:" + strPath); - } + log.info("人脸抓拍文件,文件夹路径为:" + strFilePath); File strFilePathFile = new File(strFilePath); if (!strFilePathFile.exists()) { try { @@ -358,7 +339,7 @@ public class CMSServer implements ApplicationRunner { deviceId = isQJFileName.substring(start, end); } //发送看板 - baseService.sendUserInfoToKB(strFilePathFile, deviceId); + sendUserInfoToKB(strFilePathFile, deviceId); } } catch (FileNotFoundException e) { log.error("处理人脸机抓拍文件异常,错误信息:{}",e); @@ -366,13 +347,7 @@ public class CMSServer implements ApplicationRunner { log.error("处理人脸机抓拍文件异常,错误信息:{}",e); } } - pFilePath.write(0, strFilePath.getBytes(), 0, strFilePath.getBytes().length); - -// if (isZhuaPai) { -// MqtUtils.getInstance().sendMsg("http://campus.myjxt.com//face17e5/School16/Student/" + pFileName); -// } - return true; } } @@ -397,6 +372,7 @@ public class CMSServer implements ApplicationRunner { alarmUtils.setCallBack(new AlarmUtils.AlarmCallBack() { @Override public void callBack(String minorType, String deviceID, String cardNo, String time, String picDataUrlId, String currTemperature) { + saveAttendance(deviceID); switch (minorType) { case "0x4b"://人脸认证通过 log.info("人脸验证通过,事件次类型:"+minorType); @@ -407,7 +383,7 @@ public class CMSServer implements ApplicationRunner { case "0x427"://人证设备离线 log.info("设备掉线了,设备ID: "+deviceID); map.remove(deviceID); - deviceDao.updateDeviceStatu(0,inTime,deviceID); + deviceDao.updateDeviceStatu(0,time,deviceID); break; case "0x69"://人证比对通过 log.info("人证比对通过,事件次类型:"+minorType); @@ -445,6 +421,7 @@ public class CMSServer implements ApplicationRunner { * @param picDataUrlId */ private void saveFaceRecoder(String deviceID, String cardNo, String time, String picDataUrlId, String currTemperature) { + BaseService baseService = SpringContextHolder.getBaseService(); try { if (!StringUtils.isEmpty(cardNo) && isNumeric(cardNo)) { Face_Recoder face_recoder = new Face_Recoder(); @@ -452,19 +429,23 @@ public class CMSServer implements ApplicationRunner { String card = splicingZero(Long.toHexString(Long.parseLong(cardNo)), 8).toUpperCase(); //卡号逆转 cardNo = baseService.getCard(card); - StudentBean studentBean = userDao.getStudentWithCard(cardNo); - log.info("用户信息studentBean:{}", studentBean); + StudentBean studentBean = userDao.getStudentWithCard(cardNo,null); + AttendanceBean attendanceBean = deviceDao.selectDevice(deviceID); if (null != studentBean) { - FileUtils.getInstance().writeLogs(studentBean.getName() + " " + cardNo, FileUtils.facerecoder); + String name = studentBean.getName(); + int schoolId = studentBean.getSchool_id(); + String className = studentBean.getClass_name(); + face_recoder.setCardNum(cardNo); face_recoder.setDeviceId(deviceID); face_recoder.setTime(time); - face_recoder.setName(studentBean.getName()); + face_recoder.setName(name); face_recoder.setUser_id(studentBean.getUser_id()); - face_recoder.setInOrOut(1); - String api = "/kms/services/rest/dataInfoService/downloadFile?id=" + picDataUrlId; - String imgUrl = "http://"+ ip_cloud +":8081"+ api; + face_recoder.setInOrOut(attendanceBean.getOutOrIn()); + String imgUrl = "http://" + ip_cloud + ":8081/kms/services/rest/dataInfoService/downloadFile?id=" + picDataUrlId; face_recoder.setImgurl(imgUrl); + log.info("设备: {},人脸抓怕:学校id: {} ,班级:{} ,用户名:{} ,卡号:{} ,",deviceID,schoolId,className,name,cardNo); + log.info("抓拍人脸:" + imgUrl); if (!TextUtils.isEmpty(currTemperature)) {//只有有温度的才存记录 userDao.addWGTem(studentBean.getUser_id(), studentBean.getStudent_id(), studentBean.getName(), studentBean.getClass_id() + "", studentBean.getClass_name(), currTemperature, studentBean.getStudent_type() + "", studentBean.getSchool_id() + "", time); @@ -474,7 +455,7 @@ public class CMSServer implements ApplicationRunner { face_recoder.getImgurl(), face_recoder.getInOrOut(), face_recoder.getTime(), face_recoder.getCardNum(), currTemperature); } else { //教师点名 - isTeacher(cardNo, deviceID); + isTeacher(cardNo, deviceID,null); } // if (deviceID.startsWith("qj")) {//枪击 用来抓拍人脸考勤用 // initQJ(deviceID, cardNo, studentBean == null); @@ -486,18 +467,16 @@ public class CMSServer implements ApplicationRunner { } } - public void isTeacher(String cardNo, String deviceID) { + public void isTeacher(String cardNo, String deviceID,Integer schoolId) { List devLists = userDao.getDeviceRoomRelation(deviceID); if (null != devLists && devLists.size() > 0) { - - StudentBean teacher = userDao.getTeacherWithCard(cardNo); - FileUtils.getInstance().writeLogs("teacher:" + teacher + "----" + cardNo, "教师点名.txt"); + StudentBean teacher = userDao.getTeacherWithCard(cardNo,schoolId); + log.info("teacher:" + teacher + "----" + cardNo); if (null != teacher) { String url = String.format("http://campus.myjxt.com/api/RollCall/AddRollCallPersonnelRecord?userId=%s&deviceId=%s", teacher.getUser_id(), deviceID); RestTemplate restTemplate = new RestTemplate(); String res = restTemplate.getForObject(url, String.class); JSONObject jsonObject = JSON.parseObject(res); - FileUtils.getInstance().writeLogs("card:" + res, "教师点名.txt"); System.out.println("result:" + res + "------url:" + jsonObject.getBoolean("data")); } } @@ -552,12 +531,8 @@ public class CMSServer implements ApplicationRunner { */ return sendInfo(srcFile, url, card, startTime, endTime, validTimeEnabled, name, deviceId, userType, employeeNo, schoolId,cardNum); } - if(schoolId !=null && (schoolId.intValue() == 4 || schoolId.intValue() == 27 || schoolId.intValue() == 864 || - schoolId.intValue() == 2 || schoolId.intValue() == 16)){ - baseService.sendFailRecord(cardNum, srcFile, deviceId,"设备不在线", userType); - }else{ - baseService.sendFail(card, srcFile, deviceId,"设备不在线", userType); - } + BaseService baseService = SpringContextHolder.getBaseService(); + baseService.sendFailRecord(cardNum, srcFile, deviceId,"设备不在线", userType,schoolId); return false; } @@ -705,9 +680,7 @@ public class CMSServer implements ApplicationRunner { */ public void SetCardWeekPlan(String clint_id, String card, String userType, String strConfigXMLCard, String content,Integer schoolId,String cardNum) { try { - HCEHomeCMS.NET_EHOME_XML_CFG struXMLCard = new HCEHomeCMS.NET_EHOME_XML_CFG(); - HCEHomeCMS.NET_DVR_STRING_POINTER stringRequestCard = new HCEHomeCMS.NET_DVR_STRING_POINTER(); stringRequestCard.read(); String strRequestCard = "SETDEVICECONFIG"; @@ -742,15 +715,11 @@ public class CMSServer implements ApplicationRunner { struXMLCard.write(); int i = struXMLCard.size(); + BaseService baseService = SpringContextHolder.getBaseService(); if (!hCEhomeCMS.NET_ECMS_XMLConfig(map.get(clint_id), struXMLCard, struXMLCard.size())) { int iErr = hCEhomeCMS.NET_ECMS_GetLastError(); log.error(content + "失败:" + iErr); - if(schoolId !=null && (schoolId.intValue() == 4 || - schoolId.intValue() == 27 || schoolId.intValue() == 2 || schoolId.intValue() == 16)){ - baseService.sendFailRecord(cardNum,"",clint_id,content + "失败:" + iErr, userType); - }else{ - baseService.sendFail(card,"",clint_id,content + "失败:" + iErr, userType); - } + baseService.sendFailRecord(cardNum,"",clint_id,content + "失败:" + iErr, userType,schoolId); } else { log.info(content + "成功"); } @@ -817,27 +786,22 @@ public class CMSServer implements ApplicationRunner { HCEHomeCMS.NET_DVR_STRING_POINTER stringXMLOut = new HCEHomeCMS.NET_DVR_STRING_POINTER(); struISAPXML.pOutBuffer = stringXMLOut.getPointer(); struISAPXML.dwOutSize = stringXMLOut.size(); + BaseService baseService = SpringContextHolder.getBaseService(); if (type == 1) {//下发人脸 if (!hCEhomeCMS.NET_ECMS_PostPTXMLConfig(map.get(deviceId), struISAPXML)) { int iErr = hCEhomeCMS.NET_ECMS_GetLastError(); log.error(content + "失败,错误号:" + iErr + "---" + strConfigXML + "\n"); - if(schoolId !=null && (schoolId.intValue() == 4 || schoolId.intValue() == 27 || schoolId.intValue() == 864 || - schoolId.intValue() == 2 || schoolId.intValue() == 16)){ - baseService.sendFailRecord(cardNum,"",deviceId,content + "失败,错误号:" + iErr, userType); - }else{ - baseService.sendFail(card,"",deviceId,content + "失败,错误号:" + iErr, userType); + if(schoolId !=null){ + log.info("学校Id: {},失败卡号: {}",schoolId,cardNum); + baseService.sendFailRecord(cardNum,"",deviceId,content + "失败,错误号:" + iErr, userType,schoolId); } -// sendRecoderUtils.sendFailRecord(sendRecordDao, card, srcFile, deviceId, userDao, content + "失败,错误号:" + iErr, userType); } else { stringXMLOut.read(); String strOutXML = new String(stringXMLOut.byString).trim(); - if(schoolId !=null && (schoolId.intValue() == 4 || schoolId.intValue() == 27 || schoolId.intValue() == 864 || - schoolId.intValue() == 2 || schoolId.intValue() == 16)){ - baseService.sendSuccessRecord(cardNum,faceUrl, deviceId,userType); - }else{ - baseService.sendSuccess(card,faceUrl, deviceId,userType); + if(schoolId !=null){ + log.info("学校Id: {},成功卡号: {}",schoolId,cardNum); + baseService.sendSuccessRecord(cardNum,faceUrl, deviceId,userType,schoolId); } - log.info(content + "成功: 下发卡号:" + card); } } else if (type == 2) {//删除人脸 if (!hCEhomeCMS.NET_ECMS_PutPTXMLConfig(map.get(deviceId), struISAPXML)) { @@ -863,63 +827,148 @@ public class CMSServer implements ApplicationRunner { return false; } - @Value("${attendanceHost}") - private String host; - - /* private boolean sendSMS(String cardNo, String deviceID, String time) { - if (deviceID != null && !deviceID.isEmpty() && !StringUtils.isEmpty(cardNo)) { - cardNo = sendRecoderUtils.getCard(splicingZero(Long.toHexString(Long.parseLong(cardNo)), 8).toUpperCase()); - - System.out.println(String.format("设备号:%s 卡号:%s 时间:%s", deviceID, cardNo, time)); - PlaceAttendance placeAttendance = deviceDao.getPlaceAttendance(deviceID); - AttendanceBean attendanceBean = deviceDao.selectDevice(deviceID); - QianDaoManager qianDaoManager = deviceDao.getQianDaoMnager(attendanceBean.getSchool_id()); - if (null != qianDaoManager) { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String info = String.format("", - simpleDateFormat.format(new Date()), deviceID, cardNo, time, "-1"); - - AttendanceInfoBean attendanceInfoBean = new AttendanceInfoBean(); - attendanceInfoBean.setInfo(info); - attendanceInfoBean.setIsControl(0); - attendanceInfoBean.setPwd(qianDaoManager.getPwd()); - attendanceInfoBean.setUsername(qianDaoManager.getAccount()); - - String jsonResult = JSON.toJSONString(attendanceInfoBean); - System.out.println(jsonResult); - - if (placeAttendance == null) {//出入校 - String urlXST = host + "api/XiaoAnCommon/SendXST"; - String result1 = ApiHelper.doPost(urlXST, new HashMap(), jsonResult); - JSONObject jsonObject = JSONObject.parseObject(result1); - System.out.println("urlXST:" + result1);//{"status":1,"message":null,"data":"0"} - if ((int) jsonObject.get("status") == 1) { - FileUtils.getInstance().writeLogs("出入校签到成功:" + deviceID + " 卡号:" + cardNo, FileUtils.qiandaoSuccess); - return true; - } else { - FileUtils.getInstance().writeLogs("出入校签到失败:" + deviceID + " 卡号:" + cardNo + " result1:" + result1, FileUtils.qiandaoErr); - return false; - } - } else {//出入寝室 - String urlHXY = host + "api/XiaoAnCommon/SendHXY"; - String result2 = ApiHelper.doPost(urlHXY, new HashMap(), jsonResult); - JSONObject jsonObject = JSONObject.parseObject(result2); - System.out.println("urlHXY:" + result2); - if ((int) jsonObject.get("status") == 1) { - FileUtils.getInstance().writeLogs("出入寝签到成功:" + deviceID + " 卡号:" + cardNo, FileUtils.qiandaoSuccess); - return true; + //存储抓拍人脸用户信息 + private static Map userMap = new HashMap<>(); + /** + * 人脸发送看板信息 + * @param file + * @param deviceId + */ + public void sendUserInfoToKB(File file,String deviceId){ + //获取学校ID + String schoolId = userDao.getSchoolIdWithDevId(deviceId); + //请求人脸识别 + JSONObject jsonObject = HttpUtil.sendToKB(file,schoolId); + if(jsonObject ==null){ + log.error("人脸识别失败,返回数据为空"); + return; + } + String face = jsonObject.getString("data"); + if (face.startsWith("face") || face.startsWith("pic")){ + log.error("人脸识别失败"); + return; + } + JSONObject data = jsonObject.getJSONObject("data"); + String errorMsg = data.getString("error_msg"); + //识别成功 + if (errorMsg.equals("SUCCESS")) { + JSONObject result = data.getJSONObject("result"); + //用户信息 + JSONArray userList = result.getJSONArray("user_list"); + if (userList != null && userList.size() > 0) { + for (int i = 0; i < userList.size(); i++) { + JSONObject user = userList.getJSONObject(i); + //用户ID + String userId = user.getString("user_id"); + //比对成功分数值 + String score = user.getString("score"); + double sc = Double.valueOf(score.split("\\.")[0]); + if (sc >= 60) { + TeacherBean teacherBean = userDao.getTeacherWithUserId1(userId); + if (null != teacherBean) { + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + teacherBean.setTime(time); + if (org.apache.commons.lang3.StringUtils.isBlank(teacherBean.getTeacer_num())){ + teacherBean.setTeacer_num(userId); + } + //保存百度人脸识别记录 + saveBaiDuFaceRecorder(teacherBean,file,sc,userId); + //同一用户抓拍时间在60秒内,则部不发送看板 + if (userMap.containsKey(userId) && userMap.get(userId)!=null) { + long value = userMap.get(userId); + if ((System.currentTimeMillis() - value) / 1000 > 60) { + userMap.put(userId,System.currentTimeMillis()); + send2DeviceIds(schoolId, teacherBean); + log.info("发送成功....."); + } + } else { + userMap.put(userId, System.currentTimeMillis()); + send2DeviceIds(schoolId, teacherBean); + log.info("发送成功....."); + } + } else { + log.info("用户身份信息不存在"); + sendNoPersonImg(file,schoolId); + } } else { - FileUtils.getInstance().writeLogs("出入寝签到失败:" + deviceID + " 卡号:" + cardNo + " result1:" + result2, FileUtils.qiandaoErr); - return false; + log.info("用户身份信息不存在" + score); + sendNoPersonImg(file,schoolId); } } + } + } else { + log.error("百度人脸识别失败, 返回信息:{}" + jsonObject.toJSONString()); + } + } - } else { - FileUtils.getInstance().writeLogs("schoolId:" + attendanceBean.getSchool_id(), FileUtils.sms); + /** + * 发送平台用户信息至看板设备 + * @param schoolId + * @param teacherBean + */ + private void send2DeviceIds(String schoolId, TeacherBean teacherBean) { + List deviceIds = userDao.getKBDevices(schoolId); + if (deviceIds != null) { + for (int i = 0; i < deviceIds.size(); i++) { + String deviceId = deviceIds.get(i); + if (!org.apache.commons.lang3.StringUtils.isEmpty(deviceId)) { + String content = "{\"cmd\":\"" + 1 + "\",\"clientId\":\"\",\"data\": " + teacherBean.toString() + "}"; + MqtUtils.getInstance().sendMsg(deviceId, content); + } } } - return false; - }*/ + } + + /** + * 发送陌生人信息至设备看板 + * @param faceFile + * @param schoolId + */ + private void sendNoPersonImg(File faceFile, String schoolId) { + List deviceIds = userDao.getKBDevices(schoolId); + String imgName = faceFile.getName(); + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + if (imgName.contains(date)) { + String imgId = imgName.substring(0, imgName.indexOf(date)); + String imgUrl = "http://" + ip_cloud + ":8081/kms/services/rest/dataInfoService/downloadFile?id=" + imgId; + log.info("文件名:" + imgUrl); + for (int i = 0; i < deviceIds.size(); i++) { + String deviceId = deviceIds.get(i); + if (!org.springframework.util.StringUtils.isEmpty(deviceId)){ + String content = "{\"cmd\":\"" + 2 + "\",\"clientId\":\"\",\"data\": \"" + imgUrl + "\"}"; + MqtUtils.getInstance().sendMsg(deviceId, content); + } + } + } + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private void saveBaiDuFaceRecorder(TeacherBean teacherBean,File faceFile,double score,String userId){ + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + BaiduFaceRecorder baiduFaceRecorder = new BaiduFaceRecorder(); + baiduFaceRecorder.setUserId(userId); + baiduFaceRecorder.setName(teacherBean.getName()); + baiduFaceRecorder.setScore(score + ""); + baiduFaceRecorder.setTime(teacherBean.getTime()); + baiduFaceRecorder.setUserImgUrl(teacherBean.getFace()); + String uploadImgUrl = ""; + if(faceFile.getAbsolutePath().contains(date)){ + //抓拍照片ID + String imgId = faceFile.getName().substring(0,faceFile.getName().indexOf(date)); + String api = "http://"+ ip_cloud + ":8081/kms/services/rest/dataInfoService/downloadFile?id=" +imgId; + uploadImgUrl = api; + }else { + uploadImgUrl = faceFile.getAbsolutePath(); + } + baiduFaceRecorder.setUploadImgUrl(uploadImgUrl); + + //插入百度人脸记录表 + userDao.insertBaiduFaceRecorder(baiduFaceRecorder); + } /** * 字符串前面补零操作 @@ -948,4 +997,24 @@ public class CMSServer implements ApplicationRunner { return pattern.matcher(str).matches(); } + public void saveAttendance(String deviceId){ + String inTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + AttendanceBean attendanceBean = new AttendanceBean(); + attendanceBean.setClint_id(deviceId); + + if (deviceId.startsWith("ytj")) + attendanceBean.setClint_type("28"); + else + attendanceBean.setClint_type("18"); + attendanceBean.setIntime(inTime); + attendanceBean.setIsConnection(1); + attendanceBean.setSchool_id("-1"); + attendanceBean.setState(1); + if (deviceDao.selectDevice(deviceId) != null) { + deviceDao.updateDeviceStatu(1,inTime,deviceId); + } else { + deviceDao.addDevide(attendanceBean.getClint_id(), attendanceBean.getClint_type(), attendanceBean.getIntime(), + attendanceBean.getSchool_id(), attendanceBean.getState() + "", attendanceBean.getIsConnection() + ""); + } + } } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/HaikangfaceApplication.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/HaikangfaceApplication.java index 50e1564..51d88c4 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/HaikangfaceApplication.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/HaikangfaceApplication.java @@ -1,7 +1,6 @@ package com.sincere.haikangface; import com.sincere.haikangface.utils.FileUtils; -import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -10,14 +9,13 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableAsync; @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class}) @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients(basePackages = "com.sincere.haikangface.fegin") -//@EnableAsync +@EnableAsync public class HaikangfaceApplication { public static void main(String[] args) { diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/async/AsyncTask.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/async/AsyncTask.java new file mode 100644 index 0000000..871738c --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/async/AsyncTask.java @@ -0,0 +1,95 @@ +package com.sincere.haikangface.async; + +import com.sincere.haikangface.bean.SendRecordBean; +import com.sincere.haikangface.bean.StudentBean; +import com.sincere.haikangface.dao.UserDao; +import com.sincere.haikangface.xiananDao.SendRecordDao; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.concurrent.CountDownLatch; + +/** + * 多线程执行卡下发 + * @author xuquan + * @date 2021/01/12 15:56 + */ +@Slf4j +public class AsyncTask implements Runnable { + + Integer schoolId; + String deviceId; + UserDao userDao; + SendRecordDao sendRecordDao; + CountDownLatch begin; + CountDownLatch end; + + public AsyncTask(UserDao userDao, SendRecordDao sendRecordDao, Integer schoolId,String deviceId, CountDownLatch begin, CountDownLatch end){ + this.userDao=userDao; + this.sendRecordDao=sendRecordDao; + this.schoolId=schoolId; + this.deviceId=deviceId; + this.begin=begin; + this.end=end; + } + + @Override + public void run() { + try { + begin.await(); + List successList = sendRecordDao.getSenSuccesss(deviceId,schoolId); + if(!CollectionUtils.isEmpty(successList)){ + int i =0; + for(SendRecordBean sendRecordBean : successList){ + String deviceId = sendRecordBean.getDeviceID(); + String cardNum = sendRecordBean.getNum(); + int userType = sendRecordBean.getUserType(); + StudentBean studentBean = null; + switch (userType) { + case 1://老师 + studentBean = userDao.getTeacherWithCard(cardNum,schoolId); + break; + case 2://学生 + studentBean = userDao.getStudentWithCard(cardNum,schoolId); + break; + } + if (null != studentBean) { + //用户ID + String userId = studentBean.getUser_id(); + //用户名称 + String userName = studentBean.getName(); + //所属学校 + String schoolName = sendRecordBean.getSchoolName(); + String faceUrl= sendRecordBean.getImgPath(); + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + List sendRecordBeans = sendRecordDao.getRecordIsExit(deviceId,cardNum,userId); + int deviceType = 0; + if(deviceId.startsWith("ytj")){ + deviceType=28; + }else { + deviceType=18; + } + if(CollectionUtils.isEmpty(sendRecordBeans)){ + sendRecordDao.saveFaceRecord(userId, deviceId, cardNum, userName, time, schoolName, + faceUrl, schoolId,null,null, userType,deviceType,1,null); + }else { + System.out.println(i); + sendRecordDao.updateFaceSuccessRecord(deviceId,cardNum,time,faceUrl,userName,userId,null); + } +// sendRecordDao.deleteFaceSuccess(cardNum,deviceId); + i++; + } + } + } + }catch (Exception e){ + log.error("异常,信息:",e); + }finally { + end.countDown(); + } + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/async/DeleteTask.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/async/DeleteTask.java new file mode 100644 index 0000000..9cf0d08 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/async/DeleteTask.java @@ -0,0 +1,76 @@ +package com.sincere.haikangface.async; + +import com.sincere.haikangface.bean.StudentBean; +import com.sincere.haikangface.dao.UserDao; +import com.sincere.haikangface.enums.EnumSzBusinessType; +import com.sincere.haikangface.service.impl.BaseService; +import com.sincere.haikangface.utils.CompressPic; +import com.sincere.haikangface.utils.FileUtils; +import com.sincere.haikangface.xiananDao.SendRecordDao; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.concurrent.CountDownLatch; + +/** + * 多线程执行卡下发 + * @author xuquan + * @date 2021/01/12 15:56 + */ +@Slf4j +public class DeleteTask implements Runnable { + + Integer schoolId; + Integer roomId; + Integer type; + Integer outof; + UserDao userDao; + String startTime; + String endTime; + SendRecordDao sendRecordDao; + CountDownLatch begin; + CountDownLatch end; + + public DeleteTask(UserDao userDao,SendRecordDao sendRecordDao,Integer schoolId,Integer roomId, Integer type, + Integer outof,String startTime,String endTime,CountDownLatch begin, CountDownLatch end){ + this.userDao=userDao; + this.sendRecordDao=sendRecordDao; + this.schoolId=schoolId; + this.roomId=roomId; + this.type=type; + this.outof=outof; + this.startTime=startTime; + this.endTime=endTime; + this.begin=begin; + this.end=end; + } + + @Override + public void run() { + try { + begin.await(); + List studentIds = userDao.queryStudentIdList(schoolId,roomId); + if(!CollectionUtils.isEmpty(studentIds)){ + for(int i=0;i<=studentIds.size();i++){ + StudentBean userInfoBean = userDao.getStudentWithid(studentIds.get(i)); + if(userInfoBean!=null){ + String cardNum = userInfoBean.getStudent_num(); + System.out.println(i); + sendRecordDao.deleteSS(schoolId,cardNum,type,outof,startTime,endTime); + } + } + } + }catch (Exception e){ + log.error("异常,信息:"); + }finally { + end.countDown(); + } + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendFaceBatchTask253.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendFaceBatchTask253.java index c15aee3..b951eb2 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendFaceBatchTask253.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendFaceBatchTask253.java @@ -71,7 +71,7 @@ public class SendFaceBatchTask253 implements Runnable { String filePath = path+ "\\" + fileName; Thread.sleep(1000); //下发253服务器 - sendUserAsync.uploadImgs(filePath, cardNum, userName, sno, startTime, endTime, validTimeEnabled, userType); + sendUserAsync.uploadImgs(filePath, cardNum, userName, sno, startTime, endTime, validTimeEnabled, userType,Integer.parseInt(schoolId)); }catch (Exception e){ log.error("人脸下发失败"); e.printStackTrace(); diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendUserAsync.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendUserAsync.java index 58c9208..43c68c3 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendUserAsync.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendUserAsync.java @@ -15,7 +15,7 @@ import com.sincere.haikangface.service.impl.BaseService; import com.sincere.haikangface.utils.FileUtils; import com.sincere.haikangface.utils.HKXmlUtils; import com.sincere.haikangface.utils.HttpUtil; -import com.sincere.haikangface.utils.SendRecoderUtils; +import com.sincere.haikangface.utils.SpringContextHolder; import com.sincere.haikangface.xiananDao.SendRecordDao; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -45,12 +45,6 @@ public class SendUserAsync { @Autowired UserDao userDao; - @Autowired - BaseService baseService; - - - SendRecoderUtils sendRecoderUtils; - /** * 人脸下发至海康设备 * @param srcFile @@ -81,7 +75,7 @@ public class SendUserAsync { //1老师;2学生 if (Integer.parseInt(userType) ==EnumSzBusinessType.EnumUserType.TEACHER.code) { //根据卡号获取老师信息 - StudentBean studentBean = userDao.getTeacherWithCard(resultCard); + StudentBean studentBean = userDao.getTeacherWithCard(resultCard,schoolId); if (null == studentBean) { employeeNo = time.substring(time.length() - 6, time.length()); } else{ @@ -90,7 +84,7 @@ public class SendUserAsync { } if (Integer.parseInt(userType) ==EnumSzBusinessType.EnumUserType.STUDENT.code) { //根据卡号获取学生信息 - StudentBean studentBean = userDao.getStudentWithCard(resultCard); + StudentBean studentBean = userDao.getStudentWithCard(resultCard,schoolId); if (null == studentBean) { employeeNo = time.substring(time.length() - 6, time.length()); } else{ @@ -107,13 +101,8 @@ public class SendUserAsync { cmsServer.SetCardWeekPlan(deviceId, card, userType, HKXmlUtils.getInstance().SetCardRightCfg(card), "设置卡权限",schoolId,cardNum); } } else {//不合格 - if(schoolId !=null && (schoolId.intValue() == 4 || schoolId.intValue() == 27 || schoolId.intValue() == 864 || - schoolId.intValue() == 2 || schoolId.intValue() == 16)){ - baseService.sendFailRecord(cardNum, srcFile, deviceId, "人脸照片不合格", userType); - }else{ - baseService.sendFail(card, srcFile, deviceId, "人脸照片不合格", userType); - } - + BaseService baseService = SpringContextHolder.getBaseService(); + baseService.sendFailRecord(cardNum, srcFile, deviceId, "人脸照片不合格", userType,schoolId); } } @@ -125,7 +114,6 @@ public class SendUserAsync { * @param permissionBean * @param i 1:不需要重新下发,0需要重新下发 */ - @Async("taskExecutor") public boolean sendPermiss(PermissionBean permissionBean, int i) { try{ //用户类型1老师2学生 @@ -169,7 +157,6 @@ public class SendUserAsync { * @param permissionBean * @param id */ - @Async("taskExecutor") public boolean sendHKAuth(PermissionBean permissionBean, Integer id,Integer studentType) { try{ //用户类型1老师2学生 @@ -184,7 +171,7 @@ public class SendUserAsync { String userIds = permissionBean.getUserIds(); List deviceIds = permissionBean.getDeviceIds(); - + BaseService baseService = SpringContextHolder.getBaseService(); for (WeekDay weekDay : weekDays) { List cardNumList = new ArrayList<>(); String sex = weekDay.getSex(); @@ -282,10 +269,8 @@ public class SendUserAsync { String weekPlanTimes = HKXmlUtils.getInstance().SetCardWeekPlanTimes(weekTime.getStartTime(), weekTime.getEndTime()); stringBuffer.append(weekPlanTimes); } - String weekPlanTime = HKXmlUtils.getInstance().SetCardWeekPlanTime(stringBuffer.toString(), "" + week); String serCardRightCfg = HKXmlUtils.getInstance().SetCardRightCfg(cardNum); - FileUtils.getInstance().writeLogs(weekPlanTime, "设置卡权限周计划时间.txt"); cmsServer.SetCardWeekPlan(deviceId, cardNum, userType, weekPlanTime, "设置卡权限周计划时间",schoolId,cardNum); cmsServer.SetCardWeekPlan(deviceId, cardNum, userType, serCardRightCfg, "设置卡权限",schoolId,cardNum); } @@ -373,16 +358,14 @@ public class SendUserAsync { * @param validTimeEnabled * @param userType */ - public void uploadImgs(String filePath, String card, String name, String deviceId, String startTime, String endTime, int validTimeEnabled, String userType) { - HttpUtil.uploadImgs(filePath, card, name, deviceId, startTime, endTime, validTimeEnabled, userType); + public void uploadImgs(String filePath, String card, String name, String deviceId, String startTime, String endTime, int validTimeEnabled, String userType,Integer schoolId) { + HttpUtil.uploadImgs(filePath, card, name, deviceId, startTime, endTime, validTimeEnabled, userType,schoolId); } public void deleteCard(String deviceId, String card) { HttpUtil.deleteCard(deviceId, card); } - - @Async("taskExecutor") public boolean IsDeviceOnline(String deviceId) { return HttpUtil.IsDeviceOnline(deviceId); } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/AttendanceBean.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/AttendanceBean.java index e11a0b2..d0be7e8 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/AttendanceBean.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/AttendanceBean.java @@ -23,6 +23,8 @@ public class AttendanceBean implements Serializable { private int isKaoqin; + private int OutOrIn; + public int getIsKaoqin() { return isKaoqin; } @@ -87,6 +89,14 @@ public class AttendanceBean implements Serializable { this.school_id = school_id; } + public int getOutOrIn() { + return OutOrIn; + } + + public void setOutOrIn(int outOrIn) { + OutOrIn = outOrIn; + } + @Override public String toString() { return "AttendanceBean{" + diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/StudentBean.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/StudentBean.java index 3f3608e..9ccc42f 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/StudentBean.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/StudentBean.java @@ -63,6 +63,16 @@ public class StudentBean implements Serializable { private String num; + private String ParentMobile; + + public String getParentMobile() { + return ParentMobile; + } + + public void setParentMobile(String parentMobile) { + ParentMobile = parentMobile; + } + public String getNum() { return num; } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/UpdateCardBean.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/UpdateCardBean.java new file mode 100644 index 0000000..c23ec10 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/bean/UpdateCardBean.java @@ -0,0 +1,168 @@ +package com.sincere.haikangface.bean; + +import javax.xml.crypto.Data; +import java.util.Date; + +/** + * TODO + * + * @author Administrator + * @date 2021/3/4 16:10 + */ + +public class UpdateCardBean { + + private String userId; + private String customerId; + private String studentType; + private Integer userType; + private String name; + private String classId; + private String className; + private String oldCard; + private String card; + private Integer schoolId; + private Integer isNew; + private Integer updateType; + private Date addTime; + private Integer sex; + private String face; + private String studentCode; + private String mobile; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public String getStudentType() { + return studentType; + } + + public void setStudentType(String studentType) { + this.studentType = studentType; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassId() { + return classId; + } + + public void setClassId(String classId) { + this.classId = classId; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getOldCard() { + return oldCard; + } + + public void setOldCard(String oldCard) { + this.oldCard = oldCard; + } + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card; + } + + public Integer getSchoolId() { + return schoolId; + } + + public void setSchoolId(Integer schoolId) { + this.schoolId = schoolId; + } + + public Integer getIsNew() { + return isNew; + } + + public void setIsNew(Integer isNew) { + this.isNew = isNew; + } + + public Integer getUpdateType() { + return updateType; + } + + public void setUpdateType(Integer updateType) { + this.updateType = updateType; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getFace() { + return face; + } + + public void setFace(String face) { + this.face = face; + } + + public String getStudentCode() { + return studentCode; + } + + public void setStudentCode(String studentCode) { + this.studentCode = studentCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/control/FileControl.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/control/FileControl.java index f062874..3828d37 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/control/FileControl.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/control/FileControl.java @@ -53,9 +53,9 @@ public class FileControl { } @RequestMapping(method = RequestMethod.POST, value = "uploadImg") - public String uploadImg(@RequestParam("file") MultipartFile file, @RequestParam("card") String card - , @RequestParam("name") String name, @RequestParam("deviceId") String deviceId, @RequestParam("startTime") String startTime, - @RequestParam("endTime") String endTime, @RequestParam("validTimeEnabled") int validTimeEnabled, @RequestParam("userType") String userType) { + public String uploadImg(@RequestParam("file") MultipartFile file,@RequestParam("schoolId") Integer schoolId,@RequestParam("card") String card, + @RequestParam("name") String name, @RequestParam("deviceId") String deviceId, @RequestParam("userType") String userType, + @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime, @RequestParam("validTimeEnabled") int validTimeEnabled) { try { if (!cmsServer.getIsDeviceOnline(deviceId)) { log.warn("设备ID: {},设备不在线",deviceId); @@ -74,8 +74,12 @@ public class FileControl { fileOutputStream.close(); String filePath = dest.getAbsolutePath(); long time = System.currentTimeMillis(); - StudentBean studentBean = userDao.getStudentWithCard(card); - Integer schoolId = studentBean ==null ?null:studentBean.getSchool_id(); + StudentBean studentBean =null; + if(userType.equals("1")){ + studentBean= userDao.getTeacherWithCard(card,schoolId); + }else{ + studentBean= userDao.getStudentWithCard(card,schoolId); + } String cardNum = Long.parseLong(baseService.getCard(card),16) + ""; if (new File(filePath.trim()).exists()) { String targetPath = FileUtils.picPathComp + new File(filePath).getName(); @@ -94,7 +98,7 @@ public class FileControl { return "0"; } } else { - baseService.sendFail(cardNum, filePath, deviceId,"文件不存在", userType); + baseService.sendFailRecord(cardNum, filePath, deviceId,"文件不存在", userType,schoolId); log.error("文件不存在:" + filePath); } } catch (Exception e) { @@ -106,25 +110,27 @@ public class FileControl { @RequestMapping(value = "IsDeviceOnline", method = RequestMethod.GET) @ApiOperation("判断设备是否在线") public String IsDeviceOnline(@RequestParam("deviceId") String deviceId) { - return cmsServer.getIsDeviceOnline(deviceId) ? "1" : "0"; + if(cmsServer.getIsDeviceOnline(deviceId)){ + return "1"; + }else{ + return "0"; + } } - @RequestMapping(value = "DeleteCard", method = RequestMethod.GET) - @ApiOperation("删除人脸") + @ApiOperation("删除设备人脸") public String deleteCard(@RequestParam("deviceId") String deviceId, @RequestParam("card") String card) { - StudentBean studentBean = userDao.getStudentWithCard(card); - Integer schoolId = studentBean ==null ?null:studentBean.getSchool_id(); - cmsServer.deleteCard(deviceId, Long.parseLong(baseService.getCard(card), 16) + "",schoolId); - return "1"; + if(cmsServer.deleteCard(deviceId, Long.parseLong(baseService.getCard(card), 16) + "",null)){ + return "1"; + }else{ + return "0"; + } } @RequestMapping(value = "getCard", method = RequestMethod.GET) @ApiOperation("获取设备人脸是否存在") public String getCard(@RequestParam("deviceId") String deviceId, @RequestParam("card") String card) { - StudentBean studentBean = userDao.getStudentWithCard(card); - Integer schoolId = studentBean ==null ?null:studentBean.getSchool_id(); - if (cmsServer.getFace(deviceId, Long.parseLong(baseService.getCard(card), 16) + "",schoolId)){ + if (cmsServer.getFace(deviceId, Long.parseLong(baseService.getCard(card), 16) + "",null)){ return "1"; }else{ return "0"; diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserControl.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserControl.java index c486462..885d283 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserControl.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserControl.java @@ -1,28 +1,33 @@ package com.sincere.haikangface.control; + import com.alibaba.fastjson.JSON; -import com.sincere.haikangface.bean.*; import com.sincere.haikangface.CMSServer; import com.sincere.haikangface.async.SendUserAsync; +import com.sincere.haikangface.bean.Images2Ddevices; +import com.sincere.haikangface.bean.SendRecordBean; +import com.sincere.haikangface.bean.StudentBean; import com.sincere.haikangface.bean.face.PermissionBean; import com.sincere.haikangface.bean.face.UserAndPermission; import com.sincere.haikangface.dao.UserDao; import com.sincere.haikangface.fegin.HaikangfaceFegin; import com.sincere.haikangface.service.impl.BaseService; -import com.sincere.haikangface.utils.*; +import com.sincere.haikangface.utils.CompressPic; +import com.sincere.haikangface.utils.FileUtils; +import com.sincere.haikangface.utils.HttpUtil; import com.sincere.haikangface.xiananDao.SendRecordDao; import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import java.io.*; + +import java.io.File; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Calendar; +import java.util.Date; +import java.util.List; @RestController @RequestMapping(value = "/facereco/*", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @@ -52,7 +57,6 @@ public class UserControl { @ApiOperation("下发权限给设备") public boolean sendPermiss(@RequestBody PermissionBean permissionBean) { log.error("permissionBean:{}", JSON.toJSONString(permissionBean)); - FileUtils.getInstance().writeLogs("传入权限模板:" + JSON.toJSONString(permissionBean), "设置权限内容.txt"); if (!StringUtils.isEmpty(permissionBean.getDeviceIds())) { return sendUserAsync.sendPermiss(permissionBean, 0); } @@ -63,33 +67,22 @@ public class UserControl { @ApiOperation("下发指定教师用户权限给设备") public boolean sendUsersAndPermiss(@RequestBody UserAndPermission userAndPermission) { log.info("下发指定教师权限,权限信息permission:{}", JSON.toJSONString(userAndPermission)); - FileUtils.getInstance().writeLogs(JSON.toJSONString(userAndPermission), "下发指定教师用户权限给设备.txt"); PermissionBean permissionBean = new PermissionBean(); permissionBean.setSchoolId(userAndPermission.getSchoolId()); permissionBean.setUserType(String.valueOf(userAndPermission.getUserType())); permissionBean.setWeekDays(userAndPermission.getWeekDays()); return sendUserAsync.sendPermiss(permissionBean, 0); - } - @RequestMapping(value = "sendStuCardAndImg", method = RequestMethod.GET) - @ApiOperation("下发人脸给设备") - public boolean sendCardAndImg(@RequestParam("filePath") String filePath, @RequestParam("card") String card - , @RequestParam("name") String name, @RequestParam("deviceId") String deviceId, @RequestParam("startTime") String startTime, - @RequestParam("endTime") String endTime, @RequestParam("validTimeEnabled") int validTimeEnabled, @RequestParam("userType") String userType) { - return baseService.sendImg2Device(filePath, card, name, deviceId, userType); } - @RequestMapping(value = "sendCardAndImg1", method = RequestMethod.GET) + @RequestMapping(value = "sendStuCardAndImg", method = RequestMethod.GET) @ApiOperation("下发人脸给设备") - public boolean sendCardAndImg1(@RequestParam("filePath") String filePath, @RequestParam("card") String card, - @RequestParam("name") String name, @RequestParam("deviceId") String deviceId, - @RequestParam("userType") String userType) { - log.error("sendCardAndImg1:---------------------------------"); - return baseService.sendImg2Device(filePath, card, name, deviceId, userType); + public boolean sendCardAndImg(@RequestParam("schoolId") Integer schoolId,@RequestParam("card") String card,@RequestParam("filePath") String filePath, + @RequestParam("name") String name, @RequestParam("deviceId") String deviceId,@RequestParam("userType") String userType) { + return baseService.sendImg2Device(filePath, card, name, deviceId, userType,schoolId); } @RequestMapping(value = "sendImg2Devices", method = RequestMethod.POST) - @ApiOperation("本地下发人脸给设备") public boolean sendImg2Devices(@RequestBody Images2Ddevices images2Ddevices) throws Exception { String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); Calendar calendar = Calendar.getInstance(); @@ -139,7 +132,7 @@ public class UserControl { String cardNum = Long.parseLong(baseService.getCard(card), 16) + ""; sendUserAsync.sendStuToHaiKang(filePath.getAbsolutePath(),targetPath,cardNum, startTime, endTime,1, name, devId, images2Ddevices.getUserType(), 0,card); } else { - sendUserAsync.uploadImgs(targetPath, card, name, devId, startTime, endTime, 1, images2Ddevices.getUserType()); + sendUserAsync.uploadImgs(targetPath, card, name, devId, startTime, endTime, 1, images2Ddevices.getUserType(),Integer.parseInt(schoolId)); } } else { log.error("学生对象不存在"); @@ -155,7 +148,6 @@ public class UserControl { } @RequestMapping(value = "sendFaces", method = RequestMethod.GET) - @ApiOperation(value = "下发学校下所有人脸给指定设备", notes = "下发所有人脸给指定设备") public void sendFaces(@RequestParam("deviceIds") String deviceIds, @RequestParam("schoolId") String schoolId, @RequestParam("userType") String userType) { String typeName = userType.equals("1") ? "Teacher" : "Student"; String imgPath = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; @@ -201,12 +193,6 @@ public class UserControl { } @RequestMapping(value = "sendErrorFaces", method = RequestMethod.GET) - @ApiOperation(value = "下发失败的人脸", notes = "下发失败的人脸") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deviceid", required = false), - @ApiImplicitParam(name = "userType", required = false), - @ApiImplicitParam(name = "schoolId", required = true) - }) public void sendErrorFaces(String schoolId, String deviceid, String userType) { log.info("开始下发失败人脸:schoolId:" + schoolId + "---deviceid:" + deviceid + "---userType:" + userType); //不传的话就默认失败表中的类型 @@ -225,9 +211,7 @@ public class UserControl { } @RequestMapping(value = "sendFaceNotExits", method = RequestMethod.GET) - @ApiOperation(value = "下发学校下还没有下发的人脸给指定设备", notes = "下发学校下还没有下发的人脸给指定设备") public void sendFaceNotExits(@RequestParam("deviceIds") String deviceIds, @RequestParam("schoolId") String schoolId, @RequestParam("userType") String userType) { - String typeName = userType.equals("1") ? "Teacher" : "Student"; String imgPath = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; @@ -282,52 +266,35 @@ public class UserControl { } - @RequestMapping(value = "sendFaceToDevices", method = RequestMethod.GET) - @ApiOperation(value = "下发单个用户给指定设备", notes = "下发单个用户给指定设备") - @ApiImplicitParams( - {@ApiImplicitParam(name = "deviceIds", value = "设备id用逗号,拼接"), - @ApiImplicitParam(name = "file", value = "100服务器上图片绝对路径")}) - public void sendFaceToDevices(@RequestParam("deviceIds") String deviceIds, @RequestParam("userType") String userType, - @RequestParam("file") String file, @RequestParam("card") String card, @RequestParam("name") String name) { - String[] deviceIdsStr = deviceIds.split(","); - File file1 = new File(file); - String targetPath = FileUtils.picPathComp + file1.getName(); - try { - CompressPic.CompressPic(file1.getAbsolutePath(), targetPath); - } catch (Exception e) { - e.printStackTrace(); - } - for (int i = 0; i < deviceIdsStr.length; i++) { - String deviceId = deviceIdsStr[i]; - StudentBean studentBean = userDao.getStudentWithCard(card); - Integer schoolId = studentBean ==null ?null:studentBean.getSchool_id(); - baseService.sendImg(file1.getAbsolutePath(), targetPath, deviceId, card, name, userType,schoolId); - } - - } - - @RequestMapping(value = "DeleteCard", method = RequestMethod.GET) - @ApiOperation("删除人脸") public boolean deleteCard(@RequestParam("deviceId") String deviceId, @RequestParam("card") String card) { - StudentBean studentBean = userDao.getStudentWithCard(card); - Integer schoolId = studentBean ==null ?null:studentBean.getSchool_id(); + StudentBean studentBean = userDao.getStudentWithCard(card,null); + if(studentBean ==null){ + log.error("此卡号未检索到对应学生"); + return false; + } if (cmsServer.getIsDeviceOnline(deviceId)) { String cardNo = Long.parseLong(baseService.getCard(card), 16) + ""; - cmsServer.deleteCard(deviceId, cardNo,schoolId); + return cmsServer.deleteCard(deviceId, cardNo,null); }else{ - HttpUtil.deleteCard(deviceId, card); + return HttpUtil.deleteCard(deviceId, card); } - return true; } @RequestMapping(value = "getCard", method = RequestMethod.GET) @ApiOperation("获取设备人脸是否存在") public boolean getCard(@RequestParam("deviceId") String deviceId,@RequestParam("card") String card) { - StudentBean studentBean = userDao.getStudentWithCard(card); - Integer schoolId = studentBean ==null ?null:studentBean.getSchool_id(); - String cardNo = Long.parseLong(baseService.getCard(card),16)+""; - return cmsServer.getFace(deviceId, cardNo,schoolId); + StudentBean studentBean = userDao.getStudentWithCard(card,null); + if(studentBean ==null){ + log.error("此卡号未检索到对应学生"); + return false; + } + if (cmsServer.getIsDeviceOnline(deviceId)) { + String cardNo = Long.parseLong(baseService.getCard(card), 16) + ""; + return cmsServer.getFace(deviceId, cardNo,null); + }else{ + return HttpUtil.deleteCard(deviceId, card); + } } @RequestMapping(value = "IsDeviceOnline", method = RequestMethod.GET) @@ -340,80 +307,10 @@ public class UserControl { } } - @RequestMapping(value = "FaceUploadFile", method = RequestMethod.POST) - @ApiOperation("人脸图片上传") - public String FaceUploadFile(@RequestParam("file") MultipartFile file) { - - String targetPath = FileUtils.picPathComp; - System.out.println("fileName:" + file.getOriginalFilename()); - return "sss"; - - } - - -// @RequestMapping(value = "getKaoqinTem", method = RequestMethod.GET) -// @ApiOperation("根据设备获取考勤模板") -// public String getKaoqinTem(@RequestParam("deviceId") String deviceId) { -// SZ_AttendanceDto attendanceBean = haikangfaceFegin.selectAttendaceWithId(deviceId); -// System.out.println("isKaoqin:" + attendanceBean.toString()); -// int isKaoqin = attendanceBean.getIsKaoqin();//获取考勤模板id -// List attendanceBeans = haikangfaceFegin.getAttensWithIsKaoqin(isKaoqin);//获取同一模板下的设备 -// String content = ""; -// -// for (int i = 0; i < attendanceBeans.size(); i++) { -// String clientId = attendanceBeans.get(i).getClint_id(); -// if (!StringUtils.isEmpty(clientId)) content += clientId + ","; -// } -// return content.substring(0, content.lastIndexOf(",")); -// } - - -// @RequestMapping(value = "addFace", method = RequestMethod.GET) -// @ApiOperation("注册人脸") -// public String addFace(@RequestParam("imgPath") String imgPath, @RequestParam("group_id") String group_id, -// @RequestParam("user_id") String user_id, @RequestParam("user_info") String user_info) { -// -// return BaiduApiUtiols.getInstance().registerFace(imgPath, group_id, user_id, user_info); -// } -// -// @RequestMapping(value = "searchFace", method = RequestMethod.GET) -// @ApiOperation("搜索人脸") -// public String searchFace(@RequestParam("imgPath") String imgPath, @RequestParam("group_id") String group_id, -// @RequestParam("user_id") String user_id) { -// -// return BaiduApiUtiols.getInstance().searchFace(imgPath, group_id, user_id); -// } - - @RequestMapping(value = "sendFiles", method = RequestMethod.GET) - @ApiOperation("批量下发人脸") - public String sendFiles() { - - List studentBeans = userDao.getAllStus(); - String filePath = ""; - List deviceId = userDao.getDeviceIdsWidthSchoolId(562); - - for (int i = 0; i < studentBeans.size(); i++) { - StudentInfo studentBean = studentBeans.get(i); - - filePath = "C://Student//" + studentBean.getStudentcode() + ".png"; - System.out.println("filePath:" + new File(filePath).exists() + " devId:" + deviceId.toString()); - if (!new File(filePath).exists()) - FileUtils.getInstance().writeLogs(studentBean.getStudentcode(), FileUtils.studentcode); - - for (int j = 0; j < deviceId.size(); j++) { - String devId = deviceId.get(j); - sendCardAndImg(filePath, studentBean.getStudent_num(), studentBean.getName(), devId, "2019-10-30 12:00:00", "2030-10-10 10:00:00", - 1, "2"); - } - } - return ""; - } - @RequestMapping(value = "isTeacher", method = RequestMethod.GET) - @ApiOperation("测试教师点名") - public void isTeacher(@RequestParam("deviceId") String deviceId, @RequestParam("cardNo") String cardNo) { + public void isTeacher(@RequestParam("schoolId") Integer schoolId,@RequestParam("deviceId") String deviceId, @RequestParam("cardNo") String cardNo) { try { - cmsServer.isTeacher(cardNo, deviceId); + cmsServer.isTeacher(cardNo, deviceId,schoolId); } catch (Exception e) { e.printStackTrace(); } @@ -423,7 +320,7 @@ public class UserControl { @ApiOperation("发送数据到看板") public void sendToKB(@RequestParam("filePath") String filePath, @RequestParam("deviceid") String deviceid) { try { - baseService.sendUserInfoToKB(new File(filePath), deviceid); + cmsServer.sendUserInfoToKB(new File(filePath), deviceid); } catch (Exception e) { e.printStackTrace(); } 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 4c29bf7..457affe 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 @@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; /** * 用户信息、人脸、卡信息、权限下发控制类 @@ -66,15 +67,9 @@ public class UserOperateController { } @ApiOperation(value = "照片下发2.0") - @RequestMapping(value = "sendFace", method = RequestMethod.GET) - public Result sendFace(@RequestParam("schoolId") String schoolId, @RequestParam("type") int type,@RequestParam("deviceIds") String deviceIds) { - return userOperateService.sendFace(schoolId,type,deviceIds); - } - - @ApiOperation(value = "照片下发2.1") @RequestMapping(value = "sendFaceByThread", method = RequestMethod.POST) - public Result sendFaceByThread(@RequestBody SendFaceDto sendFaceDto) { - return userOperateService.sendUserFaceByThread(sendFaceDto); + public Result sendFaceByThread(@RequestBody SendFaceDto sendFaceDto,@RequestParam(value = "groupId",required = false) Integer groupId) { + return userOperateService.sendUserFaceByThread(sendFaceDto,groupId); } @ApiOperation(value = "删除下发失败人脸2.0") @@ -91,14 +86,32 @@ public class UserOperateController { @ApiOperation(value = "删除指定人脸2.0") @RequestMapping(value = "deleteFace", method = RequestMethod.POST) - public Result deleteFace(@RequestParam("schoolId") Integer schoolId, @RequestParam("cards") String cards,@RequestParam("deviceIds") String deviceIds) { + public Result deleteFace(@RequestParam("schoolId") Integer schoolId, @RequestParam("cards") String cards, + @RequestParam(value = "deviceIds",required = false) String deviceIds) { return userOperateService.deleteFace(schoolId,cards,deviceIds); } - @ApiOperation(value = "测试下发人脸2.0") - @RequestMapping(value = "deleteFaceTest", method = RequestMethod.POST) - public Result deleteFaceTest(@RequestParam("schoolId") Integer schoolId,@RequestParam("deviceIds") String deviceIds) { - return userOperateService.deleteFaceTest(schoolId,deviceIds); + @ApiOperation(value = "下发未下发的人脸至指定设备2.0") + @RequestMapping(value = "sendFaceForNoSend", method = RequestMethod.POST) + public Result sendFaceForNoSend(@RequestParam("schoolId") Integer schoolId,@RequestParam("userType") Integer userType, + @RequestParam(value = "studentType",required = false) Integer studentType, + @RequestParam(value = "sex",required = false) String sex, + @RequestParam(value = "deviceIds",required = false) String deviceIds) { + return userOperateService.sendFaceForNoSend(schoolId,studentType,sex,userType,deviceIds); + } + + @ApiOperation(value = "补发单个人脸至指定设备2.0") + @RequestMapping(value = "againNoSendOneFace", method = RequestMethod.POST) + public Result againNoSendOneFace(@RequestParam("file") MultipartFile file,@RequestParam("schoolId") Integer schoolId, + @RequestParam("cardNum") String cardNum,@RequestParam("userType") Integer userType,@RequestParam("deviceIds") String deviceIds) { + return userOperateService.againNoSendOneFace(file,schoolId,cardNum,userType,deviceIds); + } + + + @ApiOperation(value = "捷安成闸机导入") + @RequestMapping(value = "insertUpdateCard", method = RequestMethod.POST) + public Result insertUpdateCard(@RequestParam("cardNums") String cardNums){ + return userOperateService.insertUpdateCard(cardNums); } } 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 77edd3a..e2e20db 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 @@ -49,13 +49,6 @@ public interface UserDao { @Select("select * from SZ_User where user_id = #{user_id}") UserBean getUser(@Param("user_id") String user_id); - - @Select("select Top(1)* from SZ_V_School_Student where student_num = #{card}") - StudentBean getStudentWithCard(@Param("card") String card); - - @Select("select Top(1)* from SZ_V_School_Teacher where teacher_num = #{teacher_num}") - StudentBean getTeacherWithCard(@Param("teacher_num") String teacher_num); - @Select("select school_name from SZ_School where school_id = #{schoolid}") String getSchoolName(@Param("schoolid") String schoolid); @@ -264,16 +257,31 @@ public interface UserDao { void updateAuthRecord(@Param("id") Integer authId, @Param("grantState") Integer grantState); - StudentBean getStudentCByUserId(@Param("userId") String userId); - - StudentBean getTeacherByUserId(@Param("userId") String userId); - @Select("select clint_type from SZ_Attendance where clint_id = #{deviceId}") Integer getClintTypeByDeviceId(@Param("deviceId") String deviceId); List getStudentList(@Param("schoolId") Integer schoolId,@Param("studentType")Integer studentType,@Param("sex") List sex); + List getStudentCardGroup(@Param("schoolId") Integer schoolId,@Param("studentType")Integer studentType,@Param("sex") String sex,@Param("groupId")Integer groupId); + List getTeacherList(@Param("schoolId") Integer schoolId); List getDeviceIds(@Param("schoolId") Integer schoolId,@Param("deviceId") String deviceId); + + void updateUser(@Param("userId") String userId,@Param("face") String face); + + List queryStudentIdList(@Param("schoolId") Integer schoolId,@Param("roomId")Integer roomId); + + @Select(" select top 1* from SZ_V_School_Student where student_id = #{student_id}") + StudentBean getStudentWithid(@Param("student_id") String student_id); + + StudentBean getStudentCByUserId(@Param("userId") String userId,@Param("schoolId") Integer schoolId); + + StudentBean getTeacherByUserId(@Param("userId") String userId,@Param("schoolId") Integer schoolId); + + StudentBean getStudentWithCard(@Param("card") String card,@Param("schoolId") Integer schoolId); + + StudentBean getTeacherWithCard(@Param("teacher_num") String teacher_num,@Param("schoolId") Integer schoolId); + + void insertCard(UpdateCardBean bean); } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqtUtils.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqtUtils.java index 5f38b58..d854a63 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqtUtils.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqtUtils.java @@ -21,7 +21,6 @@ public class MqtUtils { } public void sendMsg(String deviceId, String content) { - mqttManager.sendMq(deviceId, content); } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqttManager.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqttManager.java index 5218262..c96056a 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqttManager.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/mqtt/MqttManager.java @@ -23,20 +23,6 @@ public class MqttManager { private static MqttManager mqttManager; -// public static MqttManager getInstance(){ -// -// if (null==mqttManager){ -// synchronized (MqttManager.class){ -// if (null==mqttManager) { -// mqttManager = new MqttManager(); -// init(); -// } -// } -// } -// return mqttManager; -// } - - public void init() { final String brokerUrl = "tcp://post-cn-4590mq2hr03.mqtt.aliyuncs.com:1883"; groupId = "GID_HFJSIURFHAQO110"; @@ -97,15 +83,6 @@ public class MqttManager { System.out.println("mqtt:" + e.toString()); e.printStackTrace(); } - /*while (true){ - sendMessageTest("528C8E6CD4A3C659","zy105387",0); - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - System.out.println("connect success:"+e); - e.printStackTrace(); - } - }*/ } } 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 452fcba..2e817dd 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 @@ -3,9 +3,8 @@ package com.sincere.haikangface.service; import com.sincere.haikangface.bean.Result; import com.sincere.haikangface.bean.face.AuthRecordDto; import com.sincere.haikangface.bean.face.DeviceAuthRecord; -import com.sincere.haikangface.bean.face.PermissionBean; import com.sincere.haikangface.bean.face.SendFaceDto; -import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; /** * 用户操作业务接口 @@ -53,20 +52,11 @@ public interface UserOperateService { Result againSendFace(String userId,String deviceId,Integer userType); /** - * 批量照片下发 - * @param schoolId - * @param type - * @param deviceIds - * @return - */ - Result sendFace(String schoolId,Integer type,String deviceIds); - - /** * 多线程照片下发 * @param sendFaceDto * @return */ - Result sendUserFaceByThread(SendFaceDto sendFaceDto); + Result sendUserFaceByThread(SendFaceDto sendFaceDto,Integer groupId); /** * 删除失败表人脸 @@ -91,6 +81,27 @@ public interface UserOperateService { */ Result deleteFace(Integer schoolId,String cards,String deviceIds); - Result deleteFaceTest(Integer schoolId,String deviceIds); + /** + * 下发未下发完的人脸,仅供测试使用 + * @param schoolId + * @param studentType + * @param sex + * @param deviceIds + * @return + */ + Result sendFaceForNoSend(Integer schoolId,Integer studentType,String sex,Integer userType,String deviceIds); + + /** + * 补发单个人脸至指定设备 + * @param file + * @param schoolId + * @param cardNum + * @param userType + * @param deviceIds + * @return + */ + Result againNoSendOneFace(MultipartFile file,Integer schoolId,String cardNum,Integer userType,String deviceIds); + + Result insertUpdateCard(String cardNums); } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java index 253bd17..ed6916a 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/service/impl/BaseService.java @@ -1,29 +1,21 @@ package com.sincere.haikangface.service.impl; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.sincere.haikangface.CMSServer; -import com.sincere.haikangface.async.SendFaceBatchTask100; -import com.sincere.haikangface.async.SendFaceBatchTask253; +import com.sincere.haikangface.async.AsyncTask; import com.sincere.haikangface.async.SendUserAsync; -import com.sincere.haikangface.bean.BaiduFaceRecorder; import com.sincere.haikangface.bean.SendRecordBean; import com.sincere.haikangface.bean.StudentBean; -import com.sincere.haikangface.bean.TeacherBean; import com.sincere.haikangface.dao.UserDao; import com.sincere.haikangface.enums.EnumSzBusinessType; -import com.sincere.haikangface.mqtt.MqtUtils; import com.sincere.haikangface.utils.CompressPic; import com.sincere.haikangface.utils.DateUtils; import com.sincere.haikangface.utils.FileUtils; -import com.sincere.haikangface.utils.HttpUtil; import com.sincere.haikangface.xiananDao.SendRecordDao; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -51,10 +43,7 @@ public class BaseService { @Autowired SendUserAsync sendUserAsync; - @Value("${ipCloud}") - private String ipCloud; - - public boolean sendImg2Device(String filePath, String card, String name, String deviceId, String userType) { + public boolean sendImg2Device(String filePath, String card, String name, String deviceId, String userType,Integer schoolId) { try { if (new File(filePath.trim()).exists()) { String targetPath = FileUtils.picPathComp + new File(filePath).getName(); @@ -63,12 +52,14 @@ public class BaseService { } catch (Exception e) { e.printStackTrace(); } - StudentBean studentBean = userDao.getStudentWithCard(card); - Integer schoolId = studentBean ==null ?null:studentBean.getSchool_id(); - + StudentBean studentBean = userDao.getStudentWithCard(card,schoolId); + if(studentBean ==null){ + log.error("此卡号未检索到对应学生"); + return false; + } return sendImg(filePath, targetPath, deviceId, card, name, userType,schoolId); } else { - sendFail(Long.parseLong(getCard(card), 16) + "", filePath, deviceId,"文件不存在", userType); + sendFailRecord(Long.parseLong(getCard(card), 16) + "", filePath, deviceId,"文件不存在", userType,schoolId); System.out.println("文件不存在:" + filePath); } } catch (Exception e) { @@ -95,13 +86,13 @@ public class BaseService { //下发标识:详情见枚举 EnumHkOperateType int validTimeEnabled = EnumSzBusinessType.EnumHkOperateType.ADD.code; try { - FileUtils.getInstance().writeLogs("startTime:" + startTime + "---endTime:" + endTime + "---card:" + card, "下发参数"); + log.info("startTime:" + startTime + "---endTime:" + endTime + "---card:" + card); if (cmsServer.getIsDeviceOnline(deviceId)) { String cardNo = Long.parseLong(getCard(card),16)+""; //下发海康设备 sendUserAsync.sendStuToHaiKang(filePath,targetPath, cardNo, startTime, endTime, validTimeEnabled, name, deviceId, userType,schoolId,card); }else { - sendUserAsync.uploadImgs(targetPath, card, name, deviceId, startTime, endTime, validTimeEnabled, userType); + sendUserAsync.uploadImgs(targetPath, card, name, deviceId, startTime, endTime, validTimeEnabled, userType,schoolId); } return true; } catch (Exception e) { @@ -158,15 +149,15 @@ public class BaseService { /** * 保存成功下发记录 */ - public synchronized void sendSuccessRecord(String resultCard, String faceUrl, String deviceId,String userType) { + public synchronized void sendSuccessRecord(String resultCard, String faceUrl, String deviceId,String userType,Integer schoolId) { try{ StudentBean studentBean = null; switch (userType) { case "1"://老师 - studentBean = userDao.getTeacherWithCard(resultCard); + studentBean = userDao.getTeacherWithCard(resultCard,schoolId); break; case "2"://学生 - studentBean = userDao.getStudentWithCard(resultCard); + studentBean = userDao.getStudentWithCard(resultCard,schoolId); break; case "3"://家长 break; @@ -176,8 +167,6 @@ public class BaseService { String userId = studentBean.getUser_id(); //用户名称 String userName = studentBean.getName(); - //所属学校 - int schoolId = studentBean.getSchool_id(); String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + ""); List sendRecordBeans = sendRecordDao.getRecordIsExit(deviceId,resultCard,userId); @@ -187,11 +176,10 @@ public class BaseService { } if (null == sendRecordBean) { sendRecordDao.saveFaceRecord(userId, deviceId, resultCard, userName, time, schoolName, - faceUrl, schoolId,null,null, Integer.parseInt(userType),18,1); + faceUrl, schoolId,null,null, Integer.parseInt(userType),18,1,null); } else { - sendRecordDao.updateFaceSuccessRecord(deviceId,resultCard,time,faceUrl,userName,userId); + sendRecordDao.updateFaceSuccessRecord(deviceId,resultCard,time,faceUrl,userName,userId,null); } - FileUtils.getInstance().writeLogs(studentBean.toString() + "\r\n" + resultCard, "下发成功记录"); } else { log.error("用户不存在: 对应卡号{} ," + resultCard); } @@ -207,15 +195,16 @@ public class BaseService { * @param content * @param userType */ - public synchronized void sendFailRecord(String resultCard, String faceUrl, String deviceId,String content,String userType) { + public synchronized void sendFailRecord(String resultCard, String faceUrl, String deviceId,String content,String userType,Integer schoolId) { + log.info("保存失败记录卡号:"+resultCard); try{ StudentBean studentBean = null; switch (userType) { case "1"://老师 - studentBean = userDao.getTeacherWithCard(resultCard); + studentBean = userDao.getTeacherWithCard(resultCard,schoolId); break; case "2"://学生 - studentBean = userDao.getStudentWithCard(resultCard); + studentBean = userDao.getStudentWithCard(resultCard,schoolId); break; case "3"://家长 break; @@ -225,8 +214,6 @@ public class BaseService { String userId = studentBean.getUser_id(); //用户名称 String userName = studentBean.getName(); - //所属学校 - int schoolId = studentBean.getSchool_id(); String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + ""); List sendRecordBeans = sendRecordDao.getRecordIsExit(deviceId,resultCard,userId); @@ -236,7 +223,7 @@ public class BaseService { } if (null == sendRecordBean) { sendRecordDao.saveFaceRecord(userId, deviceId, resultCard, userName, time, schoolName, - faceUrl, schoolId, content,9, Integer.parseInt(userType),18,2); + faceUrl, schoolId, content,9, Integer.parseInt(userType),18,2,null); }else { sendRecordDao.updateFaceFailRecord(deviceId,faceUrl,resultCard,time,content,userId); } @@ -248,103 +235,6 @@ public class BaseService { } } - public synchronized void sendSuccess(String card,String faceUrl,String deviceId,String userType) { -// BigInteger bigInteger = new BigInteger(card); - long lon = Long.parseLong(card); - String resultCard = getCard(String.format("%08x", lon)).toUpperCase(); - StudentBean studentBean = null; - String customerId = ""; - switch (userType) { - case "1"://老师 - studentBean = userDao.getTeacherWithCard(resultCard); - customerId = studentBean.getTeacher_id(); - break; - case "2"://学生 - studentBean = userDao.getStudentWithCard(resultCard); - customerId = studentBean.getStudent_id(); - break; - case "3"://家长 - - break; - } - if (null != studentBean) { - String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + ""); - List sendRecordBeans = sendRecordDao.getSuccessIsExitStu(deviceId, resultCard); - SendRecordBean sendRecordBean = null; - //处理重复添加的数据 - if (null != sendRecordBeans && sendRecordBeans.size() > 1) { - for (int i = 0; i < sendRecordBeans.size(); i++) { - sendRecordDao.deleteFaceSuccess(sendRecordBeans.get(i).getNum(), sendRecordBeans.get(i).getDeviceID()); - } - } else if (null != sendRecordBeans && sendRecordBeans.size() == 1) { - sendRecordBean = sendRecordBeans.get(0); - } - if (null == sendRecordBean) { - //添加成功日志 - sendRecordDao.addFaceSuccess(customerId, deviceId, resultCard, studentBean.getName(), time, schoolName, - faceUrl, studentBean.getSchool_id(), Integer.parseInt(userType), 18); - } else { - sendRecordDao.updateFaceSuccess(deviceId, resultCard, time, faceUrl, studentBean.getName(), customerId); - } - FileUtils.getInstance().writeLogs(studentBean.toString() + "\r\n" + resultCard, "下发成功记录"); - //删除下发失败表中的数据 - sendRecordDao.deleteFaceFail(resultCard, deviceId); - } else { - log.error("用户不存在: 卡号 {}," + resultCard); - } - } - - /** - * 下发人脸失败 - * - * @param card - * @param faceUrl - * @param deviceId - */ - public synchronized void sendFail(String card, String faceUrl, String deviceId,String content, String userType) { -// BigInteger bigInteger = new BigInteger(card); - long lon = Long.parseLong(card); - String resultCard = getCard(String.format("%08x", lon)).toUpperCase(); - StudentBean studentBean = null; - String customerId = ""; - switch (userType) { - case "1"://老师 - studentBean = userDao.getTeacherWithCard(resultCard); - customerId = studentBean.getTeacher_id(); - break; - case "2"://学生 - studentBean = userDao.getStudentWithCard(resultCard); - customerId = studentBean.getStudent_id(); - break; - case "3"://家长 - break; - } - if (null != studentBean) { - String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - String schoolName = userDao.getSchoolName(studentBean.getSchool_id() + ""); - List sendRecordBeans = sendRecordDao.getFailIsExit(deviceId, resultCard); - - SendRecordBean sendRecordBean = null; - //处理重复添加的数据 - if (null != sendRecordBeans && sendRecordBeans.size() > 1) { - for (int i = 0; i < sendRecordBeans.size(); i++) { - sendRecordDao.deleteFaceFail(sendRecordBeans.get(i).getNum(), sendRecordBeans.get(i).getDeviceID()); - } - } else if (null != sendRecordBeans && sendRecordBeans.size() == 1) { - sendRecordBean = sendRecordBeans.get(0); - } - if (null == sendRecordBean) { - sendRecordDao.addFaceFail(customerId, deviceId, resultCard, studentBean.getName(), time, schoolName, - faceUrl, studentBean.getSchool_id(), content, 9, Integer.parseInt(userType), 18); - } else { - sendRecordDao.updateFaceFail(deviceId, resultCard, time, content); - } - } else { - log.error("用户不存在: 卡号 {}," + resultCard); - } - } - /** * 校验卡号 * @param card @@ -379,153 +269,8 @@ public class BaseService { return dateStr; } - //存储抓拍人脸用户信息 - private static Map userMap = new HashMap<>(); - - /** - * 人脸发送看板信息 - * @param file - * @param deviceId - */ - public void sendUserInfoToKB(File file,String deviceId){ - //获取学校ID - String schoolId = userDao.getSchoolIdWithDevId(deviceId); - //请求人脸识别 - JSONObject jsonObject = HttpUtil.sendToKB(file,schoolId); - if(jsonObject ==null){ - log.error("人脸识别失败,返回数据为空"); - return; - } - String face = jsonObject.getString("data"); - if (face.startsWith("face") || face.startsWith("pic")){ - log.error("人脸识别失败"); - return; - } - JSONObject data = jsonObject.getJSONObject("data"); - String errorMsg = data.getString("error_msg"); - //识别成功 - if (errorMsg.equals("SUCCESS")) { - JSONObject result = data.getJSONObject("result"); - //用户信息 - JSONArray userList = result.getJSONArray("user_list"); - if (userList != null && userList.size() > 0) { - for (int i = 0; i < userList.size(); i++) { - JSONObject user = userList.getJSONObject(i); - //用户ID - String userId = user.getString("user_id"); - //比对成功分数值 - String score = user.getString("score"); - double sc = Double.valueOf(score.split("\\.")[0]); - if (sc >= 60) { - TeacherBean teacherBean = userDao.getTeacherWithUserId1(userId); - if (null != teacherBean) { - String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - teacherBean.setTime(time); - if (StringUtils.isBlank(teacherBean.getTeacer_num())){ - teacherBean.setTeacer_num(userId); - } - //保存百度人脸识别记录 - saveBaiDuFaceRecorder(teacherBean,file,sc,userId); - //同一用户抓拍时间在60秒内,则部不发送看板 - if (userMap.containsKey(userId) && userMap.get(userId)!=null) { - long value = userMap.get(userId); - if ((System.currentTimeMillis() - value) / 1000 > 60) { - userMap.put(userId,System.currentTimeMillis()); - send2DeviceIds(schoolId, teacherBean); - log.info("发送成功....."); - } - } else { - userMap.put(userId, System.currentTimeMillis()); - send2DeviceIds(schoolId, teacherBean); - log.info("发送成功....."); - } - } else { - log.info("用户身份信息不存在"); - sendNoPersonImg(file,schoolId); - } - } else { - log.info("用户身份信息不存在" + score); - sendNoPersonImg(file,schoolId); - } - } - } - } else { - log.error("百度人脸识别失败, 返回信息:{}" + jsonObject.toJSONString()); - } - } - - /** - * 发送平台用户信息至看板设备 - * @param schoolId - * @param teacherBean - */ - private void send2DeviceIds(String schoolId, TeacherBean teacherBean) { - List deviceIds = userDao.getKBDevices(schoolId); - if (deviceIds != null) { - for (int i = 0; i < deviceIds.size(); i++) { - String deviceId = deviceIds.get(i); - if (!StringUtils.isEmpty(deviceId)) { - String content = "{\"cmd\":\"" + 1 + "\",\"clientId\":\"\",\"data\": " + teacherBean.toString() + "}"; - MqtUtils.getInstance().sendMsg(deviceId, content); - } - } - } - } - - /** - * 发送陌生人信息至设备看板 - * @param faceFile - * @param schoolId - */ - private void sendNoPersonImg(File faceFile, String schoolId) { - List deviceIds = userDao.getKBDevices(schoolId); - String imgName = faceFile.getName(); - String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); - if (imgName.contains(date)) { - String imgId = imgName.substring(0, imgName.indexOf(date)); - String api = "/kms/services/rest/dataInfoService/downloadFile?id=" + imgId; - String imgUrl = ipCloud+":8081"+ api; - FileUtils.getInstance().writeLogs("文件名:" + imgUrl, FileUtils.fileNoPerson); - for (int i = 0; i < deviceIds.size(); i++) { - String deviceId = deviceIds.get(i); - if (!org.springframework.util.StringUtils.isEmpty(deviceId)){ - String content = "{\"cmd\":\"" + 2 + "\",\"clientId\":\"\",\"data\": \"" + imgUrl + "\"}"; - MqtUtils.getInstance().sendMsg(deviceId, content); - } - } - } - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - private void saveBaiDuFaceRecorder(TeacherBean teacherBean,File faceFile,double score,String userId){ - String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); - BaiduFaceRecorder baiduFaceRecorder = new BaiduFaceRecorder(); - baiduFaceRecorder.setUserId(userId); - baiduFaceRecorder.setName(teacherBean.getName()); - baiduFaceRecorder.setScore(score + ""); - baiduFaceRecorder.setTime(teacherBean.getTime()); - baiduFaceRecorder.setUserImgUrl(teacherBean.getFace()); - String uploadImgUrl = ""; - if(faceFile.getAbsolutePath().contains(date)){ - //抓拍照片ID - String imgId = faceFile.getName().substring(0,faceFile.getName().indexOf(date)); - String api = "/kms/services/rest/dataInfoService/downloadFile?id=" +imgId; - uploadImgUrl = ipCloud+ api; - }else { - uploadImgUrl = faceFile.getAbsolutePath(); - } - baiduFaceRecorder.setUploadImgUrl(uploadImgUrl); - - //插入百度人脸记录表 - userDao.insertBaiduFaceRecorder(baiduFaceRecorder); - } - @Async - public void sendUserFaceByAsyncThread(Integer schoolId,Integer userType,Integer studentType,String sex,List deviceList){ + public void sendUserFaceByAsyncThread(Integer schoolId,Integer userType,List studentBeanList,List deviceList){ List deviceId_100 = new ArrayList<>(); List deviceId_253 = new ArrayList<>(); //过滤设备 @@ -537,46 +282,19 @@ public class BaseService { deviceId_253.add(sno); } } - //根据类型获取下发用户信息 - List studentBeanList = null; - if (userType == EnumSzBusinessType.EnumUserType.TEACHER.code) { - studentBeanList = getTeacherList(schoolId); - } - if (userType == EnumSzBusinessType.EnumUserType.STUDENT.code) { - studentBeanList = getStudentList(schoolId,studentType,sex); - } - log.info("统计共有下发用户数量:"+studentBeanList.size()); if(deviceId_100.size()>0){ //100服务器 - sendFaceToDevice100(deviceId_100,studentBeanList,String.valueOf(schoolId),userType); + sendFaceToDevice100(deviceId_100,studentBeanList,schoolId,userType); } if(deviceId_253.size()>0){ //253服务器 - sendFaceToDevice253(deviceId_253,studentBeanList,String.valueOf(schoolId),userType); + sendFaceToDevice253(deviceId_253,studentBeanList,schoolId,userType); } } - protected void sendFaceToDevice100(List deviceIds,List studentBeanList,String schoolId,Integer userType){ + protected void sendFaceToDevice100(List deviceIds,List studentBeanList,Integer schoolId,Integer userType){ log.info("------------------------开始执行100服务,人脸照下发---------------------"); -// //启用多线程执行 -// CountDownLatch begin = new CountDownLatch(1); -// CountDownLatch end = new CountDownLatch(deviceIds.size()); -// ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-sendFace-runner-%d").build(); -// ExecutorService exe = new ThreadPoolExecutor(4,8,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue(),namedThreadFactory); -// for(String sno : deviceIds){ -// log.info("设备ID:"+ sno); -// exe.execute(new SendFaceBatchTask100(schoolId,userType,sno,studentBeanList,FileUtils.getInstance(),sendUserAsync,begin,end)); -// } -// begin.countDown(); -// try { -// end.await(); -// }catch (Exception e){ -// log.error("下发人脸照失败"+e); -// e.printStackTrace(); -// } -// exe.shutdown(); -// System.out.println("统计100服务器总共有"+deviceIds.size()+"个设备,处理完毕"); String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.YEAR, 10); @@ -592,17 +310,26 @@ public class BaseService { if (StringUtils.isBlank(photo) || StringUtils.isBlank(cardNum)){ continue; } -// String path = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; - String path = "D:\\haikangface\\School" + schoolId + "\\" + typeName; + String[] fileNameStr = photo.split(typeName +"/"); + if(fileNameStr.length==0){ + continue; + } + //以学籍号为名的文件名 + String fileName = fileNameStr[1]; + //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="E:\\wwwhtdocs\\SmartCampus\\f0i5l7e5\\" + afterStr; - } else{ - //以学籍号为名的文件名 - String fileName = photo.split(typeName +"/")[1]; - //100服务器上人脸照绝对路径 - filePath = path+ "\\" + fileName; + filePath= path_3 + afterStr; + } + if(photo.indexOf("face17e5")!=-1){ + filePath = path_2 + "\\" + fileName; + } + if(photo.indexOf("face17e50")!=-1){ + filePath = path_1 + "\\" + fileName; } log.info("卡号:{},人脸路径:{}, ",cardNum,filePath); File file = new File(filePath);//图片 @@ -611,8 +338,7 @@ public class BaseService { try { CompressPic.CompressPic(file.getAbsolutePath(), targetPath); } catch (Exception e) { - log.error("压缩图片失败"); - e.printStackTrace(); + log.error("压缩图片失败:",e); continue; } for(String sno : deviceIds){ @@ -620,42 +346,23 @@ public class BaseService { if(!StringUtils.isBlank(cardNum)){ String cardNumLong = Long.parseLong(getCard(cardNum),16) + ""; //下发100海康设备 - sendUserAsync.sendStuToHaiKang(file.getAbsolutePath(),targetPath,cardNumLong, startTime, endTime, validTimeEnabled, userName, sno, String.valueOf(userType),Integer.parseInt(schoolId),cardNum); + sendUserAsync.sendStuToHaiKang(file.getAbsolutePath(),targetPath,cardNumLong, startTime, endTime, validTimeEnabled, userName, sno, String.valueOf(userType),schoolId,cardNum); } }else{ log.error("100服务器,设备不在线"); } - } } }catch (Exception e){ - log.error("人脸下发失败"); - e.printStackTrace(); + log.error("人脸下发失败,异常信息:",e); continue; } } } - protected void sendFaceToDevice253(List deviceIds,List studentBeanList,String schoolId,Integer userType){ + protected void sendFaceToDevice253(List deviceIds,List studentBeanList,Integer schoolId,Integer userType){ log.info("------------------------开始执行253服务,人脸照下发---------------------"); -// //启用多线程执行 -// CountDownLatch begin = new CountDownLatch(1); -// CountDownLatch end = new CountDownLatch(deviceIds.size()); -// ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-sendFace-runner-%d").build(); -// ExecutorService exe = new ThreadPoolExecutor(8,8,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue(),namedThreadFactory); -// for(String sno : deviceIds){ -// log.info("设备ID:"+ sno); -// exe.execute(new SendFaceBatchTask253(schoolId,userType,sno,studentBeanList,sendUserAsync,begin,end)); -// } -// begin.countDown(); -// try { -// end.await(); -// }catch (Exception e){ -// log.error("下发人脸照失败"+e); -// e.printStackTrace(); -// } -// exe.shutdown(); -// System.out.println("统计253服务器总共有"+deviceIds.size()+"个设备,处理完毕"); + String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.YEAR, 10); @@ -671,21 +378,41 @@ public class BaseService { if (StringUtils.isBlank(photo) || StringUtils.isBlank(cardNum)){ continue; } - String path = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; + String[] fileNameStr = photo.split(typeName +"/"); + if(fileNameStr.length==0){ + continue; + } + //以学籍号为名的文件名 + String fileName = fileNameStr[1]; + //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="E:\\wwwhtdocs\\SmartCampus\\f0i5l7e5\\" + afterStr; - } else{ - //以学籍号为名的文件名 - String fileName = photo.split(typeName +"/")[1]; - //100服务器上人脸照绝对路径 - filePath = path+ "\\" + fileName; + filePath= path_3 + afterStr; + } + if(photo.indexOf("face17e5")!=-1){ + filePath = path_2 + "\\" + fileName; + } + if(photo.indexOf("face17e50")!=-1){ + filePath = path_1 + "\\" + fileName; } log.info("卡号:{},人脸路径:{}, ",cardNum,filePath); - for(String sno : deviceIds) { - //下发253服务器 - sendUserAsync.uploadImgs(filePath, cardNum, userName, sno, startTime, endTime, validTimeEnabled, String.valueOf(userType)); + File file = new File(filePath);//图片 + if(file.exists()) { + String targetPath = FileUtils.picPathComp + file.getName(); + try { + CompressPic.CompressPic(file.getAbsolutePath(), targetPath); + } catch (Exception e) { + log.error("压缩图片失败:", e); + continue; + } + for (String sno : deviceIds) { + //下发253服务器 + sendUserAsync.uploadImgs(targetPath,cardNum, userName, sno, startTime, endTime, validTimeEnabled, String.valueOf(userType),schoolId); + } } }catch (Exception e){ log.error("人脸下发失败"); @@ -728,6 +455,21 @@ public class BaseService { } /** + * 获取学校下学生数据 + * @param schoolId + * @param studentType + * @param sex + * @return + */ + public List getStudentListByGroup(Integer schoolId, Integer studentType,String sex,Integer groupId) { + List students = userDao.getStudentCardGroup(schoolId,studentType,sex,groupId); + //去重重复数据 + List studentList = students.stream().collect(Collectors.collectingAndThen( + Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(StudentBean::getStudent_num))), ArrayList::new)); + return studentList; + } + + /** * 获取学校下老师数据 * @param schoolId * @return @@ -739,4 +481,31 @@ public class BaseService { Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(StudentBean::getTeacher_num))), ArrayList::new)); return teacherist; } + + + public void getSuccessList(Integer schoolId,String deviceIds) { + //下发设备集合 + String[] deviceArr = deviceIds.split(","); + List deviceList= new ArrayList<>(Arrays.asList(deviceArr)); + if(deviceList.size()<1){ + return; + } + //启用多线程执行 + CountDownLatch begin = new CountDownLatch(1); + CountDownLatch end = new CountDownLatch(deviceList.size()); + ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-sendFace-runner-%d").build(); + ExecutorService exe = new ThreadPoolExecutor(8,16,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue(),namedThreadFactory); + for(String sno : deviceList){ + exe.execute(new AsyncTask(userDao,sendRecordDao,schoolId,sno,begin,end)); + } + begin.countDown(); + try { + end.await(); + }catch (Exception e){ + log.error("迁移人脸照失败"+e); + e.printStackTrace(); + } + exe.shutdown(); + System.out.println("统计100服务器总共有"+deviceList.size()+"个设备,处理完毕"); + } } 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 94e0c42..c93bba9 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 @@ -4,12 +4,8 @@ import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.JavaType; import com.sincere.haikangface.CMSServer; import com.sincere.haikangface.async.SendUserAsync; -import com.sincere.haikangface.bean.Result; -import com.sincere.haikangface.bean.ResultGenerator; -import com.sincere.haikangface.bean.SendRecordBean; -import com.sincere.haikangface.bean.StudentBean; +import com.sincere.haikangface.bean.*; import com.sincere.haikangface.bean.face.*; -import com.sincere.haikangface.control.UserControl; import com.sincere.haikangface.dao.DeviceDao; import com.sincere.haikangface.dao.UserDao; import com.sincere.haikangface.enums.EnumSzBusinessType; @@ -17,14 +13,16 @@ import com.sincere.haikangface.service.UserOperateService; import com.sincere.haikangface.utils.*; import com.sincere.haikangface.xiananDao.SendRecordDao; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; -import java.text.SimpleDateFormat; import java.util.*; /** @@ -48,8 +46,6 @@ public class UserOperateServiceImpl implements UserOperateService { BaseService baseService; @Autowired SendUserAsync sendUserAsync; - @Autowired - UserControl userControl; private static JsonUtils objectMapper = JsonUtils.nonEmptyMapper(); @@ -106,7 +102,7 @@ public class UserOperateServiceImpl implements UserOperateService { if(deviceType.intValue()== 22 || deviceType.intValue()== 29){ Integer shiduan = userDao.getAuthRecordBySchoolId(schoolId,studentType,null); //如果是大华一体机 - record.setShiduan(shiduan!=null?shiduan+1+"":1+""); + record.setShiduan(shiduan!=null?String.valueOf(shiduan+1):String.valueOf(1)); }else{ //时段 record.setShiduan(null); @@ -147,20 +143,6 @@ public class UserOperateServiceImpl implements UserOperateService { ArrayList weekDayList = objectMapper.fromJson(weekDaysJson,javaType); //设备类型 Integer clintType = userDao.getClintTypeByDeviceId(devices.get(0)); - if(clintType.intValue()== 22 || clintType.intValue()== 29){ - PermissionDHBean dhBean = new PermissionDHBean(); - dhBean.setWeekDays(weekDayList); - dhBean.setDeviceIds(devices); - dhBean.setChannel(record.getShiduan()); - dhBean.setCustomName(EnumSzBusinessType.EnumStudentType.getByCode(studentType).code+""); - dhBean.setStudentType(String.valueOf(studentType)); - //发送大华设备 - HttpUtil.sendDHPermission(dhBean); - log.info("map{}", JSON.toJSONString(dhBean)); - //更新计划位下发成功 - userDao.updateAuthRecord(record.getId(),1); - return ResultGenerator.genSuccessResult(); - } if(clintType.intValue()== 18 || clintType.intValue()== 28){ PermissionBean permissionBean = new PermissionBean(); permissionBean.setWeekDays(weekDayList); @@ -175,6 +157,20 @@ public class UserOperateServiceImpl implements UserOperateService { } } } + if(clintType.intValue()== 22 || clintType.intValue()== 29){ + PermissionDHBean dhBean = new PermissionDHBean(); + dhBean.setWeekDays(weekDayList); + dhBean.setDeviceIds(devices); + dhBean.setChannel(record.getShiduan()); + dhBean.setCustomName(EnumSzBusinessType.EnumStudentType.getByCode(studentType).code+""); + dhBean.setStudentType(String.valueOf(studentType)); + //发送大华设备 + HttpUtil.sendDHPermission(dhBean); + log.info("权限计划详情{}", JSON.toJSONString(dhBean)); + //更新计划位下发成功 + userDao.updateAuthRecord(record.getId(),1); + return ResultGenerator.genSuccessResult(); + } return ResultGenerator.genSuccessResult(); } @@ -194,13 +190,13 @@ public class UserOperateServiceImpl implements UserOperateService { String cardNum =""; String photo =""; String studentCode = ""; - if(userType.intValue() ==1 ){ - studentBean = userDao.getTeacherByUserId(userId); + if(userType.intValue() ==1){ + studentBean = userDao.getTeacherByUserId(userId,null); cardNum = studentBean.getTeacher_num(); photo = studentBean.getFace(); studentCode = studentBean.getNum(); }else{ - studentBean = userDao.getStudentCByUserId(userId); + studentBean = userDao.getStudentCByUserId(userId,null); cardNum = studentBean.getStudent_num(); photo = studentBean.getPhoto(); studentCode = studentBean.getStudentCode(); @@ -211,21 +207,45 @@ public class UserOperateServiceImpl implements UserOperateService { } Integer schoolId = studentBean.getSchool_id(); String userName = studentBean.getName(); - //2.重新下发 String typeName = userType.intValue() ==1 ? "Teacher" : "Student"; - String path = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; + String[] fileNameStr =photo.split(typeName +"/"); + if(fileNameStr.length==0){ + log.error("文件名为空,文件路径 :"+ photo); + return ResultGenerator.genSuccessResult("文件名为空"); + } //以学籍号为名的文件名 - String fileName = photo.split(typeName+"/")[1]; - //100服务器上人脸照绝对路径 - String filePath = path+ "\\" + fileName; + String fileName = fileNameStr[1]; + //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; + } + log.info("卡号:{},人脸路径:{}, ",cardNum,filePath); //校验100服务上是否存在此人脸 - File file = new File(filePath.trim()); + File file = new File(filePath.trim());//图片 if (!file.exists()) { log.error("文件不存在:" + filePath); -// String card = Long.parseLong(baseService.getCard(cardNum), 16)+""; - baseService.sendFailRecord(cardNum, filePath, deviceId, "文件不存在", String.valueOf(userType)); + baseService.sendFailRecord(cardNum, filePath, deviceId, "文件不存在", String.valueOf(userType),schoolId); return ResultGenerator.genFailResult("文件不存在"); } + 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){ @@ -237,12 +257,7 @@ public class UserOperateServiceImpl implements UserOperateService { //不在线,去253服务器上删除 HttpUtil.deleteCard(deviceId, cardNum); } - String targetPath = FileUtils.picPathComp + file.getName(); - try { - CompressPic.CompressPic(file.getAbsolutePath(), targetPath); - } catch (Exception e) { - log.error("图片压缩失败"); - } + //2.重新下发 boolean isOk = baseService.sendImg(file.getAbsolutePath(), targetPath, deviceId, cardNum, userName, String.valueOf(userType), schoolId); if (isOk) { return ResultGenerator.genSuccessResult(); @@ -252,6 +267,7 @@ public class UserOperateServiceImpl implements UserOperateService { } //下大华人脸 if(clintType.intValue()== 22 || clintType.intValue()== 29){ + //下发单个人脸至大华设备 HttpUtil.uploadDHImgForOne(filePath,schoolId,studentCode,clintType,deviceId); return ResultGenerator.genSuccessResult(); } @@ -259,61 +275,7 @@ public class UserOperateServiceImpl implements UserOperateService { } @Override - public Result sendFace(String schoolId,Integer type,String deviceIds) { - try { - String filePathStudent = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\Student"; - String filePathParent = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\Parent"; - String filePathTeacher = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\Teacher"; - File filePaths = null; - int userType = 0; - if (type == 0) {//主卡下发 - filePaths = new File(filePathStudent); - userType = 2; - } else if (type == 1) {//副卡下发 - filePaths = new File(filePathParent); - userType = 2; - } else if (type == 2) {//教师卡下发 - filePaths = new File(filePathTeacher); - userType = 1; - } - File[] filesStudent = filePaths.listFiles(); - if (filesStudent == null) { - log.warn("目录:{},没有找到人脸图片,",filePaths.getAbsolutePath()); - return ResultGenerator.genFailResult("没有找到人脸图片"); - } - if(StringUtils.isBlank(deviceIds)){ - log.warn("未选择下发设备"); - return ResultGenerator.genFailResult("未选择下发设备"); - } - String[] deviceArr = deviceIds.split(","); - List idLists= new ArrayList<>(Arrays.asList(deviceArr)); - //设备类型 - Integer clintType = userDao.getClintTypeByDeviceId(idLists.get(0)); - if(clintType.intValue()== 22 || clintType.intValue()== 29){ - HttpUtil.uploadDHImg(schoolId,userType,deviceIds); - } - if(clintType.intValue()== 18 || clintType.intValue()== 28){ - HttpUtil.uploadHkImg(schoolId,userType,deviceIds); - } - int fileSize = filesStudent.length; - int clintNum = deviceArr.length; - //下发所用时长 - int timeLength = new Double(clintNum * fileSize * 0.06).intValue(); - //下发截止时间 - String dateStr = baseService.getTime(fileSize,clintNum,timeLength); - Map map = new HashMap(); - map.put("timeLength",timeLength); - map.put("afterDate",dateStr); - map.put("fileSize",fileSize); - return ResultGenerator.genSuccessResult(objectMapper.toJson(map)); - } catch (Exception e) { - log.error("下发失败,错误信息",e); - return ResultGenerator.genFailResult("下发失败"); - } - } - - @Override - public Result sendUserFaceByThread(SendFaceDto sendFaceDto) { + public Result sendUserFaceByThread(SendFaceDto sendFaceDto,Integer groupId) { //下发设备集合 String[] deviceArr = sendFaceDto.getsNos().split(","); List deviceList= new ArrayList<>(Arrays.asList(deviceArr)); @@ -329,17 +291,39 @@ public class UserOperateServiceImpl implements UserOperateService { }else{ userType = 1; } + //根据类型获取下发用户信息 + List studentBeanList = null; + if (userType == EnumSzBusinessType.EnumUserType.TEACHER.code) { + studentBeanList = baseService.getTeacherList(schoolId); + } + if (userType == EnumSzBusinessType.EnumUserType.STUDENT.code && groupId ==null) { + studentBeanList = baseService.getStudentList(schoolId,studentType,sex); + }else if(userType == EnumSzBusinessType.EnumUserType.STUDENT.code && groupId !=null){ + sex = sex.split(",")[0]; + studentBeanList = baseService.getStudentListByGroup(schoolId,studentType,sex,groupId); + } + log.info("统计共有下发用户数量:{}",studentBeanList.size()); //设备类型 Integer clintType = userDao.getClintTypeByDeviceId(deviceList.get(0)); if(clintType.intValue()== 22 || clintType.intValue()== 29){ //发送大华设备 - HttpUtil.uploadDHImg(String.valueOf(schoolId),userType,sendFaceDto.getsNos()); + HttpUtil.uploadDHImg(String.valueOf(schoolId),userType,sendFaceDto.getsNos(),studentType,sex); } if(clintType.intValue()== 18 || clintType.intValue()== 28){ - //发送海康设备 - baseService.sendUserFaceByAsyncThread(schoolId,userType,studentType,sex,deviceList); + //发送海康设备:异步执行 + baseService.sendUserFaceByAsyncThread(schoolId,userType,studentBeanList,deviceList); } - return ResultGenerator.genSuccessResult(); + int fileSize = studentBeanList.size(); + int clintNum = deviceList.size(); + //下发所用时长 + int timeLength = new Double(clintNum * fileSize * 0.06).intValue(); + //下发截止时间 + String dateStr = baseService.getTime(fileSize,clintNum,timeLength); + Map map = new HashMap(); + map.put("timeLength",timeLength); + map.put("afterDate",dateStr); + map.put("fileSize",fileSize); + return ResultGenerator.genSuccessResult(objectMapper.toJson(map)); } @Override @@ -370,6 +354,9 @@ public class UserOperateServiceImpl implements UserOperateService { if(clintType.intValue()== 22 || clintType.intValue()== 29){ HttpUtil.deleteDHFace(schoolId,cardNum,deviceId); } + //删除成功记录 + sendRecordDao.deleteUserFaceSuccess(schoolId,cardNum,deviceId); + sendRecordDao.deleteRecord(schoolId,deviceId,cardNum); }catch (Exception e){ log.error("删除失败人脸失败,异常信息:{}",e); continue; @@ -398,16 +385,20 @@ public class UserOperateServiceImpl implements UserOperateService { //2.重新下发 StudentBean studentBean= null; String typeName =""; + String photo = ""; if(userType ==1){ typeName= "Teacher"; - studentBean = userDao.getTeacherWithCard(cardNum); + studentBean = userDao.getTeacherWithCard(cardNum,schoolId); + photo=studentBean.getFace(); }else{ typeName= "Student"; - studentBean= userDao.getStudentWithCard(cardNum); + studentBean= userDao.getStudentWithCard(cardNum,schoolId); + photo=studentBean.getPhoto(); } - if(studentBean==null){ + if(studentBean==null|| StringUtils.isBlank(photo)){ continue; } + String userName= studentBean.getName(); String studentCode = studentBean.getStudentCode(); String filePath=""; //下发海康人脸 @@ -420,32 +411,40 @@ public class UserOperateServiceImpl implements UserOperateService { //不在线,去253服务器上删除 HttpUtil.deleteCard(deviceId, cardNum); } - //100服务器文件目录绝对路径 - String path = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; - String photo= userType==1?studentBean.getFace():studentBean.getPhoto(); - if (StringUtils.isBlank(photo)){ + String[] fileNameStr = photo.split(typeName +"/"); + if(fileNameStr.length==0){ continue; } + //以学籍号为名的文件名 + String fileName = fileNameStr[1]; + //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\\"; if(photo.indexOf("f0i5l7e5")!=-1){ String afterStr = photo.split("f0i5l7e5/")[1].replace("/","\\"); - filePath="E:\\wwwhtdocs\\SmartCampus\\f0i5l7e5\\" + afterStr; - } else{ - //以学籍号为名的文件名 - String fileName = photo.split(typeName +"/")[1]; - //100服务器上人脸照绝对路径 - filePath = path+ "\\" + fileName; + filePath= path_3 + afterStr; + } + if(photo.indexOf("face17e5")!=-1){ + filePath = path_2 + "\\" + fileName; + } + if(photo.indexOf("face17e50")!=-1){ + filePath = path_1 + "\\" + fileName; } - log.info("卡号:{},人脸路径:{}, ",cardNum, filePath); + log.info("卡号:{},人脸路径:{}, ",cardNum,filePath); File file = new File(filePath);//图片 - String targetPath = FileUtils.picPathComp + file.getName(); - try { - CompressPic.CompressPic(file.getAbsolutePath(), targetPath); - } catch (IOException e) { - log.error("图片压缩失败",e); - continue; + if(file.exists()){ + String targetPath = FileUtils.picPathComp + file.getName(); + try { + CompressPic.CompressPic(file.getAbsolutePath(), targetPath); + } catch (Exception e) { + log.error("压缩图片失败:",e); + continue; + } + if(!StringUtils.isBlank(cardNum)) { + baseService.sendImg(file.getAbsolutePath(), targetPath, deviceId, cardNum, userName, String.valueOf(userType), schoolId); + } } - String userName= studentBean.getName(); - baseService.sendImg(file.getAbsolutePath(), targetPath, deviceId, cardNum, userName, String.valueOf(userType), schoolId); } //下发大华人脸 if(clintType.intValue()== 22 || clintType.intValue()== 29){ @@ -463,121 +462,158 @@ public class UserOperateServiceImpl implements UserOperateService { @Override public Result deleteFace(Integer schoolId,String cards,String deviceIds) { if(StringUtils.isBlank(cards)){ - return ResultGenerator.genFailResult("删除人脸卡号"); + return ResultGenerator.genFailResult("删除人脸卡号为空"); + } + List deviceList = new ArrayList<>(); + if(StringUtils.isBlank(deviceIds)){ + List clintList = userDao.getDeviceIds(schoolId,null); + if(CollectionUtils.isNotEmpty(clintList)){ + deviceList.addAll(clintList); + } + }else{ + //设备集合 + String[] deviceArr = deviceIds.split(","); + deviceList= new ArrayList<>(Arrays.asList(deviceArr)); } String[] cardArr = cards.split(","); - List cardList= new ArrayList<>(Arrays.asList(cardArr)); + List cardList = new ArrayList<>(Arrays.asList(cardArr)); for(String card : cardList){ - if(StringUtils.isNotBlank(deviceIds)){ - //设备集合 - String[] deviceArr = deviceIds.split(","); - List deviceList= new ArrayList<>(Arrays.asList(deviceArr)); - for(String sno : deviceList){ - try{ + //未指定设备,删除学校下所有 + if(CollectionUtils.isNotEmpty(deviceList)) { + for (String sno : deviceList) { + try { //设备类型 Integer clintType = userDao.getClintTypeByDeviceId(sno); - if(clintType.intValue()== 18 || clintType.intValue()== 28){ + if (clintType.intValue() == 18 || clintType.intValue() == 28) { //删除海康设备人脸 if (cmsServer.getIsDeviceOnline(sno)) { - String cardNo = Long.parseLong(baseService.getCard(card),16) + ""; - cmsServer.deleteCard(sno, cardNo,schoolId); - }else{ + String cardNo = Long.parseLong(baseService.getCard(card), 16) + ""; + cmsServer.deleteCard(sno, cardNo, schoolId); + } else { HttpUtil.deleteCard(sno, card); } } - if(clintType.intValue()== 22 || clintType.intValue()== 29){ + if (clintType.intValue() == 22 || clintType.intValue() == 29) { //删除大华设备人脸 - HttpUtil.deleteDHFace(schoolId,card,sno); + HttpUtil.deleteDHFace(schoolId, card, sno); } - }catch (Exception e){ - log.error("删除人脸失败,异常信息:{}",e); + //删除成功记录 + sendRecordDao.deleteUserFaceSuccess(schoolId,card,sno); + sendRecordDao.deleteRecord(schoolId,sno,card); + } catch (Exception e) { + log.error("删除人脸失败,异常信息:{}", e); continue; } } - }else{ - List clintIds = userDao.getDeviceIds(schoolId,null); - if(clintIds.size()>0){ - for(String sno : clintIds){ - try{ - //设备类型 - Integer clintType = userDao.getClintTypeByDeviceId(sno); - if(clintType.intValue()== 18 || clintType.intValue()== 28){ - //删除海康设备人脸 - if (cmsServer.getIsDeviceOnline(sno)) { - String cardNo = Long.parseLong(baseService.getCard(card),16) + ""; - cmsServer.deleteCard(sno, cardNo,schoolId); - }else{ - HttpUtil.deleteCard(sno, card); - } - } - if(clintType.intValue()== 22 || clintType.intValue()== 29){ - //删除大华设备人脸 - HttpUtil.deleteDHFace(schoolId,card,sno); - } - }catch (Exception e){ - log.error("删除人脸失败,异常信息:{}",e); - continue; - } - } - } } } return ResultGenerator.genSuccessResult(); } @Override - public Result deleteFaceTest(Integer schoolId, String deviceIds) { - List list = baseService.getStudentList(schoolId,null,""); + public Result sendFaceForNoSend(Integer schoolId,Integer studentType,String sex,Integer userType,String deviceIds) { + //若未传下发,则下发该学校下所有设备 + //下发设备集合 + List idLists = null; if(StringUtils.isBlank(deviceIds)){ - log.warn("未选择下发设备"); - return ResultGenerator.genFailResult("未选择下发设备"); + idLists = userDao.getDeviceIds(schoolId,null); + }else{ + String[] deviceArr = deviceIds.split(","); + idLists= new ArrayList<>(Arrays.asList(deviceArr)); } - String[] deviceArr = deviceIds.split(","); - List idLists= new ArrayList<>(Arrays.asList(deviceArr)); - for(StudentBean studentBean : list){ - for(String sno : idLists){ - List bean = sendRecordDao.getRecordIsExit(sno,studentBean.getStudent_num(),studentBean.getUser_id()); - if(bean.size()>0){ - continue; - } + //下发用户集合 + List list = null; + if(userType.intValue() ==2){ + list = baseService.getStudentList(schoolId,studentType,sex); + } + if(userType.intValue()==1){ + list = baseService.getTeacherList(schoolId); + } + if(StringUtils.isBlank(deviceIds)){ + log.warn("该学校下未查询到下发设备"); + return ResultGenerator.genFailResult("该学校下未查询到下发设备"); + } + //异步执行下发 + sendFaceForNoSend(schoolId,userType,list,idLists); + int fileSize = list.size(); + int clintNum = idLists.size(); + //下发所用时长 + int timeLength = new Double(clintNum * fileSize * 0.06).intValue(); + //下发截止时间 + String dateStr = baseService.getTime(fileSize,clintNum,timeLength); + Map map = new HashMap(); + map.put("timeLength",timeLength); + map.put("afterDate",dateStr); + map.put("fileSize",fileSize); + return ResultGenerator.genSuccessResult(objectMapper.toJson(map)); + } + + + @Async + protected void sendFaceForNoSend(Integer schoolId,Integer userType,List studentList,List deviceIds){ + log.info("统计共有:"+studentList.size()+"张卡,"+deviceIds.size()+"台设备." ); + for(StudentBean studentBean : studentList){ + for(String sno : deviceIds){ try{ - String userName= studentBean.getName(); - String photo = studentBean.getPhoto(); - String cardNum =studentBean.getStudent_num(); - String typeName="Student"; + //卡号 + String cardNum = userType.intValue()==1?studentBean.getTeacher_num():studentBean.getStudent_num(); + //人脸照 + String photo = userType.intValue()==1?studentBean.getFace():studentBean.getPhoto(); if (StringUtils.isBlank(photo) || StringUtils.isBlank(cardNum)){ continue; } - String path = "E:\\wwwhtdocs\\SmartCampus\\face17e50\\School" + schoolId + "\\" + typeName; + String userName= studentBean.getName(); + String userId = studentBean.getUser_id(); + String studentCode = studentBean.getStudentCode(); + List bean = sendRecordDao.getRecordIsExit(sno,cardNum,userId); + if(CollectionUtils.isNotEmpty(bean)){ + continue; + } + String typeName= userType.intValue()==1?"Teacher":"Student"; + String[] fileNameStr = photo.split(typeName +"/"); + if(fileNameStr.length==0){ + continue; + } + //以学籍号为名的文件名 + String fileName = fileNameStr[1]; + //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="E:\\wwwhtdocs\\SmartCampus\\f0i5l7e5\\" + afterStr; - } else{ - //以学籍号为名的文件名 - String fileName = photo.split(typeName +"/")[1]; - //100服务器上人脸照绝对路径 - filePath = path+ "\\" + fileName; + filePath= path_3 + afterStr; + } + if(photo.indexOf("face17e5")!=-1){ + filePath = path_2 + "\\" + fileName; } - log.info("卡号:{},人脸路径:{}, ",cardNum,filePath); + if(photo.indexOf("face17e50")!=-1){ + filePath = path_1 + "\\" + fileName; + } + if(filePath.indexOf("?v=")!=-1){ + filePath = filePath.split("\\?")[0]; + } + log.info("卡号:{},人脸路径:{}",cardNum,filePath); File file = new File(filePath);//图片 if(file.exists()){ String targetPath = FileUtils.picPathComp + file.getName(); try { CompressPic.CompressPic(file.getAbsolutePath(), targetPath); } catch (Exception e) { - log.error("压缩图片失败"); - e.printStackTrace(); + log.error("压缩图片失败:",e); continue; } - String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - Calendar calendar = Calendar.getInstance(); - calendar.add(Calendar.YEAR, 10); - String endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()); - if(!cmsServer.getIsDeviceOnline(sno)){ - if(!StringUtils.isBlank(cardNum)){ - //下发253服务器 - sendUserAsync.uploadImgs(targetPath, cardNum, userName, sno, startTime, endTime, 1, "2"); + if(!StringUtils.isBlank(cardNum)) { + //设备类型 + Integer clintType = userDao.getClintTypeByDeviceId(sno); + if(clintType.intValue()== 18 || clintType.intValue()== 28){ + baseService.sendImg(file.getAbsolutePath(), targetPath, sno, cardNum, userName, String.valueOf(userType), schoolId); + } + //下大华人脸 + if(clintType.intValue()== 22 || clintType.intValue()== 29){ + //下发单个人脸至大华设备 + HttpUtil.uploadDHImgForOne(filePath,schoolId,studentCode,clintType,sno); } } } @@ -588,6 +624,120 @@ public class UserOperateServiceImpl implements UserOperateService { } } } + } + + public static void main(String[] args) { + String s = "E:\\wwwhtdocs\\SmartCampus\\face17e5\\School386\\Student\\sxzx2020467.png?v=1601037209723"; + if(s.indexOf("?v=")!=-1){ + System.out.println(1); + String fileName = s.split("\\?")[0]; + System.out.println(fileName); + } + } + + @Override + public Result againNoSendOneFace(MultipartFile file, Integer schoolId, String cardNum, Integer userType, String deviceIds) { + if(StringUtils.isBlank(cardNum)){ + return ResultGenerator.genFailResult("卡号为空"); + } + if(StringUtils.isBlank(deviceIds)){ + return ResultGenerator.genFailResult("未指定下发设备"); + } + StudentBean studentBean=null; + if(userType.intValue()==2){ + studentBean= userDao.getStudentWithCard(cardNum,schoolId); + }else{ + studentBean= userDao.getTeacherWithCard(cardNum,schoolId); + } + if(studentBean ==null){ + return ResultGenerator.genFailResult("此卡号未查询到对应学生/老师信息"); + } + String userName = studentBean.getName(); + String studentCode = userType.intValue()==1?studentBean.getNum():studentBean.getStudentCode(); + String typeName = userType.intValue()==1?"Teacher":"Student"; + //100服务器人脸照绝对路径 + String path = "E:\\wwwhtdocs\\SmartCampus\\face17e5\\School" + schoolId + "\\" + typeName; + if(!new File(path).exists()){ + new File(path).mkdirs(); + } + //以学籍号为名的文件名 + String fileName = studentCode + ".png"; + //人脸文件路径 + String facePath = path + "\\" +fileName; + log.info("卡号:{}, 人脸路径:{}, ",cardNum,facePath); + try { + File absolutePath = new File(facePath); + FileOutputStream fileOutputStream = new FileOutputStream(absolutePath); + fileOutputStream.write(file.getBytes()); + fileOutputStream.close(); + }catch (IOException e){ + log.error("文件处理异常: ",e); + } +// //在线活体检测 +// String result = HttpUtil.checkFace(facePath); +// if(StringUtils.isBlank(result) || result.equals("false")){ +// log.error("人脸检测不合格!"); +// return ResultGenerator.genFailResult("请添加规范的人脸照片."); +// } + String targetPath = FileUtils.picPathComp + file.getName(); + try { + CompressPic.CompressPic(new File(facePath).getAbsolutePath(), targetPath); + } catch (Exception e) { + log.error("压缩图片失败: ",e); + } + String[] deviceArr = deviceIds.split(","); + List deviceList= new ArrayList<>(Arrays.asList(deviceArr)); + if(CollectionUtils.isNotEmpty(deviceList)){ + for(String deviceId : deviceList) { + //获取设备类型 + Integer clintType = userDao.getClintTypeByDeviceId(deviceId); + if (clintType.intValue() == 18 || clintType.intValue() == 28) { + baseService.sendImg(facePath, targetPath, deviceId, cardNum, userName, String.valueOf(userType), schoolId); + } + //下发大华人脸 + if (clintType.intValue() == 22 || clintType.intValue() == 29) { + HttpUtil.uploadDHImgForOne(facePath, schoolId, studentCode, clintType, deviceId); + } + } + } + //下发完成更新表中人脸路径 + String savePath = "http://campus.myjxt.com//face17e5/School"+ schoolId + "/" + typeName + "/" + fileName; + userDao.updateUser(studentBean.getUser_id(),savePath); return ResultGenerator.genSuccessResult(); } + + @Override + public Result insertUpdateCard(String cardNums) { + String[] cardArr = cardNums.split(","); + List cardList = new ArrayList<>(Arrays.asList(cardArr)); + if(CollectionUtils.isNotEmpty(cardList)) { + for (String card : cardList) { + StudentBean studentBean = userDao.getStudentWithCard(card,null); + if(studentBean ==null){ + log.error("慧校园中此卡号不存在"); + continue; + } + UpdateCardBean bean = new UpdateCardBean(); + bean.setAddTime(new Date()); + bean.setCard(studentBean.getStudent_num()); + bean.setClassId(studentBean.getClass_id()); + bean.setClassName(studentBean.getClass_name()); + bean.setCustomerId(studentBean.getStudent_id()); + bean.setFace(studentBean.getFace()); + bean.setIsNew(1); + bean.setMobile(studentBean.getParentMobile()); + bean.setName(studentBean.getName()); + bean.setSchoolId(studentBean.getSchool_id()); + bean.setSex(studentBean.getSex()); + bean.setUserType(studentBean.getUserType()); + bean.setUserId(studentBean.getUser_id()); + bean.setStudentType(studentBean.getStudent_type()); + bean.setStudentCode(studentBean.getStudentCode()); + bean.setOldCard(studentBean.getOldCard()); + bean.setUpdateType(1); + userDao.insertCard(bean); + } + } + return new Result(); + } } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java index 5e15a3a..9a6056a 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AlarmUtils.java @@ -1,5 +1,6 @@ package com.sincere.haikangface.utils; +import com.sincere.haikangface.bean.AttendanceBean; import com.sincere.haikangface.bean.BaiduFaceRecorder; import com.sincere.haikangface.bean.FaceWaterRecoder; import com.sincere.haikangface.dao.DeviceDao; @@ -101,6 +102,7 @@ public class AlarmUtils { currTemperature = currTemperature.replace("currTemperature>", ""); currTemperature = currTemperature.replace(" 1) { String picDataUrlId = picDataUrl.split("id=")[1]; - FileUtils.getInstance().writeLogs("0x4bdeviceID:" + deviceID + " cardNo:" + cardNo + " time:" + time + " picDataUrlId:" + picDataUrlId, FileUtils.faceSuccess); + log.info("事件类型:0x4b deviceID:" + deviceID + " cardNo:" + cardNo + " time:" + time + " picDataUrlId:" + picDataUrlId); content = "人脸认证通过"; if (null != alarmCallBack) alarmCallBack.callBack(minorType, deviceID, cardNo, time, picDataUrlId, currTemperature); @@ -157,32 +159,32 @@ public class AlarmUtils { break; case "0x4c"://人脸认证失败 content = "人脸认证失败"; - log.info("卡号:{}, {}",cardNo,content); + log.info("卡号:{}, {}", cardNo, content); break; case "0x50"://人脸不存在 content = "人脸不存在"; - log.info("卡号:{}, {}",cardNo,content); + log.info("卡号:{}, {}", cardNo, content); break; case "0x68"://真人检测失败 content = "真人检测失败"; - log.info("卡号:{}, {}",cardNo,content); + log.info("卡号:{}, {}", cardNo, content); break; case "0x69"://人证比对通过 if (!StringUtils.isEmpty(picDataUrl) && picDataUrl.split("id=").length > 1) { String picDataUrlId = picDataUrl.split("id=")[1]; - FileUtils.getInstance().writeLogs("0x69deviceID:" + deviceID + " cardNo:" + cardNo + " time:" + time + " picDataUrlId:" + picDataUrlId, FileUtils.faceSuccess); + log.info("事件类型:0x69 deviceID:" + deviceID + " cardNo:" + cardNo + " time:" + time + " picDataUrlId:" + picDataUrlId); content = "人脸认证通过"; if (null != alarmCallBack) alarmCallBack.callBack(minorType, deviceID, cardNo, time, picDataUrlId, currTemperature); } break; case "0x70"://认证比对失败 - FileUtils.getInstance().writeLogs("deviceID:" + deviceID + " cardNo:" + cardNo + " time:" + time, FileUtils.faceFail); + log.info("deviceID:" + deviceID + " cardNo:" + cardNo + " time:" + time); break; case "0x6": if (!StringUtils.isEmpty(picDataUrl) && picDataUrl.split("id=").length > 1) { String picDataUrlId = picDataUrl.split("id=")[1]; - FileUtils.getInstance().writeLogs("0x69deviceID:" + deviceID + " cardNo:" + cardNo + " time:" + time + " picDataUrlId:" + picDataUrlId, FileUtils.faceSuccess); + log.info("事件类型: 0x6 deviceID:" + deviceID + " cardNo:" + cardNo + " time:" + time + " picDataUrlId:" + picDataUrlId); content = "人脸认证通过"; if (null != alarmCallBack) alarmCallBack.callBack(minorType, deviceID, cardNo, time, picDataUrlId, currTemperature); @@ -242,11 +244,11 @@ public class AlarmUtils { switch (minorType) { case "0x3a"://网络断开 content = "网络断开"; - FileUtils.getInstance().writeLogs("网络断开:"+deviceID,"设备网络.txt"); + log.info("网络断开:"+deviceID); break; case "0x400"://设备上电启动 content = "设备上电启动"; - FileUtils.getInstance().writeLogs("设备上电启动:"+deviceID,"设备网络.txt"); + log.info("设备上电启动:"+deviceID); break; case "0x401"://设备掉电关闭 content = "设备掉电关闭"; @@ -266,7 +268,7 @@ public class AlarmUtils { case "0x407"://网络恢复 content = "网络恢复"; if (null != alarmCallBack) alarmCallBack.callBack(minorType, deviceID, "", time, "", ""); - FileUtils.getInstance().writeLogs("网络恢复:"+deviceID,"设备网络.txt"); + log.info("网络恢复:"+deviceID,"设备网络.txt"); break; case "0x421"://摄像头未连接 content = "摄像头未连接"; @@ -275,14 +277,14 @@ public class AlarmUtils { content = "摄像头连接恢复"; break; case "0x426"://人证设备在线 - FileUtils.getInstance().writeLogs("人证设备在线:"+deviceID,"设备网络.txt"); + log.info("人证设备在线:"+deviceID,"设备网络.txt"); content = "人证设备在线"; if (null != alarmCallBack) alarmCallBack.callBack(minorType, deviceID, "", time, "", ""); break; case "0x427"://人证设备离线 content = "人证设备离线"; if (null != alarmCallBack) alarmCallBack.callBack(minorType, deviceID, "", time, "", ""); - FileUtils.getInstance().writeLogs("人证设备离线:"+deviceID,"设备网络.txt"); + log.info("人证设备离线:"+deviceID,"设备网络.txt"); break; } saveWater(content, minorType, deviceID, "", time, "0x02"); @@ -334,4 +336,25 @@ public class AlarmUtils { faceWaterRecoder.getContent(), faceWaterRecoder.getMajorType(), faceWaterRecoder.getTime(), faceWaterRecoder.getCardNo(), faceWaterRecoder.getSystime()); } + + private void saveAttendance(String deviceId){ + String inTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + AttendanceBean attendanceBean = new AttendanceBean(); + attendanceBean.setClint_id(deviceId); + if (deviceId.startsWith("ytj")) + attendanceBean.setClint_type("28"); + else + attendanceBean.setClint_type("18"); + attendanceBean.setIntime(inTime); + attendanceBean.setIsConnection(1); + attendanceBean.setSchool_id("-1"); + attendanceBean.setState(1); + if (deviceDao.selectDevice(deviceId) != null) { + deviceDao.updateDeviceStatu(1,inTime,deviceId); + } else { + deviceDao.addDevide(attendanceBean.getClint_id(), attendanceBean.getClint_type(), attendanceBean.getIntime(), + attendanceBean.getSchool_id(), attendanceBean.getState() + "", attendanceBean.getIsConnection() + ""); + } + } + } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/HttpUtil.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/HttpUtil.java index da63645..2306883 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/HttpUtil.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/HttpUtil.java @@ -107,13 +107,14 @@ public class HttpUtil { * @param userType */ public static void uploadImgs(String filePath, String card, String name, String deviceId, String startTime, - String endTime, int validTimeEnabled, String userType) { + String endTime, int validTimeEnabled, String userType,Integer schoolId) { if (!new File(filePath).exists()) { log.error("图片不存在,图片路径:{}",filePath); return; } try{ String url = "http://120.26.116.253:8089/file/uploadImg"; +// String url = "http://127.0.0.1:8089/file/uploadImg"; RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); MediaType mediaType = MediaType.parseMediaType(MediaType.MULTIPART_FORM_DATA_VALUE); @@ -128,6 +129,7 @@ public class HttpUtil { multivaluedMap.add("endTime", endTime); multivaluedMap.add("validTimeEnabled", validTimeEnabled); multivaluedMap.add("userType", userType); + multivaluedMap.add("schoolId", schoolId); HttpEntity> httpEntity = new HttpEntity<>(multivaluedMap, headers); ResponseEntity responseEntity = restTemplate.postForEntity(url, httpEntity, String.class); log.info("发送请求,下发人脸至253服务器海康设备,请求地址:{} ,下发用户名:{},返回信息:{}",url,name,responseEntity.getBody()); @@ -138,7 +140,6 @@ public class HttpUtil { public static boolean IsDeviceOnline(String deviceId) { - String url = "http://120.26.116.253:8089/file/IsDeviceOnline?deviceId=" + deviceId; RestTemplate restTemplate = new RestTemplate(); String res = restTemplate.getForObject(url, String.class); @@ -248,8 +249,8 @@ public class HttpUtil { */ public static void sendDHPermission(PermissionDHBean permissionBean) { try{ -// String url = "http://121.40.109.21:8991/file/sendPermission"; - String url = "http://localhost:8991/file/sendPermission"; + String url = "http://121.40.109.21:8991/file/sendPermission"; +// String url = "http://127.0.0.1:8991/file/sendPermission"; RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); MediaType mediaType = MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE); @@ -286,11 +287,11 @@ public class HttpUtil { * @param userType * @param deviceIds */ - public static void uploadDHImg( String schoolId,int userType,String deviceIds) { - String api = "http://114.55.30.100:8991/user/sendFaces"; + public static void uploadDHImg(String schoolId,Integer userType,String deviceIds,Integer studentType,String sex) { + String api = "http://114.55.30.100:8991/operate/sendUserFaces"; // String api = "http://127.0.0.1:8991/user/sendFaces"; try { - String url = String.format(api +"?schoolId=%s&userType=%s&deviceIds=%s",schoolId,userType,deviceIds); + String url = String.format(api +"?schoolId=%s&userType=%s&deviceIds=%s&studentType=%s&sex=%s",schoolId,userType,deviceIds,studentType,sex); RestTemplate restTemplate = new RestTemplate(); ResponseEntity responseEntity = restTemplate.getForEntity(url, String.class); log.info("发送请求,照片下发至大华设备,请求地址:{},返回信息: {}",url,responseEntity.getBody()); @@ -316,4 +317,23 @@ public class HttpUtil { log.error("发送请求,删除大华设备人脸,异常信息:{}",e); } } + + /** + * 在线活体检测 + * @param checkUrl + * @return + */ + public static String checkFace(String checkUrl) { + String api = "http://114.55.30.100:8991/user/checkFace"; + try { + String url = String.format(api +"?url=%s",checkUrl); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.getForEntity(url, String.class); + log.info("发送请求,删除大华设备人脸,请求地址:{},返回信息: {}",url,responseEntity.getBody()); + return responseEntity.getBody(); + } catch (Exception e) { + log.error("发送请求,删除大华设备人脸,异常信息:{}",e); + } + return null; + } } diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/SpringContextHolder.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/SpringContextHolder.java new file mode 100644 index 0000000..d716c33 --- /dev/null +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/utils/SpringContextHolder.java @@ -0,0 +1,23 @@ +package com.sincere.haikangface.utils; + +import com.sincere.haikangface.service.impl.BaseService; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringContextHolder implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextHolder.applicationContext = applicationContext; + } + + public static BaseService getBaseService(){ + return (BaseService) applicationContext.getBean("baseService"); + } + +} diff --git a/cloud/haikangface/src/main/java/com/sincere/haikangface/xiananDao/SendRecordDao.java b/cloud/haikangface/src/main/java/com/sincere/haikangface/xiananDao/SendRecordDao.java index f6fcbcf..d1444ed 100644 --- a/cloud/haikangface/src/main/java/com/sincere/haikangface/xiananDao/SendRecordDao.java +++ b/cloud/haikangface/src/main/java/com/sincere/haikangface/xiananDao/SendRecordDao.java @@ -27,11 +27,11 @@ public interface SendRecordDao { @Param("userType") int userType, @Param("deviceType") int deviceType); - @Select("select * from Face_SendSuccess where schoolId = 870 ") + @Select("select * from Face_SendSuccess where schoolId = 865 ") List getSenSuccess(); @Select("select * from Face_SendSuccess where deviceID = #{deviceID} and schoolId = #{schoolId}") - List getSenSuccesss(@Param("deviceID") String clint_id, @Param("schoolId") String schoolId); + List getSenSuccesss(@Param("deviceID") String deviceId, @Param("schoolId") Integer schoolId); @Insert("insert into Face_SendFail values(#{deviceID},#{customerid},#{num},#{name},#{time},#{schoolName},#{imgPath},#{schoolId},#{failContent},#{failType},#{userType},#{deviceType})") @@ -127,19 +127,39 @@ public interface SendRecordDao { /******************************************* add by xuquan **********************************************/ @Select("select * from Face_SendRecord where deviceID = #{deviceID} and Num = #{Num} and userId = #{userId}") - List getRecordIsExit(@Param("deviceID") String clint_id, @Param("Num") String card,@Param("userId") String userId); + List getRecordIsExit(@Param("deviceID") String deviceId, @Param("Num") String cardNum,@Param("userId") String userId); - @Insert("insert into Face_SendRecord values(#{deviceID},#{userId},#{num},#{name},#{time},#{schoolName},#{imgPath},#{schoolId},#{failContent},#{failType},#{userType},#{deviceType},#{status})") + @Insert("insert into Face_SendRecord values(#{deviceID},#{userId},#{num},#{name},#{time},#{schoolName},#{imgPath},#{schoolId},#{failContent},#{failType},#{userType},#{deviceType},#{status},#{channel})") void saveFaceRecord(@Param("userId") String userId, @Param("deviceID") String deviceID, @Param("num") String num, @Param("name") String name, @Param("time") String time, @Param("schoolName") String schoolName, @Param("imgPath") String imgPath, @Param("schoolId") Integer schoolId, @Param("failContent") String failContent, - @Param("failType") Integer failType, @Param("userType") Integer userType, @Param("deviceType") Integer deviceType,Integer status); + @Param("failType") Integer failType, @Param("userType") Integer userType, @Param("deviceType") Integer deviceType,@Param("status") Integer status,@Param("channel") Integer channel); @Update("update Face_SendRecord set time = #{time},failContent = #{content},imgPath= #{faceUrl},status = 2 where deviceID = #{deviceID} and Num =#{Num} and userId = #{userId}") void updateFaceFailRecord(@Param("deviceID") String deviceId, @Param("faceUrl") String faceUrl,@Param("Num") String card, @Param("time") String time, @Param("content") String content,@Param("userId") String userId); - @Update("update Face_SendRecord set time = #{time},imgPath= #{faceUrl},Name = #{Name},status = 1, failType=null, failContent = null where deviceID = #{deviceID} and Num = #{Num}") - void updateFaceSuccessRecord(@Param("deviceID") String deviceId, @Param("Num") String card, @Param("time") String time, @Param("faceUrl") String faceUrl, @Param("Name") String name, @Param("userId") String userId); + @Update("update Face_SendRecord set time = #{time},imgPath= #{faceUrl},Name = #{Name},status = 1,channel=#{channel},failType=null, failContent = null where deviceID = #{deviceID} and Num = #{Num}") + void updateFaceSuccessRecord(@Param("deviceID") String deviceId, @Param("Num") String card, @Param("time") String time, @Param("faceUrl") String faceUrl, @Param("Name") String name, @Param("userId") String userId,@Param("channel") Integer channel); @Select("select * from Face_SendRecord where schoolId = #{schoolId} and status =2") List getFailRecord(@Param("schoolId") Integer schoolId); + + @Delete("delete Face_SendRecord where deviceID = #{deviceID} and Num = #{Num} and schoolId = #{schoolId}") + void deleteRecord(@Param("schoolId") Integer schoolId,@Param("deviceID") String deviceID,@Param("Num") String Num); + + @Delete("delete Face_SendSuccess where deviceID = #{deviceID} and Num = #{Num} and schoolId = #{schoolId}") + void deleteUserFaceSuccess(@Param("schoolId") Integer schoolId,@Param("Num") String Num, @Param("deviceID") String deviceID); + + @Delete("delete WG_SendSuccess where deviceID = #{deviceID} and cardNum = #{cardNum} and schoolID = #{schoolID}") + void deleteWGSuccess(@Param("schoolID") Integer schoolId,@Param("cardNum") String cardNum, @Param("deviceID") String deviceId); + + + @Delete("DELETE from SZ_AttendanceRecords202101 where school_id = #{schoolId} and card_Num = #{cardNum} and card_type = #{cardType} and outof=#{outof} and intime > #{startTime} and intime < #{endTime}") + void delete(@Param("schoolId") Integer schoolId,@Param("cardNum") String cardNum,@Param("cardType") Integer cardType,@Param("outof") Integer outof,@Param("startTime") String startTime,@Param("endTime") String endTime); + + @Delete("DELETE from SZ_AttendanceRecordsSS202101 where school_id = #{schoolId} and card_Num = #{cardNum} and card_type = #{cardType} and outof=#{outof} and intime > #{startTime} and intime < #{endTime}") + void deleteSS(@Param("schoolId") Integer schoolId,@Param("cardNum") String cardNum,@Param("cardType") Integer cardType,@Param("outof") Integer outof,@Param("startTime") String startTime,@Param("endTime") String endTime); + + + @Select("select top 1000 * from Face_SendFail where schoolId = 865 ") + List getFaceFailList(); } diff --git a/cloud/haikangface/src/main/resources/application.yaml b/cloud/haikangface/src/main/resources/application.yaml index d6de118..c8760de 100644 --- a/cloud/haikangface/src/main/resources/application.yaml +++ b/cloud/haikangface/src/main/resources/application.yaml @@ -3,9 +3,14 @@ server: spring: profiles: - active: dev + active: prod application: name: haikangserver + servlet: + multipart: + enabled: true + max-file-size: -1 + max-request-size: -1 datasource: campus: username: szjxtuser @@ -57,13 +62,8 @@ mybatis: ip: localhost -attendanceHost: http://campus.myjxt.com/ - iscurl: https://60.12.93.221:443 -##ipCloud: http://114.55.30.100:8081 -ipCloud: http://172.16.2.166:8081 - #logging: # level: # com.sincere.haikangface.xiaoanDao: debug diff --git a/cloud/haikangface/src/main/resources/logback-spring.xml b/cloud/haikangface/src/main/resources/logback-spring.xml index c0edbe0..8380ee8 100644 --- a/cloud/haikangface/src/main/resources/logback-spring.xml +++ b/cloud/haikangface/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - + @@ -51,4 +51,11 @@ + + + + + + + \ No newline at end of file diff --git a/cloud/haikangface/src/main/resources/mapper/usermapper.xml b/cloud/haikangface/src/main/resources/mapper/usermapper.xml index 90ed0d7..6223f33 100644 --- a/cloud/haikangface/src/main/resources/mapper/usermapper.xml +++ b/cloud/haikangface/src/main/resources/mapper/usermapper.xml @@ -63,14 +63,6 @@ update AC_DeviceAuthRecord set GrantState = #{grantState} where id = #{id} - - - - + + + + update SZ_User set face = #{face} where user_id = #{userId} + + + + + + insert into HS_StudentUpdateCard + (UserId ,CustomerId,StudentType,UserType,Name,ClassId,ClassName,OldCard ,Card,SchoolId,IsNew,UpdateType,AddTime ,Sex,Face,StudentCode,mobile) + values + (#{userId},#{customerId}, #{studentType}, #{userType}, #{name}, #{classId}, #{className}, #{oldCard}, #{card},#{schoolId},#{isNew},#{updateType}, #{addTime}, #{sex}, #{face}, #{studentCode}, #{mobile}) + + + + + + + + + + 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 9c130dd..0bd3d10 100644 --- a/cloud/haikangface/src/test/java/com/sincere/haikangface/HaikangfaceApplicationTests.java +++ b/cloud/haikangface/src/test/java/com/sincere/haikangface/HaikangfaceApplicationTests.java @@ -14,6 +14,7 @@ import com.sincere.haikangface.bean.xiaoan.CreditCardRecordsSS; import com.sincere.haikangface.dao.DeviceDao; 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.xiananDao.SendRecordDao; import org.bouncycastle.asn1.cms.MetaData; @@ -28,6 +29,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; @@ -251,6 +253,56 @@ public class HaikangfaceApplicationTests { } + @Test + public void delete() { + Integer schoolId =27; + Integer roomId = 11748; + Integer type = 7; + Integer outof = 1; + Integer size = 66; + String startTime= "2021-01-11 00:00:00"; + String endTime ="2021-01-11 23:59:59"; + List studentIds = userDao.queryStudentIdList(schoolId,roomId); + if(!CollectionUtils.isEmpty(studentIds)){ + for(int i=0;i<=studentIds.size();i++){ + if(i == size){ + return; + } + StudentBean userInfoBean = userDao.getStudentWithid(studentIds.get(i)); + if(userInfoBean!=null){ + String cardNum = userInfoBean.getStudent_num(); + System.out.println(i); + sendRecordDao.deleteSS(schoolId,cardNum,type,outof,startTime,endTime); + } + } + } + } + + @Test + public void delete2() { + Integer schoolId =27; + Integer roomId = 11748; + Integer type = 12; + Integer outof = 0; + Integer size =62; + String startTime= "2021-01-22 00:00:00"; + String endTime ="2021-01-22 23:59:59"; + List studentIds = userDao.queryStudentIdList(schoolId,roomId); + if(!CollectionUtils.isEmpty(studentIds)){ + for(int i=0;i<=studentIds.size();i++){ + if(i == size){ + return; + } + StudentBean userInfoBean = userDao.getStudentWithid(studentIds.get(i)); + if(userInfoBean!=null){ + String cardNum = userInfoBean.getStudent_num(); + System.out.println(i); + sendRecordDao.deleteSS(schoolId,cardNum,type,outof,startTime,endTime); + } + } + } + } + private int index(String content, List list) { for (int i = 0; i < list.size(); i++) { if (list.get(i).trim().equals(content.trim())) return i; @@ -291,6 +343,18 @@ public class HaikangfaceApplicationTests { @Autowired ZuoyeAdminDao zuoyeAdminDao; + @Autowired + BaseService baseService; + + @Test + public void test() { +// String deviceIds = "338652415671,694642005671,694642555671,338652515671,338653105671,338652895671,ytj687425415671,ytj694642105671,694642135671,ytj694642375671"; +// String deviceIds = "687425135671,ytj687425345671,ytj687425395671,ytj687425155671,687425355671,687425225671,687425265671,740456495671,687425325671,694642215671"; + String deviceIds = "694642215671"; + Integer schoolId = 865; + baseService.getSuccessList(schoolId,deviceIds); + } + @Test public void fileRes() { diff --git a/cloud/mypulsar/pom.xml b/cloud/mypulsar/pom.xml index 33ba41b..58c276c 100644 --- a/cloud/mypulsar/pom.xml +++ b/cloud/mypulsar/pom.xml @@ -117,11 +117,21 @@ 2.4.2 - - - - - + + + org.springframework.integration + spring-integration-stream + + + org.springframework.integration + spring-integration-mqtt + + + + commons-codec + commons-codec + 1.10 + diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/MyRunnerableInt.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/MyRunnerableInt.java index 798cf11..6e7ae4d 100644 --- a/cloud/mypulsar/src/main/java/com/example/mypulsar/MyRunnerableInt.java +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/MyRunnerableInt.java @@ -7,13 +7,14 @@ import com.example.mypulsar.message.MessageVO; import com.example.mypulsar.mq.AESBase64Utils; import com.example.mypulsar.mq.MessageHandlerTask; import com.example.mypulsar.mq.MqConsumer; +import com.example.mypulsar.mqtt.MqttConsumer; import com.example.mypulsar.task.SchduledTasks; import com.example.mypulsar.utils.ControlUtils; +import com.example.mypulsar.utils.JsonUtils; import com.example.mypulsar.utils.PulsarConsumerPoolFactory; import com.example.mypulsar.utils.ThreadPoolFactory; import lombok.extern.slf4j.Slf4j; import org.apache.pulsar.client.api.Consumer; -import org.apache.pulsar.client.impl.TopicMessageIdImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -21,8 +22,7 @@ import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import org.springframework.web.client.RestTemplate; -import sun.rmi.runtime.Log; +import org.springframework.util.StringUtils; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -64,19 +64,22 @@ public class MyRunnerableInt implements ApplicationRunner { * 第二种方式 */ private void initMqConsumer() { - MqConsumer mqConsumer = MqConsumer.build().serviceUrl(url).accessId(accessId).accessKey(accessKey) - .maxRedeliverCount(3).messageListener(message -> { - //消息内容 - String jsonMessage = new String(message.getData()); - MessageVO vo = JSON.parseObject(jsonMessage, MessageVO.class); - String data = AESBase64Utils.decrypt(vo.getData(), accessKey.substring(8, 24)); - TuYaReceiverBean tuYaReceiverBean = JSON.parseObject(data, TuYaReceiverBean.class); - log.info("接收消息,消息内容:"+ JSON.toJSONString(tuYaReceiverBean)); - //处理数据上报 - detealData(tuYaReceiverBean); - } - - ); + MqConsumer mqConsumer = MqConsumer.build() + .serviceUrl(url) + .accessId(accessId) + .accessKey(accessKey) + .maxRedeliverCount(3) + .messageListener(message -> { + //消息内容 + String jsonMessage = new String(message.getData()); + MessageVO vo = JSON.parseObject(jsonMessage, MessageVO.class); + //通过 AES (ECB 模式)对 accessKey 的中间 16 位代码进行解密 + String data = AESBase64Utils.decrypt(vo.getData(), accessKey.substring(8, 24)); + TuYaReceiverBean tuYaReceiverBean = JSON.parseObject(data, TuYaReceiverBean.class); + log.info("接收消息,消息内容:"+ JSON.toJSONString(tuYaReceiverBean)); + //处理数据上报 + detealData(tuYaReceiverBean); + }); try { mqConsumer.start(); } catch (Exception e) { @@ -105,30 +108,31 @@ public class MyRunnerableInt implements ApplicationRunner { deviceBean.setBizCode(bizCode); deviceBean.setDevId(devId); deviceBean.setProductKey(productKey); + Wl_Attendace attendace = deviceDao.selectAttendance(devId); + String deviceName = attendace ==null?"":attendace.getName(); + Integer schoolId = attendace ==null?null:attendace.getSchool_id(); //温度、人感、湿度数据上报事件 - if (bizCode == null) { - deviceBean.setBizCode(""); + if (StringUtils.isEmpty(bizCode)) { //在线状态:1在线0离线 deviceBean.setDev_status(1); //设备上报事件:code:时间类型; 格式:"status":[{"code":"pir","t":1612283849564,"value":"pir"}] List status = tuYaReceiverBean.getStatus(); for (TuYaReceiverBeanStatus statue : status) { //事件上报处理 - initStatue(statue, deviceBean); + initStatue(statue, deviceBean,schoolId); } } else {//其他事件上报 deviceBean.setTime(new SimpleDateFormat("yyyy-MM-dd HH::mm:ss").format(new Date())); - String name = deviceDao.selectAttendance(devId); switch (bizCode) { case "offline"://设备掉线 - log.info("设备: {},已掉线",name); + log.info("设备: {},已掉线",deviceName); deviceBean.setDev_type(1); deviceBean.setDev_status(0); updateDevStatus(deviceBean); updateStatus(devId, "0"); break; case "online"://设备上线 - log.info("设备: {},已上线",name); + log.info("设备: {},已上线",deviceName); deviceBean.setDev_status(1); deviceBean.setDev_type(2); updateDevStatus(deviceBean); @@ -142,6 +146,10 @@ public class MyRunnerableInt implements ApplicationRunner { case "delete"://删除设备 break; } + if(schoolId !=null && schoolId.intValue()==1){ + //同步数据至小程序 + sendMsg(deviceBean); + } } } @@ -171,13 +179,16 @@ public class MyRunnerableInt implements ApplicationRunner { updateStatus(deviceBean.getDevId(), "1"); } + + private MqttConsumer mqttConsumer; + private String accesskey = "T6dtGFMEs35U4la176032PCis5q6em3h"; /** * 数据上报事件处理 * * @param statue * @param deviceBean */ - private void initStatue(TuYaReceiverBeanStatus statue,DeviceBean deviceBean) { + private void initStatue(TuYaReceiverBeanStatus statue,DeviceBean deviceBean,Integer schoolId) { //设备消息类型:1:掉线,2:上线,3:其他事件 deviceBean.setDev_type(3); //事件时间 @@ -195,8 +206,6 @@ public class MyRunnerableInt implements ApplicationRunner { switch (code) { case "va_temperature"://温度 deviceBean.setValue(Integer.parseInt(value) / 100 + ""); - //计算开启或关闭设备 -// calOpenOrCloseDevWithtemper(deviceBean); log.info("温度:" + deviceBean.getValue()); //存储 对应设备对应的温度记录 ControlUtils.tempDevices.put(deviceBean.getDevId(),Integer.valueOf(deviceBean.getValue())); @@ -205,15 +214,13 @@ public class MyRunnerableInt implements ApplicationRunner { deviceBean.setValue(Integer.parseInt(value) / 100 + ""); log.info("湿度:" + deviceBean.getValue()); break; - case "pir": - //人体感应 + case "pir"://人体感应 log.info("人体感应:" + value); if(value.equals("pir")){ deviceBean.setValue("有人"); }else{ deviceBean.setValue("无人"); } - setClintTime(deviceBean.getDevId()); try { Thread.sleep(1000); //根据场地是否有人控制空调设备 @@ -222,11 +229,6 @@ public class MyRunnerableInt implements ApplicationRunner { e.printStackTrace(); } break; - case "temper_alarm"://防拆报警 - break; - case "battery_percentage"://电池电量百分比 - log.info("电池电量百分比:" + value); - break; case "battery_value"://电池电量值 break; case "battery"://门磁电池电量值 @@ -244,21 +246,59 @@ public class MyRunnerableInt implements ApplicationRunner { log("开关状态:" + (value.equals("true") ? "开门" : "关门")); break; case "cur_voltage"://当前电压 -// value = Integer.parseInt(value) / 10 + "V"; - log(deviceBean.getDevId() + " 当前电压:" + value); + if(value.equals("0")){ + value = "0"; + }else{ + value = Integer.parseInt(value) / 10 + ""; + } + log(deviceBean.getDevId() + " 当前电压:" + value +"v"); break; case "cur_power"://当前功率 -// value = value.equals("0")?"0":Integer.parseInt(value) / 10 + "W"; -// log(devId + " 当前功率:" + Integer.parseInt(value) / 10 + "W"); + if(value.equals("0")){ + value = "0"; + }else{ + value = Integer.parseInt(value) / 10+""; + } + log(deviceBean.getDevId() + " 当前功率:" + value + "W"); break; case "cur_current"://当前电流 -// value = value.equals("0")?"0":Integer.parseInt(value) / 10 + "A"; -// log(devId + " 当前电流:" + Integer.parseInt(value) / 10 + "A"); + if(value.equals("0")){ + value = "0"; + }else{ + value = Integer.parseInt(value) / 10+""; + } + log(deviceBean.getDevId() + " 当前电流:" + value + "A"); + break; + case "smoke_sensor_state"://烟雾报警 + break; + case "temper_alarm"://防拆报警 + break; + case "battery_percentage"://电池电量百分比 + log.info("电池电量百分比:" + value); break; case "router_mgr"://网关路由 break; } updateDevStatus(deviceBean); + if(schoolId !=null && schoolId.intValue()==16){ + //同步数据至小程序 + sendMsg(deviceBean); + } + } + + private void sendMsg(DeviceBean deviceBean){ + String json = JsonUtils.nonDefaultMapper().toJson(deviceBean); + String data =""; + try{ + data= AESBase64Utils.encrypt(json,accesskey.substring(8, 24)); + }catch (Exception e){ + log.error("加密失败: ",e); + } + if(mqttConsumer == null){ + mqttConsumer = new MqttConsumer(); + mqttConsumer.init(); + } + mqttConsumer.publish("Topic_Quene_Test",data); } /** @@ -267,11 +307,6 @@ public class MyRunnerableInt implements ApplicationRunner { * @param deviceBean */ private void calOpenOrCloseDevWithPir(DeviceBean deviceBean) { -// if (deviceBean.getValue().equals("有人")){ -// deviceBean.setValue("1"); -// } else{ -// deviceBean.setValue("0"); -// } //获取人感设备控制 List calDevContrls = deviceDao.getCalDevContrlWidthDevId(deviceBean.getDevId()); if (CollectionUtils.isEmpty(calDevContrls)) { @@ -286,11 +321,12 @@ public class MyRunnerableInt implements ApplicationRunner { * @param clintId */ private void setClintTime(String clintId){ + //获取人感设备 List calDevContrls = deviceDao.getCalDevContrlWidthDevId(clintId); if(!CollectionUtils.isEmpty(calDevContrls)){ CalDevContrl calDevContrl = calDevContrls.get(0); String assDevice = calDevContrl.getAssDevice(); - //红外遥控器 + //获取人感关联红外遥控器 CalDevBeContrl hwClint = getCalDevBeCon(assDevice); if(hwClint==null) { log.info("未查询到控制红外遥控器"); diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/IotDevice.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/IotDevice.java new file mode 100644 index 0000000..916a32a --- /dev/null +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/IotDevice.java @@ -0,0 +1,56 @@ +package com.example.mypulsar.bean; + +/** + * 设备上报记录 + * @author xuquan + * @date 2021/3/14 14:06 + */ + +public class IotDevice { + + private String devId; + private String code; + private String value; + private String time; + private Integer dev_status; + + public String getDevId() { + return devId; + } + + public void setDevId(String devId) { + this.devId = devId; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public Integer getDev_status() { + return dev_status; + } + + public void setDev_status(Integer dev_status) { + this.dev_status = dev_status; + } +} diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/TuYaReceiverBean.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/TuYaReceiverBean.java index a9ef778..8bd87f5 100644 --- a/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/TuYaReceiverBean.java +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/TuYaReceiverBean.java @@ -5,17 +5,22 @@ import java.util.List; public class TuYaReceiverBean implements Serializable { - private String dataId;//全局唯一id,标志单次数据上报 - - private String devId;//设备id - - private String productKey;//开发者平台对应的产品key - + /** + * 全局唯一id,标志单次数据上报 + */ + private String dataId; + /** + * 设备id + */ + private String devId; + /** + * 开发者平台对应的产品key + */ + private String productKey; /** * 设备数据上报事件 */ - private List status;//设备数据上报事件 - + private List status; /** * 其他事件 */ diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/Wl_Attendace.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/Wl_Attendace.java index 62e1dd1..646237a 100644 --- a/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/Wl_Attendace.java +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/bean/Wl_Attendace.java @@ -1,13 +1,25 @@ package com.example.mypulsar.bean; +import afu.org.checkerframework.checker.igj.qual.I; + import java.io.Serializable; public class Wl_Attendace implements Serializable { + private Integer school_id; + private String clint_id; private String name; + public Integer getSchool_id() { + return school_id; + } + + public void setSchool_id(Integer school_id) { + this.school_id = school_id; + } + public String getClint_id() { return clint_id; } diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/control/UserControl.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/control/UserControl.java index 956619f..06bad8f 100644 --- a/cloud/mypulsar/src/main/java/com/example/mypulsar/control/UserControl.java +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/control/UserControl.java @@ -4,6 +4,7 @@ import com.example.mypulsar.bean.DeviceBean; import com.example.mypulsar.bean.User; import com.example.mypulsar.dao.DeviceDao; import com.example.mypulsar.service.UserService; +import com.example.mypulsar.task.SchduledTasks; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -19,6 +20,9 @@ public class UserControl { @Autowired DeviceDao deviceDao; + @Autowired + SchduledTasks schduledTasks; + // @GetMapping("getUsers") // public List getUsers(){ // return userService.select(); @@ -32,5 +36,9 @@ public class UserControl { } + @RequestMapping(value = "close", method = RequestMethod.GET) + public void close() { + schduledTasks.initWlMode(); + } } diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/dao/DeviceDao.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/dao/DeviceDao.java index 07a37b1..763611e 100644 --- a/cloud/mypulsar/src/main/java/com/example/mypulsar/dao/DeviceDao.java +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/dao/DeviceDao.java @@ -1,10 +1,6 @@ package com.example.mypulsar.dao; -import com.example.mypulsar.bean.Wl_LinkModeBean; -import com.example.mypulsar.bean.CalDevBeContrl; -import com.example.mypulsar.bean.CalDevContrl; -import com.example.mypulsar.bean.DeviceBean; -import com.example.mypulsar.bean.Wl_Attendace; +import com.example.mypulsar.bean.*; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -30,8 +26,8 @@ public interface DeviceDao { int updateStatus(@Param("clint_id") String clint_id, @Param("isConnection") String isConnection, @Param("OnlineTime") String OnlineTime); - @Select("select top 1 name from WL_Attendance where clint_id = #{clint_id}") - String selectAttendance(@Param("clint_id") String clint_id); + @Select("select top 1* from WL_Attendance where clint_id = #{clint_id}") + Wl_Attendace selectAttendance(@Param("clint_id") String clint_id); @Select("select * from Iot_Device where devId = #{devId}") List getDevice(@Param("devId") String devId); @@ -40,6 +36,8 @@ public interface DeviceDao { @Select("select * from CalDevContrl ") List getCalDevContrl(); + @Select("select top 1 * from WL_Attendance where clint_id = #{clint_id} and isConnection =1 and clint_type =10") + Wl_Attendace getAttendace(@Param("clint_id") String clint_id); @Select("select * from CalDevContrl where Devid = #{Devid} and ModelType =10 and Status = 1") List getCalDevContrlWidthDevId(@Param("Devid") String devId); @@ -47,9 +45,15 @@ public interface DeviceDao { @Select("select * from CalDevBeContrl where State = 1 and Id = #{Id}") CalDevBeContrl getCalDevBeControl(@Param("Id") String Id); + @Select("select top 1 * from CalDevBeContrl where State = 1 and ConDevId = #{devId}") + CalDevBeContrl getHWDevControl(@Param("devId") String devId); + @Select("select * from CalDevContrl where Devid = #{Devid} and Status = 1 and ModelType = 9") List getTempCalWitdDevid(@Param("Devid") String devId); + @Select("select top 1* from CalDevContrl where DevBeId = #{beId} and Status = 1 and ModelType = 9") + CalDevContrl getTempDevice(@Param("beId") Integer beId); + @Select("select clint_id\n" + "from WL_Attendance where school_id = 1085 and clint_type = 12 and state = 1") List getHWDEvices(int i); @@ -78,4 +82,11 @@ public interface DeviceDao { List getWL_LinkMode(@Param("SchoolId") String SchoolId); + IotDevice getIotDeviceRecord(@Param("devId") String devId, @Param("value") String value,@Param("openTime") String openTime); + + List getHWAtts(); + + + + } diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/enums/EnumEventType.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/enums/EnumEventType.java new file mode 100644 index 0000000..8cf0833 --- /dev/null +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/enums/EnumEventType.java @@ -0,0 +1,41 @@ +package com.example.mypulsar.enums; + +/** + * Created with IntelliJ IDEA. + * + * @Auther: xuquan + * @Date: 2021/03/31 8:55 + * @Description: + */ +public enum EnumEventType { + + VA_TEMPERATURE("va_temperature", "温度"), + VA_HUMIDITY("va_humidity", "湿度"), + PIR("pir", "人体运动"), + BATTERY("battery", "门磁电池电量值"), + BATTERY_VALUE("battery_value", "电池电量值"), + BATTERY_STATE("battery_state", "电池电量状态"), + BATTERY_PERCENTAGE("battery_percentage", "电池电量百分比"), + SMOKE_SENSOR_STATE("smoke_sensor_state", "烟雾报警"), + CUR_POWER("cur_power", "当前功率"), + CUR_CURRENT("cur_current", "当前电流"), + CUR_VOLTAGE("cur_voltage", "当前电压"), + SWITCH("switch", "门磁状态"), + DOOR_CONTACT_STATE("doorcontact_state", "门磁状态"); + + public final String code; + public final String message; + + public String getCode() { + return code; + } + + public String getMessage() { + return message; + } + + EnumEventType(String code, String message) { + this.code = code; + this.message = message; + } +} diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/message/MessageVO.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/message/MessageVO.java index 5868cf9..9fa9ee4 100644 --- a/cloud/mypulsar/src/main/java/com/example/mypulsar/message/MessageVO.java +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/message/MessageVO.java @@ -8,11 +8,25 @@ import java.io.Serializable; */ public class MessageVO implements Serializable { - + /** + * 消息体内容 + */ private String data; + /** + * 协议号 + */ private Integer protocol; + /** + * 通信协议号 + */ private String pv; + /** + * 签名 + */ private String sign; + /** + * 时间戳 + */ private Long t; diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumer.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumer.java new file mode 100644 index 0000000..54f430e --- /dev/null +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumer.java @@ -0,0 +1,168 @@ +package com.example.mypulsar.mqtt; + +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.*; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * Created with IntelliJ IDEA. + * + * @Auther: xuquan + * @Date: 2021/03/31 16:13 + * @Description: + */ +@Slf4j +public class MqttConsumer{ + + private static MqttClient client; + + @PostConstruct + public void init() { + connect(); + } + + /*** + * @Description: 连接mqtt服务器 + * @Param: [] + * @return: void + * @Author: xuquan + * @Date: 2021/3/31 + */ + private void connect() { + log.info("初始化并启动mqtt......"); + try { + // 1 创建客户端 + getClient(); + // 2 设置配置 + MqttConnectOptions options = getOptions(); + String[] topic = MqttProperties.MQTT_TOPIC.split(","); + // 3 消息发布质量 + int[] qos = getQos(topic.length); + // 4 最后设置 + create(options, topic, qos); + } catch (Exception e) { + log.error("mqtt连接异常:" + e); + } + } + + /*** + * @Description: 创建客户端 + * @Param: [] + * @return: void + * @Author: xuquan + * @Date: 2021/3/31 + */ + public void getClient() { + try { + if (null == client) { + client = new MqttClient(MqttProperties.MQTT_HOST, MqttProperties.MQTT_CLINT_ID, new MemoryPersistence()); + } + log.info("创建mqtt客户端:"); + } catch (Exception e) { + log.error("创建mqtt客户端异常:" +e); + } + } + + /*** + * @Description: 生成mqtt配置对象 + * @Param: [] + * @return: org.eclipse.paho.client.mqttv3.MqttConnectOptions + * @Author: xuquan + * @Date: 2021/3/31 + */ + public MqttConnectOptions getOptions() { + MqttConnectOptions options = new MqttConnectOptions(); + options.setUserName(MqttProperties.MQTT_USER_NAME); + options.setPassword(MqttProperties.SIGN.toCharArray()); + // 设置超时时间 + options.setConnectionTimeout(MqttProperties.MQTT_TIMEOUT); + // 设置会话心跳时间 + options.setKeepAliveInterval(MqttProperties.MQTT_KEEP_ALIVE); + options.setAutomaticReconnect(true); + // 是否清除session + options.setCleanSession(false); + log.info("生成mqtt配置对象"); + return options; + } + + /*** + * @Description: 设置消息发布服务质量 + * @Param: [length] + * @return: int[] + * @Author: xuquan + * @Date: 2021/3/31 + */ + public int[] getQos(int length) { + int[] qos = new int[length]; + for (int i = 0; i < length; i++) { + /** +             *  MQTT协议中有三种消息发布服务质量: +             * +             * QOS0: “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据, + * 丢失一次读记录无所谓,因为不久后还会有第二次发送。 +             * QOS1: “至少一次”,确保消息到达,但消息重复可能会发生。 +             * QOS2: “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果,资源开销大 +             */ + qos[i] = 1; + } + log.info("设置消息发布质量"); + return qos; + } + + /*** + * @Description: 装载各种实例和订阅主题 + * @Param: [options, topic, qos] + * @return: void + * @Author: xuquan + * @Date: 2021/3/31 + */ + public void create(MqttConnectOptions options, String[] topic, int[] qos) { + try { + client.setCallback(new MqttConsumerCallback(client, options, topic, qos)); + log.info("添加回调处理类"); + client.connect(options); + } catch (Exception e) { + log.error("装载实例或订阅主题异常:" + e); + } + } + + /*** + * @Description: 发布主题消息 + * @Param: [topic, msg] + * @return: void + * @Author: xuquan + * @Date: 2021/3/31 + */ + public static void publish(String topic, String msg) { + publish(1, false, topic, msg); + } + + public static void publish(int qos, boolean retained, String topic, String pushMessage) { + MqttMessage message = new MqttMessage(); + message.setQos(qos); + message.setRetained(retained); + message.setPayload(pushMessage.getBytes()); + MqttTopic mTopic = client.getTopic(topic); + if (null == mTopic) { + log.warn("topic:" + topic + " 不存在"); + } + MqttDeliveryToken token; + try { + token = mTopic.publish(message); + token.waitForCompletion(); + if (!token.isComplete()) { + log.info("消息发送成功"); + } + } catch (MqttPersistenceException e) { + e.printStackTrace(); + } catch (MqttException e) { + e.printStackTrace(); + } + } + +} diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumerCallback.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumerCallback.java new file mode 100644 index 0000000..f4babf8 --- /dev/null +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttConsumerCallback.java @@ -0,0 +1,70 @@ +package com.example.mypulsar.mqtt; + +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.*; + +import java.util.Arrays; + +/** + * Created with IntelliJ IDEA. + * + * @Auther: xuquan + * @Date: 2021/03/31 21:51 + * @Description: + */ +@Slf4j +public class MqttConsumerCallback implements MqttCallbackExtended { + + private MqttClient client; + private MqttConnectOptions options; + private String[] topic; + private int[] qos; + + public MqttConsumerCallback(MqttClient client, MqttConnectOptions options, String[] topic, int[] qos) { + this.client = client; + this.options = options; + this.topic = topic; + this.qos = qos; + } + + /*** + * @Description: 断开重连机制 + * @Param: [cause] + * @return: void + * @Author: xuquan + * @Date: 2021/4/1 + */ + @Override + public void connectionLost(Throwable cause) { + log.info("MQTT连接断开,发起重连......"); + try { + if (null != client && !client.isConnected()) { + client.reconnect(); + log.info("尝试重新连接"); + } else { + client.connect(options); + log.info("尝试建立新连接"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /*** + * @Description: 接收到消息调用令牌中调用 + * @Param: [token] + * @return: void + * @Author: xuquan + * @Date: 2021/4/1 + */ + @Override + public void deliveryComplete(IMqttDeliveryToken token) { + log.info("deliveryComplete---------" + Arrays.toString(topic)); + } + + @Override + public void messageArrived(String topic, MqttMessage message) { } + + @Override + public void connectComplete(boolean b, String s) { } +} \ No newline at end of file diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttProperties.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttProperties.java new file mode 100644 index 0000000..6686263 --- /dev/null +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/mqtt/MqttProperties.java @@ -0,0 +1,104 @@ +package com.example.mypulsar.mqtt; + +import org.apache.commons.codec.binary.Base64; +import org.apache.logging.log4j.util.PropertiesUtil; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Properties; + +/** + * Created with IntelliJ IDEA. + * + * @Auther: xuquan + * @Date: 2021/03/31 21:26 + * @Description: + */ +public class MqttProperties { + + public static String MQTT_HOST; + + public static String MQTT_CLINT_ID; + + public static String MQTT_USER_NAME; + + public static String MQTT_PASSWORD; + + public static String MQTT_TOPIC; + + public static Integer MQTT_TIMEOUT; + + public static Integer MQTT_KEEP_ALIVE; + + public static String MQTT_GROUP_ID; + + public static String SIGN; + + + /** +     *  mqtt配置 +     */ + static { + Properties properties = loadMqttProperties(); + MQTT_HOST = properties.getProperty("host"); + MQTT_CLINT_ID = properties.getProperty("clintId"); //+ "@@@9ED96FB6D72C1698"; + MQTT_USER_NAME = properties.getProperty("accessKey"); + MQTT_PASSWORD = properties.getProperty("secretKey"); + MQTT_TOPIC = properties.getProperty("topic"); + MQTT_TIMEOUT = Integer.valueOf(properties.getProperty("timeout")); + MQTT_KEEP_ALIVE = Integer.valueOf(properties.getProperty("keepalive")); + MQTT_GROUP_ID = properties.getProperty("clintId").split("@@@")[0]; + try { + SIGN = macSignature(MQTT_GROUP_ID, MQTT_PASSWORD); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } + + /** + * 加载mqtt配置参数 + * @return + */ + private static Properties loadMqttProperties() { + InputStream inputstream = PropertiesUtil.class.getResourceAsStream("/application.yml"); + Properties properties = new Properties(); + try { + properties.load(inputstream); + return properties; + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + try { + if (inputstream != null) { + inputstream.close(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + /** + * @param text 要签名的文本 + * @param secretKey 阿里云MQ secretKey + * @return 加密后的字符串 + * @throws InvalidKeyException + * @throws NoSuchAlgorithmException + */ + public static String macSignature(String text, String secretKey) throws InvalidKeyException, NoSuchAlgorithmException { + Charset charset = Charset.forName("UTF-8"); + String algorithm = "HmacSHA1"; + Mac mac = Mac.getInstance(algorithm); + mac.init(new SecretKeySpec(secretKey.getBytes(charset), algorithm)); + byte[] bytes = mac.doFinal(text.getBytes(charset)); + return new String(Base64.encodeBase64(bytes), charset); + } + +} diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/task/SchduledTasks.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/task/SchduledTasks.java index 2c6cb7d..efb23c0 100644 --- a/cloud/mypulsar/src/main/java/com/example/mypulsar/task/SchduledTasks.java +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/task/SchduledTasks.java @@ -2,11 +2,12 @@ package com.example.mypulsar.task; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.example.mypulsar.bean.Wl_Attendace; -import com.example.mypulsar.bean.Wl_LinkModeBean; +import com.example.mypulsar.bean.*; import com.example.mypulsar.campusDao.CampusDao; import com.example.mypulsar.dao.DeviceDao; import com.example.mypulsar.utils.HttpUtil; +import com.example.mypulsar.utils.JsonUtils; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.dom4j.Document; import org.dom4j.DocumentException; @@ -17,6 +18,7 @@ import org.springframework.boot.configurationprocessor.json.JSONArray; import org.springframework.boot.configurationprocessor.json.JSONException; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -36,7 +38,7 @@ public class SchduledTasks { public static Map closeDevMap = new HashMap<>(); - private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private String closeModel = "{\"mode\":\"0\",\"power\":\"0\",\"remote_id\":\"%s\",\"remote_index\":\"11272\",\"temp\":\"26\",\"wind\":\"0\"}"; @@ -45,35 +47,46 @@ public class SchduledTasks { @Scheduled(fixedRate = 60000) public void closeAttend() { - log.info(".......定时任务执行设备关闭.......,有在线遥控设备数量" + closeDevMap.size()); - Iterator> it = closeDevMap.entrySet().iterator(); + log.info(".......定时任务执行设备关闭.......,有在线遥控设备数量" + conDevMap.size()); + Iterator> it = conDevMap.entrySet().iterator(); while(it.hasNext()) { Map.Entry entry = it.next(); String conBeDeviceId = entry.getKey(); if(conDevMap.containsKey(conBeDeviceId) && conDevMap.get(conBeDeviceId)!=null){ + //红外设备 + String name = deviceDao.getWLName(conBeDeviceId); + //获取红外绑定的遥控器ID + String conValue = getRemoteId(deviceDao.getConBeValue(conBeDeviceId)); Date openTime = entry.getValue(); - log.info("在线设备:" + conBeDeviceId + "---在线时间:" + simpleDateFormat.format(entry.getValue())+"当前时间:"+ simpleDateFormat.format(new Date())); - //大于十分钟后关闭设备 - if(((new Date().getTime()) - openTime.getTime()) > 5 * 60 * 1000) { - String conValue = getRemoteId(deviceDao.getConBeValue(conBeDeviceId)); - String name = deviceDao.getWLName(conBeDeviceId); - log.info("开始执行关闭命令, remote_id: {}",conValue); - String response = HttpUtil.addAirCode(String.format(closeModel, conValue), conBeDeviceId, name); - try{ - // 将字符串转为XML - Document doc = DocumentHelper.parseText(response); - // 获取根节点 - Element rootElt = doc.getRootElement(); - // 拿到head节点下的子节点title值 - String title = rootElt.elementTextTrim("code"); - log.info("请求结果:" + title); - if(title.equals("200")){ - conDevMap.remove(conBeDeviceId); + log.info("在线红外设备:" + name + "---在线时间:" + simpleDateFormat.format(openTime)+" 当前时间:"+ simpleDateFormat.format(new Date())); + //获取红外设备 + CalDevBeContrl hwDevice = deviceDao.getHWDevControl(conBeDeviceId); + if(hwDevice !=null){ + Integer beId = hwDevice.getId(); + //获取温感设备 + CalDevContrl calDevContrl = deviceDao.getTempDevice(beId); + //无人状态直接关闭 + boolean isOk = convertDeviceRecord(calDevContrl,openTime); + if(isOk){ + log.info("开始执行关闭命令, remote_id: {}",conValue); + String response = HttpUtil.addAirCode(String.format(closeModel, conValue), conBeDeviceId, name); + try{ + // 将字符串转为XML + Document doc = DocumentHelper.parseText(response); + // 获取根节点 + Element rootElt = doc.getRootElement(); + // 拿到head节点下的子节点title值 + String title = rootElt.elementTextTrim("code"); + log.info("请求结果:" + title); + if(title.equals("200")){ + log.info("关闭成功:设备 :{},遥控ID: {}",name,conValue); + conDevMap.remove(conBeDeviceId); + } + } catch (DocumentException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); } - } catch (DocumentException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); } } } @@ -81,7 +94,114 @@ public class SchduledTasks { if (!outClose){ initWlModeOut(); } - log.info("关闭成功 :" + JSON.toJSONString(conDevMap)); + } + + + /** + * 解析上报记录,判断空间是否是无人状态。 + * 条件:第一次上报无人后,五分钟内没有上报有人记录,则为无人 + * @param calDevContrl + * @param openTime + * @return + */ + private boolean convertDeviceRecord(CalDevContrl calDevContrl,Date openTime){ + if(calDevContrl != null){ + List list = new ArrayList(); + Map map = new HashMap(); + //温感设备ID + String tempDevId =calDevContrl.getDevid(); + //空调开启时间 + String openTimeStr = simpleDateFormat.format(openTime); + //温感关联的人感设备 + String assDevice = calDevContrl.getAssDevice(); + String[] assDeviceIds = assDevice.split(","); + for (int i = 0; i < assDeviceIds.length; i++) { + String deviceId = assDeviceIds[i]; + //过滤温感设备ID + if (!deviceId.equals(tempDevId)) { + list.add(deviceId); + Wl_Attendace attendance = deviceDao.getAttendace(deviceId); + if(attendance==null){ + map.put(deviceId,"true"); + continue; + } + //取得空调开启时间,离最近一次上报无人记录 + IotDevice iotDevice = deviceDao.getIotDeviceRecord(deviceId, "无人", openTimeStr); + log.info("空调开启时间最近一次,无人记录,时间:{}, 设备信息:{}",openTime,JSON.toJSON(iotDevice)); + if(iotDevice != null){ + //五分钟内没有上报有人记录 + String afterTime5 = getDateAddMinute(iotDevice.getTime(),5); + iotDevice = deviceDao.getIotDeviceRecord(deviceId,"有人",afterTime5); + log.info("5分钟之后的有人记录,时间:{}, 设备信息:{}",afterTime5,JSON.toJSON(iotDevice)); + if(iotDevice ==null){ + map.put(deviceId,"true"); + }else{ + map.put(deviceId,"false"); + } + }else{ + map.put(deviceId,"false"); + } + } + } + log.info("设备信息:{}, 上报记录: {}",JSON.toJSON(list),JSON.toJSON(map)); + //false 无人 true 有人,当前后人感都为无人下,返回true + if(!CollectionUtils.isEmpty(list) && !map.isEmpty()){ + if(map.get(list.get(0)).equals("true")&& map.get(list.get(1)).equals("true")){ + return true; + } + } + } + return false; + } + + /** + * 日期叠加计算,以月为单位:整数 + * @param date 起始时间 + * @return + */ + public static String getDateAddMinute(String date,int length) { + Date date1 = stringFormatDate(date,"yyyy-MM-dd HH:mm:ss"); + Calendar cal = Calendar.getInstance(); + cal.setTime(date1);//设置起时间 + cal.add(Calendar.MINUTE,length); + String strDate = dateFormatString(cal.getTime(),"yyyy-MM-dd HH:mm:ss"); + return strDate; + } + + /** + * String 转 Date : 指定格式:pattern + * @param date + * @param pattern + * @return + */ + public static Date stringFormatDate(String date, String pattern) { + SimpleDateFormat simpleDateFormat = null; + if (date != null) { + try{ + simpleDateFormat = new SimpleDateFormat(pattern); + Date retultDate = simpleDateFormat.parse(date); + return retultDate; + }catch (ParseException e){ + e.printStackTrace(); + } + } + return null; + } + + /** + * Date转 String : 指定格式:pattern + * @param date + * @param pattern + * @return + */ + public static String dateFormatString(Date date,String pattern) { + SimpleDateFormat df = null; + String returnValue = null; + if (date != null) { + df = new SimpleDateFormat(pattern); + returnValue = df.format(date); + } + return returnValue; } @@ -93,10 +213,14 @@ public class SchduledTasks { } } + public static void main(String[] args) { + System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY)); + } + /** * 根据物联模板判断是否关闭 */ - private void initWlModeOut() { + public void initWlModeOut() { try { isClose = true; //获取有效的模板 @@ -122,12 +246,14 @@ public class SchduledTasks { int week = Integer.parseInt(weeks[k]); if (week == indexWeek) { try { + //截至时间 Date endDate = simpleDateFormat.parse(endTime); - Date date = simpleDateFormat1.parse(new Date().getHours() + ":" + new Date().getMinutes() + ":" + new Date().getSeconds()); - Date endDate2 = getDateByTime(1,endDate); - long indexTime = date.getTime(); + Date endDate2 = getDateByTime(3,endDate); long entTime = endDate.getTime(); long entTime2 = endDate2.getTime(); + //当前时间 + Date date = simpleDateFormat1.parse(new Date().getHours() + ":" + new Date().getMinutes() + ":" + new Date().getSeconds()); + long indexTime = date.getTime(); //当前时间等于结束时间触发一次指令 if (indexTime > entTime && indexTime < entTime2) { //关闭所有设备 @@ -149,10 +275,6 @@ public class SchduledTasks { log.info("关闭设备异常: ",e); } } - } else { - //获取红外遥控器 - List clintIds = deviceDao.getHWIds(); - closeAllDevice(clintIds); } } catch (Exception e) { log.info("关闭设备异常: ",e); @@ -170,12 +292,12 @@ public class SchduledTasks { /** * 根据物联模板判断是否关闭 */ - private void initWlMode() { + public void initWlMode() { try { isClose = true; //获取有效的模板 List wl_linkModes = deviceDao.getWL_LinkMode("1085"); - if (null != wl_linkModes) { + if (!CollectionUtils.isEmpty(wl_linkModes)) { for (int i = 0; i < wl_linkModes.size(); i++) { Wl_LinkModeBean wl_linkModeBean = wl_linkModes.get(i); @@ -206,7 +328,6 @@ public class SchduledTasks { for (int k = 0; k < weeks.length; k++) { int week = Integer.parseInt(weeks[k]); - if (week == indexWeek) { Date startDate = null; try { @@ -226,13 +347,11 @@ public class SchduledTasks { List clintIds = deviceDao.getHWAttsWithRoomId(fieldId); closeAllDevice(clintIds); } - } } catch (ParseException e) { log.info("关闭设备异常: ",e); } } - } } } @@ -264,10 +383,12 @@ public class SchduledTasks { Element rootElt = doc.getRootElement(); // 拿到head节点下的子节点title值 String title = rootElt.elementTextTrim("code"); - log.info("请求结果:" + title); + log.info("请求结果:" + title+" 设备ID : "+ deviceId); if(title.equals("200")){ + log.info("关闭成功:设备 :{},遥控ID: {}",devName,conValue); conDevMap.remove(deviceId); } + System.out.println(i); } catch (DocumentException e) { e.printStackTrace(); } catch (Exception e) { diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/ControlUtils.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/ControlUtils.java index e114e8a..9cbdbf7 100644 --- a/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/ControlUtils.java +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/ControlUtils.java @@ -63,11 +63,11 @@ public class ControlUtils { try { //联动的时间范围,[{"Week":"5","StartTime":"14:02","EndTime":"14:06"}] if(StringUtils.isEmpty(cal.getInUserTime())){ + log.info("人感控制设备ID: {},未设置联动计划。",cal.getDevid()); continue; } String inUseTime =cal.getInUserTime(); JSONArray jsonArray = new JSONArray(inUseTime); - log.info("控制设备ID: {}, 联动时间计划:{}",cal.getDevid(),jsonArray.toString()); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); String weekStr = jsonObject.getString("Week"); diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/HttpUtil.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/HttpUtil.java index db85c97..542c4d7 100644 --- a/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/HttpUtil.java +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/HttpUtil.java @@ -141,9 +141,10 @@ public class HttpUtil { * @param conDevName 设备名称 * @return */ - public static String addAirCode(String conValue, String conDevId, String conDevName) { + public static String addAirCode(String conValue, String conDevId, String conDevName) { try { String url = String.format("http://120.26.116.253:5555/TuYa/%s/addAirCode", conDevId); +// String url = String.format("http://120.26.116.253:5555/TuYa/%s/airConditioners", conDevId); RestTemplate restTemplate = new RestTemplate(); TuYaAirCondition tuYaAirCondition = new TuYaAirCondition(); String power = ""; @@ -160,9 +161,13 @@ public class HttpUtil { log.info("控制失败:失败信息",e); } log.info("开始发送遥控命令至设备:请求地址: {},设备名称: {},设备ID: {},请求参数: {}",url,conDevName,conDevId,tuYaAirCondition.toString()); - String response = restTemplate.postForObject(url, tuYaAirCondition, String.class); + //轮询2次下发指令,防止偶然性第一次没启动 + String response =""; + for(int i=0;i<2;i++){ + Thread.sleep(1000); + response = restTemplate.postForObject(url, tuYaAirCondition, String.class); + } log.info("返回结果:{}",response); -// FileUtils.getInstance().writeLogs(String.format("%s设备%s--控制%s", power.equals("1") ? "成功" : "失败", conDevName + "-" + conDevId, response), FileUtils.addAirCode); return response; }catch (Exception e){ log.info("请求红外控制指令失败:{}",e); diff --git a/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/JsonUtils.java b/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/JsonUtils.java new file mode 100644 index 0000000..7c8aa42 --- /dev/null +++ b/cloud/mypulsar/src/main/java/com/example/mypulsar/utils/JsonUtils.java @@ -0,0 +1,149 @@ +package com.example.mypulsar.utils; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.micrometer.core.instrument.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Collection; +import java.util.Map; + +/** + * Created with IntelliJ IDEA. + * + * @Auther: xuquan + * @Date: 2021/03/22 14:21 + * @Description:

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

+ * 简单封装Jackson,实现JSON String<->Java Object的Mapper. + */ +public class JsonUtils { + + private static final Logger LOG = LoggerFactory.getLogger(JsonUtils.class); + + private ObjectMapper mapper; + + public JsonUtils(){ + this(null); + } + + public JsonUtils(Include include) { + mapper = new ObjectMapper(); + // 设置输出时包含属性的风格 + if (include != null) { + mapper.setSerializationInclusion(include); + } + // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性 + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + } + + /** + * 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper,建议在外部接口中使用. + */ + public static JsonUtils nonEmptyMapper() { + return new JsonUtils(Include.NON_EMPTY); + } + + /** + * 创建只输出初始值被改变的属性到Json字符串的Mapper, 最节约的存储方式,建议在内部接口中使用。 + */ + public static JsonUtils nonDefaultMapper() { + return new JsonUtils(Include.NON_DEFAULT); + } + + /** + * Object可以是POJO,也可以是Collection或数组。 + * 如果对象为Null, 返回"null". + * 如果集合为空集合, 返回"[]". + */ + public String toJson(Object object) { + + try { + return mapper.writeValueAsString(object); + } catch (IOException e) { + LOG.warn(String.format("序列化成 JSON 字符串发生错误:%s", object), e); + return null; + } + } + + /** + * 反序列化POJO或简单Collection如List. + * + * 如果JSON字符串为Null或"null"字符串, 返回Null. + * 如果JSON字符串为"[]", 返回空集合. + * + * 如需反序列化复杂Collection如List, 请使用fromJson(String, JavaType) + * + * @see #fromJson(String, JavaType) + */ + public T fromJson(String jsonString, Class clazz) { + if (StringUtils.isEmpty(jsonString)) { + return null; + } + + try { + return mapper.readValue(jsonString, clazz); + } catch (IOException e) { + LOG.error(String.format("解析 JSON 字符串发生错误:%s", jsonString), e); + return null; + } + } + + /** + * 反序列化泛型对象 + * @param + * @param jsonString + * @param typeReference + * @return + */ + public T fromJson(String jsonString, TypeReference typeReference) { + if (StringUtils.isEmpty(jsonString)) { + return null; + } + + try { + return mapper.readValue(jsonString, typeReference); + } catch (IOException e) { + LOG.error(String.format("解析 JSON 字符串发生错误:%s", jsonString), e); + return null; + } + } + + /** + * 反序列化复杂Collection如List, 先使用createCollectionType()或contructMapType()构造类型, 然后调用本函数. + * + * @see #(Class, Class...) + */ + public T fromJson(String jsonString, JavaType javaType) { + if (StringUtils.isEmpty(jsonString)) { + return null; + } + + try { + return mapper.readValue(jsonString, javaType); + } catch (IOException e) { + LOG.error(String.format("解析 JSON 字符串发生错误:%s", jsonString), e); + return null; + } + } + + /** + * 构造Collection类型. + */ + public JavaType contructCollectionType(Class collectionClass, Class elementClass) { + return mapper.getTypeFactory().constructCollectionType(collectionClass, elementClass); + } + + /** + * 构造Map类型. + */ + public JavaType contructMapType(Class mapClass, Class keyClass, Class valueClass) { + return mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass); + } + + +} diff --git a/cloud/mypulsar/src/main/resources/application.yaml b/cloud/mypulsar/src/main/resources/application.yaml deleted file mode 100644 index 7821c07..0000000 --- a/cloud/mypulsar/src/main/resources/application.yaml +++ /dev/null @@ -1,41 +0,0 @@ -server: - port: 10009 - -spring: - profiles: - active: dev - application: - name: mypulsar - datasource: - iotplat: - username: szjxtuser - password: RQminVCJota3H1u8bBYH - jdbc-url: jdbc:sqlserver://116.62.155.137:33419;database=IotPlatform - driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver - campus: - username: szjxtuser - password: RQminVCJota3H1u8bBYH - jdbc-url: jdbc:sqlserver://116.62.155.137:33419;database=SmartCampus - driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver - -mybatis: - campus: - type-aliases-package: com.example.mypulsar.campusDao - mapper-locations: classpath:mapper/*.xml - iotplat: - type-aliases-package: com.example.mypulsar.dao - mapper-locations: classpath:iotmapper/*.xml - config-location: classpath:mybatis-config.xml - - - -eureka: - instance: - hostname: localhost - lease-expiration-duration-in-seconds: 60 - lease-renewal-interval-in-seconds: 10 - client: - service-url: - # defaultZone: http://localhost:8761/eureka/ - defaultZone: http://121.40.109.21:8761/eureka/,http://121.40.109.21:8762/eureka/ - diff --git a/cloud/mypulsar/src/main/resources/application.yml b/cloud/mypulsar/src/main/resources/application.yml new file mode 100644 index 0000000..6ed1752 --- /dev/null +++ b/cloud/mypulsar/src/main/resources/application.yml @@ -0,0 +1,57 @@ +server: + port: 10009 + +spring: + profiles: + active: dev + application: + name: mypulsar + datasource: + iotplat: + username: szjxtuser + password: RQminVCJota3H1u8bBYH + jdbc-url: jdbc:sqlserver://116.62.155.137:33419;database=IotPlatform + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + campus: + username: szjxtuser + password: RQminVCJota3H1u8bBYH + jdbc-url: jdbc:sqlserver://116.62.155.137:33419;database=SmartCampus + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + # MQTT + mqtt: + # 服务器连接地址,如果有多个,用逗号隔开 + host: tcp://post-cn-4590mq2hr03.mqtt.aliyuncs.com:1883 + # 连接服务器默认客户端ID 格式:groupId + @@@ + IOT2021 + clintId: GID_IOTSERVER2021@@@IOT2021 + # 默认的消息推送主题,如果有多个,用逗号隔开 + topic: Topic_Quene_Test + # 用户名 + accessKey: UimvLVp0Wj90P88u + # 密码 + secretKey: TE4rZenITG27tiQqHx9qINjx71Nws7 + # 连接超时 + timeout: 30 + # 心跳 + keepalive: 30 + +mybatis: + campus: + type-aliases-package: com.example.mypulsar.campusDao + mapper-locations: classpath:mapper/*.xml + iotplat: + type-aliases-package: com.example.mypulsar.dao + mapper-locations: classpath:iotmapper/*.xml + config-location: classpath:mybatis-config.xml + + + +eureka: + instance: + hostname: localhost + lease-expiration-duration-in-seconds: 60 + lease-renewal-interval-in-seconds: 10 + client: + service-url: + # defaultZone: http://localhost:8761/eureka/ + defaultZone: http://121.40.109.21:8761/eureka/,http://121.40.109.21:8762/eureka/ + diff --git a/cloud/mypulsar/src/main/resources/iotmapper/iotmapper.xml b/cloud/mypulsar/src/main/resources/iotmapper/iotmapper.xml index 615ef9f..47f05a0 100644 --- a/cloud/mypulsar/src/main/resources/iotmapper/iotmapper.xml +++ b/cloud/mypulsar/src/main/resources/iotmapper/iotmapper.xml @@ -7,31 +7,29 @@ --> - insert into CalDevBeContrl values (${ConDevId},${ConCode},${ConValue},${CreateTime},${CreateUserId},${State},${ModeId}) - + - - - + \ No newline at end of file diff --git a/cloud/mypulsar/src/test/java/com/example/mypulsar/MypulsarApplicationTests.java b/cloud/mypulsar/src/test/java/com/example/mypulsar/MypulsarApplicationTests.java index 98d077c..d8d3630 100644 --- a/cloud/mypulsar/src/test/java/com/example/mypulsar/MypulsarApplicationTests.java +++ b/cloud/mypulsar/src/test/java/com/example/mypulsar/MypulsarApplicationTests.java @@ -3,11 +3,17 @@ package com.example.mypulsar; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.example.mypulsar.bean.ClassRoom; +import com.example.mypulsar.bean.DeviceBean; import com.example.mypulsar.bean.Wl_Attendace; import com.example.mypulsar.bean.Wl_LinkModeBean; import com.example.mypulsar.campusDao.CampusDao; import com.example.mypulsar.dao.DeviceDao; +import com.example.mypulsar.mq.AESBase64Utils; +import com.example.mypulsar.mqtt.MqttConsumer; +import com.example.mypulsar.task.SchduledTasks; import com.example.mypulsar.utils.HttpUtil; +import com.example.mypulsar.utils.JsonUtils; +import com.google.gson.JsonObject; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; @@ -15,6 +21,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import springfox.documentation.spring.web.json.Json; import java.util.List; @@ -49,6 +56,28 @@ public class MypulsarApplicationTests { } + private MqttConsumer mqttConsumer; + private String accesskey = "T6dtGFMEs35U4la176032PCis5q6em3h"; + + @Test + public void test() throws Exception { + DeviceBean deviceBean = new DeviceBean(); + deviceBean.setDataId(""); + deviceBean.setBizCode(""); + deviceBean.setDevId("6c81dd58689d0b0e53rrwz"); + deviceBean.setValue("19"); + deviceBean.setDev_status(1); + deviceBean.setCode("battery_percentage"); + deviceBean.setDev_type(2); + deviceBean.setTime("2021-04-08"); + String json = JsonUtils.nonDefaultMapper().toJson(deviceBean); + String data = AESBase64Utils.encrypt(json,accesskey.substring(8, 24)); + if(mqttConsumer == null){ + mqttConsumer = new MqttConsumer(); + mqttConsumer.init(); + } + mqttConsumer.publish("Topic_Quene_Test",data); + } @Test public void contextLoads() { @@ -105,7 +134,6 @@ public class MypulsarApplicationTests { } private String getRemoteId(String conValue) { - try { JSONObject jsonObject = JSON.parseObject(conValue); if (null == jsonObject) return ""; -- libgit2 0.21.0