package Acs; import NetSDKDemo.HCNetSDK; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.infra.api.file.FileApi; import cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo.StudentAttendancePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo.StudentAttendanceSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.studentAttendance.StudentAttendanceDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.service.studentAttendance.StudentAttendanceService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.sun.jna.Pointer; import java.io.*; import java.nio.ByteBuffer; import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import cn.iocoder.yudao.module.md.service.*; import org.jetbrains.annotations.Nullable; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import javax.annotation.Resource; /** * 事件查询模块 */ public final class EventSearch { private static List studentAttendance =new ArrayList<>(); /** * 门禁事件查询,基于起止时间,事件类型进行查询 * * @param lUserID * @return * @throws UnsupportedEncodingException * @throws InterruptedException */ @Nullable public static List searchAllEvent(int lUserID , AdminUserService adminUserService, StudentAttendanceService studentAttendanceService, FileApi fileApi) throws UnsupportedEncodingException, InterruptedException { int i = 0; //事件条数 int previousI = -1; HCNetSDK.NET_DVR_ACS_EVENT_COND struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND(); struAcsEventCond.read(); struAcsEventCond.dwSize = struAcsEventCond.size(); //查询全部主次类型的报警 struAcsEventCond.dwMajor = 0; // 主次事件类型设为0,代表查询所有事件 struAcsEventCond.dwMinor = 0; // LocalDate yesterday = LocalDate.now().minusDays(1); //开始时间 struAcsEventCond.struStartTime.dwYear = yesterday.getYear();//当前年 struAcsEventCond.struStartTime.dwMonth = yesterday.getMonthValue();//当前月 struAcsEventCond.struStartTime.dwDay = yesterday.getDayOfMonth();;//当前月的日 struAcsEventCond.struStartTime.dwHour = 0; struAcsEventCond.struStartTime.dwMinute = 0; struAcsEventCond.struStartTime.dwSecond = 0; //结束时间 struAcsEventCond.struEndTime.dwYear = LocalDate.now().getYear(); struAcsEventCond.struEndTime.dwMonth = LocalDate.now().getMonthValue(); struAcsEventCond.struEndTime.dwDay = LocalDate.now().getDayOfMonth(); struAcsEventCond.struEndTime.dwHour = 23; struAcsEventCond.struEndTime.dwMinute = 59; struAcsEventCond.struEndTime.dwSecond = 59; struAcsEventCond.wInductiveEventType = 1; struAcsEventCond.byPicEnable = 1; //是否带图片,0-不带图片,1-带图片 struAcsEventCond.write(); Pointer ptrStruEventCond = struAcsEventCond.getPointer(); int m_lSearchEventHandle = AcsService.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_EVENT, ptrStruEventCond, struAcsEventCond.size(), null, null); if (m_lSearchEventHandle<=-1) { System.out.println("NET_DVR_StartRemoteConfig调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError()); } HCNetSDK.NET_DVR_ACS_EVENT_CFG struAcsEventCfg = new HCNetSDK.NET_DVR_ACS_EVENT_CFG(); struAcsEventCfg.read(); struAcsEventCfg.dwSize = struAcsEventCfg.size(); struAcsEventCfg.write(); Pointer ptrStruEventCfg = struAcsEventCfg.getPointer(); while (true) { // System.out.println("i=" + i); int dwEventSearch = AcsService.hCNetSDK.NET_DVR_GetNextRemoteConfig(m_lSearchEventHandle, ptrStruEventCfg, struAcsEventCfg.size()); // if (dwEventSearch <= -1) { // System.out.println("NET_DVR_GetNextRemoteConfig接口调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError()); // } if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) { System.out.println("配置等待...."); try { Thread.sleep(10); } catch (InterruptedException e) { throw new RuntimeException(e); } continue; } else if (dwEventSearch == HCNetSDK.NET_SDK_NEXT_STATUS__FINISH) { System.out.println("获取事件完成"); break; } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) { System.out.println("获取事件出现异常"); break; } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) { StudentAttendanceDO attendance =new StudentAttendanceDO(); struAcsEventCfg.read(); //打卡人脸信息 String photoUrl = null; if (struAcsEventCfg.dwPicDataLen > 0 || struAcsEventCfg.pPicData != null) { try { /** * 人脸图片保存路径 */ ByteBuffer buffers = struAcsEventCfg.pPicData.getByteBuffer(0, struAcsEventCfg.dwPicDataLen); byte[] bytes = new byte[struAcsEventCfg.dwPicDataLen]; buffers.rewind(); buffers.get(bytes); Path tempFilePath = Files.createTempFile("photo", ".jpg"); Files.write(tempFilePath, bytes); photoUrl = fileApi.createFile(Files.readAllBytes(tempFilePath)); // 上传文件并获取 URL } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } String clockInTime = (struAcsEventCfg.struTime.dwYear + "-" + String.format("%02d", struAcsEventCfg.struTime.dwMonth) + "-" + String.format("%02d", struAcsEventCfg.struTime.dwDay) + " " + String.format("%02d", struAcsEventCfg.struTime.dwHour) + ":" + String.format("%02d", struAcsEventCfg.struTime.dwMinute) + ":" + String.format("%02d", struAcsEventCfg.struTime.dwSecond)); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime parsedTime =null; String employeeNo =null; LocalDate date =null; if ( clockInTime!=null){ parsedTime = LocalDateTime.parse(clockInTime, formatter); date = parsedTime.toLocalDate(); } if (struAcsEventCfg.struAcsEventInfo.dwEmployeeNo!=0){ employeeNo = String.valueOf(struAcsEventCfg.struAcsEventInfo.dwEmployeeNo); } //设置信息 attendance.setDate(date);//打卡日期 attendance.setUserNumber(employeeNo);//学号 if (photoUrl != null) { attendance.setPhoto(photoUrl); // 设置照片 } StudentAttendanceDO ST = studentAttendanceService.getStudentAttendanceOne(employeeNo,parsedTime);//获取这个学生对应的这个考勤记录 AdminUserDO user = adminUserService.findUserByUserNumber(employeeNo);//找到这个学生 //插入到attendance表 LocalDate localDate = LocalDate.now(); if (ST==null) { // 如果不存在,则进行打卡记录的创建 if (employeeNo != null && !employeeNo.equals("0")) { if (user != null &&"1".equals(user.getUserType())) {//在校生 if (localDate.equals(date)) { StudentAttendanceDO re = studentAttendanceService.getOneErrorOrExcusedStudentAttendance(user.getUserNumber(),localDate,"1");//找到这天的未打卡记录 if (re!=null) {//有未打卡记录更新未打卡记录 re.setClockInStatus("0");//变成正常 re.setClockInTime(parsedTime);//更新打卡时间 re.setCreateTime(parsedTime); re.setUpdateTime(parsedTime);//更新时间 if (photoUrl != null) { re.setPhoto(photoUrl); // } studentAttendance.add(re);// studentAttendanceService.updateStudentAttendance(BeanUtils.toBean(re, StudentAttendanceSaveReqVO.class)); }else {//无未打卡记录直接插入 attendance.setStudentName(user.getNickname()); // 昵称 attendance.setStudentId(user.getId()); // 学生id attendance.setDeptId(user.getDeptId()); // 工作间id attendance.setSupervisorId(user.getSupervisorId()); // 导师id attendance.setClockInStatus(transformClockStatus(parsedTime)); // 打卡状态 attendance.setClockInTime(parsedTime);//打卡时间 attendance.setCreateTime(parsedTime); attendance.setUpdateTime(parsedTime); studentAttendance.add(attendance); studentAttendanceService.createStudentAttendance(BeanUtils.toBean(attendance, StudentAttendanceSaveReqVO.class)); } }else if (yesterday.equals(date)){//前一天的以免没有加载 StudentAttendanceDO re = studentAttendanceService.getOneErrorOrExcusedStudentAttendance(user.getUserNumber(),yesterday,"1");//找到前一天的未打卡记录 if (re!=null) {//有未打卡记录更新未打卡记录 re.setClockInStatus("0"); re.setClockInTime(parsedTime); re.setCreateTime(parsedTime); re.setUpdateTime(parsedTime); if (photoUrl != null) { re.setPhoto(photoUrl); } studentAttendance.add(re); studentAttendanceService.updateStudentAttendance(BeanUtils.toBean(re, StudentAttendanceSaveReqVO.class)); }else {//无未打卡记录直接插入 attendance.setStudentName(user.getNickname()); // 昵称 attendance.setStudentId(user.getId()); // 学生id attendance.setDeptId(user.getDeptId()); // 工作间id attendance.setSupervisorId(user.getSupervisorId()); // 导师id attendance.setClockInStatus(transformClockStatus(parsedTime)); // 打卡状态 attendance.setClockInTime(parsedTime);//打卡时间 attendance.setCreateTime(parsedTime); attendance.setUpdateTime(parsedTime); studentAttendance.add(attendance); studentAttendanceService.createStudentAttendance(BeanUtils.toBean(attendance, StudentAttendanceSaveReqVO.class)); } } } else { System.out.println("没有找到该用户" + employeeNo); } } }else {//存在打卡记录,判断更新照片(可能由于网络问题没有插入) if (ST.getPhoto() == null || ST.getPhoto().equals("")) { ST.setPhoto(photoUrl); studentAttendanceService.updateStudentAttendance(BeanUtils.toBean(ST, StudentAttendanceSaveReqVO.class)); } } i++; } if(i == previousI){ System.out.println("发现相同的 i = " + i + ",停止循环"); break; } previousI = i; } i = 0; if (!AcsService.hCNetSDK.NET_DVR_StopRemoteConfig(m_lSearchEventHandle)) { System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError()); } else { System.out.println("NET_DVR_StopRemoteConfig接口成功"); return studentAttendance; } return null; } public static String transformClockStatus(LocalDateTime clockTime){ return "0"; } }