EventSearch.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. package Acs;
  2. import NetSDKDemo.HCNetSDK;
  3. import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4. import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  5. import cn.iocoder.yudao.module.infra.api.file.FileApi;
  6. import cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo.StudentAttendancePageReqVO;
  7. import cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo.StudentAttendanceSaveReqVO;
  8. import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
  9. import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
  10. import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO;
  11. import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO;
  12. import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO;
  13. import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
  14. import cn.iocoder.yudao.module.system.dal.dataobject.studentAttendance.StudentAttendanceDO;
  15. import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
  16. import cn.iocoder.yudao.module.system.service.studentAttendance.StudentAttendanceService;
  17. import cn.iocoder.yudao.module.system.service.user.AdminUserService;
  18. import com.sun.jna.Pointer;
  19. import java.io.*;
  20. import java.nio.ByteBuffer;
  21. import java.nio.file.Files;
  22. import java.nio.file.Path;
  23. import java.time.LocalDate;
  24. import java.time.LocalDateTime;
  25. import java.time.format.DateTimeFormatter;
  26. import java.util.ArrayList;
  27. import java.util.Collection;
  28. import java.util.Collections;
  29. import java.util.List;
  30. import cn.iocoder.yudao.module.md.service.*;
  31. import org.jetbrains.annotations.Nullable;
  32. import org.springframework.beans.BeansException;
  33. import org.springframework.context.ApplicationContext;
  34. import org.springframework.context.ApplicationContextAware;
  35. import javax.annotation.Resource;
  36. /**
  37. * 事件查询模块
  38. */
  39. public final class EventSearch {
  40. private static List<Object> studentAttendance =new ArrayList<>();
  41. /**
  42. * 门禁事件查询,基于起止时间,事件类型进行查询
  43. *
  44. * @param lUserID
  45. * @return
  46. * @throws UnsupportedEncodingException
  47. * @throws InterruptedException
  48. */
  49. @Nullable
  50. public static List<Object> searchAllEvent(int lUserID , AdminUserService adminUserService, StudentAttendanceService studentAttendanceService, FileApi fileApi) throws UnsupportedEncodingException, InterruptedException {
  51. int i = 0; //事件条数
  52. int previousI = -1;
  53. HCNetSDK.NET_DVR_ACS_EVENT_COND struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND();
  54. struAcsEventCond.read();
  55. struAcsEventCond.dwSize = struAcsEventCond.size();
  56. //查询全部主次类型的报警
  57. struAcsEventCond.dwMajor = 0; // 主次事件类型设为0,代表查询所有事件
  58. struAcsEventCond.dwMinor = 0; //
  59. LocalDate yesterday = LocalDate.now().minusDays(1);
  60. //开始时间
  61. struAcsEventCond.struStartTime.dwYear = yesterday.getYear();//当前年
  62. struAcsEventCond.struStartTime.dwMonth = yesterday.getMonthValue();//当前月
  63. struAcsEventCond.struStartTime.dwDay = yesterday.getDayOfMonth();;//当前月的日
  64. struAcsEventCond.struStartTime.dwHour = 0;
  65. struAcsEventCond.struStartTime.dwMinute = 0;
  66. struAcsEventCond.struStartTime.dwSecond = 0;
  67. //结束时间
  68. struAcsEventCond.struEndTime.dwYear = LocalDate.now().getYear();
  69. struAcsEventCond.struEndTime.dwMonth = LocalDate.now().getMonthValue();
  70. struAcsEventCond.struEndTime.dwDay = LocalDate.now().getDayOfMonth();
  71. struAcsEventCond.struEndTime.dwHour = 23;
  72. struAcsEventCond.struEndTime.dwMinute = 59;
  73. struAcsEventCond.struEndTime.dwSecond = 59;
  74. struAcsEventCond.wInductiveEventType = 1;
  75. struAcsEventCond.byPicEnable = 1; //是否带图片,0-不带图片,1-带图片
  76. struAcsEventCond.write();
  77. Pointer ptrStruEventCond = struAcsEventCond.getPointer();
  78. int m_lSearchEventHandle = AcsService.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_EVENT, ptrStruEventCond, struAcsEventCond.size(), null, null);
  79. if (m_lSearchEventHandle<=-1)
  80. {
  81. System.out.println("NET_DVR_StartRemoteConfig调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError());
  82. }
  83. HCNetSDK.NET_DVR_ACS_EVENT_CFG struAcsEventCfg = new HCNetSDK.NET_DVR_ACS_EVENT_CFG();
  84. struAcsEventCfg.read();
  85. struAcsEventCfg.dwSize = struAcsEventCfg.size();
  86. struAcsEventCfg.write();
  87. Pointer ptrStruEventCfg = struAcsEventCfg.getPointer();
  88. while (true) {
  89. // System.out.println("i=" + i);
  90. int dwEventSearch = AcsService.hCNetSDK.NET_DVR_GetNextRemoteConfig(m_lSearchEventHandle, ptrStruEventCfg, struAcsEventCfg.size());
  91. // if (dwEventSearch <= -1) {
  92. // System.out.println("NET_DVR_GetNextRemoteConfig接口调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError());
  93. // }
  94. if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) {
  95. System.out.println("配置等待....");
  96. try {
  97. Thread.sleep(10);
  98. } catch (InterruptedException e) {
  99. throw new RuntimeException(e);
  100. }
  101. continue;
  102. } else if (dwEventSearch == HCNetSDK.NET_SDK_NEXT_STATUS__FINISH) {
  103. System.out.println("获取事件完成");
  104. break;
  105. } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) {
  106. System.out.println("获取事件出现异常");
  107. break;
  108. } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) {
  109. StudentAttendanceDO attendance =new StudentAttendanceDO();
  110. struAcsEventCfg.read();
  111. //打卡人脸信息
  112. String photoUrl = null;
  113. if (struAcsEventCfg.dwPicDataLen > 0 || struAcsEventCfg.pPicData != null) {
  114. try {
  115. /**
  116. * 人脸图片保存路径
  117. */
  118. ByteBuffer buffers = struAcsEventCfg.pPicData.getByteBuffer(0, struAcsEventCfg.dwPicDataLen);
  119. byte[] bytes = new byte[struAcsEventCfg.dwPicDataLen];
  120. buffers.rewind();
  121. buffers.get(bytes);
  122. Path tempFilePath = Files.createTempFile("photo", ".jpg");
  123. Files.write(tempFilePath, bytes);
  124. photoUrl = fileApi.createFile(Files.readAllBytes(tempFilePath)); // 上传文件并获取 URL
  125. } catch (FileNotFoundException e) {
  126. e.printStackTrace();
  127. } catch (IOException e) {
  128. e.printStackTrace();
  129. }
  130. }
  131. String clockInTime = (struAcsEventCfg.struTime.dwYear + "-" +
  132. String.format("%02d", struAcsEventCfg.struTime.dwMonth) + "-" +
  133. String.format("%02d", struAcsEventCfg.struTime.dwDay) + " " +
  134. String.format("%02d", struAcsEventCfg.struTime.dwHour) + ":" +
  135. String.format("%02d", struAcsEventCfg.struTime.dwMinute) + ":" +
  136. String.format("%02d", struAcsEventCfg.struTime.dwSecond));
  137. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  138. LocalDateTime parsedTime =null;
  139. String employeeNo =null;
  140. LocalDate date =null;
  141. if ( clockInTime!=null){
  142. parsedTime = LocalDateTime.parse(clockInTime, formatter);
  143. date = parsedTime.toLocalDate();
  144. }
  145. if (struAcsEventCfg.struAcsEventInfo.dwEmployeeNo!=0){
  146. employeeNo = String.valueOf(struAcsEventCfg.struAcsEventInfo.dwEmployeeNo);
  147. }
  148. //设置信息
  149. attendance.setDate(date);//打卡日期
  150. attendance.setUserNumber(employeeNo);//学号
  151. if (photoUrl != null) {
  152. attendance.setPhoto(photoUrl); // 设置照片
  153. }
  154. StudentAttendanceDO ST = studentAttendanceService.getStudentAttendanceOne(employeeNo,parsedTime);//获取这个学生对应的这个考勤记录
  155. AdminUserDO user = adminUserService.findUserByUserNumber(employeeNo);//找到这个学生
  156. //插入到attendance表
  157. if (ST==null) { // 如果不存在,则进行打卡记录的创建
  158. if (employeeNo != null && !employeeNo.equals("0")) {
  159. if (user != null &&"1".equals(user.getUserType())) {//在校生
  160. StudentAttendancePageReqVO attendanceReqVO = new StudentAttendancePageReqVO();
  161. LocalDate localDate = LocalDate.now();
  162. if (localDate.equals(date)) {
  163. attendanceReqVO.setDate(localDate);
  164. attendanceReqVO.setUserNumber(user.getUserNumber());
  165. attendance.setClockInStatus("1");
  166. List<StudentAttendanceDO> result = studentAttendanceService.getStudentAttendanceAllList(attendanceReqVO);//找到这天的未打卡记录
  167. if (result!=null&&!result.isEmpty()) {//有未打卡记录更新未打卡记录
  168. StudentAttendanceDO re = result.get(0);
  169. if ("1".equals(re.getClockInStatus())) {//找到未打卡的
  170. re.setClockInStatus("0");//变成正常
  171. re.setClockInTime(parsedTime);//更新打卡时间
  172. re.setCreateTime(parsedTime);
  173. re.setUpdateTime(parsedTime);//更新时间
  174. if (photoUrl != null) {
  175. re.setPhoto(photoUrl); //
  176. }
  177. studentAttendance.add(re);//
  178. studentAttendanceService.updateStudentAttendance(BeanUtils.toBean(re, StudentAttendanceSaveReqVO.class));
  179. }
  180. }else {//无未打卡记录直接插入
  181. attendance.setStudentName(user.getNickname()); // 昵称
  182. attendance.setStudentId(user.getId()); // 学生id
  183. attendance.setDeptId(user.getDeptId()); // 工作间id
  184. attendance.setSupervisorId(user.getSupervisorId()); // 导师id
  185. attendance.setClockInStatus(transformClockStatus(parsedTime)); // 打卡状态
  186. attendance.setClockInTime(parsedTime);//打卡时间
  187. attendance.setCreateTime(parsedTime);
  188. attendance.setUpdateTime(parsedTime);
  189. studentAttendance.add(attendance);
  190. studentAttendanceService.createStudentAttendance(BeanUtils.toBean(attendance, StudentAttendanceSaveReqVO.class));
  191. }
  192. }else {//前一天的以免没有加载
  193. attendance.setStudentName(user.getNickname()); // 昵称
  194. attendance.setStudentId(user.getId()); // 学生id
  195. attendance.setDeptId(user.getDeptId()); // 工作间id
  196. attendance.setSupervisorId(user.getSupervisorId()); // 导师id
  197. attendance.setClockInStatus(transformClockStatus(parsedTime)); // 打卡状态
  198. attendance.setClockInTime(parsedTime);//打卡时间
  199. attendance.setCreateTime(parsedTime);
  200. attendance.setUpdateTime(parsedTime);
  201. studentAttendance.add(attendance);
  202. studentAttendanceService.createStudentAttendance(BeanUtils.toBean(attendance, StudentAttendanceSaveReqVO.class));
  203. }
  204. } else {
  205. System.out.println("没有找到该用户" + employeeNo);
  206. }
  207. }
  208. }else {//存在打卡记录,判断更新照片(可能由于网络问题没有插入)
  209. if (ST.getPhoto() == null || ST.getPhoto().equals("")) {
  210. ST.setPhoto(photoUrl);
  211. studentAttendanceService.updateStudentAttendance(BeanUtils.toBean(ST, StudentAttendanceSaveReqVO.class));
  212. }
  213. }
  214. i++;
  215. }
  216. if(i == previousI){
  217. System.out.println("发现相同的 i = " + i + ",停止循环");
  218. break;
  219. }
  220. previousI = i;
  221. }
  222. i = 0;
  223. if (!AcsService.hCNetSDK.NET_DVR_StopRemoteConfig(m_lSearchEventHandle)) {
  224. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError());
  225. } else {
  226. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  227. return studentAttendance;
  228. }
  229. return null;
  230. }
  231. public static String transformClockStatus(LocalDateTime clockTime){
  232. return "0";
  233. }
  234. }