SmartFaceDiscernController.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  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. SmartUser smartUser = smartUserService.getBsStudentNo(idNum);
  244. Integer userId = 0;
  245. if (ObjectUtils.isNotEmpty(smartUser)) {
  246. userId = smartUser.getId();
  247. } else {
  248. userId = 0;
  249. }
  250. // 出入标识: 1-进, 0-出
  251. Integer inout = jsonObject.getInteger("inout");
  252. // 开门方式:0-白名单比对,1-人证比对,2-IC卡比对
  253. Integer openType = jsonObject.getInteger("openType");
  254. SmartAccess smartFaceDiscern = new SmartAccess();
  255. smartFaceDiscern.setName(s);
  256. smartFaceDiscern.setLocation(address);
  257. smartFaceDiscern.setType(type);
  258. smartFaceDiscern.setUserId(userId);
  259. smartFaceDiscern.setDateTime(time);
  260. smartFaceDiscern.setIdNum(idNum);
  261. smartFaceDiscern.setSn(sn);
  262. smartFaceDiscern.setInout(inout);
  263. smartFaceDiscern.setOpenType(openType);
  264. smartFaceDiscern.setResultStatus(resultStatus);
  265. if (userId != 0) {
  266. // 判断是否已经添加
  267. LambdaQueryWrapper<SmartAccess> wrapperFD = new LambdaQueryWrapper<>();
  268. wrapperFD.eq(SmartAccess::getDateTime, smartFaceDiscern.getDateTime())
  269. .eq(SmartAccess::getUserId, userId);
  270. List<SmartAccess> list = smartAccessService.list(wrapperFD);
  271. if (ObjectUtils.isEmpty(list) && list.size() == 0) {
  272. // 抓拍的照片 base64字符串
  273. String scenePhoto = jsonObject.getString("scenePhoto");
  274. scenePhoto = "data:image/jpeg;base64," + scenePhoto;
  275. logger.info("scenePhoto =" + scenePhoto.substring(0, 50));
  276. // base64转文件
  277. MultipartFile multipartFile = MultipartFileUtils.base64ToMultipartFile(scenePhoto);
  278. String image="";
  279. try {
  280. // 上传到cos桶,并生成图片地址
  281. image = smartUploadService.upload(new MultipartFile[]{multipartFile});
  282. }catch (Exception e){
  283. e.printStackTrace();
  284. logger.error("上传cos桶失败");
  285. }
  286. smartFaceDiscern.setImage(image);
  287. smartAccessService.save(smartFaceDiscern);
  288. // 通过学生id找到关联的家长affiliate,并找到公众号,如果openid为空则不传
  289. List<SmartUser> userList = smartUserService.getAffiliateList(userId);
  290. if (ObjectUtils.isNotEmpty(userList) && userList.size() > 0) {
  291. for (SmartUser user : userList) {
  292. String gzhOpenId = user.getGzhOpenId();
  293. if (ObjectUtils.isNotEmpty(gzhOpenId)) {
  294. String pushType = "";
  295. if (type.contains("进校")) {
  296. pushType = "进入大门";
  297. } else if (type.contains("出校")) {
  298. pushType = "离开大门";
  299. }
  300. LocalDateTime date = LocalDateTime.now();
  301. String format = date.format(dateTimeFormatter1);
  302. // 公众号信息推送
  303. Message2.send(gzhOpenId, pushType, address, format);
  304. SmartNotification smartNotification = new SmartNotification();
  305. smartNotification.setUserId(smartUser.getId());
  306. smartNotification.setUserName(smartUser.getName());
  307. smartNotification.setTypeName(pushType);
  308. smartNotification.setLocation(address);
  309. smartNotification.setImage(image);
  310. smartNotification.setDateTime(time);
  311. smartNotification.setType(2);
  312. smartNotificationService.save(smartNotification);
  313. }
  314. }
  315. }
  316. }
  317. } else {
  318. smartFaceDiscern.setUserId(0);
  319. // 判断是否已经添加
  320. LambdaQueryWrapper<SmartAccess> wrapperFD = new LambdaQueryWrapper<>();
  321. wrapperFD.eq(SmartAccess::getDateTime, time)
  322. .eq(SmartAccess::getName, s)
  323. .eq(SmartAccess::getType, type);
  324. List<SmartAccess> list = smartAccessService.list(wrapperFD);
  325. if (ObjectUtils.isEmpty(list) && list.size() == 0) {
  326. // 抓拍的照片 base64字符串
  327. String scenePhoto = jsonObject.getString("scenePhoto");
  328. scenePhoto = "data:image/jpeg;base64," + scenePhoto;
  329. logger.info("scenePhoto =" + scenePhoto.substring(0, 50));
  330. // base64转文件
  331. MultipartFile multipartFile = MultipartFileUtils.base64ToMultipartFile(scenePhoto);
  332. String image="";
  333. try {
  334. // 上传到cos桶,并生成图片地址
  335. image = smartUploadService.upload(new MultipartFile[]{multipartFile});
  336. }catch (Exception e){
  337. e.printStackTrace();
  338. logger.error("上传cos桶失败");
  339. }
  340. smartFaceDiscern.setImage(image);
  341. smartAccessService.save(smartFaceDiscern);
  342. }
  343. }
  344. }
  345. // }
  346. } catch (
  347. Exception e) {
  348. e.printStackTrace();
  349. JSONObject r = new JSONObject();
  350. r.put("message", "Success");
  351. r.put("result", 0);
  352. return r.toJSONString();
  353. }
  354. JSONObject r = new JSONObject();
  355. r.put("message", "Success");
  356. r.put("result", 0);
  357. return r.toJSONString();
  358. }
  359. public static JSONObject getDate(Integer date) {
  360. JSONObject jsonObject = new JSONObject();
  361. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  362. LocalDateTime now = LocalDateTime.now();
  363. LocalDateTime stateTime = now.withHour(0).withMinute(0).withSecond(0).minusDays(date);
  364. LocalDateTime endTime = now.withHour(23).withMinute(59).withSecond(59).minusDays(date);
  365. jsonObject.put("stateTime", stateTime.format(dateTimeFormatter1));
  366. jsonObject.put("endTime", endTime.format(dateTimeFormatter1));
  367. return jsonObject;
  368. }
  369. public static void main(String[] args) {
  370. LocalDateTime dateTime1 = LocalDateTime.of(2022, 8, 29, 12, 0, 0);
  371. LocalDateTime dateTime2 = LocalDateTime.of(2022, 8, 30, 12, 0, 0);
  372. LocalDateTime dateTime3 = LocalDateTime.of(2022, 8, 28, 12, 0, 0);
  373. boolean isBefore = dateTime1.isBefore(dateTime2);
  374. boolean isBefore2 = dateTime1.isBefore(dateTime3);
  375. System.out.println("dateTime1 is before dateTime2: " + isBefore);
  376. System.out.println("dateTime1 is before dateTime2: " + isBefore2);
  377. }
  378. }