SmartFaceDiscernController.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. package com.template.controller;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  7. import com.template.annotation.DESRespondSecret;
  8. import com.template.annotation.PassToken;
  9. import com.template.api.SmartCarAccessControllerAPI;
  10. import com.template.api.SmartFaceDiscernControllerAPI;
  11. import com.template.common.utils.*;
  12. import com.template.config.ControlConfig;
  13. import com.template.model.pojo.*;
  14. import com.template.model.result.CommonResult;
  15. import com.template.model.vo.LastSevenDaysTrackVo;
  16. import com.template.services.*;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.beans.factory.annotation.Value;
  21. import org.springframework.scheduling.annotation.Scheduled;
  22. import org.springframework.web.bind.annotation.GetMapping;
  23. import org.springframework.web.bind.annotation.RestController;
  24. import org.springframework.web.multipart.MultipartFile;
  25. import javax.annotation.Resource;
  26. import javax.servlet.http.HttpServletRequest;
  27. import javax.servlet.http.HttpServletResponse;
  28. import java.io.BufferedReader;
  29. import java.io.InputStreamReader;
  30. import java.net.URLDecoder;
  31. import java.net.URLEncoder;
  32. import java.text.SimpleDateFormat;
  33. import java.time.LocalDateTime;
  34. import java.time.format.DateTimeFormatter;
  35. import java.util.*;
  36. import static com.template.common.utils.AesTestOne.decrypt;
  37. /**
  38. * <p>
  39. * 前端控制器
  40. * </p>
  41. *
  42. * @author ceshi
  43. * @since 2024-01-18
  44. */
  45. @RestController
  46. //返回参数加密注解
  47. @DESRespondSecret
  48. public class SmartFaceDiscernController implements SmartFaceDiscernControllerAPI {
  49. private static Logger logger = LoggerFactory.getLogger(SmartFaceDiscernController.class);
  50. @Autowired
  51. SmartFaceDiscernService smartFaceDiscernService;
  52. @Autowired
  53. SmartQrcodeService smartQrcodeService;
  54. @Autowired
  55. SmartCarAccessService smartCarAccessService;
  56. @Autowired
  57. SmartAttendanceService smartAttendanceService;
  58. @Autowired
  59. SmartUserService smartUserService;
  60. @Autowired
  61. SmartClassService smartClassService;
  62. @Autowired
  63. SmartUploadService smartUploadService;
  64. @Autowired
  65. SmartNotificationService smartNotificationService;
  66. @Autowired
  67. SmartDeviceService smartDeviceService;
  68. @Autowired
  69. SmartAccessService smartAccessService;
  70. @Override
  71. @DESRespondSecret(validated = true)
  72. public CommonResult track(Integer id, int dateTime) {
  73. JSONObject date = getDate(dateTime);
  74. String stateTime = date.getString("stateTime");
  75. String endTime = date.getString("endTime");
  76. List<SmartFaceDiscern> smartFaceDiscerns = smartFaceDiscernService.track(stateTime, endTime, id);
  77. ArrayList<LastSevenDaysTrackVo> vos = new ArrayList<>();
  78. for (SmartFaceDiscern faceDiscern : smartFaceDiscerns) {
  79. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  80. lastSevenDaysTrackVo.setName(faceDiscern.getName());
  81. lastSevenDaysTrackVo.setType(faceDiscern.getType());
  82. lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation());
  83. lastSevenDaysTrackVo.setImage(faceDiscern.getImage());
  84. lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime());
  85. vos.add(lastSevenDaysTrackVo);
  86. }
  87. List<SmartAttendance> attendances = smartAttendanceService.track(stateTime, endTime, id);
  88. // 获取班级名称
  89. SmartUser smartUser = smartUserService.getSmartById(id);
  90. SmartClass smartClass = smartClassService.getSmartClassById(smartUser.getSchoolClass());
  91. String className = smartClass.getName();
  92. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  93. for (SmartAttendance attendance : attendances) {
  94. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  95. lastSevenDaysTrackVo.setName(attendance.getXwUserName());
  96. lastSevenDaysTrackVo.setType("打卡");
  97. lastSevenDaysTrackVo.setLocation(className);
  98. Date attendTime = attendance.getAttendTime();
  99. lastSevenDaysTrackVo.setDateTime(sdf.format(attendTime));
  100. vos.add(lastSevenDaysTrackVo);
  101. }
  102. // 门禁信息
  103. List<SmartAccess> smartAccesses = smartAccessService.track(stateTime, endTime, id);
  104. for (SmartAccess faceDiscern : smartAccesses) {
  105. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  106. lastSevenDaysTrackVo.setName(faceDiscern.getName());
  107. lastSevenDaysTrackVo.setType(faceDiscern.getType());
  108. lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation());
  109. lastSevenDaysTrackVo.setImage(faceDiscern.getImage());
  110. lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime());
  111. vos.add(lastSevenDaysTrackVo);
  112. }
  113. // 排序
  114. Collections.sort(vos, Comparator.comparing((h) -> {
  115. return h.getDateTime();
  116. }));
  117. return CommonResult.ok(vos);
  118. }
  119. @Override
  120. @DESRespondSecret(validated = true)
  121. public CommonResult access() {
  122. LocalDateTime now = LocalDateTime.now();
  123. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  124. JSONArray jsonArray = new JSONArray();
  125. for (int i = 0; i < 30; i++) {
  126. LocalDateTime stateTime = now.minusDays(i + 1);
  127. LocalDateTime endTime = now.minusDays(i);
  128. String dateTime = endTime.format(dateTimeFormatter);
  129. LambdaQueryWrapper<SmartAccess> smartAccessWrapper = new LambdaQueryWrapper<>();
  130. smartAccessWrapper.between(SmartAccess::getDateTime, stateTime, endTime);
  131. int faceDiscernCount = smartAccessService.count(smartAccessWrapper);
  132. LambdaQueryWrapper<SmartQrcode> qrcodeWrapper = new LambdaQueryWrapper<>();
  133. qrcodeWrapper.between(SmartQrcode::getCreateTime, stateTime, endTime);
  134. int qrcodeCount = smartQrcodeService.count(qrcodeWrapper);
  135. LambdaQueryWrapper<SmartCarAccess> smartCarAccessWrapper = new LambdaQueryWrapper<>();
  136. smartCarAccessWrapper.between(SmartCarAccess::getEnterTime, stateTime, endTime);
  137. int carCount = smartCarAccessService.count(smartCarAccessWrapper);
  138. JSONObject jsonObject = new JSONObject();
  139. jsonObject.put("date", dateTime);
  140. jsonObject.put("face", faceDiscernCount);
  141. jsonObject.put("code", qrcodeCount);
  142. jsonObject.put("car", carCount);
  143. jsonArray.add(jsonObject);
  144. }
  145. return CommonResult.ok(jsonArray);
  146. }
  147. @Override
  148. @DESRespondSecret(validated = true)
  149. public CommonResult lastSevenDaysTrack(int userId) {
  150. LocalDateTime end = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).plusDays(1);
  151. LocalDateTime satrt = end.minusDays(7);
  152. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  153. String endTime = end.format(dateTimeFormatter1);
  154. String startTime = satrt.format(dateTimeFormatter1);
  155. ArrayList<LastSevenDaysTrackVo> vos = new ArrayList<>();
  156. // 人脸抓拍
  157. List<SmartFaceDiscern> faceDiscerns = smartFaceDiscernService.track(startTime, endTime, userId);
  158. for (SmartFaceDiscern faceDiscern : faceDiscerns) {
  159. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  160. lastSevenDaysTrackVo.setName(faceDiscern.getName());
  161. lastSevenDaysTrackVo.setType(faceDiscern.getType());
  162. lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation());
  163. lastSevenDaysTrackVo.setImage(faceDiscern.getImage());
  164. lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime());
  165. vos.add(lastSevenDaysTrackVo);
  166. }
  167. // 打卡
  168. List<SmartAttendance> attendances = smartAttendanceService.track(startTime, endTime, userId);
  169. // 获取班级名称
  170. SmartUser smartUser = smartUserService.getSmartById(userId);
  171. SmartClass smartClass = smartClassService.getSmartClassById(smartUser.getSchoolClass());
  172. String className = smartClass.getName();
  173. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  174. for (SmartAttendance attendance : attendances) {
  175. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  176. lastSevenDaysTrackVo.setName(attendance.getXwUserName());
  177. lastSevenDaysTrackVo.setType("打卡");
  178. lastSevenDaysTrackVo.setLocation(className);
  179. Date attendTime = attendance.getAttendTime();
  180. lastSevenDaysTrackVo.setDateTime(sdf.format(attendTime));
  181. vos.add(lastSevenDaysTrackVo);
  182. }
  183. // 门禁信息
  184. List<SmartAccess> smartAccesses = smartAccessService.track(startTime, endTime, userId);
  185. for (SmartAccess faceDiscern : smartAccesses) {
  186. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  187. lastSevenDaysTrackVo.setName(faceDiscern.getName());
  188. lastSevenDaysTrackVo.setType(faceDiscern.getType());
  189. lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation());
  190. lastSevenDaysTrackVo.setImage(faceDiscern.getImage());
  191. lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime());
  192. vos.add(lastSevenDaysTrackVo);
  193. }
  194. // 排序
  195. Collections.sort(vos, Comparator.comparing((h) -> {
  196. return h.getDateTime();
  197. }));
  198. return CommonResult.ok(vos);
  199. }
  200. @Override
  201. @PassToken
  202. @DESRespondSecret(validated = false)
  203. public String callBack(HttpServletRequest request, HttpServletResponse response) {
  204. try {
  205. BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
  206. StringBuilder responseStrBuilder = new StringBuilder();
  207. String inputStr;
  208. while ((inputStr = streamReader.readLine()) != null) {
  209. responseStrBuilder.append(inputStr);
  210. }
  211. JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
  212. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  213. // 比对时间
  214. String time = jsonObject.getString("time");
  215. logger.info("time = " + time);
  216. // LocalDateTime localDateTime = LocalDateTime.now().withHour(0).withSecond(0).withMinute(0);
  217. // LocalDateTime localDateTime2 = LocalDateTime.parse(time, dateTimeFormatter1);
  218. //// 只获取当天的
  219. // if (localDateTime.isBefore(localDateTime2)) {
  220. // 比对结果
  221. Integer resultStatus = jsonObject.getInteger("resultStatus");
  222. // if (1 == resultStatus) {
  223. // 设备sn
  224. String sn = jsonObject.getString("sn");
  225. SmartDevice smartDevice = smartDeviceService.getNum(sn);
  226. String address = "";
  227. String type = "";
  228. if (ObjectUtils.isNotEmpty(smartDevice)) {
  229. // 地点
  230. address = smartDevice.getAddress();
  231. // 类型
  232. type = smartDevice.getName();
  233. }
  234. // 名字,学生会加班级[]
  235. String name = jsonObject.getString("name");
  236. System.out.println("name = " + name);
  237. String[] split = name.split("\\[");
  238. String s = split[0];
  239. logger.info("name = " + s);
  240. // 百胜门禁编号
  241. String idNum = jsonObject.getString("idNum");
  242. logger.info("idNum = " + idNum);
  243. Integer userId = 0;
  244. SmartUser smartUser = null;
  245. if (ObjectUtils.isNotEmpty(idNum)) {
  246. smartUser = smartUserService.getBsStudentNo(idNum);
  247. if (ObjectUtils.isNotEmpty(smartUser)) {
  248. userId = smartUser.getId();
  249. } else {
  250. userId = 0;
  251. }
  252. }
  253. // 出入标识: 1-进, 0-出
  254. Integer inout = jsonObject.getInteger("inout");
  255. // 开门方式:0-白名单比对,1-人证比对,2-IC卡比对
  256. Integer openType = jsonObject.getInteger("openType");
  257. SmartAccess smartFaceDiscern = new SmartAccess();
  258. smartFaceDiscern.setName(s);
  259. smartFaceDiscern.setLocation(address);
  260. smartFaceDiscern.setType(type);
  261. smartFaceDiscern.setUserId(userId);
  262. smartFaceDiscern.setDateTime(time);
  263. smartFaceDiscern.setIdNum(idNum);
  264. smartFaceDiscern.setSn(sn);
  265. smartFaceDiscern.setInOut(inout);
  266. smartFaceDiscern.setOpenType(openType);
  267. smartFaceDiscern.setResultStatus(resultStatus);
  268. if (userId != 0) {
  269. // 判断是否已经添加
  270. LambdaQueryWrapper<SmartAccess> wrapperFD = new LambdaQueryWrapper<>();
  271. wrapperFD.eq(SmartAccess::getDateTime, smartFaceDiscern.getDateTime())
  272. .eq(SmartAccess::getUserId, userId);
  273. List<SmartAccess> list = smartAccessService.list(wrapperFD);
  274. if (ObjectUtils.isEmpty(list) && list.size() == 0) {
  275. // 抓拍的照片 base64字符串
  276. String scenePhoto = jsonObject.getString("scenePhoto");
  277. scenePhoto = "data:image/jpeg;base64," + scenePhoto;
  278. logger.info("scenePhoto =" + scenePhoto.substring(0, 50));
  279. // base64转文件
  280. MultipartFile multipartFile = MultipartFileUtils.base64ToMultipartFile(scenePhoto);
  281. String image = "";
  282. try {
  283. // 上传到cos桶,并生成图片地址
  284. image = smartUploadService.upload(new MultipartFile[]{multipartFile});
  285. } catch (Exception e) {
  286. e.printStackTrace();
  287. logger.error("上传cos桶失败");
  288. }
  289. smartFaceDiscern.setImage(image);
  290. smartAccessService.save(smartFaceDiscern);
  291. // 通过学生id找到关联的家长affiliate,并找到公众号,如果openid为空则不传
  292. List<SmartUser> userList = smartUserService.getAffiliateList(userId);
  293. if (ObjectUtils.isNotEmpty(userList) && userList.size() > 0) {
  294. for (SmartUser user : userList) {
  295. String gzhOpenId = user.getGzhOpenId();
  296. if (ObjectUtils.isNotEmpty(gzhOpenId)) {
  297. String pushType = "";
  298. if (type.contains("进校")) {
  299. pushType = "进入大门";
  300. } else if (type.contains("出校")) {
  301. pushType = "离开大门";
  302. }
  303. LocalDateTime date = LocalDateTime.now();
  304. String format = date.format(dateTimeFormatter1);
  305. // 公众号信息推送
  306. Message2.send(gzhOpenId, pushType, address, format);
  307. SmartNotification smartNotification = new SmartNotification();
  308. smartNotification.setUserId(smartUser.getId());
  309. smartNotification.setUserName(smartUser.getName());
  310. smartNotification.setTypeName(pushType);
  311. smartNotification.setLocation(address);
  312. smartNotification.setImage(image);
  313. smartNotification.setDateTime(time);
  314. smartNotification.setType(2);
  315. smartNotificationService.save(smartNotification);
  316. }
  317. }
  318. }
  319. }
  320. } else {
  321. smartFaceDiscern.setUserId(0);
  322. // 判断是否已经添加
  323. LambdaQueryWrapper<SmartAccess> wrapperFD = new LambdaQueryWrapper<>();
  324. wrapperFD.eq(SmartAccess::getDateTime, time)
  325. .eq(SmartAccess::getName, s)
  326. .eq(SmartAccess::getType, type);
  327. List<SmartAccess> list = smartAccessService.list(wrapperFD);
  328. if (ObjectUtils.isEmpty(list) && list.size() == 0) {
  329. // 抓拍的照片 base64字符串
  330. String scenePhoto = jsonObject.getString("scenePhoto");
  331. scenePhoto = "data:image/jpeg;base64," + scenePhoto;
  332. logger.info("scenePhoto =" + scenePhoto.substring(0, 50));
  333. // base64转文件
  334. MultipartFile multipartFile = MultipartFileUtils.base64ToMultipartFile(scenePhoto);
  335. String image = "";
  336. try {
  337. // 上传到cos桶,并生成图片地址
  338. image = smartUploadService.upload(new MultipartFile[]{multipartFile});
  339. } catch (Exception e) {
  340. e.printStackTrace();
  341. logger.error("上传cos桶失败");
  342. }
  343. smartFaceDiscern.setImage(image);
  344. smartAccessService.save(smartFaceDiscern);
  345. }
  346. }
  347. // }
  348. // }
  349. } catch (Exception e) {
  350. e.printStackTrace();
  351. JSONObject r = new JSONObject();
  352. r.put("message", "Success");
  353. r.put("result", 0);
  354. return r.toJSONString();
  355. }
  356. JSONObject r = new JSONObject();
  357. r.put("message", "Success");
  358. r.put("result", 0);
  359. return r.toJSONString();
  360. }
  361. @Override
  362. public CommonResult selectTrack(Integer userId, String startTime, String endTime) {
  363. ArrayList<LastSevenDaysTrackVo> vos = new ArrayList<>();
  364. // 人脸抓拍
  365. List<SmartFaceDiscern> faceDiscerns = smartFaceDiscernService.track(startTime, endTime, userId);
  366. for (SmartFaceDiscern faceDiscern : faceDiscerns) {
  367. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  368. lastSevenDaysTrackVo.setName(faceDiscern.getName());
  369. lastSevenDaysTrackVo.setType(faceDiscern.getType());
  370. lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation());
  371. lastSevenDaysTrackVo.setImage(faceDiscern.getImage());
  372. lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime());
  373. vos.add(lastSevenDaysTrackVo);
  374. }
  375. // 打卡
  376. List<SmartAttendance> attendances = smartAttendanceService.track(startTime, endTime, userId);
  377. // 获取班级名称
  378. SmartUser smartUser = smartUserService.getSmartById(userId);
  379. SmartClass smartClass = smartClassService.getSmartClassById(smartUser.getSchoolClass());
  380. String className = smartClass.getName();
  381. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  382. for (SmartAttendance attendance : attendances) {
  383. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  384. lastSevenDaysTrackVo.setName(attendance.getXwUserName());
  385. lastSevenDaysTrackVo.setType("打卡");
  386. lastSevenDaysTrackVo.setLocation(className);
  387. Date attendTime = attendance.getAttendTime();
  388. lastSevenDaysTrackVo.setDateTime(sdf.format(attendTime));
  389. vos.add(lastSevenDaysTrackVo);
  390. }
  391. // 门禁信息
  392. List<SmartAccess> smartAccesses = smartAccessService.track(startTime, endTime, userId);
  393. for (SmartAccess faceDiscern : smartAccesses) {
  394. LastSevenDaysTrackVo lastSevenDaysTrackVo = new LastSevenDaysTrackVo();
  395. lastSevenDaysTrackVo.setName(faceDiscern.getName());
  396. lastSevenDaysTrackVo.setType(faceDiscern.getType());
  397. lastSevenDaysTrackVo.setLocation(faceDiscern.getLocation());
  398. lastSevenDaysTrackVo.setImage(faceDiscern.getImage());
  399. lastSevenDaysTrackVo.setDateTime(faceDiscern.getDateTime());
  400. vos.add(lastSevenDaysTrackVo);
  401. }
  402. // 排序
  403. Collections.sort(vos, Comparator.comparing((h) -> {
  404. return h.getDateTime();
  405. }));
  406. return CommonResult.ok(vos);
  407. }
  408. public static JSONObject getDate(Integer date) {
  409. JSONObject jsonObject = new JSONObject();
  410. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  411. LocalDateTime now = LocalDateTime.now();
  412. LocalDateTime stateTime = now.withHour(0).withMinute(0).withSecond(0).minusDays(date);
  413. LocalDateTime endTime = now.withHour(23).withMinute(59).withSecond(59).minusDays(date);
  414. jsonObject.put("stateTime", stateTime.format(dateTimeFormatter1));
  415. jsonObject.put("endTime", endTime.format(dateTimeFormatter1));
  416. return jsonObject;
  417. }
  418. public static void main(String[] args) {
  419. LocalDateTime dateTime1 = LocalDateTime.of(2022, 8, 29, 12, 0, 0);
  420. LocalDateTime dateTime2 = LocalDateTime.of(2022, 8, 30, 12, 0, 0);
  421. LocalDateTime dateTime3 = LocalDateTime.of(2022, 8, 28, 12, 0, 0);
  422. boolean isBefore = dateTime1.isBefore(dateTime2);
  423. boolean isBefore2 = dateTime1.isBefore(dateTime3);
  424. System.out.println("dateTime1 is before dateTime2: " + isBefore);
  425. System.out.println("dateTime1 is before dateTime2: " + isBefore2);
  426. }
  427. }